/* ============================================================================
   NormAtiva — native design system (no framework)
   Modern glassmorphism app: translucent surfaces + blur, violet→indigo gradients,
   layered shadows + glow, radial-mesh background, polished dark mode.
   Theme is switched by [data-theme="light|dark"] on <html> (see theme.js).
   ============================================================================ */

:root {
    /* Brand */
    --na-primary: #7c3aed;
    --na-primary-2: #6366f1;
    --na-grad: linear-gradient(135deg, #7c3aed 0%, #6366f1 55%, #4f46e5 100%);
    --na-primary-hover: rgba(124, 58, 237, .10);   /* soft tint (used widely) */
    --na-primary-contrast: #ffffff;

    /* Risk bands */
    --na-success: #16a34a;
    --na-warning: #d97706;
    --na-error: #dc2626;
    --na-info: #0ea5e9;

    /* ---- Risk bands (Baixo / Atenção / Crítico) ----
       DELIBERATELY NOT THEMED. These are a status palette painting DATA, not chrome: if the fill
       shifted per theme, the same score would read as a different colour and two screenshots of
       one report would not agree. Reusing --na-success/warning/error was also measurably broken —
       dark themes define those as LIGHT accents meant for text ON a dark background, so used as
       fills behind white text they gave 1.74:1 (green) and 2.77:1 (red), far under the 4.5 floor.

       Every step below was chosen by measurement, not by eye: text-on-fill >= 4.5:1, and the fill
       stays >= 3:1 against the dark surface so cells never sink into a dark card. The amber sits
       at 2.15:1 against a white surface, which is inherent to amber — the relief is the secondary
       encoding these cells already carry: the printed score, the B/A/C letter, and the legend. */
    --na-risk-low:  #15803d;  --na-risk-low-fg:  #ffffff;   /* texto 5.02:1 */
    --na-risk-mid:  #f59e0b;  --na-risk-mid-fg:  #241a04;   /* texto 7.99:1 */
    --na-risk-high: #dc2626;  --na-risk-high-fg: #ffffff;   /* texto 4.83:1 */

    /* Surfaces & text (light) */
    --na-bg: #f4f2fb;
    --na-bg-grey: rgba(124, 58, 237, .05);
    --na-surface: rgba(255, 255, 255, .72);        /* glass */
    --na-surface-solid: #ffffff;
    --na-glass-border: rgba(255, 255, 255, .7);
    --na-text: #191325;
    --na-text-secondary: #675e7c;
    --na-line: rgba(25, 19, 37, .09);
    --na-line-input: rgba(25, 19, 37, .16);

    /* Depth */
    --na-radius: 14px;
    --na-radius-lg: 20px;
    --na-blur: saturate(180%) blur(14px);
    --na-shadow: 0 6px 24px rgba(30, 12, 60, .10), 0 1px 2px rgba(30, 12, 60, .06);
    --na-shadow-lg: 0 24px 60px rgba(30, 12, 60, .18), 0 2px 6px rgba(30, 12, 60, .08);
    --na-glow: 0 10px 30px rgba(124, 58, 237, .38);
    --na-ring: 0 0 0 3px rgba(124, 58, 237, .30);
    --na-mesh:
        radial-gradient(38% 40% at 12% 8%, rgba(124, 58, 237, .20), transparent 60%),
        radial-gradient(36% 38% at 88% 12%, rgba(99, 102, 241, .18), transparent 60%),
        radial-gradient(45% 45% at 50% 108%, rgba(14, 165, 233, .12), transparent 60%);
    --na-maxw: 1200px;
    --na-font: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;

    /* ===== Escala tipográfica =====
       Fonte única de tamanho de texto. Antes destes tokens o arquivo tinha 132 declarações
       de font-size em 38 valores distintos — só entre .72rem e .98rem eram DEZESSETE degraus
       (.84, .85, .86, .88, .89…). Ninguém distingue um do outro de perto, mas a falta de
       ritmo é visível na página inteira: é o que fazia a interface parecer desalinhada.

       Dez degraus cobrem tudo o que o app usa hoje, e o mapeamento foi para o degrau mais
       próximo — a intenção é dar ritmo, não redesenhar a escala. Ao estilizar algo novo,
       ESCOLHA UM DEGRAU; não invente um valor intermediário, é assim que a bagunça volta.

       Sempre em rem, nunca em em: um tamanho relativo herda do pai e o mesmo componente
       acaba com tamanhos diferentes conforme onde cai (o chip <code> chegava a 25px dentro
       de um h1, maior que o próprio h3). */
    --na-fs-2xs: .75rem;    /* 12px — badges, cabeçalho de tabela, metadado */
    --na-fs-xs: .8125rem;   /* 13px — rótulo de campo, dica */
    --na-fs-sm: .875rem;    /* 14px — texto de apoio, checkbox */
    --na-fs-md: .9375rem;   /* 15px — corpo denso: célula de tabela, item de lista */
    --na-fs-base: 1rem;     /* 16px — corpo e campos de formulário */
    --na-fs-lg: 1.125rem;   /* 18px — h4, destaque em cartão */
    --na-fs-xl: 1.25rem;    /* 20px — h3 */
    --na-fs-2xl: 1.5rem;    /* 24px — h2 */
    --na-fs-3xl: 1.75rem;   /* 28px — h1 de seção */
    --na-fs-4xl: 2rem;      /* 32px — h1 de página, número de destaque */
}
:root[data-theme="violet"] { color-scheme: light; }

/* Um quadro sem transição nenhuma, ligado pelo theme.js APENAS quando ele acabou de repor um
   atributo do <html> que a navegação melhorada do Blazor tinha derrubado.

   Não é um "desligar animações": é cancelar uma transição que foi armada por um estado que nunca
   deveria ter existido. A troca de DOM força um recálculo de estilo com o atributo ausente, e o
   navegador guarda esse valor como estilo anterior — os rótulos da barra lateral recolhida (que
   são os tooltips flutuantes) ficavam desaparecendo de opacity 1 para 0 a cada navegação, embora
   o estado expandido nunca chegasse a ser pintado. O raciocínio inteiro está no theme.ts. */
:root[data-na-swap] * { transition: none !important; }

/* ===== Theme: Meia-noite (dark violet) ===== */
:root[data-theme="midnight"] {
    color-scheme: dark;
    --na-primary: #a78bfa; --na-primary-2: #818cf8;
    --na-grad: linear-gradient(135deg, #8b5cf6 0%, #6366f1 55%, #4f46e5 100%);
    --na-primary-hover: rgba(167, 139, 250, .14); --na-primary-contrast: #14101f;
    --na-success: #4ade80; --na-warning: #fbbf24; --na-error: #f87171; --na-info: #38bdf8;
    --na-bg: #0c0a13; --na-bg-grey: rgba(255, 255, 255, .04);
    --na-surface: rgba(30, 25, 44, .62); --na-surface-solid: #1b1727; --na-glass-border: rgba(255, 255, 255, .08);
    --na-text: #f3effc; --na-text-secondary: #b4a9cc; --na-line: rgba(255, 255, 255, .08); --na-line-input: rgba(255, 255, 255, .16);
    --na-shadow: 0 8px 30px rgba(0, 0, 0, .5), 0 1px 2px rgba(0, 0, 0, .4);
    --na-shadow-lg: 0 30px 70px rgba(0, 0, 0, .6), 0 2px 8px rgba(0, 0, 0, .5);
    --na-glow: 0 10px 34px rgba(124, 58, 237, .5); --na-ring: 0 0 0 3px rgba(167, 139, 250, .35);
    --na-mesh:
        radial-gradient(40% 44% at 12% 6%, rgba(139, 92, 246, .28), transparent 60%),
        radial-gradient(38% 40% at 90% 10%, rgba(79, 70, 229, .26), transparent 60%),
        radial-gradient(50% 50% at 50% 110%, rgba(14, 165, 233, .16), transparent 60%);
}

/* ===== Theme: Oceano (light cyan→blue) ===== */
:root[data-theme="ocean"] {
    color-scheme: light;
    --na-primary: #0891b2; --na-primary-2: #2563eb;
    --na-grad: linear-gradient(135deg, #06b6d4 0%, #0ea5e9 50%, #2563eb 100%);
    --na-primary-hover: rgba(8, 145, 178, .10); --na-primary-contrast: #ffffff;
    --na-success: #059669; --na-warning: #d97706; --na-error: #e11d48; --na-info: #0284c7;
    --na-bg: #edf4fb; --na-bg-grey: rgba(8, 145, 178, .06);
    --na-surface: rgba(255, 255, 255, .72); --na-surface-solid: #ffffff; --na-glass-border: rgba(255, 255, 255, .7);
    --na-text: #0c1a26; --na-text-secondary: #4a6273; --na-line: rgba(12, 26, 38, .09); --na-line-input: rgba(12, 26, 38, .16);
    --na-shadow: 0 6px 24px rgba(6, 60, 80, .10), 0 1px 2px rgba(6, 60, 80, .06);
    --na-shadow-lg: 0 24px 60px rgba(6, 60, 80, .18), 0 2px 6px rgba(6, 60, 80, .08);
    --na-glow: 0 10px 30px rgba(8, 145, 178, .35); --na-ring: 0 0 0 3px rgba(8, 145, 178, .30);
    --na-mesh:
        radial-gradient(38% 40% at 12% 8%, rgba(6, 182, 212, .20), transparent 60%),
        radial-gradient(36% 38% at 88% 12%, rgba(37, 99, 235, .16), transparent 60%),
        radial-gradient(45% 45% at 50% 108%, rgba(20, 184, 166, .12), transparent 60%);
}

/* ===== Theme: Esmeralda (dark emerald→teal) ===== */
:root[data-theme="emerald"] {
    color-scheme: dark;
    --na-primary: #34d399; --na-primary-2: #22d3ee;
    --na-grad: linear-gradient(135deg, #10b981 0%, #14b8a6 50%, #06b6d4 100%);
    --na-primary-hover: rgba(52, 211, 153, .14); --na-primary-contrast: #05201a;
    --na-success: #4ade80; --na-warning: #fbbf24; --na-error: #fb7185; --na-info: #38bdf8;
    --na-bg: #07130f; --na-bg-grey: rgba(255, 255, 255, .04);
    --na-surface: rgba(18, 38, 32, .62); --na-surface-solid: #0f221c; --na-glass-border: rgba(255, 255, 255, .08);
    --na-text: #eafaf3; --na-text-secondary: #9fc3b4; --na-line: rgba(255, 255, 255, .08); --na-line-input: rgba(255, 255, 255, .16);
    --na-shadow: 0 8px 30px rgba(0, 0, 0, .5), 0 1px 2px rgba(0, 0, 0, .4);
    --na-shadow-lg: 0 30px 70px rgba(0, 0, 0, .6), 0 2px 8px rgba(0, 0, 0, .5);
    --na-glow: 0 10px 34px rgba(16, 185, 129, .45); --na-ring: 0 0 0 3px rgba(52, 211, 153, .35);
    --na-mesh:
        radial-gradient(40% 44% at 12% 6%, rgba(16, 185, 129, .26), transparent 60%),
        radial-gradient(38% 40% at 90% 10%, rgba(6, 182, 212, .24), transparent 60%),
        radial-gradient(50% 50% at 50% 110%, rgba(20, 184, 166, .16), transparent 60%);
}

/* ===== Theme: Pôr do sol (light amber→rose) ===== */
:root[data-theme="sunset"] {
    color-scheme: light;
    --na-primary: #ea580c; --na-primary-2: #db2777;
    --na-grad: linear-gradient(135deg, #f97316 0%, #f43f5e 55%, #db2777 100%);
    --na-primary-hover: rgba(234, 88, 12, .10); --na-primary-contrast: #ffffff;
    --na-success: #059669; --na-warning: #d97706; --na-error: #e11d48; --na-info: #0284c7;
    --na-bg: #fdf2ec; --na-bg-grey: rgba(234, 88, 12, .06);
    --na-surface: rgba(255, 255, 255, .74); --na-surface-solid: #fffaf7; --na-glass-border: rgba(255, 255, 255, .72);
    --na-text: #2a1710; --na-text-secondary: #7a5a4c; --na-line: rgba(42, 23, 16, .10); --na-line-input: rgba(42, 23, 16, .17);
    --na-shadow: 0 6px 24px rgba(120, 40, 10, .12), 0 1px 2px rgba(120, 40, 10, .07);
    --na-shadow-lg: 0 24px 60px rgba(120, 40, 10, .20), 0 2px 6px rgba(120, 40, 10, .09);
    --na-glow: 0 10px 30px rgba(249, 115, 22, .38); --na-ring: 0 0 0 3px rgba(249, 115, 22, .30);
    --na-mesh:
        radial-gradient(38% 40% at 12% 8%, rgba(249, 115, 22, .20), transparent 60%),
        radial-gradient(36% 38% at 88% 12%, rgba(219, 39, 119, .16), transparent 60%),
        radial-gradient(45% 45% at 50% 108%, rgba(245, 158, 11, .14), transparent 60%);
}

/* ===== Theme: Grafite (dark slate, cool blue) ===== */
:root[data-theme="graphite"] {
    color-scheme: dark;
    --na-primary: #60a5fa; --na-primary-2: #818cf8;
    --na-grad: linear-gradient(135deg, #3b82f6 0%, #6366f1 55%, #8b5cf6 100%);
    --na-primary-hover: rgba(96, 165, 250, .14); --na-primary-contrast: #0a0f1a;
    --na-success: #4ade80; --na-warning: #fbbf24; --na-error: #f87171; --na-info: #38bdf8;
    --na-bg: #0e1017; --na-bg-grey: rgba(255, 255, 255, .035);
    --na-surface: rgba(30, 34, 45, .6); --na-surface-solid: #191c26; --na-glass-border: rgba(255, 255, 255, .07);
    --na-text: #eef1f7; --na-text-secondary: #a3adbf; --na-line: rgba(255, 255, 255, .075); --na-line-input: rgba(255, 255, 255, .15);
    --na-shadow: 0 8px 30px rgba(0, 0, 0, .55), 0 1px 2px rgba(0, 0, 0, .4);
    --na-shadow-lg: 0 30px 70px rgba(0, 0, 0, .65), 0 2px 8px rgba(0, 0, 0, .5);
    --na-glow: 0 10px 34px rgba(59, 130, 246, .4); --na-ring: 0 0 0 3px rgba(96, 165, 250, .35);
    --na-mesh:
        radial-gradient(40% 44% at 12% 6%, rgba(59, 130, 246, .22), transparent 60%),
        radial-gradient(38% 40% at 90% 10%, rgba(139, 92, 246, .20), transparent 60%),
        radial-gradient(50% 50% at 50% 110%, rgba(14, 165, 233, .14), transparent 60%);
}

/* ===== Theme: Corporativo (solid, no transparency / no blur) ===== */
:root[data-theme="corporate"] {
    color-scheme: light;
    --na-primary: #2563eb; --na-primary-2: #1d4ed8;
    --na-grad: linear-gradient(135deg, #2563eb 0%, #1d4ed8 100%);
    --na-primary-hover: rgba(37, 99, 235, .08); --na-primary-contrast: #ffffff;
    --na-success: #15803d; --na-warning: #b45309; --na-error: #b91c1c; --na-info: #0369a1;
    --na-bg: #eef1f6; --na-bg-grey: #f2f5f9;
    --na-surface: #ffffff; --na-surface-solid: #ffffff; --na-glass-border: #e2e8f0;
    --na-text: #0f172a; --na-text-secondary: #475569; --na-line: #e2e8f0; --na-line-input: #cbd5e1;
    --na-shadow: 0 1px 3px rgba(15, 23, 42, .10), 0 1px 2px rgba(15, 23, 42, .06);
    --na-shadow-lg: 0 12px 32px rgba(15, 23, 42, .14), 0 2px 6px rgba(15, 23, 42, .08);
    --na-glow: 0 4px 14px rgba(37, 99, 235, .22); --na-ring: 0 0 0 3px rgba(37, 99, 235, .25);
    --na-blur: none;   /* no glass blur */
    --na-mesh: none;   /* flat background */
}

/* ---- Paleta categórica (identidade, não magnitude) ------------------------
   Para séries em que a cor só diz "qual", nunca "quanto" nem "quão grave": o mix de planos do
   painel da plataforma é o primeiro uso. Deliberadamente SEPARADA de --na-success/warning/error,
   que pintam estado — reaproveitar o âmbar de "atenção" para o terceiro plano do catálogo faria
   um plano parecer um alerta.

   Ao contrário das faixas de risco (--na-risk-*, fixas entre temas), estes têm um passo próprio
   no escuro: as cores claras o bastante para um fundo branco somem no fundo escuro. Ambos os
   conjuntos foram validados (banda de luminosidade, piso de croma, separação para daltonismo
   deutan/protan/tritan >= 8 e contraste >= 3:1 contra a superfície do tema) — reordenar ou trocar
   um passo exige revalidar, não é escolha de gosto.

   --na-cat-0 é o cinza de "resto/indefinido": só ele pode repetir e ficar fora da ordem. */
:root {
    --na-cat-0: #94a3b8;
    --na-cat-1: #8b5cf6;
    --na-cat-2: #0891b2;
    --na-cat-3: #db2777;
    --na-cat-4: #4338ca;
}
:root[data-theme="midnight"], :root[data-theme="emerald"], :root[data-theme="graphite"] {
    --na-cat-0: #64748b;
    --na-cat-1: #8b5cf6;
    --na-cat-2: #0d9dbb;
    --na-cat-3: #ec4899;
    --na-cat-4: #6366f1;
}

/* ---- Base ---------------------------------------------------------------- */
* { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; }

body {
    margin: 0;
    font-family: var(--na-font);
    background: var(--na-bg);
    color: var(--na-text);
    line-height: 1.55;
    -webkit-font-smoothing: antialiased;
    text-rendering: optimizeLegibility;
}

/* Fixed radial-gradient mesh behind everything (per-theme via --na-mesh) → glass reads with depth. */
body::before {
    content: "";
    position: fixed;
    inset: 0;
    z-index: -1;
    pointer-events: none;
    background: var(--na-mesh);
    transition: background .4s ease;
}

/* Títulos. Esta regra existia sem font-size algum: h2 e h3 caíam no default do navegador
   (24px e 18,72px, de um UA stylesheet), enquanto h1 era estilizado caso a caso pelas
   páginas. Era a causa mais visível da falta de harmonia — dois títulos irmãos na mesma
   tela seguiam escalas diferentes. Agora os quatro saem da mesma escala; páginas que
   precisem de outro tamanho ainda podem sobrescrever por classe. */
h1, h2, h3, h4 { color: var(--na-text); letter-spacing: -.02em; line-height: 1.25; }
h1 { font-size: var(--na-fs-4xl); font-weight: 800; letter-spacing: -.03em; }
h2 { font-size: var(--na-fs-2xl); font-weight: 700; }
h3 { font-size: var(--na-fs-xl); font-weight: 700; }
h4 { font-size: var(--na-fs-lg); font-weight: 600; }

a { color: var(--na-primary); text-decoration: none; }
a:hover { text-decoration: underline; }

.na-muted { color: var(--na-text-secondary); }
.na-center { text-align: center; }

/* Brand wordmark — "Norm" in text colour, "Ativa" in the brand gradient. */
.na-brand { font-weight: 800; font-size: var(--na-fs-xl); letter-spacing: -.03em; color: var(--na-text); text-decoration: none; }
.na-brand:hover { text-decoration: none; }
.na-brand span { background: var(--na-grad); -webkit-background-clip: text; background-clip: text; color: transparent; }

/* ---- Layout helpers ------------------------------------------------------ */
.na-container { width: 100%; max-width: var(--na-maxw); margin-inline: auto; padding-inline: 1.5rem; }
.na-container-sm { max-width: 720px; }
.na-container-xs { max-width: 460px; }
.na-grid { display: grid; gap: 1.5rem; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); }

/* ---- Buttons ------------------------------------------------------------- */
.na-btn {
    display: inline-flex; align-items: center; justify-content: center; gap: .5rem;
    padding: .72rem 1.3rem; border-radius: 999px; border: 1px solid transparent;
    font: inherit; font-weight: 600; letter-spacing: -.01em; cursor: pointer;
    transition: transform .15s cubic-bezier(.2,.8,.2,1), box-shadow .15s ease, background .15s ease, border-color .15s ease;
    text-decoration: none; white-space: nowrap;
}
.na-btn:hover { text-decoration: none; }
.na-btn:active { transform: translateY(0) scale(.98); }
.na-btn-lg { padding: .9rem 1.7rem; font-size: var(--na-fs-lg); }
/* Busy state (set by na-refresh.js while enhanced navigation re-fetches the page): the icon spins
   and the control stops accepting clicks, so a slow round-trip never reads as a dead button. */
.na-btn[aria-busy="true"] { pointer-events: none; opacity: .72; }
.na-btn[aria-busy="true"] .na-ico { animation: na-spin .7s linear infinite; transform-origin: 50% 50%; }
@keyframes na-spin { to { transform: rotate(360deg); } }
.na-btn-block { width: 100%; }

.na-btn-primary { background: linear-gradient(180deg, rgba(255,255,255,.22), rgba(255,255,255,0) 45%), var(--na-grad); color: #fff; box-shadow: var(--na-glow); }
.na-btn-primary:hover { transform: translateY(-2px); box-shadow: 0 16px 40px rgba(124, 58, 237, .5); }

.na-btn-outline {
    background: var(--na-surface); color: var(--na-primary);
    border-color: var(--na-line-input); backdrop-filter: var(--na-blur); -webkit-backdrop-filter: var(--na-blur);
}
.na-btn-outline:hover { background: var(--na-primary-hover); border-color: var(--na-primary); transform: translateY(-1px); }

.na-btn-white { background: #fff; color: var(--na-primary); box-shadow: var(--na-shadow); }
.na-btn-white:hover { transform: translateY(-2px); box-shadow: var(--na-shadow-lg); }
.na-btn-success { background: linear-gradient(135deg, #22c55e, #16a34a); color: #fff; box-shadow: 0 10px 30px rgba(22, 163, 74, .35); }
.na-btn-success:hover { transform: translateY(-2px); }
.na-btn-danger { background: linear-gradient(135deg, #ef4444, #dc2626); color: #fff; box-shadow: 0 10px 30px rgba(220, 38, 38, .35); }
.na-btn-danger:hover { transform: translateY(-2px); }
.na-btn-dark { background: var(--na-text); color: var(--na-bg); }
.na-btn-dark:hover { transform: translateY(-2px); box-shadow: var(--na-shadow); }
.na-btn-sm { padding: .4rem .85rem; font-size: var(--na-fs-sm); }

.na-actions { display: flex; flex-wrap: wrap; gap: .75rem; align-items: center; }

/* Dev-only login picker (DevLoginPicker molecule). */
.na-devlogin {
    margin-bottom: 1.25rem; padding: .85rem; border: 1px dashed var(--na-line-input);
    border-radius: var(--na-radius); background: var(--na-bg-grey);
}
.na-devlogin .na-select { margin-top: .3rem; }

/* ---- Surfaces (glass) ---------------------------------------------------- */
.na-card {
    background: var(--na-surface);
    border: 1px solid var(--na-glass-border);
    border-radius: var(--na-radius-lg);
    padding: 1.6rem;
    box-shadow: var(--na-shadow);
    backdrop-filter: var(--na-blur);
    -webkit-backdrop-filter: var(--na-blur);
}
.na-card-hover { transition: transform .18s ease, box-shadow .18s ease; }
.na-card-hover:hover { transform: translateY(-4px); box-shadow: var(--na-shadow-lg); }

/* ---- Forms --------------------------------------------------------------- */
.na-label { display: block; font-size: var(--na-fs-xs); font-weight: 600; color: var(--na-text-secondary); margin-bottom: .35rem; letter-spacing: -.01em; }
.na-input, .na-select {
    width: 100%; min-height: 2.9rem; padding: .72rem .9rem; border: 1px solid var(--na-line-input);
    border-radius: 12px; font: inherit; color: var(--na-text);
    background-color: var(--na-surface-solid); outline: none;
    transition: border-color .15s ease, box-shadow .15s ease, background-color .15s ease;
}
:root[data-theme="dark"] .na-input, :root[data-theme="dark"] .na-select { background-color: rgba(255,255,255,.04); }
.na-input:hover, .na-select:hover { border-color: color-mix(in srgb, var(--na-primary) 42%, var(--na-line-input)); }
.na-input:focus, .na-select:focus { border-color: var(--na-primary); box-shadow: var(--na-ring); }
.na-input::placeholder { color: var(--na-text-secondary); opacity: .7; }

/* Custom chevron: drop the OS-native arrow so selects match the design in every browser.
   Neutral mid-slate stroke reads on both light and dark surfaces across all themes. */
.na-select {
    appearance: none; -webkit-appearance: none; -moz-appearance: none;
    cursor: pointer; padding-right: 2.5rem;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%238a90a3' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
    background-repeat: no-repeat; background-position: right .9rem center; background-size: 1.05em;
}
.na-select::-ms-expand { display: none; }
.na-field + .na-field { margin-top: 1rem; }

/* Dica do campo (o <small> que o FormField renderiza a partir de Hint).
   Sem regra própria ela ficava inline, colada no rótulo do campo SEGUINTE — "Obrigatório ·
   referência do MRR/ARR" parecia legenda do "Valor mensal" logo abaixo. Bloco + respiro em
   cima e, principalmente, embaixo: a dica pertence ao campo que vem ANTES dela. */
.na-field > small {
    display: block;
    margin-top: .375rem;
    font-size: var(--na-fs-xs);
    line-height: 1.45;
    color: var(--na-text-secondary);
}
/* Dentro da grade os campos não recebem margin-top, então a dica precisa criar o respiro
   que separa uma linha da grade da seguinte. */
.na-form-grid .na-field > small { margin-bottom: .125rem; }

/* ---- Checkbox ------------------------------------------------------------
   The real <input type="checkbox"> stays in the DOM and keeps every native
   behaviour (label click, Space, :checked, form submit); it is only made
   invisible and repainted by the sibling .na-check-box. */
.na-check { position: relative; display: inline-flex; align-items: center; gap: .6rem; cursor: pointer; user-select: none; }
.na-check > input { position: absolute; width: 1px; height: 1px; opacity: 0; margin: 0; }
.na-check-box {
    flex: 0 0 auto; display: inline-grid; place-items: center;
    width: 1.2rem; height: 1.2rem; border-radius: 6px;
    border: 1px solid var(--na-line-input); background: var(--na-surface-solid);
    transition: background .15s ease, border-color .15s ease, box-shadow .15s ease;
}
:root[data-theme="dark"] .na-check-box { background: rgba(255,255,255,.04); }
.na-check-box .na-ico {
    width: .8rem; height: .8rem; stroke-width: 3.5; color: var(--na-primary-contrast);
    opacity: 0; transform: scale(.55); transition: opacity .12s ease, transform .12s ease;
}
.na-check:hover .na-check-box { border-color: color-mix(in srgb, var(--na-primary) 42%, var(--na-line-input)); }
.na-check > input:checked + .na-check-box { background: var(--na-grad); border-color: transparent; }
.na-check > input:checked + .na-check-box .na-ico { opacity: 1; transform: none; }
.na-check > input:focus-visible + .na-check-box { box-shadow: var(--na-ring); }
.na-check-text { font-size: var(--na-fs-md); font-weight: 600; color: var(--na-text); }

/* ---- Sub-form revealed by a checkbox (CSS only, no JS) -------------------
   The body is never removed from the DOM — its fields keep posting, and the
   endpoint reads the checkbox to decide whether to use them at all. A browser
   without :has() therefore shows the block permanently, which is the right
   degradation: the checkbox still governs the outcome, nothing is lost. */
.na-subform { border: 1px solid var(--na-line); border-radius: var(--na-radius); padding: .9rem 1rem; background: var(--na-bg-grey); }
.na-subform-head { display: flex; align-items: center; gap: .1rem; flex-wrap: wrap; }
.na-subform-body { margin-top: .95rem; padding-top: .95rem; border-top: 1px dashed var(--na-line); }
.na-subform-intro { font-size: var(--na-fs-sm); margin: 0 0 .9rem; }
/* Scoped to the sub-form's OWN head checkbox (`> .na-subform-head`), not to any unchecked box
   anywhere inside it. Unscoped, a second checkbox nested in the body — the override permission —
   satisfies :has() while it is off and pins the body shut forever. */
.na-subform:has(> .na-subform-head .na-check > input:not(:checked)) > .na-subform-body { display: none; }

/* Same shape, warning colours: a sub-form whose checkbox waives a guard-rail rather than adding
   one. Tinted only once ticked, so an untouched form is not a wall of alarm — the option should
   read as available, and only look like a decision once it has been taken. */
.na-subform-danger {
    border: 1px solid var(--na-line); border-radius: var(--na-radius); padding: .9rem 1rem;
    background: var(--na-surface-solid);
    transition: border-color .18s ease, background .18s ease;
}
:root[data-theme="dark"] .na-subform-danger { background: rgba(255,255,255,.03); }
.na-subform-danger:has(.na-check > input:checked) {
    border-color: color-mix(in srgb, var(--na-warning) 55%, transparent);
    background: color-mix(in srgb, var(--na-warning) 8%, var(--na-surface-solid));
}
.na-subform-danger:has(.na-check > input:checked) .na-check-text { color: var(--na-warning); }

/* ---- Modal (native <dialog>) --------------------------------------------
   For decisions that must not be made by reflex. showModal() puts the dialog in the top layer, so
   it needs no z-index of ours and traps focus by itself.

   No-JS degradation: the dialog can then never be opened, so it unfolds into the page instead of
   vanishing — the confirmation field stays reachable and the form still works (the server requires
   the phrase either way). na-override.js sets data-na-modal="js" on <html>; until it runs, the
   rules under :not([data-na-modal]) are the ones in charge. */
.na-modal {
    width: min(34rem, calc(100vw - 2rem)); padding: 1.5rem; margin: auto;
    border: 1px solid var(--na-glass-border); border-radius: var(--na-radius-lg);
    background: var(--na-surface-solid); color: var(--na-text); box-shadow: var(--na-shadow-lg);
}
.na-modal::backdrop { background: rgba(15, 23, 42, .5); backdrop-filter: blur(3px); }
/* O backdrop entra junto com a caixa. Aparecer de uma vez, sob um painel que ainda está
   chegando, faz o painel parecer atrasado em relação ao próprio fundo. */
.na-modal[open]::backdrop { animation: na-backdrop-in .28s ease-out; }
@keyframes na-backdrop-in { from { opacity: 0; } }
.na-modal[open] { animation: na-modal-in .2s cubic-bezier(.16, 1, .3, 1); }
@keyframes na-modal-in { from { opacity: 0; transform: translateY(.6rem) scale(.98); } }

/* ---- Saída ---------------------------------------------------------------
   <dialog>.close() tira o elemento da camada superior NO MESMO QUADRO — display vira none e
   o ::backdrop deixa de existir. Ou seja: uma animação de saída só é visível se NINGUÉM
   chamar close(). Por isso na-dialog.js marca data-na-out, deixa a animação abaixo rodar, e
   só então fecha/navega. Sem o script (ou com movimento reduzido) o atributo nunca aparece e
   nada disto entra em cena. */
.na-modal[data-na-out] { animation: na-modal-out .18s ease-in forwards; }
@keyframes na-modal-out { to { opacity: 0; transform: translateY(.4rem) scale(.98); } }
.na-modal[data-na-out]::backdrop { animation: na-backdrop-out .28s ease-in forwards; }
@keyframes na-backdrop-out { to { opacity: 0; } }

.na-modal-head { display: flex; align-items: center; gap: .7rem; margin-bottom: .9rem; }
.na-modal-head h2 { font-size: var(--na-fs-lg); margin: 0; letter-spacing: -.02em; }
.na-modal-ico {
    display: inline-flex; align-items: center; justify-content: center; flex: none;
    width: 38px; height: 38px; border-radius: 12px;
    color: var(--na-warning); background: color-mix(in srgb, var(--na-warning) 14%, transparent);
}
.na-modal-ico .na-ico { width: 1.25rem; height: 1.25rem; }
.na-modal-body { font-size: var(--na-fs-md); }
.na-modal-body > p { margin: 0 0 .8rem; }
.na-modal-list { margin: 0 0 1.1rem; padding-left: 1.1rem; display: grid; gap: .45rem; }
.na-modal-foot { display: flex; justify-content: flex-end; gap: .6rem; margin-top: 1.2rem; }

:root:not([data-na-modal]) .na-modal {
    display: block; width: auto; margin: .9rem 0 0; box-shadow: none;
    border-color: var(--na-line); background: var(--na-bg-grey);
}
/* Those buttons only ever talk to the script, so without it they are dead controls — better absent
   than present-and-inert. The checkbox plus the typed phrase carry the whole gate on their own. */
:root:not([data-na-modal]) .na-modal-foot { display: none; }

@media (prefers-reduced-motion: reduce) {
    .na-modal[open], .na-modal[open]::backdrop,
    .na-modal[data-na-out], .na-modal[data-na-out]::backdrop { animation: none; }
}


/* ---- Drawer (gaveta) -----------------------------------------------------
   Painel que entra por uma borda da tela e cobre a página. Serve para qualquer conteúdo que
   mereça a tela inteira sem tirar a pessoa de onde ela está — o componente <Drawer> não sabe o
   que é um formulário.

   É um <dialog> promovido pelo na-dialog.js — showModal() já dá camada superior, backdrop, foco
   preso e Esc. Daqui para baixo é só a moldura e o movimento. Quatro decisões sustentam o resto:

   1. MOVIMENTO. A curva é `cubic-bezier(.32, .72, 0, 1)` — a mesma do Vaul, que é o que roda por
      baixo do drawer da shadcn. Ela não é um ease-out qualquer: sai quase na velocidade máxima
      e gasta a maior parte do tempo desacelerando, o que dá a sensação de peso sendo puxado em
      vez de caixa aparecendo. Trocar por `ease`/`ease-out` é a diferença inteira entre
      "desliza" e "pisca".
   2. O <dialog> é uma COLUNA FLEX que NÃO rola; quem rola é .na-drawer-body. Antes o painel
      inteiro rolava e cabeçalho e rodapé grudavam com `sticky` + margens negativas para
      desfazer o padding do container. Com o corpo rolando, o cabeçalho é só um irmão que não
      encolhe, e a aritmética de margem negativa some.
   3. A sombra sob o cabeçalho é pintada com `background-attachment: local` no corpo — o truque
      clássico: a camada "local" rola junto com o conteúdo e vai destapando a camada "scroll",
      que fica parada. A sombra aparece exatamente quando há conteúdo escondido acima, sem
      listener de scroll e sem scroll-timeline.
   4. Fechar NAVEGA, e navegar destrói o elemento — então a animação de saída tem de terminar
      ANTES. Ver o bloco de saída em .na-modal: na-dialog.js marca data-na-out, espera, e só
      então segue o link.

   ---- Os quatro lados são DADOS, não quatro blocos --------------------------------------
   A geometria toda (de onde entra, onde encosta, que medida cresce, que canto arredonda, para
   onde a sombra é projetada) sai de custom properties que .na-drawer consome uma vez. Cada lado
   só ATRIBUI esses valores. É o que faz a regra de tela estreita — "gaveta lateral vira folha
   inferior" — caber em quatro linhas em vez de repetir o bloco inteiro do lado de baixo, e é o
   que garante que uma mudança no movimento valha para os quatro de uma vez.

   Por isso os valores da folha inferior moram em --na-sheet-*, definidos UMA vez aqui: tanto o
   Side="bottom" quanto as gavetas laterais em tela estreita leem deles, então não têm como
   divergir. */
.na-drawer {
    /* Cor das sombras INTERNAS do painel (sob o cabeçalho, sobre o rodapé). Não pode ser a
       mesma dos dois temas: sobre uma superfície escura, uma sombra azul-ardósia a 24% some por
       completo — a borda entre "há conteúdo escondido" e "acabou" simplesmente deixava de
       existir no tema Meia-noite. Os temas escuros são midnight/emerald/graphite (mesmo grupo
       usado na paleta categórica lá em cima). */
    --na-drawer-shade: rgba(15, 23, 42, .24);
    /* Duração + curva do movimento, em UM lugar só, porque entrar e sair têm de ser exatamente
       o mesmo movimento em sentidos opostos. Separados, os dois valores derivavam — e o painel
       entrava num tempo e saía noutro, que é o que faz a saída parecer "outro componente". */
    --na-drawer-motion: .42s cubic-bezier(.32, .72, 0, 1);

    /* Geometria da folha inferior, referenciada em dois lugares (Side="bottom" e lateral em
       tela estreita) e escrita em um só. */
    --na-sheet-hidden: translateY(100%);
    --na-sheet-place: auto auto 0;
    --na-sheet-w: 100vw;
    --na-sheet-h: auto;
    --na-sheet-max-h: min(var(--na-drawer-size, 32rem), 92dvh);
    --na-sheet-radius: var(--na-radius-lg) var(--na-radius-lg) 0 0;
    --na-sheet-rim: inset 0 1px 0 var(--na-glass-border);
    --na-sheet-cast: 0 -30px 66px -28px;

    display: flex; flex-direction: column;
    margin: var(--na-drawer-place);
    width: var(--na-drawer-w); max-width: 100vw;
    height: var(--na-drawer-h); max-height: var(--na-drawer-max-h);
    padding: 0;                            /* cabeçalho, corpo e rodapé carregam o próprio */
    border: 0;
    border-radius: var(--na-drawer-radius);
    overflow: hidden;                      /* o arredondado precisa recortar o cabeçalho */
    /* Fio de luz na borda exposta + sombra longa projetada para o lado de onde a gaveta veio: é
       ela que faz o painel parecer FLUTUAR sobre a página em vez de estar encostado nela. */
    box-shadow:
        var(--na-drawer-rim),
        var(--na-drawer-cast) rgba(15, 23, 42, .32),
        var(--na-shadow-lg);
    /* Só serve para a alça: soltá-la sem passar do limite devolve o painel ao lugar. A
       animação de entrada/saída ganha da transição enquanto estiver rodando. */
    transition: transform .28s cubic-bezier(.32, .72, 0, 1);
}
:root[data-theme="midnight"] .na-drawer,
:root[data-theme="emerald"] .na-drawer,
:root[data-theme="graphite"] .na-drawer { --na-drawer-shade: rgba(0, 0, 0, .62); }

/* margin: auto é o que centraliza um <dialog>; zerar o lado onde ele encosta e deixar `auto`
   nos outros é o que o cola na borda. --na-drawer-size é a medida no eixo em que a gaveta
   cresce: largura nas laterais, altura no topo e na base. */
.na-drawer-right {
    --na-drawer-hidden: translateX(100%);
    --na-drawer-place: 0 0 0 auto;
    --na-drawer-w: min(var(--na-drawer-size, 38rem), 100vw);
    --na-drawer-h: 100dvh;
    --na-drawer-max-h: 100dvh;
    --na-drawer-radius: var(--na-radius-lg) 0 0 var(--na-radius-lg);
    --na-drawer-rim: inset 1px 0 0 var(--na-glass-border);
    --na-drawer-cast: -34px 0 70px -30px;
}
.na-drawer-left {
    --na-drawer-hidden: translateX(-100%);
    --na-drawer-place: 0 auto 0 0;
    --na-drawer-w: min(var(--na-drawer-size, 38rem), 100vw);
    --na-drawer-h: 100dvh;
    --na-drawer-max-h: 100dvh;
    --na-drawer-radius: 0 var(--na-radius-lg) var(--na-radius-lg) 0;
    --na-drawer-rim: inset -1px 0 0 var(--na-glass-border);
    --na-drawer-cast: 34px 0 70px -30px;
}
.na-drawer-top {
    --na-drawer-hidden: translateY(-100%);
    --na-drawer-place: 0 auto auto;
    --na-drawer-w: 100vw;
    --na-drawer-h: auto;
    --na-drawer-max-h: min(var(--na-drawer-size, 32rem), 92dvh);
    --na-drawer-radius: 0 0 var(--na-radius-lg) var(--na-radius-lg);
    --na-drawer-rim: inset 0 -1px 0 var(--na-glass-border);
    --na-drawer-cast: 0 30px 66px -28px;
}
.na-drawer-bottom {
    --na-drawer-hidden: var(--na-sheet-hidden);
    --na-drawer-place: var(--na-sheet-place);
    --na-drawer-w: var(--na-sheet-w);
    --na-drawer-h: var(--na-sheet-h);
    --na-drawer-max-h: var(--na-sheet-max-h);
    --na-drawer-radius: var(--na-sheet-radius);
    --na-drawer-rim: var(--na-sheet-rim);
    --na-drawer-cast: var(--na-sheet-cast);
}

/* ---- Entrar e sair: o MESMO movimento, ao contrário ----------------------
   A entrada está pendurada em [data-na-dialog-ready] — o atributo que na-dialog.js põe no
   instante em que chama showModal() — e NÃO em .na-drawer solto. A diferença não é cosmética:
   o servidor entrega <dialog open>, então o painel existe e é pintado ANTES de o script rodar.
   Com a animação no seletor solto ela começava aí, no elemento ainda não-modal desdobrado na
   página; o script então removia `open` (display: none cancela a animação no meio) e chamava
   showModal(), que a fazia recomeçar do zero. Duas entradas, uma por cima da outra — o painel
   dava um tranco no começo em vez de deslizar. Com o atributo, ela roda uma vez só, no quadro
   certo, e sem JS nenhuma delas roda (o painel se desdobra na página, não desliza).

   Entrada e saída compartilham --na-drawer-motion: mesma duração, mesma curva, sentidos
   opostos. O seletor da saída carrega os dois atributos de propósito — é mais específico que o
   da entrada, então ganha dela sem depender da ordem em que as duas regras aparecem aqui.

   Um par de keyframes só serve aos quatro lados porque o destino é lido de
   --na-drawer-hidden, que cada lado define. Sem isso seriam oito conjuntos de keyframes, e a
   próxima mudança no movimento teria de acertar todos. */
.na-drawer[data-na-dialog-ready] { animation: na-drawer-in var(--na-drawer-motion); }
@keyframes na-drawer-in { from { transform: var(--na-drawer-hidden); } }
.na-drawer[data-na-dialog-ready][data-na-out] { animation: na-drawer-out var(--na-drawer-motion) forwards; }
@keyframes na-drawer-out { to { transform: var(--na-drawer-hidden); } }

/* Mais escuro do lado por onde a gaveta entrou: o degradê insinua a sombra que ela projeta
   sobre a página. */
.na-drawer::backdrop {
    background: linear-gradient(90deg, rgba(15, 23, 42, .30) 0%, rgba(15, 23, 42, .58) 100%);
    backdrop-filter: saturate(120%) blur(4px);
}
.na-drawer-left::backdrop { background: linear-gradient(270deg, rgba(15, 23, 42, .30) 0%, rgba(15, 23, 42, .58) 100%); }
.na-drawer-top::backdrop { background: linear-gradient(180deg, rgba(15, 23, 42, .58) 0%, rgba(15, 23, 42, .30) 100%); }
.na-drawer-bottom::backdrop { background: linear-gradient(0deg, rgba(15, 23, 42, .58) 0%, rgba(15, 23, 42, .30) 100%); }
/* O escurecimento acompanha o painel em vez de terminar antes dele: fundo e painel entram e
   saem no mesmo tempo. O valor está escrito à mão, e não em var(--na-drawer-motion), porque
   nem todo navegador herda custom property no ::backdrop — e ali um var() que não resolve
   invalida o shorthand inteiro, ou seja, o fundo apareceria de estalo. Se mexer na duração
   do painel, mexa aqui também. */
.na-drawer[data-na-dialog-ready]::backdrop { animation: na-backdrop-in .42s ease-out; }
.na-drawer[data-na-dialog-ready][data-na-out]::backdrop { animation: na-backdrop-out .42s ease-in forwards; }

/* Cabeçalho fixo (irmão que não encolhe), com um véu da cor da marca que dá a ele o papel de
   "topo do painel" sem precisar de outra cor de fundo. Precisa ser OPACO: o corpo rola por
   baixo dele. */
.na-drawer > .na-modal-head {
    flex: none; position: relative; z-index: 1;
    justify-content: space-between;
    margin: 0; padding: 1.15rem 1.35rem;
    background: linear-gradient(180deg,
        color-mix(in srgb, var(--na-primary) 7%, var(--na-surface-solid)),
        var(--na-surface-solid));
    border-bottom: 1px solid var(--na-line);
}
/* O título empurra o "fechar" para a borda: sem isto o X fica colado no texto, no meio do
   painel, em vez de no canto onde se procura por ele. */
.na-modal-head > .na-modal-title { flex: 1; min-width: 0; }
.na-modal-title h2 { margin: 0; }
.na-modal-title p { margin: .15rem 0 0; font-size: var(--na-fs-sm); color: var(--na-text-secondary); }

.na-drawer-body {
    flex: 1 1 auto;
    min-height: 0;              /* sem isto o filho flex não encolhe e o corpo NUNCA rola */
    overflow-y: auto;
    overscroll-behavior: contain;   /* chegar ao fim do painel não arrasta a lista atrás dele */
    padding: 1.25rem 1.35rem 0;
    /* Coluna flex para que o rodapé possa ser empurrado até a base — ver .na-actions abaixo. */
    display: flex; flex-direction: column;
    /* Sombra de rolagem — ver decisão (3) no topo da seção. A primeira camada é a cobertura
       que rola junto (local); a segunda é a sombra parada (scroll) que ela tapa enquanto o
       conteúdo está no topo. */
    background:
        linear-gradient(var(--na-surface-solid) 42%, transparent) top / 100% 1.5rem no-repeat local,
        radial-gradient(farthest-side at 50% 0, var(--na-drawer-shade), transparent) top / 100% .7rem no-repeat scroll;
}

/* Rodapé de ações ancorado no fim do painel — SEMPRE na base, tenha o conteúdo a altura que
   tiver. São dois mecanismos, e os dois são necessários:
   · `margin-top: auto` numa coluna flex empurra o rodapé para a base quando o conteúdo é CURTO.
     Só `sticky` não resolvia isso: sticky não move nada enquanto não há transbordo, então num
     formulário curto o rodapé parava logo depois do último campo, com meio painel vazio embaixo
     dele — a barra de ações no meio da tela, e não onde se procura por ela.
   · `sticky` continua valendo para o conteúdo LONGO: mantém a ação visível durante a rolagem
     sem tirá-la do <form>, então o submit segue nativo.

   O afastamento do último campo vira `padding-top` em vez de `margin-top`: com o margin em
   `auto`, uma margem fixa não teria como coexistir — `auto` absorve toda a folga e vira zero
   quando não há nenhuma. */
.na-drawer-body > form {
    flex: 1 0 auto;             /* estica: é a folga daqui que o `auto` do rodapé consome */
    display: flex; flex-direction: column;
    min-height: 0;
}
.na-drawer .na-actions {
    position: sticky; bottom: 0; z-index: 1;
    margin: auto -1.35rem 0; padding: 1.15rem 1.35rem;
    background: var(--na-surface-solid);
    border-top: 1px solid var(--na-line);
    box-shadow: 0 -18px 30px -22px var(--na-drawer-shade);
}

/* Alça — a mesma da shadcn/Vaul, sempre na borda por onde a gaveta entrou: barra vertical nas
   laterais, horizontal no topo e na base. Arrasta de verdade (na-dialog.js): puxar de volta
   para fora, além do limite, fecha. Uma alça que não arrasta é enfeite prometendo um gesto que
   não existe — se o script não estiver rodando, ela some.

   --na-drawer-axis é a única coisa que o script lê daqui, e diz eixo E sentido: 'x' puxa para a
   direita, '-x' para a esquerda, 'y' para baixo, '-y' para cima. Fica no CSS porque quem sabe
   de que lado a gaveta está é o CSS — inclusive quando a tela estreita a transforma em folha
   inferior, um caso que o script não tem como adivinhar sem repetir o ponto de quebra. */
.na-drawer-grip {
    display: none;
    position: absolute; z-index: 2;
    touch-action: none; cursor: grab;
}
.na-drawer-grip::before {
    content: ""; position: absolute; border-radius: 999px;
    background: var(--na-line-input);
    transition: background .15s ease;
}
.na-drawer-grip:hover::before { background: var(--na-text-secondary); }
.na-drawer-grip:active { cursor: grabbing; }
.na-drawer-grip:active::before { background: var(--na-primary); }
:root[data-na-modal] .na-drawer-grip { display: block; }

/* Alça vertical (gavetas laterais) — cabe dentro do padding lateral do corpo, então não invade
   o conteúdo. */
.na-drawer-right .na-drawer-grip,
.na-drawer-left .na-drawer-grip { top: 50%; translate: 0 -50%; width: 1.1rem; height: 4rem; }
.na-drawer-right .na-drawer-grip { --na-drawer-axis: x; left: 0; }
.na-drawer-left .na-drawer-grip { --na-drawer-axis: -x; right: 0; }
.na-drawer-right .na-drawer-grip::before { inset: 0 auto 0 .38rem; width: .28rem; }
.na-drawer-left .na-drawer-grip::before { inset: 0 .38rem 0 auto; width: .28rem; }

/* Alça horizontal (topo e base). No topo ela fica na borda DE BAIXO — que é por onde a gaveta
   entrou — e por isso o espaço extra vai no rodapé, não no cabeçalho. */
.na-drawer-top .na-drawer-grip,
.na-drawer-bottom .na-drawer-grip { left: 50%; translate: -50% 0; width: 4rem; height: 1.1rem; }
.na-drawer-bottom .na-drawer-grip { --na-drawer-axis: y; top: 0; }
.na-drawer-top .na-drawer-grip { --na-drawer-axis: -y; bottom: 0; }
.na-drawer-bottom .na-drawer-grip::before { inset: .38rem 0 auto; height: .28rem; }
.na-drawer-top .na-drawer-grip::before { inset: auto 0 .38rem; height: .28rem; }
/* Espaço para a alça não cair em cima do conteúdo. Em "bottom" ela fica sobre o cabeçalho, que
   é simples. Em "top" ela fica na borda de baixo, e aí O ALVO IMPORTA: o padding tem de ir no
   rodapé grudado, não no corpo. `sticky: bottom 0` para na borda do padding box do scroller —
   um padding-bottom no corpo empurra o rodapé para cima e abre uma fresta por onde o conteúdo
   rolando aparece por baixo dele. Só quando NÃO existe rodapé o corpo assume o espaço. */
.na-drawer-bottom > .na-modal-head { padding-top: 1.7rem; }
.na-drawer-top .na-actions { padding-bottom: 1.7rem; }
.na-drawer-top .na-drawer-body:not(:has(.na-actions)) { padding-bottom: 1.7rem; }

.na-modal-close {
    display: inline-flex; align-items: center; justify-content: center; flex: none;
    width: 34px; height: 34px; border-radius: 10px;
    color: var(--na-text-secondary); text-decoration: none;
    transition: background .16s ease, color .16s ease, rotate .2s cubic-bezier(.32, .72, 0, 1);
}
.na-modal-close:hover {
    background: var(--na-bg-grey); color: var(--na-text); text-decoration: none;
    rotate: 90deg;                         /* o X gira até virar um "+" — só um sinal de vida */
}
.na-modal-close:active { scale: .93; }
.na-modal-close:focus-visible { outline: none; box-shadow: var(--na-ring); }

/* ---- Gaveta lateral → folha inferior (telas estreitas) --------------------
   38rem coladas na direita numa tela de 360px são a tela inteira com um recorte torto. Abaixo
   de 640px as laterais viram folha inferior; "top" e "bottom" ficam onde estão, que já é o
   formato certo em qualquer largura.

   A troca é só de valores — as mesmas --na-sheet-* que o Side="bottom" usa. Nenhuma regra de
   caixa, animação ou sombra é reescrita aqui: o movimento sai de --na-drawer-hidden e o resto
   .na-drawer já consome. */
@media (max-width: 640px) {
    .na-drawer-right, .na-drawer-left {
        --na-drawer-hidden: var(--na-sheet-hidden);
        --na-drawer-place: var(--na-sheet-place);
        --na-drawer-w: var(--na-sheet-w);
        --na-drawer-h: var(--na-sheet-h);
        --na-drawer-max-h: var(--na-sheet-max-h);
        --na-drawer-radius: var(--na-sheet-radius);
        --na-drawer-rim: var(--na-sheet-rim);
        --na-drawer-cast: var(--na-sheet-cast);
    }
    .na-drawer-right::backdrop, .na-drawer-left::backdrop { background: rgba(15, 23, 42, .5); }
    /* A alça acompanha o lado novo: horizontal, no topo da folha. */
    .na-drawer-right .na-drawer-grip, .na-drawer-left .na-drawer-grip {
        --na-drawer-axis: y;
        top: 0; right: auto; left: 50%; translate: -50% 0;
        width: 4rem; height: 1.1rem;
    }
    .na-drawer-right .na-drawer-grip::before,
    .na-drawer-left .na-drawer-grip::before { inset: .38rem 0 auto; width: auto; height: .28rem; }
    .na-drawer-right > .na-modal-head, .na-drawer-left > .na-modal-head { padding-top: 1.7rem; }
}

@media (prefers-reduced-motion: reduce) {
    .na-drawer[data-na-dialog-ready],
    .na-drawer[data-na-dialog-ready][data-na-out],
    .na-drawer[data-na-dialog-ready]::backdrop,
    .na-drawer[data-na-dialog-ready][data-na-out]::backdrop { animation: none; }
    .na-drawer { transition: none; }
    .na-modal-close { transition: none; }
    .na-modal-close:hover { rotate: none; }
}

/* ---- Drawer sem JS -------------------------------------------------------
   Sem script o <dialog> nunca é aberto de verdade, então ele se desdobra na página (regra
   geral de .na-modal acima) — e aí nada de painel: altura de tela, rolagem própria, elementos
   grudados e sombras de rolagem viram estorvo numa caixa que é só mais um bloco do documento.
   Vem depois das media queries de propósito: é o último a falar. */
:root:not([data-na-modal]) .na-drawer {
    display: block; height: auto; max-height: none; overflow: visible;
    width: auto; margin: .9rem 0 0;
    border: 1px solid var(--na-line); border-radius: var(--na-radius);
    box-shadow: none; animation: none; transition: none;
}
:root:not([data-na-modal]) .na-drawer > .na-modal-head { margin: 0; border-radius: 0; }
:root:not([data-na-modal]) .na-drawer-body {
    overflow: visible; background: none; padding-bottom: 1.25rem;
}
:root:not([data-na-modal]) .na-drawer .na-actions {
    position: static; margin: 1.25rem 0 0; padding: 0;
    background: none; border-top: 0; box-shadow: none;
}

/* ---- Células de grade compartilhadas -------------------------------------
   Estes dois padrões não são de nenhuma tela: são "identidade do registro" (nome + código) e
   "ações da linha", e toda listagem do admin precisa dos dois. Nasceram como .na-plan-* no
   catálogo de planos; quando /admin/pagamentos virou DataGrid e precisou exatamente deles, o
   certo foi tirar o nome da tela do meio em vez de a segunda página passar a usar classes
   chamadas "plan". O nome e o código nunca quebram — "Parcelado Pro" partido em duas linhas era
   o sintoma mais visível da tabela espremida. */
.na-cell-id { display: flex; align-items: center; gap: .5rem; flex-wrap: wrap; }
.na-cell-id > strong { white-space: nowrap; }
.na-cell-id > code { white-space: nowrap; }
.na-cell-desc { font-size: var(--na-fs-xs); margin-top: .2rem; max-width: 34ch; }
/* Ações lado a lado: o <form> do excluir é bloco e empilhava sob o "Editar". */
.na-cell-actions { display: flex; align-items: center; justify-content: flex-end; gap: .75rem; }
.na-cell-actions > form { display: inline-flex; margin: 0; }
/* Contagem com a unidade ao lado ("3 assinaturas", "301 respostas"). Nasceu duplicada como
   .na-plan-use e .na-pay-use, com a mesma única declaração nas duas; a terceira tela que
   precisou dela — a lista de avaliações — foi o sinal de que o padrão é da grade, não da tela.
   Nunca quebra: "1 resposta" partido em duas linhas alarga a linha inteira da tabela. */
.na-cell-count { white-space: nowrap; }

/* ---- Catálogo de planos (o que é só dele) --------------------------------
   Colunas agrupadas por leitura: identidade, preço, uso. */
.na-plan-price > strong { font-size: var(--na-fs-md); white-space: nowrap; }
.na-plan-price-alt { display: flex; flex-direction: column; gap: .1rem; font-size: var(--na-fs-xs); margin-top: .15rem; }
.na-plan-pay { display: flex; align-items: center; gap: .35rem; flex-wrap: wrap; }
.na-plan-cap { font-size: var(--na-fs-xs); margin-top: .15rem; white-space: nowrap; }

/* ---- Meios de pagamento ---------------------------------------------------
   "Aceita" são dois selos que podem faltar; "—" no lugar de nada, senão a célula vazia parece
   dado faltando em vez de "não aceita nenhum dos dois". */
.na-pay-abilities { display: flex; align-items: center; gap: .35rem; flex-wrap: wrap; }

/* Live "minimum sample" readout under the sample fields. */
.na-sample-readout {
    display: flex; align-items: center; gap: .75rem;
    padding: .7rem .9rem; border-radius: 12px;
    background: var(--na-surface-solid); border: 1px solid var(--na-line);
}
:root[data-theme="dark"] .na-sample-readout { background: rgba(255,255,255,.04); }
.na-sample-ico { width: 1.35rem; height: 1.35rem; flex: 0 0 auto; color: var(--na-primary); }
.na-sample-line { margin: 0; font-size: var(--na-fs-sm); }
.na-sample-line strong { font-size: var(--na-fs-base); color: var(--na-text); }

/* ---- Listbox / Combobox (JS-enhanced native controls) -------------------- */
.na-lb { position: relative; }
/* native control kept for form submit + no-JS fallback, visually hidden once enhanced */
.na-lb-native { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; border: 0; clip: rect(0 0 0 0); overflow: hidden; opacity: 0; pointer-events: none; }
.na-cb .na-input { padding-right: 2.5rem; }

.na-lb-btn {
    width: 100%; min-height: 2.9rem; display: flex; align-items: center; gap: .5rem;
    padding: .72rem .9rem; border: 1px solid var(--na-line-input); border-radius: 12px;
    font: inherit; color: var(--na-text); background-color: var(--na-surface-solid);
    cursor: pointer; text-align: left;
    transition: border-color .15s ease, box-shadow .15s ease, background-color .15s ease;
}
:root[data-theme="dark"] .na-lb-btn { background-color: rgba(255,255,255,.04); }
.na-lb-btn:hover { border-color: color-mix(in srgb, var(--na-primary) 42%, var(--na-line-input)); }
.na-lb-btn:focus-visible { outline: none; border-color: var(--na-primary); box-shadow: var(--na-ring); }
.na-lb-btn[aria-expanded="true"] { border-color: var(--na-primary); box-shadow: var(--na-ring); }
.na-lb-value { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.na-lb-placeholder { color: var(--na-text-secondary); opacity: .75; }
.na-lb-chevron { flex: none; color: var(--na-text-secondary); transition: transform .2s ease; }
.na-lb-btn[aria-expanded="true"] .na-lb-chevron { transform: rotate(180deg); }

/* combobox caret sits over the input's right padding */
.na-cb-caret { position: absolute; right: .9rem; top: 50%; transform: translateY(-50%); color: var(--na-text-secondary); display: inline-flex; cursor: pointer; }
.na-cb .na-input[aria-expanded="true"] + .na-cb-caret .na-lb-chevron { transform: rotate(180deg); }

/* floating panel (portaled to <body>, position:fixed set by JS) */
.na-lb-panel {
    position: fixed; z-index: 1200; overflow-y: auto; padding: .3rem;
    background: var(--na-surface-solid); border: 1px solid var(--na-glass-border);
    border-radius: 14px; box-shadow: var(--na-shadow-lg);
    opacity: 0; transform: translateY(-.4rem) scale(.97); transform-origin: top center;
    transition: opacity .15s ease, transform .15s cubic-bezier(.16,1,.3,1);
}
.na-lb-panel[data-placement="top"] { transform-origin: bottom center; transform: translateY(.4rem) scale(.97); }
.na-lb-panel.na-lb-open { opacity: 1; transform: translateY(0) scale(1); }
.na-lb-panel ul { list-style: none; margin: 0; padding: 0; }
.na-lb-option {
    display: flex; align-items: center; gap: .5rem; padding: .55rem .55rem;
    border-radius: 9px; cursor: pointer; font-size: var(--na-fs-md); line-height: 1.3; color: var(--na-text);
    scroll-margin: .3rem;
}
.na-lb-option > span { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.na-lb-option.na-lb-opt-muted { color: var(--na-text-secondary); }
.na-lb-check { flex: none; color: var(--na-primary); opacity: 0; }
.na-lb-option[aria-selected="true"] { font-weight: 600; }
.na-lb-option[aria-selected="true"] .na-lb-check { opacity: 1; }
.na-lb-option.na-lb-active { background: color-mix(in srgb, var(--na-primary) 15%, transparent); color: var(--na-primary); }
.na-lb-empty { padding: .6rem .55rem; font-size: var(--na-fs-md); color: var(--na-text-secondary); }

/* ---- Feedback ------------------------------------------------------------ */
.na-alert { border-radius: 12px; padding: .8rem 1rem; font-size: var(--na-fs-md); border: 1px solid transparent; }
.na-alert-error {
    background: color-mix(in srgb, var(--na-error) 14%, transparent);
    border-color: color-mix(in srgb, var(--na-error) 40%, transparent);
    color: var(--na-error);
}
.na-alert-warning {
    background: color-mix(in srgb, var(--na-warning) 16%, transparent);
    border-color: color-mix(in srgb, var(--na-warning) 40%, transparent);
    color: var(--na-warning);
}

.na-chip {
    display: inline-flex; align-items: center; gap: .3rem; padding: .2rem .7rem;
    border-radius: 999px; font-size: var(--na-fs-2xs); font-weight: 600; color: #fff; letter-spacing: -.01em;
    /* Um selo é um rótulo, não um parágrafo. Sem isto "Pagamento pendente" quebrava em duas
       linhas dentro da coluna estreita de status e o raio de 999px transformava a pílula num
       borrão alto — a coluna alarga, que é o comportamento certo para um valor curto e fixo. */
    white-space: nowrap;
}
.na-chip-success { background: var(--na-success); }
.na-chip-warning { background: var(--na-warning); }
.na-chip-error { background: var(--na-error); }

/* Risk / progress bar */
.na-bar { height: 9px; border-radius: 999px; background: var(--na-line); overflow: hidden; }
.na-bar > span { display: block; height: 100%; border-radius: 999px; transition: width .5s cubic-bezier(.2,.8,.2,1); }
.na-bar-success > span { background: linear-gradient(90deg, #22c55e, #16a34a); }
.na-bar-warning > span { background: linear-gradient(90deg, #f59e0b, #d97706); }
.na-bar-error > span { background: linear-gradient(90deg, #f43f5e, #dc2626); }
.na-bar-primary > span { background: var(--na-grad); }

/* ---- Icons --------------------------------------------------------------- */
.na-ico { width: 1.25em; height: 1.25em; flex: none; vertical-align: -.15em; }

/* ---- Public form --------------------------------------------------------- */
.na-form-wrap { padding: 1.5rem 1.25rem 5rem; }
.na-form-msg { max-width: 480px; margin: 3rem auto 0; }
.na-form-msg h1 { font-size: var(--na-fs-2xl); margin: .5rem 0; }
.na-result-ico { width: 72px; height: 72px; margin: 0 auto; border-radius: 50%; display: flex; align-items: center; justify-content: center; color: #fff; }
.na-result-ico .na-ico { width: 36px; height: 36px; }
.na-ok { background: linear-gradient(135deg, #22c55e, #16a34a); box-shadow: 0 12px 34px rgba(22,163,74,.4); }

.na-form { background: var(--na-surface); border: 1px solid var(--na-glass-border); border-radius: var(--na-radius-lg); overflow: hidden; box-shadow: var(--na-shadow-lg); backdrop-filter: var(--na-blur); -webkit-backdrop-filter: var(--na-blur); }
.na-form-head { background: var(--na-grad); color: #fff; padding: 1.8rem; }
/* Light pill behind the logo so a coloured/transparent mark reads on every palette's gradient. */
.na-form-logo { display: block; max-height: 52px; max-width: 200px; object-fit: contain; margin: 0 0 .9rem; background: rgba(255, 255, 255, .92); border-radius: 8px; padding: .35rem .5rem; }
.na-form-head h1 { color: #fff; font-size: var(--na-fs-xl); margin: 0; }
.na-form-head p { margin: .4rem 0 0; font-size: var(--na-fs-md); color: rgba(255,255,255,.9); }
.na-form-section { padding: 1.6rem; border-top: 1px solid var(--na-line); }
.na-form-section:first-of-type { border-top: 0; }
.na-form-section > h2 { font-size: var(--na-fs-lg); margin: 0 0 1rem; }
.na-form-grid { display: grid; gap: 1rem; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); }
.na-form-grid .na-field + .na-field { margin-top: 0; }
/* Cada linha do formulário é um .na-form-grid próprio, e o `gap` só separa colunas DENTRO da
   grade — entre uma grade e a seguinte não havia nada. Resultado: a dica de um campo encostava
   no rótulo do campo de baixo ("Obrigatório · referência do MRR/ARR" parecia legenda do "Valor
   mensal"). Esta é a margem que faltava entre as linhas. */
.na-form-grid + .na-form-grid { margin-top: 1rem; }
.na-field + .na-form-grid, .na-form-grid + .na-field { margin-top: 1rem; }

.na-q { border: 1px solid var(--na-line); border-radius: var(--na-radius); padding: 1.1rem; margin: 0 0 1rem; background: var(--na-bg-grey); }
.na-q:last-child { margin-bottom: 0; }
/* <legend> defaults to overlaying the fieldset's top border, so a wrapping question would
   "poke out" of the rounded card. Float it to width:100% → it drops into normal flow inside
   the padding, and the border renders unbroken. Following content clears it. */
.na-q > legend { font-weight: 600; font-size: var(--na-fs-md); padding: 0; float: left; width: 100%; line-height: 1.35; }

/* Segmented 1–5 scale (native radios; label = button) */
.na-scale { display: flex; gap: .5rem; margin-top: .7rem; clear: left; }
.na-scale-radio { position: absolute; opacity: 0; width: 1px; height: 1px; pointer-events: none; }
.na-scale-btn {
    flex: 1; text-align: center; cursor: pointer; user-select: none; padding: .7rem 0;
    border: 1px solid var(--na-line-input); border-radius: 12px; font-weight: 700;
    color: var(--na-text-secondary); background: var(--na-surface-solid);
    transition: transform .12s ease, background .12s ease, border-color .12s ease, color .12s ease, box-shadow .12s ease;
}
:root[data-theme="dark"] .na-scale-btn { background: rgba(255,255,255,.04); }
.na-scale-btn:hover { border-color: var(--na-primary); color: var(--na-primary); transform: translateY(-1px); }
.na-scale-radio:checked + .na-scale-btn { background: var(--na-grad); border-color: transparent; color: #fff; box-shadow: var(--na-glow); }
.na-scale-radio:focus-visible + .na-scale-btn { box-shadow: var(--na-ring); }
.na-scale-ends { display: flex; justify-content: space-between; margin-top: .45rem; font-size: var(--na-fs-xs); }

.na-consent { display: flex; gap: .6rem; align-items: flex-start; font-size: var(--na-fs-md); line-height: 1.4; cursor: pointer; }
.na-consent input { margin-top: .2rem; width: 18px; height: 18px; flex: none; accent-color: var(--na-primary); }

/* ---- Crédito do instrumento (InstrumentCredit) ----------------------------
   O COPSOQ é cedido sob CC BY-NC-ND 4.0: a atribuição é condição de uso, então o bloco é
   discreto mas nunca escondido — sem `display:none`, sem cor abaixo do contraste mínimo. */
.na-credit {
    max-width: 640px; margin: 2.5rem auto 0; padding-top: 1rem;
    border-top: 1px solid var(--na-line);
    font-size: var(--na-fs-xs); line-height: 1.5; color: var(--na-text-secondary);
}
.na-credit p { margin: 0; }
.na-credit-ref { margin-top: .5rem !important; text-indent: -1em; padding-left: 1em; }
.na-credit-links { margin-top: .6rem !important; display: flex; flex-wrap: wrap; gap: 1rem; }
.na-credit-links a { color: inherit; text-decoration: underline; text-underline-offset: 2px; }
.na-credit-links a:hover { color: var(--na-primary); }
/* Dentro de um painel (metodologia) o bloco já tem moldura própria: sem linha nem centragem. */
.na-credit-full { max-width: none; margin: 0; }

/* ---- Utilities ----------------------------------------------------------- */
.mt-1 { margin-top: .5rem; } .mt-2 { margin-top: 1rem; } .mt-3 { margin-top: 1.5rem; } .mt-4 { margin-top: 2rem; }
.mb-2 { margin-bottom: 1rem; } .mb-3 { margin-bottom: 1.5rem; }
.na-r { text-align: right; }

/* ==========================================================================
   Atomic components
   ========================================================================== */

/* Badge atom */
.na-badge-success { background: linear-gradient(135deg, #22c55e, #16a34a); color: #fff; }
.na-badge-warning { background: linear-gradient(135deg, #f59e0b, #d97706); color: #fff; }
.na-badge-error   { background: linear-gradient(135deg, #f43f5e, #dc2626); color: #fff; }
.na-badge-primary { background: var(--na-grad); color: #fff; }
.na-badge-info    { background: linear-gradient(135deg, #38bdf8, #0ea5e9); color: #fff; }
.na-badge-neutral { background: var(--na-line); color: var(--na-text-secondary); }

/* InfoTip atom — "?" trigger + native-popover explanation bubble.
   Placement is done by js/na-tips.js; with no JS the UA centres the popover in the viewport,
   which is why nothing here may hide the bubble unconditionally. */
.na-tip { display: inline-flex; vertical-align: middle; line-height: 0; }
/* HintedLabel molecule — keeps the trigger on the same line as the last word of its label, so a
   lone "?" can never end up stranded on a line of its own. */
.na-hinted-tail { white-space: nowrap; }
.na-tip-btn {
    display: inline-flex; align-items: center; justify-content: center;
    width: 1.15rem; height: 1.15rem; padding: 0; margin-inline-start: .3rem;
    border: 0; border-radius: 50%; cursor: help;
    background: transparent; color: var(--na-text-secondary);
    opacity: .7; transition: opacity .15s ease, color .15s ease, background .15s ease;
}
.na-tip-btn .na-ico { width: 1.05rem; height: 1.05rem; }
.na-tip-btn:hover { opacity: 1; color: var(--na-primary); background: var(--na-primary-hover); }
.na-tip-btn:focus-visible { outline: none; opacity: 1; box-shadow: var(--na-ring); }
/* Triggers sitting on the gradient header band, where the muted token is unreadable. */
.na-tip-btn-onbrand { color: rgba(255,255,255,.85); }
.na-tip-btn-onbrand:hover { color: #fff; background: rgba(255,255,255,.22); }
/* Inside a coloured heatmap cell / on a StatCard's gradient tile the text colour is inherited. */
.na-tip-btn-inherit { color: inherit; }
.na-tip-btn-inherit:hover { color: inherit; background: rgba(127,127,127,.25); }

/* The popover is a bare positioning shell (overflow visible so the arrow can stick out);
   .na-tip-body carries the card chrome and does the scrolling. */
.na-tip-pop:popover-open {
    display: block; position: fixed;                  /* JS overwrites left/top with real values */
    max-width: min(30rem, calc(100vw - 2rem));
    padding: 0; border: 0; background: none; overflow: visible;
    animation: na-tip-in .14s ease-out;
    /* A popover inherits from its DOM parent, not from where it paints — and these tips live in
       uppercased/nowrap/bold table headers. Reset everything that would leak in. */
    font: 400 .86rem/1.55 var(--na-font); color: var(--na-text);
    text-transform: none; letter-spacing: normal; white-space: normal; text-align: left;
    font-variant-numeric: normal;
}
.na-tip-body {
    display: block; max-height: calc(100vh - 2rem); overflow: auto;
    padding: .8rem .9rem; border: 1px solid var(--na-glass-border); border-radius: var(--na-radius);
    background: var(--na-surface-solid); box-shadow: var(--na-shadow-lg);
}
/* JS hides the bubble for the frame between "shown" and "positioned" (see na-tips.ts) — gated on
   the flag the script sets, so a no-JS page never hides it. */
[data-na-tips="js"] .na-tip-pop:popover-open { visibility: hidden; }
.na-tip-title { display: block; margin-bottom: .25rem; font-size: var(--na-fs-sm); font-weight: 700; }
.na-tip-text { display: block; color: var(--na-text-secondary); }
.na-tip-text strong, .na-tip-text em { color: var(--na-text); }
.na-tip-pop::after {                                   /* arrow, x set by --na-tip-arrow */
    content: ""; position: absolute; left: var(--na-tip-arrow, 50%); width: 9px; height: 9px;
    margin-left: -5px; background: var(--na-surface-solid);
    border: 1px solid var(--na-glass-border); transform: rotate(45deg);
}
.na-tip-pop[data-na-tip-side="below"]::after { top: -5px; border-width: 1px 0 0 1px; }
.na-tip-pop[data-na-tip-side="above"]::after { bottom: -5px; border-width: 0 1px 1px 0; }
@keyframes na-tip-in { from { opacity: 0; transform: translateY(-3px); } }
/* Browsers without the Popover API would otherwise render the bubble inline, always visible. */
@supports not selector(:popover-open) { .na-tip-pop { display: none; } }

/* PlanCard molecule */
.na-plans { display: grid; gap: 1.5rem; max-width: 820px; margin-inline: auto; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); }
.na-plan { position: relative; background: var(--na-surface); border: 1px solid var(--na-glass-border); border-radius: var(--na-radius-lg); padding: 2rem; display: flex; flex-direction: column; box-shadow: var(--na-shadow); backdrop-filter: var(--na-blur); -webkit-backdrop-filter: var(--na-blur); transition: transform .18s ease, box-shadow .18s ease; }
.na-plan:hover { transform: translateY(-4px); box-shadow: var(--na-shadow-lg); }
.na-plan-highlight { border: 1.5px solid transparent; background:
    linear-gradient(var(--na-surface-solid), var(--na-surface-solid)) padding-box,
    var(--na-grad) border-box; }
.na-plan-tag { position: absolute; top: -.8rem; right: 1.5rem; box-shadow: var(--na-glow); border-radius: 999px; }
.na-plan h2 { font-size: var(--na-fs-xl); margin: 0; }
.na-plan-price { margin: .75rem 0 0; display: flex; align-items: baseline; gap: .35rem; }
.na-plan-price strong { font-size: var(--na-fs-4xl); background: var(--na-grad); -webkit-background-clip: text; background-clip: text; color: transparent; }
.na-plan-list { list-style: none; padding: 0; margin: 1.25rem 0 0; flex: 1; display: flex; flex-direction: column; gap: .65rem; }
.na-plan-list li { display: flex; align-items: center; gap: .5rem; font-size: var(--na-fs-md); }
.na-plan-list .na-ico { color: var(--na-success); width: 1.1em; height: 1.1em; }

/* StatCard molecule */
.na-statcard { display: flex; align-items: center; gap: .95rem; background: var(--na-surface); border: 1px solid var(--na-glass-border); border-radius: var(--na-radius); padding: 1.1rem 1.2rem; box-shadow: var(--na-shadow); backdrop-filter: var(--na-blur); -webkit-backdrop-filter: var(--na-blur); transition: transform .18s ease, box-shadow .18s ease; }
.na-statcard:hover { transform: translateY(-3px); box-shadow: var(--na-shadow-lg); }
.na-statcard-ico { width: 46px; height: 46px; flex: none; border-radius: 13px; display: flex; align-items: center; justify-content: center; }
.na-statcard-primary { background: var(--na-grad); color: #fff; box-shadow: var(--na-glow); }
.na-statcard-success { background: linear-gradient(135deg, #22c55e, #16a34a); color: #fff; }
.na-statcard-warning { background: linear-gradient(135deg, #f59e0b, #d97706); color: #fff; }
.na-statcard-info { background: linear-gradient(135deg, #38bdf8, #0ea5e9); color: #fff; }
.na-statcard-accent { background: linear-gradient(135deg, #8b5cf6, #db2777); color: #fff; }
.na-statcard-body { display: flex; flex-direction: column; min-width: 0; }
/* The help trigger is pinned to the card's top-right rather than trailing the label: inline, a
   long label pushed the lone "?" onto a line of its own. `position: relative` on the card gives
   it its containing block. */
.na-statcard { position: relative; }
.na-statcard > .na-tip { position: absolute; top: .55rem; right: .6rem; margin: 0; }
.na-statcard > .na-tip .na-tip-btn { margin-inline-start: 0; }
.na-statcard-body strong { font-size: var(--na-fs-2xl); line-height: 1.1; letter-spacing: -.02em; }
.na-statcard-body span { font-size: var(--na-fs-sm); }
/* Qualificador opcional ("1 ativa", "60 por ciclo"). Recuado do rótulo em peso e tamanho para
   não disputar com ele — é contexto do número, não um segundo rótulo. */
.na-statcard-sub { font-size: var(--na-fs-2xs); color: var(--na-text-secondary); opacity: .85; margin-top: .15rem; }

/* Stat molecule */
.na-stat { display: flex; flex-direction: column; gap: .15rem; background: var(--na-surface); border: 1px solid var(--na-glass-border); border-radius: var(--na-radius); padding: 1.2rem 1.35rem; box-shadow: var(--na-shadow); backdrop-filter: var(--na-blur); -webkit-backdrop-filter: var(--na-blur); }
.na-stat-accent { background: var(--na-grad); border-color: transparent; color: #fff; box-shadow: var(--na-glow); }
.na-stat-label { font-size: var(--na-fs-sm); }
.na-stat-accent .na-stat-label { color: rgba(255,255,255,.85); }
.na-stat-value { font-size: var(--na-fs-3xl); line-height: 1.15; letter-spacing: -.02em; font-weight: 700; }
.na-stat-accent .na-stat-value { color: #fff; }

/* Back-office page header + stat row */
.na-page-head { display: flex; flex-wrap: wrap; gap: 1rem; align-items: center; justify-content: space-between; }
.na-page-head h1 { font-size: var(--na-fs-4xl); margin: 0; letter-spacing: -.03em; }
/* O bloco de texto encolhe; a ação não. Sem isto o <p> de apoio segurava sua largura inteira e
   empurrava o botão para a linha de baixo, encostado à esquerda — o cabeçalho parecia de outro
   layout, e só em algumas telas, porque dependia de o subtítulo ser alguns caracteres mais longo
   que o da tela ao lado. Deixar quebrar era o comportamento certo no celular e o errado aqui:
   agora o texto reflui e a ação fica onde se procura por ela. */
.na-page-head > div:first-child { flex: 1 1 22rem; min-width: 0; }
.na-page-head > .na-btn,
.na-page-head > .na-detail-actions { flex: 0 0 auto; }
.na-stats { display: grid; gap: 1rem; grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); }
.na-empty-state { padding: 3.5rem 1.5rem; border-style: dashed; }
.na-empty-state h2 { font-size: var(--na-fs-xl); margin: 0 0 .25rem; }

/* Table */
.na-table { width: 100%; border-collapse: collapse; font-size: var(--na-fs-md); }
.na-table th, .na-table td { padding: .95rem 1.1rem; text-align: left; border-bottom: 1px solid var(--na-line); }
.na-table th { font-size: var(--na-fs-2xs); text-transform: uppercase; letter-spacing: .06em; color: var(--na-text-secondary); background: var(--na-bg-grey); }
.na-table tbody tr { transition: background .12s ease; }
.na-table tbody tr:last-child td { border-bottom: 0; }
.na-table tbody tr:hover { background: var(--na-primary-hover); }
.na-row-link { font-weight: 600; color: var(--na-text); }
.na-row-link:hover { color: var(--na-primary); }
.na-link { color: var(--na-primary); font-weight: 600; white-space: nowrap; }
/* Destructive action rendered as a link (inside a table row, next to "Editar"). A <button> is
   used so it can submit its form; these resets strip the native button chrome. */
.na-link-danger { color: var(--na-error); font-weight: 600; white-space: nowrap;
    background: none; border: 0; padding: 0; margin-left: .75rem; cursor: pointer; font-size: inherit;
    font-family: inherit; }
.na-link-danger:hover { text-decoration: underline; }

/* App / admin shells — app-like layout */
.na-app { display: flex; min-height: 100vh; }
.na-side {
    width: 260px; flex: none; padding: 1.4rem 1rem;
    display: flex; flex-direction: column; gap: 1.4rem;
    background: var(--na-surface); border-right: 1px solid var(--na-line);
    backdrop-filter: var(--na-blur); -webkit-backdrop-filter: var(--na-blur);
    position: sticky; top: 0; height: 100vh; z-index: 30;   /* z-index: rail tooltips overlay the page */
    transition: width .22s cubic-bezier(.2, .8, .2, 1), padding .22s cubic-bezier(.2, .8, .2, 1);
}
.na-side .na-brand { padding: 0 .5rem; }

/* Header row: brand + collapse toggle (the toggle is a desktop-only affordance). */
.na-side-head { display: flex; align-items: center; gap: .5rem; }
.na-side-head .na-brand { margin-right: auto; min-width: 0; overflow: hidden; white-space: nowrap; }
.na-side-toggle {
    display: inline-flex; align-items: center; justify-content: center; flex: none;
    width: 34px; height: 34px; border-radius: 10px; cursor: pointer;
    border: 1px solid var(--na-line); background: var(--na-surface); color: var(--na-text-secondary);
    transition: color .15s ease, border-color .15s ease, background .15s ease;
}
.na-side-toggle:hover { color: var(--na-primary); border-color: var(--na-primary); background: var(--na-primary-hover); }
.na-side-toggle .na-ico { width: 1.15em; height: 1.15em; transition: transform .25s ease; }
/* Tint layered OVER the (possibly solid) surface, so opaque themes stay opaque. */
.na-side-admin { background: linear-gradient(180deg, var(--na-primary-hover), transparent 42%), var(--na-surface); }
.na-side nav { display: flex; flex-direction: column; gap: .3rem; }
.na-side nav a {
    display: flex; align-items: center; gap: .7rem; padding: .7rem .8rem; border-radius: 12px;
    color: var(--na-text-secondary); font-weight: 600; letter-spacing: -.01em;
    transition: background .14s ease, color .14s ease, transform .14s ease;
}
.na-side nav a .na-ico { width: 1.2em; height: 1.2em; }
.na-side nav a:hover { background: var(--na-primary-hover); color: var(--na-primary); text-decoration: none; }
.na-side nav a.active { background: var(--na-grad); color: #fff; box-shadow: var(--na-glow); }
.na-side-foot { margin-top: auto; }
.na-app-main { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.na-app-body { flex: 1; padding: 2.5rem 0; }

/* Collapsible drawer plumbing (CSS-only, checkbox hack) — inert on desktop. */
.na-nav-toggle { position: absolute; opacity: 0; pointer-events: none; }
.na-appbar { display: none; }
.na-nav-overlay { display: none; }
.na-nav-hamburger {
    display: inline-flex; flex-direction: column; justify-content: center; gap: 5px;
    width: 44px; height: 44px; padding: 11px; border-radius: 12px; cursor: pointer; flex: none;
    border: 1px solid var(--na-line); background: var(--na-surface-solid);
}
.na-nav-hamburger span { display: block; height: 2px; border-radius: 2px; background: var(--na-text); transition: transform .22s ease, opacity .22s ease; }

/* ---- Collapsed icon rail (desktop only; the mobile drawer ignores data-nav) --------------- */
@media (min-width: 1025px) {
    :root[data-nav="collapsed"] .na-side { width: 76px; padding-left: .6rem; padding-right: .6rem; }
    /* Header: hide the wordmark, centre + flip the toggle so it now reads "expand". */
    :root[data-nav="collapsed"] .na-side-head { justify-content: center; }
    :root[data-nav="collapsed"] .na-side-head .na-brand { display: none; }
    :root[data-nav="collapsed"] .na-side-toggle .na-ico { transform: rotate(180deg); }
    /* Nav: centre the glyph; the label becomes a hover tooltip (see below). */
    :root[data-nav="collapsed"] .na-side nav a { position: relative; justify-content: center; padding-left: 0; padding-right: 0; gap: 0; }
    /* Foot: avatar-only chip, stacked icon buttons. */
    :root[data-nav="collapsed"] .na-userchip { position: relative; justify-content: center; padding: .5rem; }
    :root[data-nav="collapsed"] .na-side-foot-row { flex-direction: column; align-items: stretch; }
    :root[data-nav="collapsed"] .na-side-foot-row form { flex: none; }
    :root[data-nav="collapsed"] .na-side-foot-row .na-btn { position: relative; padding-left: 0; padding-right: 0; }
    :root[data-nav="collapsed"] .na-side-foot-row .na-btn .na-ico { width: 20px; height: 20px; }
    /* The picker's <summary> is an inline-flex box with a fixed 42px width: inside the stretched
       column it lands on a line box and sits flush LEFT, off the rail's centre axis. Centre the
       box rather than stretching it — the button keeps its own size (it is a 42px square icon
       control, not a full-width action like "Sair") and still shares the rail's axis. */
    :root[data-nav="collapsed"] .na-side-foot-row .na-themepicker { display: flex; justify-content: center; }

    /* ---- Rail tooltips -------------------------------------------------------------------
       The label itself floats out of the rail on hover/focus instead of being display:none —
       one source of truth for the text, and the link keeps its accessible name. */
    :root[data-nav="collapsed"] .na-side nav a > span,
    :root[data-nav="collapsed"] .na-side-foot-row .na-btn > span,
    :root[data-nav="collapsed"] .na-userchip-body {
        position: absolute; left: calc(100% + .55rem); top: 50%;
        transform: translateY(-50%) translateX(-.25rem);
        /* opacity (not visibility/display) so the label stays in the accessibility tree — it is
           still the link's accessible name while the rail shows only the glyph. */
        z-index: 5; pointer-events: none; opacity: 0;
        padding: .45rem .65rem; border-radius: 10px; text-align: left; white-space: nowrap;
        font-size: var(--na-fs-xs); font-weight: 600; line-height: 1.35; letter-spacing: -.01em;
        color: var(--na-text); background: var(--na-surface-solid);
        border: 1px solid var(--na-glass-border); box-shadow: var(--na-shadow-lg);
        transition: opacity .14s ease, transform .16s cubic-bezier(.16, 1, .3, 1);
    }
    /* Little arrow pointing back at the glyph. */
    :root[data-nav="collapsed"] .na-side nav a > span::after,
    :root[data-nav="collapsed"] .na-side-foot-row .na-btn > span::after,
    :root[data-nav="collapsed"] .na-userchip-body::after {
        content: ""; position: absolute; right: 100%; top: 50%; transform: translateY(-50%);
        border: 5px solid transparent; border-right-color: var(--na-surface-solid);
    }
    /* The user chip carries two lines (name + tenant), so it stacks instead of centring. */
    :root[data-nav="collapsed"] .na-userchip-body { display: flex; }
    :root[data-nav="collapsed"] .na-userchip-body span { font-size: var(--na-fs-2xs); font-weight: 500; }

    :root[data-nav="collapsed"] .na-side nav a:hover > span,
    :root[data-nav="collapsed"] .na-side nav a:focus-visible > span,
    :root[data-nav="collapsed"] .na-side-foot-row .na-btn:hover > span,
    :root[data-nav="collapsed"] .na-side-foot-row .na-btn:focus-visible > span,
    :root[data-nav="collapsed"] .na-userchip:hover .na-userchip-body {
        opacity: 1; transform: translateY(-50%) translateX(0);
    }
}

@media (min-width: 1025px) and (prefers-reduced-motion: reduce) {
    :root[data-nav="collapsed"] .na-side nav a > span,
    :root[data-nav="collapsed"] .na-side-foot-row .na-btn > span,
    :root[data-nav="collapsed"] .na-userchip-body { transition: none; transform: translateY(-50%); }
}

/* Results dashboard organism */
/* Cabeçalho da dimensão sobre a grade de cartões. Mesma leitura do heatmap — rótulo, contagem e o
   pior fator — para as duas telas do mesmo ciclo não parecerem dois produtos. */
.na-results-dim { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem .7rem;
    margin: 1.4rem 0 .7rem; }
.na-results-dim:first-child { margin-top: 0; }
.na-results-dim-label { text-transform: uppercase; letter-spacing: .06em; font-size: var(--na-fs-xs);
    color: var(--na-text-secondary); }
.na-results-dim-count { font-size: var(--na-fs-xs); }
.na-results-dim-worst { display: inline-flex; align-items: baseline; gap: .1rem; margin-left: auto;
    padding: .12rem .5rem; border-radius: 999px; font-size: var(--na-fs-2xs); font-weight: 700;
    white-space: nowrap; }

.na-results { display: grid; gap: 1.1rem; grid-template-columns: repeat(auto-fit, minmax(270px, 1fr)); }
.na-results .na-bar { margin: .7rem 0; }
.na-dim-head { display: flex; align-items: center; justify-content: space-between; gap: .5rem; }
.na-dim-foot { display: flex; align-items: center; justify-content: space-between; }

/* Assessment detail header */
.na-detail-head { display: flex; flex-wrap: wrap; gap: 1rem; align-items: flex-start; justify-content: space-between; }
.na-detail-head h1 { font-size: var(--na-fs-3xl); margin: .3rem 0 0; letter-spacing: -.03em; }
.na-detail-actions { display: flex; flex-wrap: wrap; gap: .5rem; align-items: center; }
/* An action and its <InfoTip> must travel as ONE flex item — left loose in the row, the trigger
   became a sibling of every button and drifted to the end of the line, detached from what it
   explains. Same rule as HintedLabel, applied to a control instead of a label. */
.na-action { display: inline-flex; align-items: center; gap: .1rem; }

/* A gated action: the button is present but inert, so the toolbar keeps its shape and the
   reason lives next to it (the sample panel) instead of behind a click that does nothing. */
.na-btn[disabled] { opacity: .5; cursor: not-allowed; box-shadow: none; transform: none; }
.na-btn[disabled]:hover { transform: none; box-shadow: none; }

/* ---- Sample-target panel (assessment detail) ----------------------------- */
.na-sample-panel { display: grid; gap: .8rem; }
.na-sample-head { display: flex; align-items: baseline; justify-content: space-between; gap: .6rem 1.2rem; flex-wrap: wrap; }
.na-sample-head h3 { font-size: var(--na-fs-lg); margin: 0; }
.na-sample-count { font-size: var(--na-fs-2xl); font-weight: 700; letter-spacing: -.02em; line-height: 1.1; }
.na-sample-count small { font-size: var(--na-fs-md); font-weight: 600; color: var(--na-text-secondary); }
.na-sample-meta { display: flex; flex-wrap: wrap; gap: .25rem 1.2rem; font-size: var(--na-fs-sm); color: var(--na-text-secondary); margin: 0; }
.na-sample-meta b { color: var(--na-text); font-weight: 600; }
.na-sample-gate { display: flex; align-items: flex-start; gap: .6rem; font-size: var(--na-fs-sm); }
.na-sample-gate .na-ico { width: 1.1rem; height: 1.1rem; flex: 0 0 auto; margin-top: .1rem; }
.na-sample-gate-warn .na-ico { color: var(--na-warning); }
.na-sample-gate-ok .na-ico { color: var(--na-success); }
.na-sample-gate p { margin: 0; }
.na-sample-override { margin-top: .55rem; }
.na-sample-locked { margin: .5rem 0 0; font-size: var(--na-fs-sm); color: var(--na-text-secondary); }

/* Collection share organism */
.na-share { display: grid; gap: 1.5rem; grid-template-columns: 2fr 1fr; align-items: stretch; }
.na-share h3 { font-size: var(--na-fs-lg); margin: 0; }
.na-share img { border-radius: 14px; box-shadow: var(--na-shadow); }

/* ---- Responsive: tablet & below → hamburger drawer ----------------------- */
@media (max-width: 1024px) {
    /* Top app bar with the hamburger. */
    .na-appbar {
        display: flex; align-items: center; gap: .9rem;
        position: sticky; top: 0; z-index: 40; padding: .65rem 1.1rem;
        background: var(--na-surface); border-bottom: 1px solid var(--na-line);
        backdrop-filter: var(--na-blur); -webkit-backdrop-filter: var(--na-blur);
    }

    /* Sidebar becomes an off-canvas drawer, hidden until toggled. */
    .na-side {
        position: fixed; top: 0; left: 0; height: 100vh; width: 284px; z-index: 60;
        transform: translateX(-100%); transition: transform .28s cubic-bezier(.2, .8, .2, 1);
        box-shadow: none;
    }
    .na-nav-toggle:checked ~ .na-side { transform: translateX(0); box-shadow: var(--na-shadow-lg); }

    /* Collapse is a desktop affordance; in the drawer the rail is always full-width. */
    .na-side-toggle { display: none; }

    /* Dimmed backdrop; tapping it (a <label>) closes the drawer. */
    .na-nav-toggle:checked ~ .na-nav-overlay {
        display: block; position: fixed; inset: 0; z-index: 55;
        background: rgba(10, 6, 25, .5); backdrop-filter: blur(2px); -webkit-backdrop-filter: blur(2px);
    }

    /* Hamburger → X while open. */
    .na-nav-toggle:checked ~ .na-app-main .na-nav-hamburger span:nth-child(1) { transform: translateY(7px) rotate(45deg); }
    .na-nav-toggle:checked ~ .na-app-main .na-nav-hamburger span:nth-child(2) { opacity: 0; }
    .na-nav-toggle:checked ~ .na-app-main .na-nav-hamburger span:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }

    .na-app-body { padding: 1.75rem 0 2.5rem; }
    .na-share { grid-template-columns: 1fr; }
}

/* ==========================================================================
   Polish & extras (theme toggle, user chip, focus, scrollbar, refinements)
   ========================================================================== */

/* Theme toggle — moon in light, sun in dark. */
.na-theme-toggle {
    display: inline-flex; align-items: center; justify-content: center; flex: none;
    width: 42px; height: 42px; border-radius: 12px; cursor: pointer;
    border: 1px solid var(--na-line); background: var(--na-surface); color: var(--na-text-secondary);
    backdrop-filter: var(--na-blur); -webkit-backdrop-filter: var(--na-blur);
    transition: color .15s ease, border-color .15s ease, background .15s ease, transform .15s ease;
}
.na-theme-toggle:hover { color: var(--na-primary); border-color: var(--na-primary); background: var(--na-primary-hover); transform: translateY(-1px); }
.na-theme-toggle:active { transform: scale(.94); }
.na-theme-sun { display: none; }
.na-theme-moon { display: inline-block; }
:root[data-theme="dark"] .na-theme-sun { display: inline-block; }
:root[data-theme="dark"] .na-theme-moon { display: none; }

/* User chip (sidebar). */
.na-userchip { display: flex; align-items: center; gap: .7rem; padding: .6rem; border-radius: 14px; background: var(--na-bg-grey); margin-bottom: .75rem; }
.na-avatar {
    width: 40px; height: 40px; flex: none; border-radius: 12px; display: flex; align-items: center; justify-content: center;
    font-weight: 700; font-size: var(--na-fs-md); letter-spacing: -.02em; color: #fff; background: var(--na-grad); box-shadow: var(--na-glow);
}
.na-userchip-body { min-width: 0; display: flex; flex-direction: column; }
.na-userchip-body strong { font-size: var(--na-fs-md); line-height: 1.25; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.na-userchip-body span { font-size: var(--na-fs-xs); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.na-side-foot-row { display: flex; align-items: center; gap: .5rem; }
.na-appbar-spacer { flex: 1; }

/* Empty-state icon medallion. */
.na-empty-ico { width: 66px; height: 66px; margin: 0 auto 1rem; border-radius: 18px; display: flex; align-items: center; justify-content: center; background: var(--na-primary-hover); color: var(--na-primary); }
.na-empty-ico .na-ico { width: 30px; height: 30px; }

/* Keyboard focus ring (mouse clicks stay clean).

   tabindex="-1" is excluded on purpose. It means "focusable by script, never by Tab", and the
   navegação enhanced do Blazor uses exactly that: after every page load it stamps tabindex="-1" on
   the <h1> and focuses it so screen readers announce the new page. With [tabindex] matching
   unqualified, that programmatic focus painted a 3px purple ring around the whole heading of every
   single page in the app — a keyboard affordance on something the keyboard can never reach. */
:where(a, button, .na-nav-hamburger, .na-input, .na-select, textarea, [tabindex]):not([tabindex="-1"]):focus-visible { outline: none; box-shadow: var(--na-ring); }

/* E o alvo programático não pode cair no outline padrão do navegador tampouco: excluí-lo da regra
   acima o excluiu também do `outline: none` dela, o que só trocou o anel roxo pelo anel do Chrome.
   Um elemento que existe para receber foco por script nunca deve desenhar affordance de teclado. */
[tabindex="-1"]:focus { outline: none; }

/* Tabular figures for numbers. */
.na-statcard-body strong, .na-stat-value, .na-plan-price strong, .na-table td { font-variant-numeric: tabular-nums; }

/* Legibility for gradient badges. */
.na-badge-success, .na-badge-warning, .na-badge-error, .na-badge-primary, .na-badge-info { text-shadow: 0 1px 1px rgba(0, 0, 0, .16); }

/* Selection. */
::selection { background: color-mix(in srgb, var(--na-primary) 28%, transparent); }

/* ---- Scrollbars: one appearance on every OS, driven by the theme ---------
   The app must not look different on Windows and macOS. Two platform defaults are what break
   that, and styling the scrollbar at all opts out of both: macOS overlay bars (auto-hiding,
   zero layout width) and the Windows stepper arrows.

   The rules are split by engine ON PURPOSE — they are mutually exclusive, not redundant:
   Chrome/Edge 121+ and Safari 18.2+ support BOTH `scrollbar-color` and `::-webkit-scrollbar`,
   and when `scrollbar-color` is set they honour it and silently DROP every `::-webkit-*` rule.
   Declaring both (as this file used to) therefore threw away the custom size, the inset pill and
   the hover colour in exactly the browsers most users are on. `@supports not selector(...)`
   hands Firefox the standard properties and everyone else the webkit ones, so each engine gets
   the one it renders best and neither cancels the other.

   Colours are derived from the theme tokens with color-mix, so all seven themes follow along
   without a per-theme block. Mixed against --na-surface-solid rather than `transparent`: an
   alpha thumb would pick up whatever it floats over — including the red/amber cells under the
   heatmap's horizontal bar. */
:root {
    --na-scroll-size: 12px;
    --na-scroll-inset: 3px;                                  /* transparent border → inset pill */
    --na-scroll-track: color-mix(in srgb, var(--na-text) 7%, var(--na-surface-solid));
    --na-scroll-thumb: color-mix(in srgb, var(--na-text) 30%, var(--na-surface-solid));
    --na-scroll-thumb-hover: var(--na-primary);
}

::-webkit-scrollbar { width: var(--na-scroll-size); height: var(--na-scroll-size); }
::-webkit-scrollbar-track { background: var(--na-scroll-track); }
::-webkit-scrollbar-thumb {
    background: var(--na-scroll-thumb); border-radius: 999px;
    border: var(--na-scroll-inset) solid transparent; background-clip: content-box;
}
::-webkit-scrollbar-thumb:hover { background: var(--na-scroll-thumb-hover); background-clip: content-box; }
/* Where a horizontal and a vertical bar meet; unstyled it renders as a pale platform-coloured
   square that ignores the theme. */
::-webkit-scrollbar-corner { background: var(--na-scroll-track); }
/* Windows renders stepper arrows at the ends; macOS does not. Hide them so both match. */
::-webkit-scrollbar-button { display: none; width: 0; height: 0; }

/* Firefox: no pseudo-elements, so it gets the standard properties. It cannot take a custom
   size — `thin` is the closest match to the 12px above. */
@supports not selector(::-webkit-scrollbar) {
    * { scrollbar-width: thin; scrollbar-color: var(--na-scroll-thumb) var(--na-scroll-track); }
}

/* ---- Overlay scrollbars drawn by js/na-scrollbars.js ---------------------
   Everything above styles the NATIVE bar and is the no-JS fallback. It cannot equalise the one
   difference that matters: macOS draws overlay bars (floating, auto-hiding, 0px of layout width)
   and Windows classic ones (always visible, reserving ~12px of layout). No CSS flips that.

   So when the script is running — and ONLY then, hence the `[data-na-sbar="js"]` gate, which it
   sets itself — the native bar is hidden on every platform and replaced by the thumbs below.
   Result: same width, same auto-hide, same theme colours everywhere. Without JS the attribute is
   absent, the rules below never match, and the themed native bars above stay in charge. */
/* O elemento que CARREGA o atributo precisa entrar na conta, não só os descendentes: o atributo
   vive no <html>, e `[data-na-sbar="js"] *` (combinador descendente) não casa com ele. A barra do
   documento continuava nativa com o thumb desenhado por cima — duas barras lado a lado. O
   `scrollbar-width` do <body> não resolve: por spec, a barra da viewport herda a do <html>. */
[data-na-sbar="js"], [data-na-sbar="js"] * { scrollbar-width: none; }
[data-na-sbar="js"]::-webkit-scrollbar,
[data-na-sbar="js"] ::-webkit-scrollbar { width: 0; height: 0; display: none; }

.na-sbar-layer { position: fixed; inset: 0; z-index: 2000; pointer-events: none; }
.na-sbar {
    position: fixed; border-radius: 999px; background: var(--na-scroll-thumb);
    opacity: 0; transition: opacity .18s ease, background .15s ease;
    pointer-events: auto; cursor: default;
}
.na-sbar-y { width: var(--na-scroll-size); }
.na-sbar-x { height: var(--na-scroll-size); }
.na-sbar.is-visible { opacity: 1; }
.na-sbar:hover, .na-sbar.is-dragging { background: var(--na-scroll-thumb-hover); }
/* While dragging the pointer routinely leaves the thumb; keep it lit and keep the page from
   selecting text under it. */
.na-sbar.is-dragging { opacity: 1; }
/* Coarse pointers keep native momentum scrolling; the thumb is a read-only indicator there. */
@media not all and (hover: hover) and (pointer: fine) {
    .na-sbar { pointer-events: none; }
}

/* Reduced motion: respect the OS setting. */
@media (prefers-reduced-motion: reduce) {
    * { transition-duration: .01ms !important; animation-duration: .01ms !important; }
}

/* Theme picker popover. */
.na-themepicker { position: relative; }
.na-theme-toggle { list-style: none; }
.na-theme-toggle::-webkit-details-marker { display: none; }
.na-themepicker[open] > .na-theme-toggle { color: var(--na-primary); border-color: var(--na-primary); background: var(--na-primary-hover); }
.na-theme-menu {
    position: absolute; right: 0; top: calc(100% + .55rem); z-index: 80; width: 216px; padding: .5rem;
    border-radius: 16px; background: var(--na-surface); border: 1px solid var(--na-glass-border);
    box-shadow: var(--na-shadow-lg); backdrop-filter: var(--na-blur); -webkit-backdrop-filter: var(--na-blur);
    animation: na-pop .16s cubic-bezier(.2, .8, .2, 1);
}
@keyframes na-pop { from { opacity: 0; transform: translateY(-6px) scale(.98); } to { opacity: 1; transform: none; } }
.na-theme-menu-title { font-size: var(--na-fs-2xs); text-transform: uppercase; letter-spacing: .06em; color: var(--na-text-secondary); padding: .35rem .5rem; }
.na-theme-opt {
    display: flex; align-items: center; gap: .65rem; width: 100%; padding: .5rem; margin: 0; border: 0;
    border-radius: 11px; background: transparent; cursor: pointer; font: inherit; font-weight: 600;
    color: var(--na-text); text-align: left;
}
.na-theme-opt:hover { background: var(--na-primary-hover); }
.na-theme-name { flex: 1; }
.na-theme-swatch { width: 24px; height: 24px; border-radius: 8px; flex: none; box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .3), var(--na-shadow); }
.na-theme-check { width: 1.1em; height: 1.1em; color: var(--na-primary); opacity: 0; flex: none; }
.na-theme-opt.is-active { background: var(--na-primary-hover); }
.na-theme-opt.is-active .na-theme-check { opacity: 1; }

/* In the sidebar the picker sits at the bottom → open upward, aligned to the left edge. */
.na-side .na-theme-menu { top: auto; bottom: calc(100% + .55rem); left: 0; right: auto; }

/* ---- Setup page: form appearance (palette + logo) ------------------------ */
.na-setup-section + .na-setup-section { margin-top: 2rem; }
.na-setup-title { font-size: var(--na-fs-lg); margin: 0 0 .15rem; }
.na-setup-sub { font-size: var(--na-fs-sm); margin: 0 0 1rem; }
.na-palette-grid { display: grid; gap: .6rem; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); }
.na-palette-opt {
    display: flex; align-items: center; gap: .65rem; padding: .6rem .75rem; margin: 0;
    border: 1px solid var(--na-line-input); border-radius: var(--na-radius); cursor: pointer;
    transition: border-color .14s ease, box-shadow .14s ease, background .14s ease;
}
.na-palette-opt:hover { border-color: var(--na-primary); }
.na-palette-opt:has(input:checked) { border-color: transparent; box-shadow: var(--na-ring); background: var(--na-primary-hover); }
.na-palette-opt:has(input:focus-visible) { box-shadow: var(--na-ring); }
/* Radio drives state via :has() — visually hidden but still focusable and submitted. */
.na-palette-opt input { position: absolute; opacity: 0; width: 1px; height: 1px; pointer-events: none; }
.na-palette-opt .na-theme-name { flex: 1; font-weight: 600; }
.na-logo-preview { margin: 0 0 1rem; }
.na-logo-preview img {
    max-height: 64px; max-width: 220px; object-fit: contain;
    background: var(--na-bg-grey); border: 1px solid var(--na-line); border-radius: var(--na-radius); padding: .5rem .65rem;
}

/* Nota do ajuste automático da imagem (na-image-fit.js). Criada por script — só existe com JS. */
.na-imgfit { margin: .4rem 0 0; font-size: var(--na-fs-sm); color: var(--na-text-secondary); }
.na-imgfit[data-kind="done"] { color: var(--na-success); }
.na-imgfit[data-kind="warn"] { color: var(--na-error); }
.na-imgfit[data-kind="busy"]::before {
    content: ""; display: inline-block; width: .7em; height: .7em; margin-right: .45em;
    border: 2px solid currentColor; border-right-color: transparent; border-radius: 50%;
    animation: na-imgfit-spin .6s linear infinite; vertical-align: -.05em;
}
@keyframes na-imgfit-spin { to { transform: rotate(360deg); } }
@media (prefers-reduced-motion: reduce) { .na-imgfit[data-kind="busy"]::before { animation: none; } }

/* Corporate theme: no blur on the drawer scrim either (keep it a plain, serious dim). */
:root[data-theme="corporate"] .na-nav-overlay { backdrop-filter: none; -webkit-backdrop-filter: none; background: rgba(15, 23, 42, .48); }

/* ==========================================================================
   Data grid (admin/empresas) — toolbar, sortable headers, pagination
   ========================================================================== */
.na-gridtoolbar { display: flex; flex-wrap: wrap; gap: .6rem; align-items: center; }
.na-grid-search { flex: 1 1 240px; min-width: 200px; }
.na-gridtoolbar .na-select { width: auto; }
.na-grid-scroll { overflow-x: auto; }

/* Envoltório do cabeçalho: mantém o título (ou o link de ordenação) e o "?" da explicação na
   mesma linha, com o "?" sempre depois do indicador de ordem. */
.na-th-in { display: inline-flex; align-items: center; gap: .3rem; }
.na-th-in-r { justify-content: flex-end; width: 100%; }
.na-th-sort { display: inline-flex; align-items: center; gap: .35rem; color: inherit; font: inherit;
    text-transform: inherit; letter-spacing: inherit; cursor: pointer; user-select: none; white-space: nowrap; }
.na-th-sort:hover { color: var(--na-primary); text-decoration: none; }
.na-th-sort-r { justify-content: flex-end; }
.na-th-active, .na-th-active .na-th-sort { color: var(--na-primary); }
.na-sort-ind { font-size: var(--na-fs-2xs); opacity: .35; }
.na-sort-ind.on { opacity: 1; color: var(--na-primary); }

.na-grid-foot { display: flex; flex-wrap: wrap; gap: .75rem; align-items: center; justify-content: space-between; padding: .85rem 1.1rem; border-top: 1px solid var(--na-line); }
.na-grid-count { font-size: var(--na-fs-sm); color: var(--na-text-secondary); }
.na-pagi { display: flex; gap: .3rem; }
.na-pagi-btn {
    display: inline-flex; align-items: center; justify-content: center; min-width: 36px; height: 36px;
    padding: 0 .6rem; border-radius: 10px; border: 1px solid var(--na-line); background: var(--na-surface);
    color: var(--na-text); font-weight: 600; font-size: var(--na-fs-md);
    transition: border-color .12s ease, color .12s ease, transform .12s ease;
}
.na-pagi-btn:hover { border-color: var(--na-primary); color: var(--na-primary); text-decoration: none; transform: translateY(-1px); }
.na-pagi-btn.is-current { background: var(--na-grad); border-color: transparent; color: #fff; box-shadow: var(--na-glow); }
.na-pagi-btn.is-disabled { opacity: .4; pointer-events: none; }

/* =====================================================================
   Diagnostic dashboard (NR-01)  —  header band, KPI+donut grid, heatmap
   ===================================================================== */

.na-visually-hidden {
    position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
    overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}

.na-diag { display: flex; flex-direction: column; gap: 1.25rem; }

/* --- Header band --- */
.na-diag-head {
    display: flex; flex-wrap: wrap; gap: 1rem; align-items: center; justify-content: space-between;
    padding: 1.6rem 1.8rem; border-radius: var(--na-radius-lg);
    background: linear-gradient(180deg, rgba(255,255,255,.14), rgba(255,255,255,0) 42%), var(--na-grad);
    color: #fff; box-shadow: var(--na-shadow-lg);
}
.na-diag-head h1 { color: #fff; margin: 0; font-size: var(--na-fs-3xl); letter-spacing: -.03em; }
.na-diag-head-sub { margin: .35rem 0 0; color: rgba(255,255,255,.82); font-size: var(--na-fs-md); }
.na-diag-head-side { display: flex; flex-wrap: wrap; gap: .75rem; align-items: center; }
.na-diag-chip {
    display: flex; flex-direction: column; gap: .1rem; padding: .55rem .9rem;
    background: rgba(255,255,255,.16); border: 1px solid rgba(255,255,255,.28);
    border-radius: var(--na-radius); backdrop-filter: var(--na-blur);
}
.na-diag-chip strong { font-size: var(--na-fs-md); letter-spacing: .02em; }
.na-diag-chip span { font-size: var(--na-fs-xs); color: rgba(255,255,255,.82); }
/* Outline button sitting ON the gradient band — the default outline tokens are unreadable there. */
.na-diag-back {
    color: #fff; border-color: rgba(255,255,255,.42); background: rgba(255,255,255,.14);
    backdrop-filter: var(--na-blur); -webkit-backdrop-filter: var(--na-blur);
}
.na-diag-back:hover { color: #fff; background: rgba(255,255,255,.24); border-color: rgba(255,255,255,.6); }
.na-diag-select { display: flex; gap: .5rem; }
.na-diag-select .na-select { min-width: 210px; }

/* --- KPI + donut grid ---
   The KPI block is a fixed 2×2, NOT auto-fit: auto-fit packed 3 tiles on the first row and left
   the fourth orphaned beside an empty cell. 2×2 also matches the donut card's height, so the two
   columns end level instead of stair-stepping. Both stretch so the cards fill their row. */
.na-diag-grid { display: grid; gap: 1.25rem; grid-template-columns: minmax(0, 2fr) minmax(300px, 1fr); align-items: stretch; }
.na-diag-grid .na-stats { grid-template-columns: repeat(2, minmax(0, 1fr)); align-content: stretch; }
.na-diag-grid .na-donut-card { justify-content: center; }
/* Tablet: the donut drops below, so the four KPIs spread across the full width in one row. */
@media (max-width: 1100px) {
    .na-diag-grid { grid-template-columns: 1fr; }
    .na-diag-grid .na-stats { grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); }
}

/* --- Donut (pure CSS conic-gradient) --- */
.na-donut-card { display: flex; flex-direction: column; gap: 1rem; }
.na-donut-head { display: flex; flex-direction: column; gap: .1rem; }
.na-donut-head strong { font-size: var(--na-fs-base); }
.na-donut-wrap { display: flex; gap: 1.25rem; align-items: center; flex-wrap: wrap; }
/* 168px = the 152px ring + the 8px/side layout padding Chart.js reserves for the hover pop-out
   (see na-charts.ts) — keeps the ring at its intended size instead of shrinking it. */
.na-donut-figure { position: relative; width: 168px; height: 168px; flex: 0 0 auto; }
.na-donut-canvas { display: block; width: 100%; height: 100%; }
.na-donut-center {
    position: absolute; inset: 0; display: grid; place-content: center; text-align: center;
    pointer-events: none;
}
.na-donut-total { display: block; font-size: var(--na-fs-3xl); font-weight: 700; line-height: 1; letter-spacing: -.03em; }
.na-donut-center .na-muted { font-size: var(--na-fs-2xs); }
/* max-width, because below the 1100px breakpoint this card spans the full page and the
   `auto 1fr auto` rows would otherwise strand the counts far from their labels. */
.na-donut-legend { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: .55rem; flex: 1 1 140px; max-width: 260px; }
.na-donut-legend li { display: grid; grid-template-columns: auto 1fr auto; align-items: center; gap: .55rem; font-size: var(--na-fs-md); }
.na-donut-sw { width: .8rem; height: .8rem; border-radius: 4px; }
.na-donut-lg-val { font-variant-numeric: tabular-nums; font-weight: 600; }

/* --- Heatmap --- */
.na-heatmap-card { display: flex; flex-direction: column; gap: 1rem; padding-bottom: 1.1rem; }
.na-heatmap-head { display: flex; flex-direction: column; gap: .1rem; }
.na-heatmap-head strong { font-size: var(--na-fs-base); }
/* Legenda e "Fechar tudo" na mesma linha, com o botão empurrado para a direita; abaixo de 560px
   a linha quebra em duas em vez de espremer o rótulo. */
.na-heatmap-head-end { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem 1rem; }
.na-heatmap-head-end > .na-muted { flex: 1 1 auto; }

/* Os gatilhos só existem com JS: sem script nada recolhe, e botão morto é pior que nenhum. */
.na-heat-toggle-all, .na-ap-group-btn { display: none; }
[data-na-fold-js] .na-heat-toggle-all {
    display: inline-flex; align-items: center; gap: .4rem;
    padding: .3rem .7rem; border: 1px solid var(--na-line); border-radius: 999px;
    background: var(--na-surface-solid); color: var(--na-text-secondary);
    font: inherit; font-size: var(--na-fs-xs); font-weight: 600; cursor: pointer;
    transition: color .15s ease, border-color .15s ease, background .15s ease;
}
[data-na-fold-js] .na-heat-toggle-all:hover { color: var(--na-primary); border-color: var(--na-primary); }
[data-na-fold-js] .na-heat-toggle-all:focus-visible { outline: none; box-shadow: var(--na-ring); }
/* Um rótulo por estado, os dois no HTML: o texto fica versionado com a tela em vez de morar numa
   string do script. `aria-expanded` é a fonte da verdade — o CSS só escolhe qual aparece. */
.na-heat-toggle-all[aria-expanded="true"] .na-heat-toggle-open,
.na-heat-toggle-all[aria-expanded="false"] .na-heat-toggle-close { display: none; }
/* A seta segue a mesma convenção dos blocos: apontando para baixo quando há o que fechar. */
.na-heat-toggle-all[aria-expanded="true"] .na-heat-caret { transform: rotate(90deg); }
/* Band legend above the table — the B/A/C letters and the "—" need naming somewhere visible,
   not only inside the collapsed methodology panel. */
.na-heat-legend { display: flex; flex-wrap: wrap; gap: .35rem 1.1rem; margin: -.35rem 0 0; font-size: var(--na-fs-xs); color: var(--na-text-secondary); }
.na-heat-legend-item { display: inline-flex; align-items: center; gap: .4rem; }
.na-heat-legend-dash { min-width: 1.5rem; text-align: center; font-weight: 700; }
.na-heatmap-scroll { overflow-x: auto; border-radius: var(--na-radius); border: 1px solid var(--na-line); }
.na-heatmap-scroll:focus-visible { outline: none; box-shadow: var(--na-ring); }
/* Fixed layout: every data column takes its width from the LONGEST header, so the matrix is a
   regular grid. With `auto` the browser sized each column to its own content and the columns
   stair-stepped in width from one department name to the next.
   `--na-heat-cols` is the longest header's character count, set inline by the component; the
   `ch` conversion happens here so it resolves in the header's own (uppercase, tracked-out) font.
   1.5 is the ratio between an uppercase tracked-out character and `1ch` (Inter's "0" advance,
   which is much narrower). Measured, not guessed: the widest real header, "RECURSOS HUMANOS",
   needs 1.46ch per character, so 1.5 fits it on one line with a few px to spare. */
.na-heatmap { table-layout: fixed; width: max-content; font-variant-numeric: tabular-nums;
    /* `separate` — NOT the `.na-table` default `collapse` — is required by the frozen column.
       With collapsed borders the browser paints every border at the TABLE level instead of on the
       cell, so the scrolling cells' edges kept drawing over the sticky column's opaque background:
       coloured slivers striping the factor labels, exactly across the overlap zone. With
       `separate` each cell owns its borders and carries them along as it sticks.
       Only bottom+right are set below, so adjacent cells never double up to 2px. */
    border-collapse: separate; border-spacing: 0; }
.na-heatmap th, .na-heatmap td { border-bottom: 1px solid var(--na-line); border-right: 1px solid var(--na-line); }
.na-heatmap thead th { position: sticky; top: 0; z-index: 2; text-align: center; }
.na-heatmap thead th:not(.na-heat-factor) {
    /* Side padding matches the body cells (.6rem) rather than the .na-table default (1.1rem):
       uniform columns multiply every spare pixel by the sector count, and it also lines the
       header up with the numbers under it. */
    padding-inline: .6rem;
    width: calc(var(--na-heat-cols, 12) * 1.5ch + 1.2rem);
    /* Safety net: a header longer than the clamp wraps rather than being clipped, so an
       unexpected department name degrades to two lines instead of breaking the grid. */
    white-space: normal; overflow-wrap: anywhere; line-height: 1.2;
}
.na-heatmap tbody tr:hover { background: transparent; }

/* sticky "fator de risco" column.
   Every background here MUST be opaque, and every rule scoped under .na-heatmap: `.na-table th`
   (0,1,1) outweighs a bare `.na-heat-factor` (0,1,0) and was repainting these cells with the
   translucent `--na-bg-grey` tint, so the scrolling score cells showed straight through the
   frozen column. The header keeps that tint by layering it OVER the solid surface instead of
   relying on alpha — which also holds up in the opaque "Corporativo" theme. */
.na-heatmap .na-heat-factor { position: sticky; left: 0; z-index: 1; text-align: left !important;
    width: 15.5rem; background: var(--na-surface-solid); white-space: normal; line-height: 1.25;
    text-transform: none; letter-spacing: 0; font-size: var(--na-fs-md); color: var(--na-text); font-weight: 600; }
.na-heatmap thead th { background: linear-gradient(var(--na-bg-grey), var(--na-bg-grey)) var(--na-surface-solid); }
.na-heatmap thead .na-heat-factor { z-index: 3; text-transform: uppercase; letter-spacing: .06em;
    font-size: var(--na-fs-2xs); color: var(--na-text-secondary);
    background: linear-gradient(var(--na-bg-grey), var(--na-bg-grey)) var(--na-surface-solid); }

/* dimension block header: one full-width row opening each dimension of the COPSOQ.
   The cell spans the whole table, so it cannot be frozen as a column — instead the LABEL is
   sticky-left, and stays readable while the score columns scroll under it. */
.na-heatmap .na-heat-group > th { background: var(--na-bg-grey); text-align: left !important;
    padding: 0; text-transform: none; letter-spacing: 0; border-right: 0; }

/* O invólucro é o que fica preso à esquerda: a célula tem a largura da TABELA, então prender algo
   à sua borda direita o jogaria para fora da viewport do scroller. */
.na-heat-group-inner { position: sticky; left: 0; display: inline-flex; align-items: center;
    gap: .6rem; padding: .5rem .75rem; }
.na-heat-group-btn { display: inline-flex; align-items: center; gap: .45rem; padding: .1rem 0;
    border: 0; margin: 0; background: none; color: var(--na-text-secondary); font: inherit;
    text-align: left; cursor: pointer; }
.na-heat-group-btn:hover { color: var(--na-text); }
.na-heat-group-btn:focus-visible { outline: 2px solid var(--na-primary); outline-offset: 3px;
    border-radius: 4px; }
.na-heat-group-label { text-transform: uppercase; letter-spacing: .06em; font-size: var(--na-fs-2xs);
    font-weight: 700; }
.na-heat-group-count { font-size: var(--na-fs-2xs); font-weight: 500; color: var(--na-text-secondary); }

/* Seta em CSS puro (o app não carrega icon font): gira 90° quando o bloco está aberto. */
.na-heat-caret { width: 0; height: 0; border-left: 5px solid currentColor;
    border-top: 4px solid transparent; border-bottom: 4px solid transparent;
    transition: transform .15s ease; }
.na-heat-group-btn[aria-expanded="true"] .na-heat-caret { transform: rotate(90deg); }

/* Pior fator do bloco — mesma paleta das células, para o olho ligar um ao outro sem legenda nova. */
.na-heat-group-worst { display: inline-flex; align-items: center; gap: .1rem;
    padding: .12rem .45rem .12rem .5rem; border-radius: 999px; font-size: var(--na-fs-2xs);
    font-weight: 700; white-space: nowrap; }
/* `baseline` deixava o "?" pairando acima do número: o botão é inline-flex e a linha de base que
   ele oferece é a do próprio ícone. Centrado, os três (número, letra, "?") assentam juntos. */
.na-heat-group-worst .na-tip-btn { margin-inline-start: .2rem; }
/* O `?` herda a cor da pílula (via na-tip-btn-inherit); o que faltava era opacidade — .7 sobre
   vermelho saturado sumia. */
.na-heat-group-worst .na-tip-btn { opacity: .92; }
.na-heat-group-worst .na-tip-btn:hover { background: rgba(255,255,255,.28); }

/* Abrir e fechar = animar ALTURA, não opacidade.
   `display: none` na linha seria mais simples, mas faz a tabela pular de tamanho num quadro só:
   o espaço abre inteiro e o conteúdo chega depois, "saltando do nada". Por isso a linha nunca sai
   do fluxo — quem encolhe é a caixa dentro de cada célula, pelo truque do grid `1fr → 0fr`, que é
   a única forma de interpolar até "altura do conteúdo" com suporte amplo (`height: auto` não
   interpola, e `interpolate-size` ainda é só Chrome).
   O recuo vive na caixa e não na célula: assim a faixa colorida encolhe junto, em vez de deixar
   uma tarja de 1.6rem por linha fechada. */
.na-heatmap tbody .na-heat-box {
    /* `minmax(0, …)`, e não `1fr`/`0fr` puros: uma faixa `fr` mantém o mínimo automático do item,
       e o recuo dele entra nesse mínimo — a linha parava em 25,6px em vez de fechar. Com o piso
       explícito em 0 a faixa chega de fato a zero e o `overflow: hidden` corta o resto. */
    display: grid; grid-template-rows: minmax(0, 1fr); overflow: hidden;
    transition: grid-template-rows .22s cubic-bezier(.4, 0, .2, 1), opacity .16s ease .06s;
}
.na-heatmap tbody .na-heat-boxin { min-height: 0; padding: .8rem .6rem; }
.na-heatmap tbody .na-heat-factor .na-heat-boxin { padding: .8rem 1.1rem; }

.na-heat-block[data-collapsed] .na-heat-box {
    grid-template-rows: minmax(0, 0fr); opacity: 0;
    /* `visibility` fecha a linha para leitor de tela e para o foco, mas só no fim da animação —
       daí o delay. Sem ela a linha some da vista e continua no caminho do Tab. */
    visibility: hidden; transition: grid-template-rows .22s cubic-bezier(.4, 0, .2, 1),
        opacity .12s ease, visibility 0s linear .22s;
}
/* Fechada, a linha tem altura zero: a borda inferior de cada célula viraria um fio solto. */
.na-heat-block[data-collapsed] > tr:not(.na-heat-group) > * { border-bottom-width: 0; }

/* ---- Blocos recolhíveis fora da tabela (js/na-collapse.js) ---------------------------------
   Mesmo truque de grid da tabela, agora num invólucro comum: a lista do plano de ação. `minmax(0,
   …)` e não `1fr`/`0fr` puros pelo mesmo motivo — uma faixa `fr` mantém o mínimo automático do
   item, e o bloco nunca fecharia de todo. `visibility` sai só no fim, para o conteúdo fechado
   deixar de existir para leitor de tela e para o Tab. */
.na-fold-body {
    display: grid; grid-template-rows: minmax(0, 1fr); overflow: hidden;
    transition: grid-template-rows .22s cubic-bezier(.4, 0, .2, 1), opacity .16s ease .06s;
}
.na-fold-inner { min-height: 0; }
[data-na-fold-block][data-collapsed] > .na-fold-body {
    grid-template-rows: minmax(0, 0fr); opacity: 0; visibility: hidden;
    transition: grid-template-rows .22s cubic-bezier(.4, 0, .2, 1), opacity .12s ease,
        visibility 0s linear .22s;
}

/* Gatilho do bloco na lista do plano — mesma anatomia do heatmap: seta, rótulo, contagem. */
[data-na-fold-js] .na-ap-group-btn {
    display: inline-flex; align-items: center; gap: .5rem; padding: .1rem 0; border: 0; margin: 0;
    background: none; color: inherit; font: inherit; text-align: left; cursor: pointer;
}
[data-na-fold-js] .na-ap-group-btn:hover .na-ap-group-label { color: var(--na-text); }
[data-na-fold-js] .na-ap-group-btn:focus-visible { outline: none; box-shadow: var(--na-ring);
    border-radius: 4px; }
.na-ap-groups-head { display: flex; justify-content: flex-end; margin-bottom: -.4rem; }
/* Pílula do pior fator — mesma forma e paleta do cabeçalho de dimensão do diagnóstico. */
.na-ap-group-worst { display: inline-flex; align-items: baseline; gap: .1rem; margin-left: auto;
    padding: .12rem .5rem; border-radius: 999px; font-size: var(--na-fs-2xs); font-weight: 700;
    white-space: nowrap; }

/* TODOS fechados (atributo posto por js/na-collapse.js): sobram oito linhas de dimensão e nenhuma
   célula de score. O cabeçalho perde a função — com uma coluna só ele vira uma divisa solta no
   meio do cartão — e a rolagem lateral deixa de ter o que mostrar. O `tabindex` sai pelo script,
   junto: região rolável que não rola é parada morta no teclado. */
.na-heatmap-scroll[data-na-heat-folded] { overflow-x: hidden; }
.na-heatmap-scroll[data-na-heat-folded] .na-heatmap { width: 100%; table-layout: auto; }
.na-heatmap-scroll[data-na-heat-folded] .na-heatmap thead { display: none; }

/* cells: colour + score + B/A/C letter (colour never the sole signal).
   Scoped under .na-heatmap so `text-align` beats `.na-table td` (0,1,1) — unscoped, .na-heat-cell
   (0,1,0) lost and every score sat left-aligned. Harmless while the columns hugged their content;
   obvious once they were widened to the header. */
.na-heatmap .na-heat-cell { text-align: center; font-weight: 700; }
/* Zero na célula: o recuo foi para `.na-heat-boxin`, que é o que encolhe ao recolher o bloco. */
.na-heatmap tbody th, .na-heatmap tbody td { padding: 0; }
.na-heatmap .na-heat-empty { text-align: center; }
.na-heat-code { font-size: var(--na-fs-2xs); font-weight: 700; margin-left: .12rem; opacity: .85; }
.na-heat-baixo   { background: var(--na-risk-low);  color: var(--na-risk-low-fg); }
.na-heat-atencao { background: var(--na-risk-mid);  color: var(--na-risk-mid-fg); }
.na-heat-critico { background: var(--na-risk-high); color: var(--na-risk-high-fg); }
.na-heat-empty { text-align: center; color: var(--na-text-secondary); background: var(--na-bg-grey); }
.na-heat-cell:hover { outline: 2px solid rgba(0,0,0,.28); outline-offset: -2px; cursor: default; }

.na-diag-note { margin: 0; color: var(--na-text-secondary); font-size: var(--na-fs-sm); }

/* --- "Como ler estes indicadores": native <details> methodology panel --- */
.na-help { padding: 0; overflow: hidden; }
.na-help-summary {
    display: flex; align-items: center; gap: .85rem; padding: 1rem 1.25rem;
    cursor: pointer; list-style: none; user-select: none;
}
.na-help-summary::-webkit-details-marker { display: none; }
.na-help-summary:focus-visible { outline: none; box-shadow: var(--na-ring); border-radius: var(--na-radius-lg); }
.na-help-summary:hover { background: var(--na-primary-hover); }
.na-help-summary-text { display: flex; flex-direction: column; gap: .1rem; flex: 1; min-width: 0; }
.na-help-summary-text .na-muted { font-size: var(--na-fs-xs); }
.na-help-ico {
    display: grid; place-content: center; width: 2.1rem; height: 2.1rem; flex: 0 0 auto;
    border-radius: 50%; background: var(--na-primary-hover); color: var(--na-primary);
}
/* Chevron affordance, rotated when open. */
.na-help-summary::after {
    content: ""; flex: 0 0 auto; width: .55rem; height: .55rem; margin-right: .2rem;
    border-right: 2px solid var(--na-text-secondary); border-bottom: 2px solid var(--na-text-secondary);
    transform: rotate(45deg) translate(-2px, -2px); transition: transform .18s ease;
}
.na-help[open] > .na-help-summary::after { transform: rotate(-135deg) translate(-2px, -2px); }
.na-help[open] > .na-help-summary { border-bottom: 1px solid var(--na-line); }

.na-help-body {
    padding: .5rem 1.25rem 1.4rem;
    display: grid; gap: .35rem; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
    align-items: start; column-gap: 2rem;
}
.na-help-sec { padding: .9rem 0 .2rem; min-width: 0; }
.na-help-sec h3 {
    margin: 0 0 .5rem; font-size: var(--na-fs-xs); text-transform: uppercase; letter-spacing: .07em;
    color: var(--na-primary);
}
.na-help-sec p { margin: 0 0 .5rem; font-size: var(--na-fs-sm); line-height: 1.55; }
.na-help-list, .na-help-steps { margin: 0; padding-left: 1.15rem; display: flex; flex-direction: column; gap: .4rem; }
.na-help-list { list-style: disc; }
.na-help-list li, .na-help-steps li { font-size: var(--na-fs-sm); line-height: 1.55; }
.na-help-steps ul { margin: .35rem 0 0; padding-left: 1.1rem; display: flex; flex-direction: column; gap: .25rem; }
.na-help-code {
    font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: var(--na-fs-sm);
    padding: .1rem .35rem; border-radius: 6px;
    background: var(--na-bg-grey); border: 1px solid var(--na-line);
}
.na-help-caveat {
    margin: .6rem 0 0 !important; padding: .55rem .75rem; border-radius: var(--na-radius);
    border-left: 3px solid var(--na-info); background: var(--na-bg-grey);
    color: var(--na-text-secondary); font-size: var(--na-fs-sm)!important;
}
.na-help-defs { margin: 0; font-size: var(--na-fs-sm); }
.na-help-defs dt { font-weight: 700; margin-top: .7rem; }
.na-help-defs dt:first-child { margin-top: 0; }
.na-help-defs dd { margin: .2rem 0 0; color: var(--na-text-secondary); line-height: 1.55; }
.na-help-tablewrap { overflow-x: auto; border-radius: var(--na-radius); border: 1px solid var(--na-line); }
.na-help-table { min-width: max-content; font-size: var(--na-fs-sm); }
.na-help-table th, .na-help-table td { padding: .5rem .7rem; }
.na-help-table tbody tr:hover { background: transparent; }
.na-help-band {
    display: inline-block; padding: .12rem .5rem; border-radius: 999px;
    font-size: var(--na-fs-2xs); font-weight: 700; white-space: nowrap;
}

/* ---- Action plan (NR-01) -------------------------------------------------- */
/* Reuses .na-diag for the outer rhythm — the plan is read right after the diagnostic and the
   two screens must not feel like different products. Everything specific lives under .na-ap-. */

/* KPI tiles are links to the filtered list; the tile itself keeps the StatCard look. */
.na-ap-kpi { display: block; color: inherit; border-radius: var(--na-radius); }
.na-ap-kpi:hover .na-statcard { transform: translateY(-2px); box-shadow: var(--na-shadow-lg); }
.na-ap-kpi:focus-visible { outline: none; box-shadow: var(--na-ring); }
.na-ap-kpi .na-statcard { height: 100%; transition: transform .14s ease, box-shadow .14s ease; }

/* Governance as a bar, not a column: as a side column its height left half a screen of white
   space under the (short) KPI tiles. */
/* Governança em zonas empilhadas — título, trilha do ciclo de vida, o próximo passo — e não numa
   fileira só de controles: era o `space-between` que espalhava o formulário de aprovação pela
   largura do cartão e deixava o botão primário órfão no canto. */
.na-ap-gov { display: flex; flex-direction: column; gap: .9rem; padding: 1rem 1.1rem; }
.na-ap-gov-top { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between;
    gap: .6rem 1rem; }
.na-ap-gov-title { margin: 0; font-size: var(--na-fs-base); }

/* Trilha do ciclo de vida: stepper simétrico — três colunas iguais, marcador centrado em cada uma
   e a linha ligando um marcador ao seguinte. A versão anterior alinhava tudo à esquerda com um
   traço curto perto do marcador: lia como três itens soltos com riscos aleatórios, não como uma
   trilha. Cada etapa desenha META linha para cada lado (`::before` à esquerda, `::after` à
   direita), e as pontas do conjunto escondem a sua — é isso que faz a linha nascer e morrer em
   marcadores, sem sobrar toco nas bordas. */
.na-ap-track { display: grid; grid-template-columns: repeat(3, 1fr); margin: 0; padding: 0;
    list-style: none; }
.na-ap-track-step { position: relative; display: flex; flex-direction: column; align-items: center;
    gap: .3rem; padding: 0 .4rem; text-align: center; min-width: 0; }
.na-ap-track-step::before, .na-ap-track-step::after {
    content: ""; position: absolute; top: .52rem; height: 2px; background: var(--na-line-input); }
.na-ap-track-step::before { left: 0; right: 50%; margin-right: .75rem; }
.na-ap-track-step::after { left: 50%; right: 0; margin-left: .75rem; }
.na-ap-track-step:first-child::before, .na-ap-track-step:last-child::after { content: none; }

.na-ap-track-dot { width: 1.15rem; height: 1.15rem; display: inline-flex; align-items: center;
    justify-content: center; border-radius: 50%; border: 2px solid var(--na-line-input);
    background: var(--na-surface-solid); }
.na-ap-track-dot .na-ico { width: .7rem; height: .7rem; color: #fff; }
.na-ap-track-label { font-size: var(--na-fs-sm); font-weight: 600; color: var(--na-text-secondary);
    line-height: 1.2; }
.na-ap-track-meta { font-size: var(--na-fs-xs); color: var(--na-text-secondary); line-height: 1.35;
    overflow-wrap: anywhere; }

/* Concluída pinta o marcador e a linha que CHEGA nela e a que SAI: o verde precisa ser contínuo
   até o passo atual, senão a trilha parece interrompida no meio. */
.na-ap-track-step.is-done .na-ap-track-dot { background: var(--na-risk-low); border-color: var(--na-risk-low); }
.na-ap-track-step.is-done::before, .na-ap-track-step.is-done::after,
.na-ap-track-step.is-current::before { background: var(--na-risk-low); }
.na-ap-track-step.is-current .na-ap-track-dot { border-color: var(--na-primary);
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--na-primary) 18%, transparent); }
.na-ap-track-step.is-current .na-ap-track-label { color: var(--na-text); font-weight: 700; }
.na-ap-track-step.is-next { opacity: .5; }

/* O passo do ciclo de vida: bloco enquadrado, com título e consequência antes dos campos. O
   enquadramento é o que diz "isto é uma coisa só" — título, campos e botão pertencem ao mesmo ato. */
.na-ap-step { display: flex; flex-direction: column; gap: .75rem; padding: .85rem .9rem;
    border: 1px solid var(--na-line); border-radius: var(--na-radius); background: var(--na-bg-grey); }
.na-ap-step-head { display: flex; flex-direction: column; gap: .15rem; }
.na-ap-step-head > strong { font-size: var(--na-fs-md); }
.na-ap-step-head > .na-muted { font-size: var(--na-fs-sm); line-height: 1.5; max-width: 68ch; }
/* Dois campos lado a lado quando cabe; as observações ganham o dobro por serem texto livre. */
.na-ap-step-fields { display: grid; gap: .6rem .8rem; grid-template-columns: minmax(220px, 1fr) 2fr; }
.na-ap-step-foot { display: flex; justify-content: flex-end; }
/* Passo sem formulário (encerrar): texto e botão na mesma linha. Empilhados, sobrava um vão morto
   entre a explicação curta e o botão no canto. */
.na-ap-step:not(:has(.na-ap-step-fields)) {
    flex-direction: row; align-items: center; justify-content: space-between; gap: 1rem 1.5rem;
    flex-wrap: wrap; }
.na-ap-step:not(:has(.na-ap-step-fields)) .na-ap-step-head { flex: 1 1 24rem; }
@media (max-width: 720px) {
    .na-ap-step-fields { grid-template-columns: 1fr; }
    .na-ap-step-foot > .na-btn { width: 100%; }
}
/* Sem `flex-basis: 100%`: servia para ocupar a linha inteira quando o cartão era uma fileira que
   quebrava. Numa coluna, o eixo principal é a altura — a mesma declaração pedia a altura toda. */
.na-ap-notes {
    margin: 0; padding: .55rem .75rem; border-radius: var(--na-radius);
    border-left: 3px solid var(--na-primary); background: var(--na-bg-grey);
    font-size: var(--na-fs-sm); line-height: 1.55; white-space: pre-line;
}

/* Filter bar */
.na-ap-filters {
    display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between;
    gap: .75rem 1rem;
}
.na-ap-chips { display: flex; flex-wrap: wrap; gap: .4rem; }
.na-ap-chip {
    display: inline-flex; align-items: center; gap: .4rem; padding: .38rem .75rem;
    border: 1px solid var(--na-line-input); border-radius: 999px;
    font-size: var(--na-fs-sm); font-weight: 600; color: var(--na-text-secondary);
    background: var(--na-surface); transition: all .12s ease;
}
.na-ap-chip:hover { border-color: var(--na-primary); color: var(--na-primary); }
.na-ap-chip.is-active { background: var(--na-grad); border-color: transparent; color: #fff; box-shadow: var(--na-glow); }
.na-ap-chip-n {
    padding: 0 .4rem; border-radius: 999px; font-size: var(--na-fs-2xs);
    background: var(--na-bg-grey); color: var(--na-text-secondary);
}
.na-ap-chip.is-active .na-ap-chip-n { background: rgba(255,255,255,.22); color: #fff; }
.na-ap-refine { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; }
/* Sized so the controls + "Filtrar" + "Limpar" hold one line at the app's min desktop width;
   at 230/240 the "Limpar" link was pushed onto a third row of its own. */
.na-ap-refine .na-select { max-width: 190px; }
.na-ap-refine .na-input { max-width: 210px; }

/* The export sits ON the gradient band, so it uses the solid-white button rather than the
   outline one, which is unreadable there. */
.na-ap-export { font-weight: 600; }

/* Charts. Auto-fit so two sit side by side on a desktop and stack on a phone; the timeline
   spans both columns because a time axis squeezed to half the width stops being readable. */
/* No máximo DUAS colunas, e ainda assim fluida. Com `minmax(360px, 1fr)` puro, uma tela larga
   comportava TRÊS faixas de 360px: os dois primeiros gráficos ficavam nas colunas 1 e 2 e a
   terceira sobrava vazia, porque o gráfico de dimensões — último e ímpar — já ia para uma linha
   inteira própria. Fixar `repeat(2, …)` resolveria a sobra, mas ao custo da responsividade: a
   contagem passaria a depender de um @media de viewport, que não enxerga a largura real deste
   container (a barra lateral do AppShell come parte dela).
   Daí o mínimo da faixa ser `max(360px, metade do container)`: como duas faixas de meia largura
   já esgotam a linha, nunca cabe uma terceira; e quando metade fica menor que 360px o próprio
   360px assume e o `auto-fit` desce sozinho para uma coluna — pela largura do container, não da
   janela. O `100% - 1rem` desconta o gap que separa as duas colunas. */
.na-ap-charts {
    display: grid; gap: 1rem;
    grid-template-columns: repeat(auto-fit, minmax(max(360px, (100% - 1rem) / 2), 1fr));
}
.na-ap-charts > .na-ap-chart:last-child:nth-child(odd) { grid-column: 1 / -1; }
.na-ap-chart { display: flex; flex-direction: column; gap: .7rem; }
/* Cartões da mesma linha esticam até o mais alto; sem isto a sobra virava um vazio no fim do
   cartão baixo. Empurrando o "Ver números" para o rodapé, a diferença vira respiro e os dois
   disclosures ficam alinhados entre si. */
.na-ap-chart > .na-ap-chart-data { margin-top: auto; }
.na-ap-chart-head { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: .5rem; }
.na-ap-chart-head > strong { font-size: var(--na-fs-md); }
.na-ap-chart-legend {
    display: flex; flex-wrap: wrap; gap: .25rem .8rem; margin: 0; padding: 0; list-style: none;
    font-size: var(--na-fs-xs); color: var(--na-text-secondary);
}
.na-ap-chart-legend li { display: inline-flex; align-items: center; gap: .35rem; }
.na-ap-chart-legend .na-muted { font-weight: 700; color: var(--na-text); }
.na-ap-chart-canvas { position: relative; width: 100%; }
/* `max-width` em ch: no cartão de linha inteira a nota viraria uma linha de ponta a ponta, que é
   justamente a medida em que o olho perde o começo da linha seguinte. */
.na-ap-chart-note { margin: 0; font-size: var(--na-fs-xs); line-height: 1.5; max-width: 88ch; }
/* A tabela leva o nome por extenso e não cabe sempre: rola dentro do cartão em vez de ter a
   coluna "Total" cortada pela borda. Recuos menores porque aqui a densidade é o ponto. */
.na-ap-chart-tablewrap { overflow-x: auto; margin-top: .5rem; }
.na-ap-chart-tablewrap .na-table { width: 100%; font-size: var(--na-fs-xs); }
.na-ap-chart-tablewrap .na-table th, .na-ap-chart-tablewrap .na-table td { padding: .45rem .5rem; }
.na-ap-chart-tablewrap .na-table th:first-child, .na-ap-chart-tablewrap .na-table td:first-child {
    white-space: normal; min-width: 12rem; }
.na-ap-chart-data > summary { cursor: pointer; font-size: var(--na-fs-xs); color: var(--na-text-secondary); }

/* Fechado, o bloco é uma linha de lista e o espaçamento tem de ser de lista; o respiro de seção
   só faz sentido em volta do que está aberto — senão oito cabeçalhos ficam boiando no vazio. */
.na-ap-groups { display: flex; flex-direction: column; gap: .45rem; }
/* Só margem EMBAIXO. Com `margin-block` a margem de cima nascia junto com a abertura e empurrava
   o próprio cabeçalho para baixo — clicar num bloco fazia ele fugir do cursor (12px medidos). O
   que vem depois pode mover, porque o conteúdo cresceu ali mesmo; o que foi clicado, não. */
[data-na-fold-block]:not([data-collapsed]) { margin-bottom: .8rem; }
.na-ap-group { display: flex; flex-direction: column; gap: .45rem; }
/* O cabeçalho é uma superfície própria, e não texto solto sobre o fundo da página: recolhido, o
   bloco vira a única coisa na tela e sem contraste os oito viram uma lista sem forma. É a mesma
   função da faixa cinza no heatmap — lá ela se destaca contra o branco do cartão, aqui contra o
   fundo lavanda do app, por isso a superfície sólida e não o mesmo `--na-bg-grey`. */
.na-ap-group-head { display: flex; align-items: center; gap: .6rem; flex-wrap: wrap;
    padding: .5rem .85rem; border: 1px solid var(--na-line); border-radius: var(--na-radius);
    background: var(--na-surface); backdrop-filter: blur(6px); }
.na-ap-group-head .na-muted { font-size: var(--na-fs-sm); }
/* Hierarquia: aberto, o cabeçalho vira o TÍTULO do bloco e as ações penduram dele.
   Três sinais somados, porque nenhum sozinho basta: (1) o cabeçalho perde o arredondamento de
   baixo e encosta no corpo — deixa de ser um cartão irmão dos itens; (2) o corpo recua até a
   coluna da seta, então as ações começam depois de onde o título começa; (3) uma espinha vertical
   sai do cabeçalho e desce até a última ação, que é o que transforma "lista abaixo de um rótulo"
   em "filhos de um pai". */
[data-na-fold-block]:not([data-collapsed]) { gap: 0; }
[data-na-fold-block]:not([data-collapsed]) > .na-ap-group-head {
    border-bottom-left-radius: 0; border-bottom-right-radius: 0;
    background: linear-gradient(var(--na-bg-grey), var(--na-bg-grey)) var(--na-surface-solid); }
[data-na-fold-block]:not([data-collapsed]) > .na-fold-body {
    margin-left: 1.05rem; padding-left: 1.05rem;
    /* Espinha pontilhada, desenhada com `radial-gradient` em vez de `border-left: dotted`: a
       borda pontilhada do CSS dá quadradinhos colados, sem controle de raio nem de espaçamento.
       Aqui cada ponto é um círculo de 1px a cada 7px, e o tom é o de borda de campo (um pouco
       mais forte que `--na-line`) porque pontilhado lê mais claro que linha cheia. */
    background-image: radial-gradient(circle at 1px 1px, var(--na-line-input) 1px, transparent 1.5px);
    background-size: 2px 7px; background-repeat: repeat-y; background-position: left .2rem; }
/* A espinha não pode passar da última ação: o `padding-top` a começa colada no cabeçalho e o
   corpo termina exatamente onde o conteúdo termina. */
[data-na-fold-block]:not([data-collapsed]) > .na-fold-body > .na-fold-inner {
    display: flex; flex-direction: column; gap: .45rem; padding-block: .55rem; }
/* Mesma tipografia do cabeçalho de dimensão do diagnóstico e da tela da avaliação: as três telas
   cortam o ciclo pelo mesmo eixo e devem anunciá-lo do mesmo jeito. */
.na-ap-group-label { text-transform: uppercase; letter-spacing: .06em; font-size: var(--na-fs-xs);
    color: var(--na-text-secondary); }

/* One action. <details> so it opens without JS; the summary alone must be enough to audit the
   line (what, where it came from, who owns it, when it is due). */
/* ---- Abertura dos <details> do plano -------------------------------------------------------
   A ação (com o formulário de acompanhamento dentro), o histórico e o "Ver números" abriam num
   quadro só: o conteúdo surgia inteiro e a lista dava um salto. Aqui eles passam a abrir como os
   blocos recolhíveis da mesma tela (.na-fold-body) — altura primeiro, conteúdo entrando atrás,
   nos mesmos .22s/cubic-bezier(.4,0,.2,1), para a página ter UM tempo só e não três.

   São dois caminhos porque, até pouco tempo, não havia como animar um <details> em CSS: onde
   `::details-content` existe, a altura interpola de verdade e o FECHAMENTO também anima; onde não
   existe, um keyframe de entrada tira o corte seco — sem altura, mas também sem salto. Nenhum dos
   dois é requisito: sem suporte a nada disto, o <details> abre como sempre abriu. */
@supports selector(::details-content) {
    /* `interpolate-size` fica NOS details, e não no :root: a propriedade é herdada, e ligá-la
       globalmente mudaria como `auto` interpola em toda a aplicação — efeito colateral fora
       do que esta seção se propõe a mexer. */
    .na-ap-item, .na-ap-history, .na-ap-chart-data { interpolate-size: allow-keywords; }
    .na-ap-item::details-content,
    .na-ap-history::details-content,
    .na-ap-chart-data::details-content {
        block-size: 0; overflow: hidden; opacity: 0;
        /* `allow-discrete` mantém o conteúdo visível durante o fechamento; sem ele o
           `content-visibility` corta no primeiro quadro e a altura anima sobre o vazio. */
        transition: block-size .22s cubic-bezier(.4, 0, .2, 1), opacity .14s ease,
                    content-visibility .22s allow-discrete;
    }
    .na-ap-item[open]::details-content,
    .na-ap-history[open]::details-content,
    .na-ap-chart-data[open]::details-content {
        block-size: auto; opacity: 1;
        /* A altura lidera e o conteúdo entra logo atrás — mesma defasagem do .na-fold-body. */
        transition-delay: 0s, .06s, 0s;
    }
}
@supports not selector(::details-content) {
    .na-ap-item[open] > .na-ap-body,
    .na-ap-history[open] > .na-ap-history-list,
    .na-ap-chart-data[open] > .na-ap-chart-tablewrap {
        animation: na-details-in .22s cubic-bezier(.4, 0, .2, 1);
    }
}
@keyframes na-details-in { from { opacity: 0; transform: translateY(-6px); } }

@media (prefers-reduced-motion: reduce) {
    .na-ap-item::details-content,
    .na-ap-history::details-content,
    .na-ap-chart-data::details-content { transition: none; }
    .na-ap-item[open] > .na-ap-body,
    .na-ap-history[open] > .na-ap-history-list,
    .na-ap-chart-data[open] > .na-ap-chart-tablewrap { animation: none; }
}

.na-ap-item {
    border: 1px solid var(--na-line); border-left: 3px solid transparent;
    border-radius: var(--na-radius);
    background: var(--na-surface); backdrop-filter: var(--na-blur); -webkit-backdrop-filter: var(--na-blur);
    box-shadow: var(--na-shadow); overflow: hidden;
}
.na-ap-item[open] { box-shadow: var(--na-shadow-lg); border-left-color: var(--na-primary); }
/* Overdue reads at a glance from the rail; the deadline text still says "Venceu há N dias",
   so colour is never the only signal. */
.na-ap-item.is-late { border-left-color: var(--na-error); }
.na-ap-item.is-closed { opacity: .72; }
.na-ap-item.is-closed:hover, .na-ap-item.is-closed[open] { opacity: 1; }

.na-ap-sum {
    display: flex; gap: .75rem; align-items: center; justify-content: space-between;
    padding: .7rem .95rem; cursor: pointer; list-style: none;
}
.na-ap-sum::-webkit-details-marker { display: none; }
.na-ap-sum:hover { background: var(--na-primary-hover); }
.na-ap-sum:focus-visible { outline: none; box-shadow: var(--na-ring); }
/* The affordance the row was missing: nothing said these lines opened. */
.na-ap-caret { display: flex; flex: none; color: var(--na-text-secondary); transition: transform .16s ease; }
.na-ap-item[open] .na-ap-caret { transform: rotate(180deg); color: var(--na-primary); }
.na-ap-sum-main { display: flex; flex-direction: column; gap: .18rem; min-width: 0; flex: 1; }
.na-ap-sum-title { font-weight: 600; line-height: 1.35; }
.na-ap-sum-meta {
    display: flex; flex-wrap: wrap; align-items: center; gap: .35rem .5rem;
    font-size: var(--na-fs-xs); color: var(--na-text-secondary);
}
.na-ap-dot { opacity: .5; }
.na-ap-owner { display: inline-flex; align-items: center; gap: .25rem; }
.na-ap-owner .na-ico { width: 1em; height: 1em; }
.na-ap-sum-side {
    display: flex; flex-direction: column; align-items: flex-end; gap: .25rem;
    flex: none; min-width: 150px;
}
.na-ap-sum-side > span { font-size: var(--na-fs-xs); }
.na-ap-progress { width: 110px; }
.na-ap-late { color: var(--na-error); font-weight: 600; }

.na-ap-body {
    display: grid; gap: .9rem; padding: .9rem 1.1rem 1.1rem;
    border-top: 1px solid var(--na-line); background: var(--na-bg-grey);
}
.na-ap-desc { margin: 0; font-size: var(--na-fs-md); line-height: 1.6; }
/* Two columns so the reference block (aferição, comprovação, responsável, base legal) stops
   being a tall wall pushing the form below the fold. */
.na-ap-defs {
    display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
    gap: .75rem 1.75rem; align-content: start;
}
.na-ap-defs dt { margin-top: 0; }
.na-ap-defs dd { color: var(--na-text); }
/* The form is a different activity from reading the measure — say so with a rule. */
.na-ap-form { display: grid; gap: .8rem; padding-top: .9rem; border-top: 1px dashed var(--na-line); }
.na-ap-remove { margin-left: auto; }

.na-ap-history > summary {
    cursor: pointer; font-size: var(--na-fs-sm); color: var(--na-text-secondary); padding: .25rem 0;
}
.na-ap-history-list { margin: .5rem 0 0; padding: 0; list-style: none; display: flex; flex-direction: column; gap: .5rem; }
.na-ap-history-list li {
    display: flex; flex-direction: column; gap: .1rem; font-size: var(--na-fs-sm);
    padding-left: .75rem; border-left: 2px solid var(--na-line);
}
.na-ap-history-list .na-muted { font-size: var(--na-fs-2xs); }

/* Cartão colapsável genérico: um <details class="na-card na-disclosure"> cujo <summary> vira
   o cabeçalho clicável. Nasceu aqui, no compositor do plano de ação, e foi generalizado
   quando o catálogo de planos precisou do mesmo desenho — formulário de criação recolhido,
   para não competir com a lista que é o objeto principal da tela. */
.na-disclosure > summary, .na-ap-add > summary {
    cursor: pointer; list-style: none; display: flex; align-items: center; gap: .5rem;
    font-weight: 600;
}
.na-disclosure > summary::-webkit-details-marker,
.na-ap-add > summary::-webkit-details-marker { display: none; }
.na-disclosure[open] > summary, .na-ap-add[open] > summary { margin-bottom: 1rem; padding-bottom: .75rem; border-bottom: 1px solid var(--na-line); }
.na-disclosure > summary:focus-visible { outline: none; box-shadow: var(--na-ring); border-radius: var(--na-radius); }
.na-ap-add-body { display: grid; gap: 1.5rem; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); }
.na-ap-add-body section { display: flex; flex-direction: column; gap: .7rem; min-width: 0; }
.na-ap-add-body h3 { margin: 0; font-size: var(--na-fs-md); }
.na-ap-add-body form { display: flex; flex-direction: column; gap: .7rem; }

@media (max-width: 900px) {
    /* On a phone the gradient band was a full screen of chrome before the first action. */
    .na-diag-head { padding: 1.1rem 1.1rem; }
    .na-diag-head h1 { font-size: var(--na-fs-xl); }
    .na-ap-kpis { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .6rem; }
    .na-ap-kpis .na-statcard { padding: .7rem .8rem; gap: .6rem; }
    .na-ap-kpis .na-statcard-ico { width: 34px; height: 34px; }
    .na-ap-kpis .na-statcard-body strong { font-size: var(--na-fs-xl); }
    /* Plan-level actions are occasional; stacked full-width buttons ate a screen on a phone. */
    .na-ap-gov-forms { width: 100%; }
    .na-ap-gov-forms > form { flex: 1 1 auto; }
    .na-ap-refine { width: 100%; }
    .na-ap-refine .na-select, .na-ap-refine .na-input { max-width: none; flex: 1 1 160px; }
    .na-ap-sum { flex-wrap: wrap; }
    .na-ap-sum-side {
        flex-direction: row; flex-wrap: wrap; align-items: center; gap: .5rem;
        min-width: 0; width: 100%; padding-left: 1.75rem;
    }
    .na-ap-defs { grid-template-columns: 1fr; }
    .na-ap-charts { grid-template-columns: 1fr; }
}

/* ============================================================================
   Painel da plataforma (/admin) — organismos AdminOverviewHeader / AdminKpiRow /
   AdminPlanMix / AdminHealthPanel / AdminTopTenants.
   Mesma gramática do dashboard de diagnóstico (faixa em gradiente → KPIs → cartões de vidro),
   para os dois painéis do produto lerem como um sistema só.
   ============================================================================ */

.na-adm { display: flex; flex-direction: column; gap: 1.25rem; }

/* --- Faixa de cabeçalho: título à esquerda, dinheiro à direita --- */
.na-adm-head {
    display: flex; flex-wrap: wrap; gap: 1.5rem; align-items: center; justify-content: space-between;
    padding: 1.7rem 1.9rem; border-radius: var(--na-radius-lg);
    background: linear-gradient(180deg, rgba(255,255,255,.14), rgba(255,255,255,0) 42%), var(--na-grad);
    color: #fff; box-shadow: var(--na-shadow-lg);
    position: relative; overflow: hidden;
}
/* Brilho de canto: dá volume ao bloco chapado sem custar um segundo elemento no markup. */
.na-adm-head::after {
    content: ""; position: absolute; inset: auto -12% -70% auto; width: 340px; height: 340px;
    background: radial-gradient(circle, rgba(255,255,255,.22), transparent 62%);
    pointer-events: none;
}
.na-adm-head-main { position: relative; min-width: 240px; }
.na-adm-head h1 { color: #fff; margin: 0; font-size: var(--na-fs-3xl); letter-spacing: -.03em; }
.na-adm-head-sub { margin: .35rem 0 0; color: rgba(255,255,255,.82); font-size: var(--na-fs-md); }
.na-adm-head-actions { display: flex; flex-wrap: wrap; gap: .6rem; margin-top: 1.1rem; }
/* Botão outline SOBRE o gradiente — os tokens padrão do outline somem ali (igual .na-diag-back). */
.na-adm-onbrand {
    color: #fff; border-color: rgba(255,255,255,.42); background: rgba(255,255,255,.14);
    backdrop-filter: var(--na-blur); -webkit-backdrop-filter: var(--na-blur);
}
.na-adm-onbrand:hover { color: #fff; background: rgba(255,255,255,.26); border-color: rgba(255,255,255,.6); }

.na-adm-money { position: relative; display: flex; flex-wrap: wrap; gap: .8rem; }
.na-adm-money-item {
    display: flex; flex-direction: column; gap: .15rem; min-width: 170px;
    padding: .95rem 1.2rem; border-radius: var(--na-radius);
    background: rgba(255,255,255,.16); border: 1px solid rgba(255,255,255,.28);
    backdrop-filter: var(--na-blur); -webkit-backdrop-filter: var(--na-blur);
}
.na-adm-money-label { font-size: var(--na-fs-xs); color: rgba(255,255,255,.86); letter-spacing: .02em; }
.na-adm-money-value { font-size: var(--na-fs-4xl); line-height: 1.1; letter-spacing: -.03em; font-weight: 700; }
.na-adm-money-item small { font-size: var(--na-fs-2xs); color: rgba(255,255,255,.78); }

/* --- KPIs: âncora estendida ---
   O <a> é uma irmã vazia cobrindo o cartão (nada de botão dentro de link, ver AdminKpiRow), e o
   gatilho "?" sobe acima dela para receber o próprio clique. */
.na-adm-kpi { position: relative; display: block; }
.na-adm-kpi-link { position: absolute; inset: 0; z-index: 1; border-radius: var(--na-radius); }
.na-adm-kpi-link:focus-visible { outline: none; box-shadow: var(--na-ring); }
.na-adm-kpi .na-tip { z-index: 2; }
.na-adm-kpi:hover .na-statcard { transform: translateY(-3px); box-shadow: var(--na-shadow-lg); }
.na-adm-kpis .na-statcard { height: 100%; }

/* --- Corpo: mix de planos (largo) + saúde da base (estreito) --- */
.na-adm-grid { display: grid; gap: 1.25rem; grid-template-columns: minmax(0, 1.6fr) minmax(280px, 1fr); }
.na-adm-panel { display: flex; flex-direction: column; gap: 1rem; padding: 1.35rem 1.5rem; }
.na-adm-panel-head {
    display: flex; flex-wrap: wrap; gap: .5rem; align-items: baseline; justify-content: space-between;
}
.na-adm-panel-head strong { font-size: var(--na-fs-base); letter-spacing: -.01em; }
.na-adm-panel-head .na-link { font-size: var(--na-fs-sm); }
.na-adm-empty { margin: 0; color: var(--na-text-secondary); font-size: var(--na-fs-md); }
.na-adm-code { font-size: var(--na-fs-xs); }
.na-adm-note { margin: 0; color: var(--na-text-secondary); font-size: var(--na-fs-xs); }

/* --- Barra 100% empilhada do mix de planos ---
   O vão de 2px entre fatias é a superfície aparecendo: sem ele, dois roxos vizinhos viram um
   bloco só. A fatia não leva número dentro (contraste), então a tabela logo abaixo é ao mesmo
   tempo a legenda e a versão acessível do gráfico. */
.na-adm-mix { display: flex; gap: 2px; height: 30px; border-radius: 999px; overflow: hidden; }
.na-adm-mix-seg {
    display: flex; align-items: center; justify-content: center; min-width: 0;
    flex-basis: 0; flex-shrink: 1;
}
.na-adm-mix-seg:first-child { border-radius: 999px 4px 4px 999px; }
.na-adm-mix-seg:last-child { border-radius: 4px 999px 999px 4px; }
.na-adm-mix-seg:only-child { border-radius: 999px; }

.na-adm-mixtable { font-size: var(--na-fs-sm); }
.na-adm-mixtable th, .na-adm-mixtable td { padding: .5rem .6rem; }
.na-adm-mixtable th:first-child, .na-adm-mixtable td:first-child { padding-left: 0; }
.na-adm-mixtable th:last-child, .na-adm-mixtable td:last-child { padding-right: 0; }
.na-adm-mixtable th { background: none; }
.na-adm-mixtable tbody tr:hover { background: none; }

/* Amostra de cor da legenda: quadradinho antes do nome do plano. */
.na-adm-sw {
    display: inline-block; width: 10px; height: 10px; border-radius: 3px;
    margin-right: .5rem; vertical-align: baseline;
}
.na-cat-0 { background: var(--na-cat-0); }
.na-cat-1 { background: var(--na-cat-1); }
.na-cat-2 { background: var(--na-cat-2); }
.na-cat-3 { background: var(--na-cat-3); }
.na-cat-4 { background: var(--na-cat-4); }

/* --- Medidores de parte/todo --- */
.na-adm-meters { display: flex; flex-direction: column; gap: 1.1rem; }
.na-adm-meter { display: flex; flex-direction: column; gap: .4rem; }
.na-adm-meter-head { display: flex; align-items: baseline; justify-content: space-between; gap: .5rem; font-size: var(--na-fs-sm); }
.na-adm-meter-head strong { font-size: var(--na-fs-lg); letter-spacing: -.01em; }
.na-adm-meter small { font-size: var(--na-fs-2xs); line-height: 1.4; }

.na-adm-figures {
    display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: .9rem;
    margin: 0; padding-top: 1rem; border-top: 1px solid var(--na-line);
}
.na-adm-figures dt { font-size: var(--na-fs-xs); color: var(--na-text-secondary); }
.na-adm-figures dd { margin: .15rem 0 0; font-size: var(--na-fs-xl); font-weight: 700; letter-spacing: -.02em; }
.na-adm-figures dd span { font-size: var(--na-fs-xs); font-weight: 500; }

/* --- Ranking de empresas --- */
.na-adm-rank { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: .85rem; }
.na-adm-rank-row {
    display: flex; align-items: center; gap: .75rem; text-decoration: none; color: inherit;
    padding: .15rem .25rem; border-radius: 10px; transition: background .12s ease;
}
.na-adm-rank-row:hover { background: var(--na-primary-hover); }
.na-adm-rank-name { display: flex; flex-direction: column; min-width: 0; flex: 1; }
.na-adm-rank-name strong { font-size: var(--na-fs-md); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.na-adm-rank-num { display: flex; flex-direction: column; align-items: flex-end; flex: none; }
.na-adm-rank-num strong { font-size: var(--na-fs-lg); letter-spacing: -.01em; font-variant-numeric: tabular-nums; }
.na-adm-rank-num small { font-size: var(--na-fs-2xs); }
/* Barra relativa à primeira colocada — proporção entre as linhas, sem eixo nem escala absoluta. */
.na-adm-rank-bar { height: 5px; margin-top: .3rem; border-radius: 999px; background: var(--na-line); overflow: hidden; }
.na-adm-rank-bar > span { display: block; height: 100%; border-radius: 999px; background: var(--na-grad); }

@media (max-width: 1000px) {
    .na-adm-grid { grid-template-columns: 1fr; }
}
@media (max-width: 900px) {
    .na-adm-head { padding: 1.2rem 1.2rem; gap: 1.1rem; }
    .na-adm-head h1 { font-size: var(--na-fs-xl); }
    .na-adm-money { width: 100%; }
    .na-adm-money-item { flex: 1 1 140px; min-width: 0; padding: .75rem .9rem; }
    .na-adm-money-value { font-size: var(--na-fs-2xl); }
    .na-adm-kpis { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .6rem; }
    .na-adm-kpis .na-statcard { padding: .8rem .85rem; gap: .6rem; }
    .na-adm-kpis .na-statcard-ico { width: 36px; height: 36px; }
    .na-adm-kpis .na-statcard-body strong { font-size: var(--na-fs-xl); }
    .na-adm-panel { padding: 1.1rem 1.15rem; }
}

/* ---- Inspetor de eventos da Stripe (/admin/stripe) ------------------------
   Duas peças que não existiam: uma lista de definições para os metadados do evento e um bloco
   de código rolável para o payload cru. O payload é JSON de terceiro, sem quebras garantidas —
   por isso rola dentro do próprio bloco em vez de esticar a página, que é a regra do app para
   qualquer conteúdo largo (ver .na-help-tablewrap, .na-heatmap-scroll). */
.na-deflist { display: grid; grid-template-columns: minmax(8rem, auto) 1fr; gap: .45rem 1rem; margin: 0; }
.na-deflist dt { font-size: var(--na-fs-sm); color: var(--na-muted); }
.na-deflist dd { margin: 0; min-width: 0; overflow-wrap: anywhere; }

.na-code-block {
    margin: 0; padding: .9rem 1rem; max-height: 26rem; overflow: auto;
    background: var(--na-surface-2, var(--na-surface)); border: 1px solid var(--na-line);
    border-radius: var(--na-radius); font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
    font-size: var(--na-fs-sm); line-height: 1.5; white-space: pre; tab-size: 2;
}

@media (max-width: 40rem) {
    .na-deflist { grid-template-columns: 1fr; gap: .15rem; }
    .na-deflist dd { margin-bottom: .5rem; }
}

/* ---- Documento incorporável (/embed/*) -----------------------------------
   O iframe roda dentro da página de vendas de outra pessoa, então o padrão é NÃO pintar fundo:
   o quadro herda visualmente a seção do site anfitrião e o cliente não precisa acertar duas
   cores. `?fundo=pagina` volta ao fundo do tema, para quem quiser o bloco destacado.

   A malha radial de body::before é `position: fixed` — dentro de um iframe ela cobriria a
   viewport inteira do quadro e apareceria como um retângulo colorido sobre a página do cliente.
   Some junto com o fundo. */
:root[data-embed="transparent"],
:root[data-embed="transparent"] body { background: transparent; }
:root[data-embed="transparent"] body::before { content: none; }

/* Fundo transparente NÃO se resolve só zerando `background`. Quando o `color-scheme` do documento
   dentro do iframe difere do documento que o emoldura, o Chrome pinta um fundo opaco por baixo —
   é uma salvaguarda de legibilidade da própria especificação, e ela vence qualquer `transparent`
   que o CSS declare. Os temas escuros (midnight, emerald, graphite) declaram `color-scheme: dark`,
   então o embed aparecia como um retângulo quase preto sobre a seção do Wix, com html e body
   computando `rgba(0,0,0,0)` — o que faz o sintoma parecer impossível ao inspecionar.
   Neutralizar o esquema resolve, e não custa nada aqui: as cores do tema vêm das custom
   properties, não do `color-scheme`, e este documento não tem controle nativo nem barra de
   rolagem para tirar proveito dele. */
:root[data-embed="transparent"] { color-scheme: normal; }

/* O respiro é do embed, não da grade: o selo "Mais popular" fica em top:-.8rem e o card sobe 4px
   no hover — sem folga em volta, os dois são cortados pela borda do iframe. */
.na-embed { padding: 1.25rem 1rem; }
.na-embed .na-plans { max-width: 900px; }
.na-embed-title { margin: 0 0 1.5rem; }
.na-embed-note { font-size: .8rem; margin-top: 1.25rem; }

@media (max-width: 40rem) {
    .na-embed { padding: 1.25rem .75rem; }
}

/* ---- Checkout transparente (/app/assinatura) ------------------------------
   O painel que na-stripe-payment.js insere ao lado dos botões de plano. Só existe quando o script
   roda: sem JavaScript a página fica exatamente como antes, com os botões levando ao checkout
   hospedado da Stripe. */
.na-pay-panel {
    margin-top: 1.25rem; padding: 1.15rem 1.2rem; border: 1px solid var(--na-line);
    border-radius: var(--na-radius); background: var(--na-surface);
}
.na-pay-title { margin: 0 0 .15rem; font-size: var(--na-fs-lg); }
.na-pay-summary { margin: 0 0 1rem; font-variant-numeric: tabular-nums; }
/* O Element é um iframe da Stripe: precisa de altura própria, e não pode ganhar overflow nosso
   por cima ou o dropdown de parcelas fica cortado dentro do cartão. */
.na-pay-element { min-height: 3rem; }
.na-pay-status { margin: .75rem 0 0; min-height: 1.25rem; font-size: var(--na-fs-sm); }
.na-pay-status[data-kind="error"] { color: var(--na-error); }
.na-pay-fallback { margin: .35rem 0 0; font-size: var(--na-fs-sm); }

/* ---- Gateways de pagamento (/admin/gateways) -------------------------------
   Classes próprias porque a tela antes emprestava as de outras: `na-plan-pay` (os meios de
   pagamento de um *plano*) para as capacidades e `na-page-head` (cabeçalho de *página*) dentro do
   card. Emprestada, cada regra trazia junto o layout do contexto de origem, e o resultado era
   acidental — badges colados no título, barra de ações empilhada, input de chave secreta com
   1080px de largura. */

.na-gw-h2 { margin: 0; font-size: var(--na-fs-xl); letter-spacing: -.01em; }

/* Comparativo. É rolável no eixo x porque em telas estreitas três colunas de gateway não cabem, e
   encolher a fonte até caber tornaria ilegível justamente a tabela que existe para ser comparada. */
.na-gw-matrix-card { padding-bottom: .5rem; }
.na-gw-matrix-scroll { margin-top: 1rem; overflow-x: auto; }
.na-gw-matrix { width: 100%; border-collapse: collapse; font-size: var(--na-fs-sm); }
.na-gw-matrix th, .na-gw-matrix td { padding: .6rem .9rem; text-align: left; border-bottom: 1px solid var(--na-line); }
.na-gw-matrix thead th { font-size: var(--na-fs-xs); text-transform: uppercase; letter-spacing: .06em; color: var(--na-text-secondary); white-space: nowrap; }
.na-gw-matrix tbody th { font-weight: 500; color: var(--na-text-secondary); }
.na-gw-matrix tbody tr:last-child th, .na-gw-matrix tbody tr:last-child td { border-bottom: 0; }
.na-gw-matrix td { text-align: center; }
.na-gw-matrix thead th:not(:first-child) { text-align: center; }
.na-gw-col-name { display: block; font-size: var(--na-fs-sm); text-transform: none; letter-spacing: 0; color: var(--na-text); }
/* A coluna do gateway ativo é a única que descreve o presente; as outras são hipóteses. */
.na-gw-col-active { background: var(--na-bg-grey); }
.na-gw-yes { color: var(--na-success, #16a34a); font-weight: 700; }
.na-gw-no { color: var(--na-text-secondary); opacity: .55; }
.na-gw-owner { font-size: var(--na-fs-xs); color: var(--na-text-secondary); }

/* Card de um gateway. */
.na-gw-head { display: flex; flex-wrap: wrap; gap: 1rem; align-items: flex-start; justify-content: space-between; }
.na-gw-id { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; min-width: 0; }
.na-gw-badges { display: flex; flex-wrap: wrap; align-items: center; gap: .35rem; }
/* Medida de leitura: o resumo é prosa, e prosa atravessando 1100px de card não se lê, se varre. */
.na-gw-summary { margin: .5rem 0 0; max-width: 68ch; }

.na-gw-facts { display: grid; grid-template-columns: minmax(9rem, auto) 1fr; gap: .6rem 1.25rem; margin: 1.25rem 0 0; }
.na-gw-facts dt { font-size: var(--na-fs-sm); color: var(--na-muted, var(--na-text-secondary)); }
.na-gw-facts dd { margin: 0; min-width: 0; overflow-wrap: anywhere; }
.na-gw-hint { margin: .35rem 0 0; max-width: 62ch; font-size: var(--na-fs-xs); color: var(--na-text-secondary); }

/* Uma linha só: os dois <form> são irmãos no mesmo flex, e o de dentro NÃO reabre outro contexto
   de layout — era isso que empilhava caixa/select/botão em coluna. */
.na-gw-toolbar { display: flex; flex-wrap: wrap; gap: .75rem; align-items: center; margin-top: 1.25rem; }
.na-gw-envform { display: flex; flex-wrap: wrap; gap: .6rem; align-items: center; }
.na-gw-check { display: inline-flex; align-items: center; gap: .45rem; font-size: var(--na-fs-sm); cursor: pointer; white-space: nowrap; }
.na-gw-check input { width: 17px; height: 17px; flex: none; accent-color: var(--na-primary); }
.na-gw-envselect { width: auto; min-width: 11rem; }

/* Credenciais. */
.na-gw-cred { margin-top: 1rem; border-top: 1px solid var(--na-line); padding-top: .85rem; }
.na-gw-cred > summary { display: flex; align-items: center; gap: .5rem; cursor: pointer; list-style: none; color: var(--na-primary); font-size: var(--na-fs-sm); }
.na-gw-cred > summary::-webkit-details-marker { display: none; }
/* Triângulo desenhado com bordas em vez de um caractere: "▸" depende da fonte, e na que a app usa
   ele saía do tamanho de um ponto final — affordance nenhuma para o único controle que revela o
   formulário de chaves. */
.na-gw-cred > summary::before {
    content: ""; flex: none; width: 0; height: 0;
    border-left: 5px solid currentColor;
    border-top: 4px solid transparent; border-bottom: 4px solid transparent;
    transition: transform .15s ease;
}
.na-gw-cred[open] > summary::before { transform: rotate(90deg); }
.na-gw-cred > summary:focus-visible { outline: none; box-shadow: var(--na-ring); border-radius: var(--na-radius); }
.na-gw-cred-title { font-weight: 500; }
/* Um campo de chave não fica mais legível ocupando a largura do card — fica só mais difícil de
   conferir de ponta a ponta. */
.na-gw-credform { margin-top: .9rem; max-width: 34rem; }

@media (max-width: 40rem) {
    /* Rótulo em cima do valor. Em duas colunas num celular sobrava tão pouca largura para o <dd>
       que a URL do webhook quebrava no meio da palavra ("/api/payments/str" ⏎ "ipe/webhook") —
       justamente o campo que existe para ser copiado inteiro e sem erro. */
    .na-gw-facts { grid-template-columns: 1fr; gap: .2rem; }
    .na-gw-facts dd { margin-bottom: .7rem; }
    .na-gw-facts dd:last-child { margin-bottom: 0; }
}

/* ---- Stepper do funil de compra (/planos → /cadastro → /app/assinatura) ---
   Três passos numa linha, ligados por um filete que se preenche conforme avança. O estado vem do
   atributo data-state escrito pelo servidor — não há JavaScript aqui, e não há :has() nem contadores
   CSS decidindo nada, porque o passo corrente é um fato do servidor, não do layout.

   A cor nunca é o único sinal: o passo concluído troca o número por "✓", o corrente ganha anel e
   peso de fonte, e cada um carrega o estado por extenso num <span> visualmente oculto. */
.na-stepper {
    /* Teto, porque um stepper esticado deixa de ser uma régua e vira uma linha do horizonte: no
       /app/assinatura ele ocupava toda a área de conteúdo enquanto o card abaixo tinha 560px, e os
       dois pareciam pertencer a telas diferentes. 35rem = os mesmos 560px do card. */
    max-width: 35rem;
    margin: 0 auto 1.5rem;
}

.na-stepper-list {
    display: grid;
    grid-auto-flow: column;
    grid-auto-columns: 1fr;
    list-style: none;
    margin: 0;
    padding: 0;
}

.na-step {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: .45rem;
    position: relative;
    text-align: center;
}

/* O filete que liga um passo ao anterior. Desenhado no ::before de cada passo (exceto o primeiro)
   e centrado na altura da bolinha, para não depender da altura do rótulo — que quebra em duas
   linhas no celular. */
.na-step + .na-step::before {
    content: "";
    position: absolute;
    top: 0.9375rem;                 /* metade da bolinha de 1.875rem */
    right: 50%;
    left: -50%;
    height: 2px;
    background: var(--na-border);
    z-index: 0;
}

.na-step[data-state="done"]::before,
.na-step[data-state="current"]::before { background: var(--na-primary); }

.na-step-mark {
    position: relative;
    z-index: 1;                     /* acima do filete */
    display: grid;
    place-items: center;
    width: 1.875rem;
    height: 1.875rem;
    border-radius: 50%;
    border: 2px solid var(--na-border);
    background: var(--na-surface-solid);
    color: var(--na-text-secondary);
    font-size: .8rem;
    font-weight: 600;
    font-variant-numeric: tabular-nums;
}

.na-step-label {
    font-size: .8rem;
    color: var(--na-text-secondary);
    line-height: 1.25;
}

.na-step[data-state="done"] .na-step-mark {
    border-color: var(--na-primary);
    background: var(--na-primary);
    color: var(--na-primary-contrast);
}

.na-step[data-state="current"] .na-step-mark {
    border-color: var(--na-primary);
    color: var(--na-primary);
    /* Anel externo em vez de sombra difusa: sobrevive ao modo de alto contraste. */
    box-shadow: 0 0 0 4px var(--na-primary-hover);
}

.na-step[data-state="current"] .na-step-label {
    color: var(--na-text);
    font-weight: 600;
}

@media (max-width: 30rem) {
    /* No celular o rótulo do passo que não é o corrente vira ruído: as bolinhas e o filete já
       dizem onde a pessoa está, e três rótulos lado a lado quebram em três linhas cada. */
    .na-step[data-state="todo"] .na-step-label,
    .na-step[data-state="done"] .na-step-label { display: none; }
}

/* Os dois campos do responsável técnico, lado a lado quando cabe. Vivem dentro de um Alert, que é
   estreito de propósito — daí o minmax em vez de duas colunas fixas. */
.na-resp-fields { display: grid; gap: .5rem 1rem; grid-template-columns: repeat(auto-fit, minmax(13rem, 1fr)); }

/* ---- Cadastro: grade de duas colunas no desktop ---------------------------
   Empilhados, os seis campos passavam da dobra num monitor comum: quem estava comprando tinha de
   rolar para achar o botão, num card de 460px com a largura sobrando dos dois lados.

   auto-fit + minmax, e não duas colunas fixas: abaixo de ~26rem de espaço útil ele volta sozinho a
   uma coluna, sem media query e sem depender de eu ter adivinhado a largura do card. */
.na-signup-fields {
    display: grid;
    gap: 0 1rem;
    grid-template-columns: repeat(auto-fit, minmax(13rem, 1fr));
}

/* Ocupa a linha toda quando há duas colunas; inofensivo quando só há uma. */
.na-signup-fields .na-span-2 { grid-column: 1 / -1; }

/* ---- Checkout: formulário + resumo do pedido -------------------------------
   Duas colunas onde antes havia um card sozinho no meio da tela. A da direita não é enfeite: é o
   que a pessoa está comprando, e ela estava ausente dos dois passos em que se pede CNPJ e cartão.

   minmax(0,1fr) na primeira coluna, e não 1fr: sem isso um <input> força a largura mínima do
   conteúdo e a coluna do formulário empurra a do resumo para fora em telas médias. */
.na-checkout-grid {
    display: grid;
    gap: 1.5rem;
    grid-template-columns: minmax(0, 1fr);
    align-items: start;
}

@media (min-width: 56rem) {
    .na-checkout-grid { grid-template-columns: minmax(0, 1fr) 20rem; }
    /* Acompanha a rolagem quando o formulário é mais alto que a tela — o pedido tem de continuar
       visível na hora de confirmar, que é quando a dúvida aparece. */
    .na-checkout-grid .na-summary { position: sticky; top: 1.5rem; }
}

.na-summary {
    border: 1px solid var(--na-line);
    border-radius: var(--na-radius);
    background: var(--na-surface);
    padding: 1.25rem;
}

.na-summary-title {
    font-size: .78rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: .06em;
    color: var(--na-text-secondary);
    margin: 0 0 .75rem;
}

.na-summary-plan { display: flex; flex-direction: column; gap: .15rem; }
.na-summary-name { font-size: 1.05rem; font-weight: 600; }
.na-summary-desc { font-size: .82rem; }

.na-summary-price { display: flex; align-items: baseline; gap: .25rem; margin-top: .6rem; }
.na-summary-amount { font-size: 1.75rem; font-weight: 700; color: var(--na-primary); }
.na-summary-period { font-size: .9rem; }

.na-summary-terms { font-size: .8rem; margin: .35rem 0 0; }

.na-summary-items,
.na-summary-trust { list-style: none; margin: 0; padding: 0; }

.na-summary-items {
    margin-top: .9rem;
    padding-top: .9rem;
    border-top: 1px solid var(--na-line);
    display: grid;
    gap: .4rem;
}

.na-summary-items li,
.na-summary-trust li { position: relative; padding-left: 1.15rem; font-size: .82rem; line-height: 1.35; }

/* Marcas em ::before para que a lista continue sendo uma lista para leitor de tela — o ícone é
   decorativo e não deve virar texto lido antes de cada item. */
.na-summary-items li::before { content: "✓"; position: absolute; left: 0; color: var(--na-primary); font-weight: 700; }

.na-summary-trust {
    margin-top: .9rem;
    padding-top: .9rem;
    border-top: 1px solid var(--na-line);
    display: grid;
    gap: .35rem;
}

.na-summary-trust li { color: var(--na-text-secondary); font-size: .76rem; }
.na-summary-trust li::before { content: "🔒"; position: absolute; left: 0; font-size: .7rem; }

/* ---- Checkout: escolha de plano e forma de pagamento ----------------------
   Radios de verdade, estilizados. Não é purismo: eles moram DENTRO do formulário de compra, então
   sem circuito o navegador ainda manda a escolha no POST — o mesmo controle serve o caminho com e
   sem JavaScript. Trocar por <div @onclick> mataria a compra de quem bloqueia script.

   O input nativo continua no DOM (não é display:none) para que o foco por teclado e a navegação por
   setas do grupo de radio continuem funcionando; quem some é só o desenho padrão. */
.na-choice { border: 0; margin: 0 0 1rem; padding: 0; display: grid; gap: .5rem; }

.na-choice-legend {
    font-size: .78rem; font-weight: 600; text-transform: uppercase; letter-spacing: .06em;
    color: var(--na-text-secondary); padding: 0; margin-bottom: .1rem;
}

.na-choice-opt {
    display: flex; align-items: flex-start; gap: .7rem;
    border: 1px solid var(--na-line); border-radius: var(--na-radius);
    padding: .75rem .9rem; cursor: pointer;
    transition: border-color .12s ease, background-color .12s ease;
}

.na-choice-opt:hover { border-color: var(--na-primary); background: var(--na-primary-hover); }

/* :has() para pintar o cartão inteiro a partir do estado do input — sem :has() o rótulo continua
   legível e só perde o destaque, que é degradação aceitável. */
.na-choice-opt:has(input:checked) {
    border-color: var(--na-primary);
    background: var(--na-primary-hover);
    box-shadow: 0 0 0 1px var(--na-primary);
}

.na-choice-opt:has(input:focus-visible) { outline: 2px solid var(--na-primary); outline-offset: 2px; }

.na-choice-opt input { margin: .2rem 0 0; accent-color: var(--na-primary); flex: none; }

.na-choice-body { display: flex; flex-direction: column; gap: .15rem; }
.na-choice-name { font-weight: 600; font-size: .92rem; }
.na-choice-note { font-size: .78rem; line-height: 1.35; }

/* ---- Zona de risco: exclusão da própria conta (/app/conta) ----------------
   Moldura vermelha e colunas lado a lado "o que apaga" × "o que fica". As duas listas juntas são o
   ponto: sem elas, um botão "Excluir conta" deixa a pessoa adivinhando se está apagando o histórico
   de conformidade da empresa — que é justamente o que ela NÃO está. */
.na-card.na-danger { border-color: var(--na-error); }
.na-danger-cols { display: grid; gap: 1rem 1.5rem; grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr)); }
.na-danger-h { font-size: .82rem; font-weight: 600; margin: 0 0 .4rem; }
.na-danger-list { margin: 0; padding-left: 1.1rem; display: grid; gap: .25rem; font-size: .84rem; }
