/* ═══════════════════════════════════════════════════════════════════════════
   PORTAL DE NOTAS · NATURGY — S08 redesign
   Identidade Naturgy do Connecta (azul institucional #004571, laranja de ação
   #E57200), Archivo + IBM Plex Mono, vendorizadas em /fonts. Fonte de verdade
   visual: Prototipo_Portal_de_Notas_v2.html (docs/specs/S08-redesign.md).
   Tema único (claro). Bootstrap 5 carrega antes deste arquivo: as seções 8 e 9
   sobrescrevem os componentes Bootstrap e as classes legadas das views.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ───────────────────────── (1) @font-face ───────────────────────── */
@font-face {
    font-family: 'Archivo';
    font-style: normal;
    font-weight: 400;
    font-display: swap;
    src: url(/fonts/archivo-latin-400.woff2) format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
    font-family: 'Archivo';
    font-style: normal;
    font-weight: 400;
    font-display: swap;
    src: url(/fonts/archivo-latin-ext-400.woff2) format('woff2');
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
    font-family: 'Archivo';
    font-style: normal;
    font-weight: 500;
    font-display: swap;
    src: url(/fonts/archivo-latin-500.woff2) format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
    font-family: 'Archivo';
    font-style: normal;
    font-weight: 500;
    font-display: swap;
    src: url(/fonts/archivo-latin-ext-500.woff2) format('woff2');
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
    font-family: 'Archivo';
    font-style: normal;
    font-weight: 600;
    font-display: swap;
    src: url(/fonts/archivo-latin-600.woff2) format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
    font-family: 'Archivo';
    font-style: normal;
    font-weight: 600;
    font-display: swap;
    src: url(/fonts/archivo-latin-ext-600.woff2) format('woff2');
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
    font-family: 'Archivo';
    font-style: normal;
    font-weight: 700;
    font-display: swap;
    src: url(/fonts/archivo-latin-700.woff2) format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
    font-family: 'Archivo';
    font-style: normal;
    font-weight: 700;
    font-display: swap;
    src: url(/fonts/archivo-latin-ext-700.woff2) format('woff2');
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
    font-family: 'IBM Plex Mono';
    font-style: normal;
    font-weight: 400;
    font-display: swap;
    src: url(/fonts/ibmplexmono-latin-400.woff2) format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
    font-family: 'IBM Plex Mono';
    font-style: normal;
    font-weight: 400;
    font-display: swap;
    src: url(/fonts/ibmplexmono-latin-ext-400.woff2) format('woff2');
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
    font-family: 'IBM Plex Mono';
    font-style: normal;
    font-weight: 500;
    font-display: swap;
    src: url(/fonts/ibmplexmono-latin-500.woff2) format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
    font-family: 'IBM Plex Mono';
    font-style: normal;
    font-weight: 500;
    font-display: swap;
    src: url(/fonts/ibmplexmono-latin-ext-500.woff2) format('woff2');
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
    font-family: 'IBM Plex Mono';
    font-style: normal;
    font-weight: 600;
    font-display: swap;
    src: url(/fonts/ibmplexmono-latin-600.woff2) format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
    font-family: 'IBM Plex Mono';
    font-style: normal;
    font-weight: 600;
    font-display: swap;
    src: url(/fonts/ibmplexmono-latin-ext-600.woff2) format('woff2');
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* ───────────────────────── (2) tokens :root ───────────────────────── */
/* S09 (v3): os NOMES são os mesmos do S08 — só os VALORES mudaram, para os do protótipo v3
   aprovado com a Naturgy. É o que faz as 22 telas herdarem a paleta nova (e o tema escuro) sem
   uma linha de CSS por tela.

   Paleta oficial (manuais Naturgy, RNF-13): Pantone 301 C #004571 é a estrutura; Pantone 152 C
   #E57200 é o acento, reservado ao que se deve fazer a seguir; 032 C #D3222A é SÓ erro; o verde
   NTGY G2 #4E7E17 é SÓ número positivo; o azul NTGY B1 #0066CC é SÓ hiperlink. Os neutros saem do
   Warm Gray 3 C (#BFB8AE) — é o que dá o fundo levemente quente, em vez de um cinza frio. */
:root {
    /* ── superfícies ── */
    --bg: #F2F1EF;
    --bg-deep: #00314F;
    --surface: #FFFFFF;
    --surface-2: #FAF9F7;
    --surface-3: #EFF4F8;
    --line: #E8E6E2;
    --line-soft: #F0EEEB;
    --shadow: 0 10px 34px rgba(0, 69, 113, .13);
    --shadow-sm: 0 1px 2px rgba(0, 69, 113, .05), 0 4px 14px rgba(0, 69, 113, .06);

    /* ── tinta ── */
    --ink: #12212B;
    --ink-2: #3D5462;
    --ink-3: #6A8494;
    --ink-4: #97AAB6;

    /* ── azul estrutural da marca (Pantone 301 C) ── */
    --gold: #004571;
    --gold-hi: #0A5C8F;
    --gold-soft: rgba(0, 69, 113, .07);

    /* ── laranja de ação (Pantone 152 C), só na ação principal de cada tela ── */
    --cta: #E57200;
    --cta-hi: #C46200;
    --cta-soft: rgba(229, 114, 0, .10);

    /* ── semântica, dentro das reservas do manual ── */
    --ok: #4E7E17;
    --ok-bg: #EDF3E4;
    --warn: #B45A00;
    --warn-bg: #FCF0E2;
    --warn-fill: #E57200;
    --crit: #D3222A;
    --crit-bg: #FBE9E9;
    --info: #005B93;
    --info-bg: #EAF1F6;
    --link: #0066CC;

    --focus: 0 0 0 3px rgba(0, 91, 147, .34);
    /* botão com canto de 4 px — determinação do manual da marca */
    --r-btn: 4px;
    --r-s: 8px;
    --r-m: 12px;
    --r-l: 16px;
    --r-xl: 28px;
    --font: 'Archivo', 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
    --mono: 'IBM Plex Mono', ui-monospace, 'SF Mono', Menlo, monospace;
    --rail: 238px;

    /* ── trilho: 301 C nos DOIS temas (decisão do protótipo v3) ── */
    --rail-bg: linear-gradient(180deg, #004571 0%, #00314F 100%);
    --rail-ink: #EDF3F7;
    --rail-ink-2: rgba(237, 243, 247, .78);
    --rail-ink-3: rgba(237, 243, 247, .56);
    --rail-ink-4: rgba(237, 243, 247, .40);
    --rail-line: rgba(255, 255, 255, .14);
    --rail-gold: #FF8A1E;
    --rail-hover: rgba(255, 255, 255, .10);
    /* tinta sobre o laranja do trilho (badge): azul do próprio trilho, nos dois temas */
    --rail-sobre-gold: #00314F;
    /* selo sólido de "Emitida" na listagem (S08, T34): azul cheio com texto branco */
    --selo-emitida: #004571;

    /* ── ponte para o Bootstrap (ver nota abaixo do bloco de tokens) ── */
    --bs-body-color: var(--ink);
    --bs-body-bg: var(--bg);
    --bs-emphasis-color: var(--ink);
    --bs-secondary-color: var(--ink-3);
    --bs-tertiary-color: var(--ink-4);
    --bs-border-color: var(--line);
    --bs-link-color: var(--link);
    --bs-link-hover-color: var(--link);
    --bs-heading-color: var(--ink);

    color-scheme: light;
}

/* ── tema escuro (S09, revisto no S11) ──────────────────────────────────────────────────────
   DOIS estados desde o S11 (decisão do Caio, 27/08): o portal é CLARO por padrão e deixa de
   seguir a preferência de cor do sistema. O escuro existe apenas como ESCOLHA EXPLÍCITA,
   guardada em localStorage e aplicada como `data-theme="dark"` no <html> pelo tema.js — que roda
   no <head>, antes da folha de estilo, para não haver flash em nenhum dos dois sentidos.

     1. sem escolha guardada → claro (os tokens de :root acima, mesmo com o sistema em escuro);
     2. escolha "escuro"     → :root[data-theme="dark"] troca os tokens;
     3. escolha "claro"      → nada a fazer: o padrão JÁ é claro.

   Por isso não há mais nesta folha nenhuma consulta de mídia pela preferência de cor do sistema;
   a guarda `:not([data-theme="light"])`, que existia para desarmá-la, também perdeu a função.
   Só os TOKENS mudam: nenhum componente tem regra própria de tema. */
:root[data-theme="dark"] {
    --bg: #00223A;
    --bg-deep: #001A2C;
    --surface: #003152;
    --surface-2: #003D66;
    --surface-3: #004571;
    --line: rgba(191, 184, 174, .22);
    --line-soft: rgba(191, 184, 174, .11);
    --shadow: 0 18px 46px rgba(0, 10, 20, .5);
    --shadow-sm: 0 4px 16px rgba(0, 10, 20, .32);
    --ink: #EDF3F7;
    --ink-2: rgba(237, 243, 247, .78);
    --ink-3: rgba(237, 243, 247, .56);
    --ink-4: rgba(237, 243, 247, .38);
    --gold: #5AA8DA;
    --gold-hi: #93C8E9;
    --gold-soft: rgba(90, 168, 218, .15);
    --cta: #FF9128;
    --cta-hi: #FFB870;
    --cta-soft: rgba(255, 145, 40, .15);
    --ok: #9CC65C;
    --ok-bg: rgba(156, 198, 92, .15);
    --warn: #E39A45;
    --warn-bg: rgba(227, 154, 69, .15);
    --warn-fill: #FF9128;
    --crit: #F2635C;
    --crit-bg: rgba(242, 99, 92, .15);
    --info: #5AA8DA;
    --info-bg: rgba(90, 168, 218, .15);
    --link: #5AB0FF;
    --focus: 0 0 0 3px rgba(90, 168, 218, .4);
    /* o azul institucional some sobre o cartão escuro — o selo clareia para continuar selo */
    --selo-emitida: #0F5F96;

    color-scheme: dark;
}

/* Rótulo do botão de tema: os dois textos vêm no HTML e o CSS mostra o que vale agora. É o que
   impede o rótulo de piscar (o servidor não sabe qual tema o navegador vai resolver).
   S11: como o padrão é claro, o rótulo padrão é "Tema escuro" — só o data-theme="dark" troca. */
.tema-rotulo-claro {
    display: none;
}

:root[data-theme="dark"] .tema-rotulo-escuro {
    display: none;
}

:root[data-theme="dark"] .tema-rotulo-claro {
    display: inline;
}

/* ───────────────────────── (3) base / reset ───────────────────────── */
*, *::before, *::after {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

html, body {
    min-height: 100%;
}

body {
    font-family: var(--font);
    background: var(--bg);
    color: var(--ink);
    font-size: 14px;
    line-height: 1.55;
    -webkit-font-smoothing: antialiased;
    min-height: 100vh;
    overflow-x: hidden;
    overflow-y: auto;
}

img, svg, video {
    display: block;
    max-width: 100%;
}

button, input, select, textarea {
    font: inherit;
    color: inherit;
}

a {
    color: inherit;
}

:focus-visible {
    outline: none;
    box-shadow: var(--focus);
    border-radius: 6px;
}

::selection {
    background: var(--gold);
    color: #fff;
}

* {
    scrollbar-width: thin;
    scrollbar-color: var(--line) transparent;
}

*::-webkit-scrollbar {
    width: 10px;
    height: 10px;
}

*::-webkit-scrollbar-track {
    background: transparent;
}

*::-webkit-scrollbar-thumb {
    background: var(--ink-4);
    border: 3px solid transparent;
    background-clip: content-box;
    border-radius: 99px;
}

*::-webkit-scrollbar-thumb:hover {
    background: var(--gold);
    border: 3px solid transparent;
    background-clip: content-box;
}

/* ───────────────────────── (4) marca ───────────────────────── */
.mk-naturgy {
    background-color: currentColor;
    aspect-ratio: 125/55;
    -webkit-mask-image: url(/img/naturgy-logo.svg);
    mask-image: url(/img/naturgy-logo.svg);
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-position: center;
    mask-position: center;
    -webkit-mask-size: contain;
    mask-size: contain;
}

/* placeholder tipográfico atual da marca (Views/Shared/_Logo.cshtml, até o T2
   trocar por <img src="/img/naturgy-logo.svg">) */
.marca-naturgy {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    color: var(--gold);
}

/* ── tipografia utilitária ── */
.eyebrow {
    display: inline-flex;
    align-items: center;
    gap: 9px;
    font-size: 10px;
    font-weight: 600;
    letter-spacing: 2.4px;
    text-transform: uppercase;
    color: var(--cta);
}

.eyebrow::before {
    content: "";
    width: 20px;
    height: 2px;
    background: var(--cta);
    border-radius: 2px;
}

/* ───────────────────────── (5) shell de acesso (gate) ───────────────────────── */
#gatehost {
    position: fixed;
    inset: 0;
    z-index: 900;
    display: grid;
    place-items: center;
    padding: 24px;
    background: #00131F;
    overflow: auto;
}

.amb {
    position: absolute;
    inset: 0;
    overflow: hidden;
    pointer-events: none;
}

/* T16 (R4, E8): vídeo ambiente desfocado atrás do palco (mesmo arquivo do .brand-video) */
.amb-video {
    position: absolute;
    inset: -6%;
    width: 112%;
    height: 112%;
    object-fit: cover;
    filter: blur(34px) saturate(.9) brightness(.62);
    transform: scale(1.08);
}

.amb-grain {
    position: absolute;
    inset: 0;
    opacity: .5;
    background-image: radial-gradient(circle, rgba(255, 255, 255, .26) 0 .6px, transparent .8px);
    background-size: 6px 6px;
    -webkit-mask-image: linear-gradient(135deg, rgba(0, 0, 0, .9), rgba(0, 0, 0, .3) 58%, rgba(0, 0, 0, .7));
    mask-image: linear-gradient(135deg, rgba(0, 0, 0, .9), rgba(0, 0, 0, .3) 58%, rgba(0, 0, 0, .7));
}

.amb-tint {
    position: absolute;
    inset: 0;
    background:
        radial-gradient(circle at 7% 4%, rgba(229, 114, 0, .34) 0%, rgba(229, 114, 0, .10) 20%, transparent 38%),
        radial-gradient(circle at 84% 24%, rgba(44, 194, 235, .20) 0%, transparent 40%),
        linear-gradient(118deg, rgba(0, 45, 74, .62) 0%, rgba(0, 69, 113, .14) 44%, rgba(0, 19, 31, .62) 100%);
}

.amb-vignette {
    position: absolute;
    inset: 0;
    background:
        linear-gradient(180deg, rgba(0, 20, 36, .06), rgba(0, 20, 36, .3)),
        radial-gradient(ellipse at center, transparent 28%, rgba(0, 15, 30, .6) 100%);
}

.gate-shell {
    position: relative;
    z-index: 1;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 14px;
    width: min(1020px, calc(100vw - 44px));
}

.stage {
    position: relative;
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    width: 100%;
    /* T15.2 (GAP-3): altura fixa cortava telas com mais campos (/primeiro-acesso/outra-forma);
       agora acompanha o conteúdo, com piso e teto. */
    height: auto;
    min-height: 604px;
    max-height: calc(100dvh - 48px);
    border-radius: var(--r-xl);
    overflow: hidden;
    background:
        radial-gradient(ellipse at 7% 5%, rgba(255, 255, 255, .92) 0%, rgba(255, 255, 255, .36) 34%, transparent 60%),
        radial-gradient(ellipse at 94% 92%, rgba(153, 213, 243, .52) 0%, rgba(191, 230, 248, .24) 46%, transparent 70%),
        linear-gradient(142deg, rgba(235, 248, 255, .84) 0%, rgba(205, 235, 250, .72) 48%, rgba(236, 248, 255, .78) 100%);
    box-shadow: 0 34px 100px rgba(0, 23, 38, .36);
    backdrop-filter: blur(30px) saturate(1.2);
    -webkit-backdrop-filter: blur(30px) saturate(1.2);
}

/* T16 (E9): transição de saída no submit do login — site.js liga .leaving no .stage */
.stage.leaving .gate {
    transform: translateX(-3%);
    opacity: 0;
}

.stage.leaving .show {
    transform: translateX(3%);
    opacity: .2;
    filter: blur(5px);
}

.stage .gate, .stage .show {
    transition: transform .7s cubic-bezier(.7, 0, .3, 1), opacity .6s ease, filter .6s ease;
}

.gate {
    /* T15.2 (GAP-3): justify-content:center recortava o topo do conteúdo quando ele não cabe
       (bug clássico de flex + overflow:auto); o .gate-in já centraliza com margin:auto. */
    position: relative;
    order: 1;
    display: flex;
    flex-direction: column;
    padding: 34px 48px 30px;
    overflow-y: auto;
}

.gate-in {
    width: 100%;
    max-width: 400px;
    margin: auto;
}

/* T16: logo (D3 mantém o SVG colorido, ao contrário do .mk-naturgy mono do protótipo — só o
   respiro embaixo é o mesmo) + régua divisória antes do título */
.gate-in > .marca-naturgy {
    margin-bottom: 14px;
}

.gate-rule {
    height: 1px;
    margin: 0 0 22px;
    background: linear-gradient(90deg, rgba(0, 69, 113, .2), rgba(255, 255, 255, .62) 62%, transparent);
}

.gate h1, .gate h2 {
    color: #152D3D;
    font-size: 33px;
    font-weight: 600;
    letter-spacing: -1.15px;
    line-height: 1.08;
    margin: 0 0 9px;
}

.gate .lead {
    color: #697780;
    font-size: 13.5px;
    line-height: 1.55;
    margin-bottom: 24px;
}

.field {
    position: relative;
    margin-bottom: 13px;
}

.field input {
    width: 100%;
    height: 55px;
    padding: 22px 16px 8px;
    font-size: 14.5px;
    color: #102D3E;
    background: rgba(255, 255, 255, .54);
    border: 1px solid rgba(255, 255, 255, .76);
    border-radius: 13px;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, .72), 0 4px 14px rgba(0, 69, 113, .035);
    transition: border-color .18s, background .18s, box-shadow .18s;
}

.field input:hover {
    border-color: #fff;
    background: rgba(255, 255, 255, .68);
}

.field input:focus {
    outline: none;
    border-color: #004571;
    background: rgba(255, 255, 255, .9);
    box-shadow: 0 0 0 4px rgba(0, 69, 113, .1), inset 0 1px 0 #fff;
}

.field label {
    position: absolute;
    left: 17px;
    top: 18px;
    font-size: 14px;
    color: #74818A;
    pointer-events: none;
    transition: all .16s cubic-bezier(.2, .8, .2, 1);
}

/* T21.4 (GAP-4, R14): .field label não declara text-transform/letter-spacing/font-weight, então
   essas 3 propriedades vazavam de .form-label (D7, uppercase 9.5px/1.5px/600) — o rótulo em
   repouso saía em caixa alta espaçada. Reforço com a classe .form-label no seletor, especificidade
   (0,2,1), maior que .form-label (0,1,0). */
.field label.form-label {
    text-transform: none;
    letter-spacing: 0;
    font-weight: 400;
    font-size: 14px;
    color: #74818A;
}

.field input:focus + label, .field input:not(:placeholder-shown) + label {
    top: 8px;
    font-size: 10.5px;
    font-weight: 600;
    letter-spacing: .5px;
    text-transform: uppercase;
    color: #004571;
}

.field .eye {
    position: absolute;
    right: 9px;
    top: 50%;
    transform: translateY(-50%);
    width: 38px;
    height: 38px;
    border: 0;
    background: none;
    cursor: pointer;
    color: #78858D;
    display: grid;
    place-items: center;
    border-radius: 9px;
}

.field .eye:hover {
    background: rgba(0, 69, 113, .07);
    color: #004571;
}

.field .eye svg {
    width: 19px;
    height: 19px;
}

.caps {
    display: none;
    align-items: center;
    gap: 6px;
    margin-top: 7px;
    font-size: 11.5px;
    color: #8A5A05;
}

.caps.on {
    display: flex;
}

.check {
    display: inline-flex;
    align-items: center;
    gap: 9px;
    font-size: 13px;
    color: #5E6C74;
    cursor: pointer;
    user-select: none;
}

.check input {
    position: absolute;
    opacity: 0;
    width: 0;
    height: 0;
}

.check .bx {
    width: 19px;
    height: 19px;
    flex: none;
    display: grid;
    place-items: center;
    border: 1.5px solid #C4CDD2;
    border-radius: 6px;
    background: #fff;
    transition: .16s;
}

.check input:checked + .bx {
    background: #004571;
    border-color: #004571;
}

.check .bx svg {
    width: 12px;
    height: 12px;
    color: #fff;
    opacity: 0;
    transition: .16s;
}

.check input:checked + .bx svg {
    opacity: 1;
}

.check input:focus-visible + .bx {
    box-shadow: 0 0 0 3px rgba(8, 122, 195, .32);
}

/* T16: linha do "Manter conectado" + "Esqueci minha senha" (Login), e os links avulsos do
   .gate-alt (Login e demais telas de acesso, junto com .cartao-acesso-links a) */
.gate-row {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    margin: 4px 0 20px;
}

.linky {
    font-size: 13px;
    font-weight: 600;
    color: #004571;
    text-decoration: none;
    cursor: pointer;
    background: none;
    border: 0;
    padding: 0;
}

.linky:hover {
    color: #C75F00;
    text-decoration: underline;
}

/* botão primário do gate: azul que se preenche de laranja da esquerda p/ direita */
.go {
    position: relative;
    width: 100%;
    height: 54px;
    border: 0;
    border-radius: 13px;
    cursor: pointer;
    font-family: var(--font);
    font-size: 15px;
    font-weight: 600;
    letter-spacing: .2px;
    color: #fff;
    background: #004571;
    overflow: hidden;
    isolation: isolate;
    box-shadow: 0 10px 25px rgba(0, 69, 113, .22);
    transition: box-shadow .16s;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    text-decoration: none;
}

.go::before {
    content: "";
    position: absolute;
    inset: 0;
    z-index: -1;
    transform: translateX(-101%);
    background: linear-gradient(90deg, #D96800 0%, #E57200 54%, #F08A24 100%);
    transition: transform .42s cubic-bezier(.2, .8, .2, 1);
}

.go:hover, .go:focus-visible {
    box-shadow: 0 13px 30px rgba(229, 114, 0, .3);
    color: #fff;
}

.go:hover::before, .go:focus-visible::before {
    transform: translateX(0);
}

/* T16: rótulo + seta (some no .busy) e o spinner que aparece no lugar (E9: site.js liga .busy
   no submit do login enquanto a requisição real vai ao servidor) */
.go .lbl {
    display: inline-flex;
    align-items: center;
    gap: 10px;
    transition: opacity .2s;
}

.go .lbl svg {
    width: 17px;
    transition: transform .28s cubic-bezier(.2, .8, .2, 1);
}

.go:hover .lbl svg, .go:focus-visible .lbl svg {
    transform: translateX(4px);
}

.go .spin {
    position: absolute;
    inset: 0;
    display: none;
    place-items: center;
}

.go.busy .lbl {
    opacity: 0;
}

.go.busy .spin {
    display: grid;
}

.spin i {
    width: 19px;
    height: 19px;
    border: 2.2px solid rgba(255, 255, 255, .35);
    border-top-color: #fff;
    border-radius: 50%;
    display: block;
    animation: spin .7s linear infinite;
}

@keyframes spin {
    to {
        transform: rotate(360deg);
    }
}

.gate-alt {
    display: flex;
    flex-wrap: wrap;
    gap: 8px 22px;
    margin-top: 20px;
    padding-top: 18px;
    border-top: 1px solid rgba(0, 69, 113, .12);
    list-style: none;
}

.gate-alt li {
    display: inline-flex;
}

.gate-alt a {
    font-size: 13px;
    font-weight: 600;
    color: #004571;
    text-decoration: none;
}

.gate-alt a:hover {
    color: #C75F00;
    text-decoration: underline;
}

/* palco: painel escuro da marca, com o vídeo (T16, R4: E8) atrás do texto */
.show {
    position: relative;
    order: 2;
    overflow: hidden;
    min-width: 0;
    margin: 10px 10px 10px 0;
    border-radius: 23px;
    background: #102D3D;
    box-shadow: 0 10px 30px rgba(0, 32, 52, .12);
}

.brand-video {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
}

.show::after {
    content: "";
    position: absolute;
    z-index: 1;
    inset: 0;
    pointer-events: none;
    background:
        linear-gradient(90deg, rgba(0, 25, 40, .72) 0%, rgba(0, 30, 49, .46) 54%, rgba(0, 25, 40, .12) 100%),
        linear-gradient(180deg, rgba(0, 25, 40, .02) 20%, rgba(0, 30, 49, .18) 52%, rgba(0, 25, 40, .78) 100%);
}

.show-in {
    position: relative;
    z-index: 2;
    height: 100%;
    display: flex;
    flex-direction: column;
    justify-content: flex-end;
    padding: 38px 40px;
}

.pitch {
    max-width: 430px;
}

/* T21.7 (R14): animações "rise" do protótipo, h1/p/pulse entram com opacidade 0 e
   translateY(18px), subindo em cascata (animation-delay crescente); prefers-reduced-motion
   zera a duração via a regra global (seção 11) e, abaixo, fixa opacity:1/transform:none para
   não deixar o conteúdo "piscando" invisível durante o delay.
   T24.1 (R17): a etiqueta ".eyebrow" ("XML e DANFE em um clique") saiu do palco; o h1 assumiu o
   primeiro delay e os demais blocos foram reindexados uma casa para trás. */

.pitch h1 {
    margin: 20px 0 0;
    color: #fff;
    font-size: clamp(30px, 3.3vw, 46px);
    font-weight: 500;
    line-height: 1.08;
    letter-spacing: -1.8px;
    text-shadow: 0 3px 24px rgba(0, 15, 28, .72), 0 1px 3px rgba(0, 0, 0, .5);
    opacity: 0;
    transform: translateY(18px);
    animation: rise 1s .4s cubic-bezier(.2, .8, .2, 1) forwards;
}

.pitch h1 b {
    font-weight: 700;
}

.pitch p {
    margin-top: 16px;
    max-width: 400px;
    font-size: 13.5px;
    line-height: 1.6;
    color: rgba(255, 255, 255, .94);
    text-shadow: 0 2px 10px rgba(0, 15, 28, .72);
    opacity: 0;
    transform: translateY(18px);
    animation: rise 1s .52s cubic-bezier(.2, .8, .2, 1) forwards;
}

/* T16 (E3): os 3 contadores do palco, fatos estáticos e verdadeiros, animados por countTo()
   em site.js a partir de data-count-to; o .dotlive fica só no primeiro item.
   T24.2 (R17): gap reduzido de 32px para 24px para os 3 rótulos caberem numa linha em 1280px. */
.pulse {
    display: flex;
    gap: 24px;
    margin-top: 32px;
    padding-top: 22px;
    border-top: 1px solid rgba(255, 255, 255, .16);
    opacity: 0;
    transform: translateY(18px);
    animation: rise 1s .64s cubic-bezier(.2, .8, .2, 1) forwards;
}

/* T24.2 (R17): cada item encolhe (min-width:0) para o texto do rótulo poder quebrar dentro do
   próprio item em vez de estourar a largura do palco. */
.pulse > div {
    min-width: 0;
    flex: 1;
}

.pulse .p-v {
    display: flex;
    align-items: baseline;
    gap: 3px;
    font-family: var(--mono);
    font-size: 23px;
    font-weight: 500;
    color: #fff;
    font-variant-numeric: tabular-nums;
}

.pulse .p-v i {
    font-style: normal;
    font-size: 13px;
    color: #FF9900;
}

.pulse .p-k {
    margin-top: 3px;
    font-size: 12.5px;
    letter-spacing: .2px;
    line-height: 1.35;
    color: rgba(255, 255, 255, .82);
}

.dotlive {
    display: inline-block;
    width: 6px;
    height: 6px;
    margin-right: 6px;
    vertical-align: middle;
    border-radius: 50%;
    background: #42D18A;
    animation: blip 2.2s ease-in-out infinite;
}

@keyframes blip {
    0%, 100% {
        box-shadow: 0 0 0 0 rgba(66, 209, 138, .55);
    }
    50% {
        box-shadow: 0 0 0 6px rgba(66, 209, 138, 0);
    }
}

@keyframes rise {
    to {
        opacity: 1;
        transform: none;
    }
}

/* T16 (E4): o .gate-foot do gate ganha 2 linhas dentro do <footer> — cadeado + "Conexão segura"
   (mesma linha do protótipo) e, menor, o rodapé legal obrigatório (T11). No shell "documento" o
   <footer> só tem a linha legal (sem cadeado), então continua um único item de flex centralizado.
   T26.2 (R19): o margin-top daqui era sempre anulado por ".rodape.gate-foot{margin-top:0}"
   (maior especificidade) — regra morta removida; o respiro real (14px) vem do gap do
   .gate-shell. */
.gate-foot {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 6px;
    font-size: 11.5px;
    color: rgba(255, 255, 255, .74);
    text-shadow: 0 1px 8px rgba(0, 24, 40, .28);
}

.gate-foot svg {
    width: 15px;
    height: 15px;
    color: #E57200;
}

.gate-seguranca {
    display: flex;
    align-items: center;
    gap: 9px;
}

.gate-legal {
    margin-top: 12px;
    font-size: 10.5px;
}

/* header discreto acima do palco (T2): mantém as classes legadas cabecalho/
   cabecalho-marca, escopadas ao gate para não vazar estilo para a topbar do
   app, que carrega a mesma classe "cabecalho" só como marcador. */
.gate-shell > .cabecalho {
    display: flex;
    justify-content: center;
}

.gate-shell > .cabecalho .cabecalho-marca {
    font-size: 11px;
    font-weight: 600;
    letter-spacing: .6px;
    color: rgba(255, 255, 255, .74);
    text-decoration: none;
    text-shadow: 0 1px 8px rgba(0, 24, 40, .28);
}

.gate-shell > .cabecalho .cabecalho-marca:hover {
    color: #fff;
}

/* rodapé do gate reaproveita .rodape (mesmo texto/markup do app) por cima do
   fundo escuro: zera o que .rodape define para superfície clara. */
.rodape.gate-foot {
    padding: 0;
    margin-top: 0;
    border-top: 0;
    color: rgba(255, 255, 255, .74);
}

/* terceiro shell (T12, R6; refeito no T17, R4): páginas institucionais públicas (Política de
   Privacidade), mesmo fundo ambiente do gate, sem o palco de duas colunas; um card de leitura
   (T17.1: NÃO usa #gatehost).
   T23.3 (R16): em ≥621px a página vira "leitor" e não rola; só o corpo do card
   (".documento-corpo") rola. Cabeçalho fixo no topo do card (".documento-cabecalho": logo,
   page-head e o botão "Voltar"); rodapé fixo no viewport, logo abaixo do card. Em ≤620px volta ao
   fluxo normal de página de sempre (T21.6, media query abaixo). */
.amb-fixa {
    position: fixed;
    inset: 0;
    z-index: 0;
    background: #00131F;
}

.documento-pagina {
    position: relative;
    z-index: 1;
    height: 100dvh;
    overflow: hidden;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    padding: 24px 16px;
}

.documento {
    display: flex;
    flex-direction: column;
    max-height: calc(100dvh - 110px);
    width: min(860px, 100%);
    overflow: hidden;
}

/* T26.3 (R19): sem largura própria, o rodapé do shell "documento" encolhia ao conteúdo
   (~120px) dentro do .documento-pagina (align-items:center) e o texto quebrava em 5 linhas;
   passa a ocupar a largura do card, como o rodapé do gate.
   T32.4 (R22, GAP-5): a largura sozinha não bastava — sem wrapper em volta dos filhos crus
   (<a>/texto/<span>/<a>), cada um virava um item de flex em coluna (herdada de .gate-foot) e
   empilhava em 5 linhas. Aqui o rodapé vira linha (o .gate-foot do gate continua em coluna). */
.documento-pagina > .gate-foot {
    width: min(860px, 100%);
    align-self: center;
    flex-direction: row;
    flex-wrap: wrap;
    justify-content: center;
    align-items: center;
    gap: 4px 6px;
}

.documento .marca-naturgy {
    margin-bottom: 26px;
}

/* cabeçalho fixo do card: logo (herda ".documento .marca-naturgy" acima), page-head (eyebrow/h1)
   e a data, com o botão "Voltar" em ".page-head .acts" (à direita); flex:none para nunca encolher
   e ficar sempre visível acima do corpo que rola. */
.documento-cabecalho {
    flex: none;
    padding: 40px 40px 22px;
    border-bottom: 1px solid var(--line-soft);
}

.documento-cabecalho .page-head {
    margin-bottom: 0;
}

.documento-voltar {
    flex: none;
}

/* tipografia de documento: título das seções com respiro, texto de leitura, tabelas do design
   system e os campos entre colchetes (minuta) em destaque discreto. */
.documento-data {
    margin: 6px 0 0;
    font-size: 13px;
    color: var(--ink-3);
}

.documento-corpo {
    flex: 1;
    min-width: 0;
    overflow-y: auto;
    padding: 24px 32px;
}

.documento-corpo h2 {
    margin: 30px 0 10px;
    font-size: 17px;
    font-weight: 600;
    letter-spacing: -.2px;
    color: var(--ink);
}

.documento-corpo h2:first-child {
    margin-top: 0;
}

.documento-corpo p, .documento-corpo li {
    max-width: 72ch;
    font-size: 14px;
    line-height: 1.65;
    color: var(--ink-2);
}

.documento-corpo p {
    margin: 0 0 14px;
}

.documento-corpo ul {
    margin: 0 0 14px;
    padding-left: 20px;
}

.documento-corpo li {
    margin-bottom: 8px;
}

.documento-corpo li strong {
    color: var(--ink);
}

.documento-corpo .table-responsive {
    margin: 0 0 20px;
}

.documento-corpo mark {
    background: var(--warn-bg);
    color: var(--warn);
    padding: 0 4px;
    border-radius: 3px;
}

/* ───────────────────────── (6) shell do app ───────────────────────── */
.app {
    display: grid;
    grid-template-columns: var(--rail) minmax(0, 1fr);
    min-height: 100vh;
}

.rail {
    position: sticky;
    top: 0;
    height: 100vh;
    display: flex;
    flex-direction: column;
    border-right: 1px solid var(--line);
    background: var(--rail-bg);
    color: var(--rail-ink);
}

.rail-top {
    padding: 22px 20px 18px;
    border-bottom: 1px solid var(--rail-line);
}

.rail-logo {
    width: 104px;
    color: var(--rail-ink);
}

.rail-sub {
    margin-top: 9px;
    font-size: 9.5px;
    letter-spacing: 2.6px;
    text-transform: uppercase;
    color: var(--rail-gold);
}

.rail-nav {
    flex: 1;
    overflow-y: auto;
    padding: 16px 12px;
}

.nav-group {
    margin-bottom: 20px;
}

.nav-cap {
    padding: 0 10px 8px;
    font-size: 9px;
    font-weight: 600;
    letter-spacing: 2.2px;
    text-transform: uppercase;
    color: var(--rail-ink-4);
}

.nav-i {
    display: flex;
    align-items: center;
    gap: 11px;
    width: 100%;
    padding: 9px 11px;
    margin-bottom: 2px;
    border: 0;
    border-radius: var(--r-s);
    background: none;
    color: var(--rail-ink-2);
    font-size: 13.5px;
    cursor: pointer;
    text-align: left;
    text-decoration: none;
    transition: background .16s, color .16s;
}

.nav-i svg {
    width: 17px;
    height: 17px;
    flex: none;
    opacity: .8;
}

.nav-i:hover {
    background: var(--rail-hover);
    color: var(--rail-ink);
}

.nav-i.on {
    background: var(--rail-hover);
    color: var(--rail-ink);
    font-weight: 600;
    box-shadow: inset 2px 0 0 var(--rail-gold);
}

.nav-i.on svg {
    color: var(--rail-gold);
    opacity: 1;
}

/* T28 (S08b): badge do item "Notas" com o total de notas visíveis ao usuário. */
.nav-i .badge {
    margin-left: auto;
    padding: 1px 7px;
    border-radius: 99px;
    background: var(--rail-gold);
    color: var(--rail-sobre-gold);
    font-family: var(--mono);
    font-size: 10px;
    font-weight: 600;
}

.rail-foot {
    padding: 16px 20px;
    border-top: 1px solid var(--rail-line);
    display: flex;
    flex-direction: column;
    gap: 10px;
}

.rail-foot .btn {
    background: none;
    border-color: var(--rail-line);
    color: var(--rail-ink-2);
}

.rail-foot .btn:hover {
    border-color: var(--rail-gold);
    color: var(--rail-ink);
    background: var(--rail-hover);
}

.rail-sign {
    font-size: 9px;
    letter-spacing: 1.4px;
    text-transform: uppercase;
    color: var(--rail-ink-4);
    line-height: 1.5;
}

/* T19.3 (GAP-3): o link "Weehub, Inc." herdava --rail-ink-4 (opacidade .4) do .rail-sign, quase
   invisível sobre o azul do rail. */
.rail-sign a {
    color: var(--rail-ink-2);
    text-decoration: none;
}

/* T23.1: mesmo tratamento do rodapé do gate (sem sublinhado em repouso). */
.rail-sign a:hover, .rail-sign a:focus-visible {
    text-decoration: underline;
}

.main {
    min-width: 0;
    display: flex;
    flex-direction: column;
}

.topbar {
    position: sticky;
    top: 0;
    z-index: 60;
    display: flex;
    align-items: center;
    gap: 14px;
    padding: 12px 26px;
    border-bottom: 1px solid var(--line);
    background: color-mix(in srgb, var(--bg) 88%, transparent);
    backdrop-filter: blur(14px);
}

.crumb {
    font-size: 12px;
    color: var(--ink-3);
}

.crumb b, .crumb strong {
    color: var(--ink);
    font-weight: 600;
}

.tb-spacer {
    flex: 1;
}

.menu-btn {
    display: none;
    width: 36px;
    height: 36px;
    place-items: center;
    cursor: pointer;
    border: 1px solid var(--line);
    border-radius: var(--r-s);
    background: var(--surface);
    color: var(--ink-2);
}

.menu-btn svg {
    width: 17px;
    height: 17px;
}

/* T42.1 (R30): chip do usuário maior — a topbar cresce (≥72px) para acomodar sem cortar. */
.who {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 8px 18px 8px 8px;
    min-height: 56px;
    border: 1px solid var(--line);
    border-radius: 999px;
    background: var(--surface);
}

/* T28 (S08b) / T42.1 (R30): pílula do usuário, hover --gold como no protótipo. */
.who:hover {
    border-color: var(--gold);
    box-shadow: var(--shadow-sm);
}

.who .av {
    width: 40px;
    height: 40px;
    border-radius: 50%;
    display: grid;
    place-items: center;
    flex: none;
    background: var(--gold);
    color: #fff;
    font-size: 14px;
    font-weight: 700;
}

/* T28 (S08b): chip reorganizado (C3) — nome, papel e documento em mono, sem tocar no literal
   {documento} | {NOME} que continua em .cabecalho-identificacao (visually-hidden). */
.who-info {
    display: flex;
    flex-direction: column;
    gap: 1px;
    line-height: 1.2;
}

.who .nm {
    font-size: 14px;
    font-weight: 600;
    color: var(--ink);
    white-space: nowrap;
}

.who .rl {
    font-size: 12px;
    color: var(--ink-3);
    white-space: nowrap;
}

.who .doc {
    font-family: var(--mono);
    font-size: 12px;
    letter-spacing: .2px;
    color: var(--ink-3);
    white-space: nowrap;
}

.who .cabecalho-identificacao {
    font-size: 12px;
    font-weight: 600;
    line-height: 1.2;
    white-space: nowrap;
}

.view {
    flex: 1;
    padding: 26px 26px 60px;
    max-width: 1420px;
    width: 100%;
}

.scrim {
    position: fixed;
    inset: 0;
    z-index: 110;
    background: rgba(0, 14, 14, .6);
    backdrop-filter: blur(3px);
    opacity: 0;
    visibility: hidden;
    transition: .3s;
}

.scrim.on {
    opacity: 1;
    visibility: visible;
}

/* ───────────────────────── (7) componentes ───────────────────────── */
/* botões */
.btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
    height: 38px;
    padding: 0 15px;
    border: 1px solid var(--line);
    /* S09 (v3): canto de 4 px — determinação do manual da marca. */
    border-radius: var(--r-btn);
    background: var(--surface);
    color: var(--ink);
    font-size: 13px;
    font-weight: 500;
    cursor: pointer;
    white-space: nowrap;
    text-decoration: none;
    transition: .16s;
}

.btn:hover {
    border-color: var(--gold);
    background: var(--surface-2);
    color: var(--ink);
    text-decoration: none;
}

.btn svg {
    width: 15px;
    height: 15px;
}

/* T15.3 (GAP-4): o Bootstrap não zera background/border/color no disabled dos variantes
   (.btn-secondary, .btn-outline-*...); sem isso o fantasma vira um botão cinza sólido. */
.btn[disabled], .btn.disabled, .btn:disabled,
.btn-portal[disabled], .btn-portal.disabled, .btn-portal:disabled {
    background: none;
    border-color: var(--line);
    color: var(--ink-4);
    opacity: 1;
    cursor: not-allowed;
}

/* fantasma (D5: Cancelar/Voltar/Anterior) em markup novo, sem classe Bootstrap para reaproveitar
   (T12: botão "Voltar" da página de documento) */
.btn-ghost {
    background: none;
}

/* cartões */
.card {
    border: 1px solid var(--line);
    border-radius: var(--r-l);
    background: var(--surface);
    box-shadow: var(--shadow-sm);
}

.card-b {
    padding: 18px;
}

/* page-head (D10) */
.page-head {
    display: flex;
    align-items: flex-end;
    gap: 20px;
    flex-wrap: wrap;
    margin-bottom: 22px;
}

.page-head .lead {
    margin-top: 6px;
    font-size: 13.5px;
    color: var(--ink-3);
    max-width: 64ch;
}

/* T14 (P-A): ".acts" à direita do page-head — usada por telas admin que movem uma ação
   principal (ex.: "Novo" em Usuários) para o cabeçalho da página. */
.page-head .acts {
    margin-left: auto;
    display: flex;
    align-items: center;
    gap: 10px;
    flex-wrap: wrap;
}

/* T14 (P-F): avatar de iniciais — 27px por padrão (listagens); Views/Shared/_Iniciais.cshtml
   renderiza o <span class="av">. Contextos específicos (ex.: .ficha-identidade) ampliam. */
.av {
    display: grid;
    place-items: center;
    flex: none;
    width: 27px;
    height: 27px;
    border-radius: 50%;
    background: var(--gold);
    color: #fff;
    font-size: 11px;
    font-weight: 700;
}

/* T14.3/T14.4: ".h2" é utilitário tipográfico (não um <h2> semântico extra) — usado em textos
   de destaque que não são cabeçalhos de seção (nome da ficha, pergunta de confirmação). */
.h2 {
    font-size: 19px;
    font-weight: 600;
    letter-spacing: -.3px;
    color: var(--ink);
}

/* ───────────────────────── (8) overrides do Bootstrap ───────────────────────── */
/* mapa de botões (D5): .btn (herdado de Bootstrap .btn) já dá o visual neutro
   do protótipo a Editar/Visualizar/Ver itens/Gerar nova senha provisória — só
   as variantes abaixo precisam de tratamento próprio. */
.btn-portal, .btn-success {
    background: var(--cta);
    border-color: var(--cta);
    color: #fff;
    font-weight: 600;
}

.btn-portal:hover, .btn-success:hover {
    background: var(--cta-hi);
    border-color: var(--cta-hi);
    color: #fff;
}

/* T20.1/T21.1 (GAP-1, R13/R14): o "Entrar" do login perdeu o wrapper .cartao-acesso no T16.1
   e caiu para .btn-portal genérico — empate de especificidade (0,1,0) com .btn-portal/.btn
   resolvido pela ordem do arquivo a favor do laranja. Visual .go do protótipo redeclarado aqui
   (depois de .btn-portal, especificidade ≥ (0,2,0)) para as telas sem o wrapper; o .gate-in
   cobre qualquer view renderizada no shell do gate, então .cartao-acesso .btn-portal continua
   valendo do mesmo jeito nas demais telas públicas. */
.btn.btn-portal.go, .gate-in .go {
    position: relative;
    height: 54px;
    border: 0;
    border-radius: 13px;
    background: var(--gold);
    overflow: hidden;
    isolation: isolate;
    box-shadow: 0 10px 25px rgba(0, 69, 113, .22);
    font-size: 15px;
    font-weight: 600;
    letter-spacing: .2px;
    color: #fff;
}

.btn.btn-portal.go::before, .gate-in .go::before {
    content: "";
    position: absolute;
    inset: 0;
    z-index: -1;
    transform: translateX(-101%);
    background: linear-gradient(90deg, #D96800 0%, #E57200 54%, #F08A24 100%);
    transition: transform .42s cubic-bezier(.2, .8, .2, 1);
}

.btn.btn-portal.go:hover, .btn.btn-portal.go:focus-visible,
.gate-in .go:hover, .gate-in .go:focus-visible {
    background: var(--gold);
    border-color: var(--gold);
    box-shadow: 0 13px 30px rgba(229, 114, 0, .3);
    color: #fff;
}

.btn.btn-portal.go:hover::before, .btn.btn-portal.go:focus-visible::before,
.gate-in .go:hover::before, .gate-in .go:focus-visible::before {
    transform: translateX(0);
}

.btn.btn-portal.go .lbl, .gate-in .go .lbl {
    display: inline-flex;
    align-items: center;
    gap: 10px;
    transition: opacity .2s;
}

.btn.btn-portal.go .lbl svg, .gate-in .go .lbl svg {
    width: 17px;
    transition: transform .28s cubic-bezier(.2, .8, .2, 1);
}

.btn.btn-portal.go:hover .lbl svg, .btn.btn-portal.go:focus-visible .lbl svg,
.gate-in .go:hover .lbl svg, .gate-in .go:focus-visible .lbl svg {
    transform: translateX(4px);
}

.btn.btn-portal.go .spin, .gate-in .go .spin {
    position: absolute;
    inset: 0;
    display: none;
    place-items: center;
}

.btn.btn-portal.go.busy .lbl, .gate-in .go.busy .lbl {
    opacity: 0;
}

.btn.btn-portal.go.busy .spin, .gate-in .go.busy .spin {
    display: grid;
}

/* T19.5 (GAP-5): um laranja só por tela — no formulário de usuário o laranja é "Salvar";
   "Buscar destinatários" perde a cor (classes do markup intactas). */
.btn.btn-portal.botao-buscar-destinatarios {
    background: var(--surface);
    border-color: var(--line);
    color: var(--ink);
}

/* Conecte-se / Enviar / Salvar senha dentro do cartão de acesso: visual .go */
.cartao-acesso .btn-portal {
    position: relative;
    height: 54px;
    border: 0;
    border-radius: 13px;
    background: var(--gold);
    overflow: hidden;
    isolation: isolate;
    box-shadow: 0 10px 25px rgba(0, 69, 113, .22);
    font-size: 15px;
    font-weight: 600;
    letter-spacing: .2px;
}

.cartao-acesso .btn-portal::before {
    content: "";
    position: absolute;
    inset: 0;
    z-index: -1;
    transform: translateX(-101%);
    background: linear-gradient(90deg, #D96800 0%, #E57200 54%, #F08A24 100%);
    transition: transform .42s cubic-bezier(.2, .8, .2, 1);
}

.cartao-acesso .btn-portal:hover, .cartao-acesso .btn-portal:focus-visible {
    background: var(--gold);
    border-color: var(--gold);
    box-shadow: 0 13px 30px rgba(229, 114, 0, .3);
}

.cartao-acesso .btn-portal:hover::before, .cartao-acesso .btn-portal:focus-visible::before {
    transform: translateX(0);
}

/* T3: rótulo + seta do botão .go (D5) — o texto do botão continua igual, só ganha o wrapper */
.cartao-acesso .btn-portal .lbl {
    display: inline-flex;
    align-items: center;
    gap: 8px;
}

.cartao-acesso .btn-portal .lbl svg {
    width: 16px;
    height: 16px;
    flex: none;
    transition: transform .16s;
}

.cartao-acesso .btn-portal:hover .lbl svg, .cartao-acesso .btn-portal:focus-visible .lbl svg {
    transform: translateX(3px);
}

.btn-outline-danger {
    color: var(--crit);
}

.btn-outline-danger:hover {
    color: var(--crit);
    border-color: var(--crit);
    background: var(--crit-bg);
}

.btn-outline-success {
    color: var(--ok);
}

.btn-outline-success:hover {
    color: var(--ok);
    border-color: var(--ok);
    background: var(--ok-bg);
}

.btn-secondary {
    background: none;
}

.btn-danger {
    background: var(--crit);
    border-color: var(--crit);
    color: #fff;
}

.btn-danger:hover {
    background: #A32A1E;
    border-color: #A32A1E;
    color: #fff;
}

.btn-sm {
    height: 31px;
    padding: 0 11px;
    font-size: 12px;
}

.btn-outline-primary.btn-sm {
    height: 26px;
    padding: 0 9px;
    font-size: 11px;
    border-radius: 6px;
}

/* T14.6 (P-D): .btn-xs — mesma receita de .btn-outline-primary.btn-sm (XML/DANFE), como classe
   reutilizável para outras ações compactas (ex.: "Ver itens" em Cargas). */
.btn-xs {
    height: 26px;
    padding: 0 9px;
    font-size: 11px;
    border-radius: 6px;
}

/* T14 (P-E): links "Voltar para ..." — .btn.btn-ghost com seta à esquerda via ::before, sem
   markup novo no Razor (texto e href continuam intactos). */
.link-voltar::before {
    content: "←";
    margin-right: 2px;
}

/* T15.6 (D5 revisado, R8): um laranja só por tela; "Próximo" das listagens admin
   (Usuários/Cargas/Downloads) usa .btn-portal por herança de classe, mas vira fantasma como o
   "Anterior" ao lado; e o "Buscar" de Usuários (única tela onde "Novo" já é a ação laranja) vira
   neutro, sem remover a classe .btn-portal existente. */
.btn-portal.botao-proximo, .btn-portal.botao-proximo:hover {
    background: none;
    border-color: var(--line);
    color: var(--ink);
    font-weight: 500;
}

/* T38.3 (GAP-3, R26): "Próximo" desabilitado (paginação simples de Usuários/Cargas/Downloads)
   perdia a cor apagada para a regra acima (.btn-portal.botao-proximo, 0,2,0, que vence por vir
   depois de ".btn.disabled" mesmo com especificidade empatada) e ficava indistinguível do
   habilitado. Especificidade elevada a (0,3,0) e declarada depois de .btn-portal para nunca mais
   perder o empate. */
span.btn.btn-sm.disabled {
    color: var(--ink-4);
    background: none;
    border-color: var(--line);
    opacity: 1;
    cursor: default;
}

/* T32.3 (R22, GAP-4): o "Buscar" neutro herdava o visual de superfície clara (borda/texto
   escuros) e ficava ilegível sobre o painel azul (contraste 1,02:1) — vira fantasma claro, como
   qualquer botão neutro dentro de .painel-filtros (ver também .painel-filtros .link-todos-registros). */
#busca-usuarios .btn-portal {
    background: rgba(255, 255, 255, .06);
    border: 1px solid rgba(255, 255, 255, .3);
    color: #EAF1F6;
    font-weight: 500;
}

#busca-usuarios .btn-portal:hover {
    background: rgba(255, 255, 255, .12);
    border-color: rgba(255, 255, 255, .3);
    color: #EAF1F6;
}

.acao-bloqueada {
    opacity: .55;
}

/* campos (D7) */
.form-label {
    display: inline-block;
    margin-bottom: 6px;
    font-size: 9.5px;
    font-weight: 600;
    letter-spacing: 1.5px;
    text-transform: uppercase;
    color: var(--ink-3);
}

.form-control, .form-select {
    height: 36px;
    padding: 0 10px;
    border: 1px solid var(--line);
    border-color: var(--line);
    color: var(--ink);
    font-size: 13px;
}

.form-control {
    background-color: var(--bg);
}

.form-select {
    background-color: var(--bg);
}

.form-control:focus, .form-select:focus {
    outline: none;
    border-color: var(--gold);
    box-shadow: var(--focus);
}

textarea.form-control {
    height: auto;
    padding: 8px 10px;
}

.form-control[type="file"] {
    height: auto;
    padding: 7px 10px;
}

select[multiple].form-select {
    height: auto;
}

/* T13.3/T25.1: campo com valor ganha borda destacada (--rail-gold, #FF9900, mesmo laranja do
   trilho, sobre o painel azul). T32.2 (R22, GAP-1): a técnica ERA :not(:placeholder-shown) nos
   inputs, mas isso casa também com campo VAZIO sem placeholder (todo input[type=date] e os campos
   sem placeholder) — a borda passa a depender só da classe "com-valor", acrescentada no Razor em
   todos os campos do painel quando o valor não é vazio (inputs e selects). */
.painel-filtros .form-control.com-valor,
.painel-filtros .form-select.com-valor {
    border-color: var(--rail-gold);
}

/* T14.2: 12px (era 11.5px) — mesma classe usada em todos os textos de ajuda do portal. */
.form-text {
    font-size: 12px;
    color: var(--ink-3);
}

.is-invalid.form-control, .is-invalid.form-select {
    border-color: var(--crit);
}

.invalid-feedback {
    color: var(--crit);
    font-size: 12px;
}

/* T15.1 (GAP-2): o Bootstrap define .text-danger com !important; sem vencer aqui, o aviso dos
   5 anos e os erros de campo ficam com a cor padrão do Bootstrap em vez de --crit. */
.text-danger { color: var(--crit) !important; }

.mb-3 .text-danger {
    font-size: 12px;
}

/* checkbox custom (D7) — sem span .bx extra na marcação; appearance:none no
   próprio input, mantendo o par input+label das views */
.form-check {
    display: flex;
    align-items: center;
    gap: 9px;
    min-height: 0;
    padding-left: 0;
}

.form-check-input {
    appearance: none;
    -webkit-appearance: none;
    margin: 0;
    width: 19px;
    height: 19px;
    flex: none;
    /* S09: por token, para o quadrado não ficar branco (e invisível) no tema escuro. */
    border: 1.5px solid var(--ink-4);
    border-radius: 6px;
    background: var(--surface);
    display: inline-grid;
    place-items: center;
    cursor: pointer;
    transition: .16s;
}

.form-check-input:checked {
    background: var(--gold);
    border-color: var(--gold);
}

.form-check-input:checked::after {
    content: "";
    width: 5px;
    height: 9px;
    border: solid #fff;
    border-width: 0 2px 2px 0;
    transform: rotate(45deg) translate(-1px, -1px);
}

.form-check-label {
    font-size: 13px;
    color: var(--ink-2);
    cursor: pointer;
}

/* tabelas (D6) — mesmo visual de table.tb/.tablewrap nas classes Bootstrap */
/* T19.8d (GAP-8): sombra-degradê na borda direita avisando que há rolagem horizontal — técnica
   CSS pura de duas camadas: a "capa" acompanha o conteúdo (background-attachment: local) e
   encobre a sombra assim que a rolagem chega ao fim; a sombra em si fica presa ao contêiner
   (attachment: scroll). */
.table-responsive {
    overflow-x: auto;
    border-radius: var(--r-l);
    border: 1px solid var(--line);
    background:
        linear-gradient(to left, var(--surface) 30%, rgba(255, 255, 255, 0)) 100% 0 / 40px 100% local no-repeat,
        linear-gradient(to left, rgba(21, 39, 51, .18), rgba(21, 39, 51, 0)) 100% 0 / 14px 100% scroll no-repeat,
        var(--surface);
}

.table {
    width: 100%;
    margin-bottom: 0;
    color: var(--ink);
}

.table th {
    position: sticky;
    top: 0;
    z-index: 5;
    padding: 11px 14px;
    text-align: left;
    white-space: nowrap;
    font-size: 10px;
    font-weight: 600;
    letter-spacing: 1.5px;
    text-transform: uppercase;
    color: var(--ink-3);
    background: var(--surface-2);
    border-bottom: 1px solid var(--line);
}

/* S08 (T37.2, R25): recalibração de densidade — alvo de linha ≤ 56px com célula de duas linhas
   (o "~48px" do T29 não fechava por aritmética; era 9px 14px). T30 reaproveita a mesma regra em
   Cargas/Downloads/Detalhe/Usuários. */
.table td {
    padding: 8px 14px;
    border-bottom: 1px solid var(--line-soft);
    font-size: 13px;
    line-height: 1.3;
    vertical-align: middle;
}

/* S08 (T29, R21; T37.2, R25): segunda linha da célula de duas linhas (C1) — texto principal
   colado à tag, ".sub" logo em seguida; herda a fonte do pai, por isso já sai mono nas células
   que são mono (ex.: ".celula-numero"). */
.sub {
    display: block;
    font-size: 11px;
    line-height: 1.2;
    color: var(--ink-3);
    margin-top: 1px;
}

.table tbody tr:hover {
    background: var(--gold-soft);
}

.table tbody tr:last-child td {
    border-bottom: 0;
}

/* S08 (T35.2, R23; T40.2/T40.3, R28): colunas redimensionáveis das tabelas de listagem. A alça
   (.col-resizer) e os controles de largura (.colunas-controles) são inseridos pelo site.js em
   runtime (ligarColunasRedimensionaveis); aqui só o visual da alça, do estado de arrasto e dos
   controles. */
th {
    position: relative;
}

.col-resizer {
    position: absolute;
    top: 0;
    right: 0;
    width: 8px;
    height: 100%;
    cursor: col-resize;
}

/* T40.3: alça visível em repouso (linha de 1px), 2px --gold no hover/arrasto (como antes). */
.col-resizer::after {
    content: '';
    position: absolute;
    top: 0;
    left: 3.5px;
    width: 1px;
    height: 100%;
    background: rgba(0, 69, 113, .18);
}

.col-resizer:hover::after,
.col-resizer.on::after {
    left: 3px;
    width: 2px;
    background: var(--gold);
}

body.redimensionando {
    cursor: col-resize;
    user-select: none;
}

/* T40.2: controles "Colunas − + Redefinir" injetados pelo JS logo acima do .table-responsive,
   substituindo o antigo botão isolado "Redefinir colunas". */
.colunas-controles {
    display: flex;
    align-items: center;
    justify-content: flex-end;
    gap: 6px;
    margin-bottom: 8px;
}

.colunas-rotulo {
    margin-right: 4px;
    font-size: 10px;
    font-weight: 600;
    letter-spacing: 1.2px;
    text-transform: uppercase;
    color: var(--ink-3);
}

/* T14.6/P-D: Usuário (Cargas) entra no mesmo mono da Chave/Lote. */
.celula-chave, .celula-lote, .celula-usuario {
    font-family: var(--mono);
    font-size: 11.5px;
    color: var(--ink-3);
    letter-spacing: -.3px;
}

/* T19.2 (GAP-2): font-size/color de Chave/Lote perdiam para ".table td" (0,1,1) — a regra acima
   é (0,1,0). Reforço aditivo só nessas duas propriedades, com selector elevado. */
.table td.celula-chave, .table td.celula-lote {
    font-size: 11.5px;
    color: var(--ink-3);
}

/* T14.6: Início/Fim em --mono 12px (a receita acima é 11.5px por ser id/chave — aqui o pedido
   do spec é 12px). */
.celula-inicio, .celula-fim {
    font-family: var(--mono);
    font-size: 12px;
}

/* T14.8: Data/hora dos downloads em --mono. */
.celula-data-hora {
    font-family: var(--mono);
    font-size: 12px;
}

/* A tabela do legado (larguras por <colgroup>, células com reticências e o selo de status
   desenhado por ::before) saiu no S11: a consulta v3 usa "table.tb", a mesma primitiva da
   Central fiscal e de Pacotes, com a pílula de situação no lugar do selo. */

a.ordenacao {
    color: inherit;
    text-decoration: none;
}

a.ordenacao:hover {
    color: var(--gold);
}

/* A seta de ordenação era desenhada aqui por "::after" a partir do aria-sort (S08). No S11 ela
   virou um <span class="ar"> no próprio HTML, como no protótipo v3 — manter as duas produzia
   DUAS setas no mesmo cabeçalho. Ver ".notas table.tb th .ar", no fim desta folha. */

/* T40.1 (R28): cabeçalhos de colunas numéricas alinhados à direita, como os valores da célula;
   a seta de ordenação (::after acima) flui com o texto do próprio link, sem empurrar para fora. */
.table th.th-numerico {
    text-align: right;
}

/* T44.2 (R32, GAP-1 da R12): as células das colunas numéricas (Total/Aceitas/Rejeitadas em
   Cargas e no histórico da Carga manual) alinham à direita, como o th-numerico correspondente
   (especificidade 0,2,1, acima de ".table td" 0,1,1). */
.table td.celula-numero {
    text-align: right;
}

/* alertas e banners (D9) */
.alert {
    border-radius: var(--r-m);
    padding: 11px 14px;
    font-size: 12.5px;
    border: 1px solid transparent;
}

/* S09: por token — no tema escuro o fundo rosa claro com texto vinho ficava ilegível sobre a
   página azul-noite. O 032 C continua reservado ao erro nos dois temas. */
.alert-danger, .validation-summary-errors {
    display: flex;
    align-items: center;
    gap: 9px;
    border-color: var(--crit);
    background: var(--crit-bg);
    color: var(--crit);
}

.alert-danger::before, .validation-summary-errors::before {
    content: "⚠";
    flex: none;
    font-size: 14px;
    line-height: 1;
}

/* T15.5: sem marcador de lista (o ⚠ do ::before já sinaliza o alerta) */
.validation-summary-errors ul {
    list-style: none;
    padding: 0;
    margin: 0;
}

.alert-success {
    background: var(--ok-bg);
    border-color: rgba(72, 176, 143, .3);
    color: var(--ok);
}

.alert-warning {
    background: var(--warn-bg);
    border-color: rgba(217, 150, 63, .3);
    color: var(--warn);
}

.banner-silencio, .banner-primeiro-acesso {
    width: 100%;
    margin-bottom: 18px;
}

/* paginação (D11) */
.pagination {
    display: flex;
    align-items: center;
    gap: 5px;
    flex-wrap: wrap;
}

/* T13.7: visual .btn.btn-ghost.btn-s (fantasma) para Primeira/Anterior/Próxima/Última e para os
   números, que ficam como quadrados de 31px */
.page-link {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    height: 31px;
    min-width: 31px;
    padding: 0 11px;
    border: 1px solid var(--line);
    border-radius: var(--r-s);
    background: none;
    color: var(--ink);
    font-size: 12px;
    font-weight: 500;
    text-decoration: none;
    line-height: 1;
}

a.page-link:hover {
    border-color: var(--gold);
    background: var(--surface-2);
    color: var(--ink);
}

.page-item.active .page-link {
    background: var(--gold);
    border-color: var(--gold);
    color: #fff;
}

.page-item.disabled .page-link {
    opacity: .45;
    cursor: not-allowed;
}

/* T37.3 (GAP-3, R25): o `.page-item.disabled .page-link` acima perdia "background"/"color" para
   o `.disabled > .page-link, .page-link.disabled` do Bootstrap (mesma especificidade 0,2,0, mas
   declarado depois no bundle.min.css); elevado a (0,3,0)/(0,2,0) e declarado por último para
   sempre vencer, sem !important. */
.page-item.disabled > .page-link, .page-link.disabled {
    background: none;
    border-color: var(--line);
    color: var(--ink-4);
    opacity: 1;
}

/* T13.7: reticências sem borda (não é um botão clicável). Especificidade elevada
   (.page-item.disabled > .page-link.reticencias, 0,4,0) para continuar vencendo a regra do
   T37.3 acima (0,3,0), que também se aplica a este item (a reticência vive dentro de um
   .page-item.disabled). */
.page-link.reticencias, .page-item.disabled > .page-link.reticencias {
    border-color: transparent;
    background: none;
}

/* ───────────────────────── (9) página a página (legado) ───────────────────────── */
/* cartão de acesso (T3: vive dentro do .gate-in do shell novo — sem caixa própria, senão duplica a
   borda/sombra do .stage por baixo). */
.cartao-acesso {
    width: 100%;
}

.cartao-acesso-titulo {
    font-size: 24px;
    font-weight: 600;
    letter-spacing: -.5px;
    color: var(--ink);
    margin: 14px 0 9px;
}

.cartao-acesso-explicacao {
    color: var(--ink-3);
    font-size: 13.5px;
    line-height: 1.55;
    max-width: 64ch;
    margin-bottom: 18px;
}

.cartao-acesso-links {
    display: flex;
    flex-wrap: wrap;
    gap: 8px 22px;
    margin-top: 20px;
    padding-top: 18px;
    border-top: 1px solid var(--line);
    list-style: none;
}

.cartao-acesso-links a {
    font-size: 13px;
    font-weight: 600;
    color: var(--gold);
    text-decoration: none;
}

.cartao-acesso-links a:hover {
    color: var(--cta-hi);
    text-decoration: underline;
}

/* T3: campos com floating label (D7) dentro do cartão — o .mb-3 do Bootstrap é !important, então
   o espaçamento do .field (13px) precisa da mesma força para não virar 16px. */
.cartao-acesso .field.mb-3 {
    margin-bottom: 13px !important;
}

/* T16: generalizado de ".cartao-acesso .field" para ".field" — o Login saiu do .cartao-acesso
   (vive direto no .gate-in, como no protótipo), mas o recado vale para as duas telas. */
.field .text-danger {
    display: block;
    margin-top: 6px;
}

/* checkbox custom (D7) — "Lembre de mim" e "Isento de Inscrição Estadual?" */
.cartao-acesso .check {
    margin: 4px 0 6px;
}

/* regras da nova senha: mesmo respiro dos campos ao redor */
.cartao-acesso .regras-de-senha {
    margin: -2px 0 16px;
}

.cartao-acesso .alert, .gate-in .alert {
    margin-bottom: 16px;
}

/* painéis genéricos (cards) */
/* T25.1 (R18): painel de filtros azul (D1: `filtro*` — a mesma classe é usada pelas telas admin,
   que herdam o visual daqui, "mesmo grid do T13", P-B em R7); substitui o fundo --surface-2 do
   T13.9 pelo gradiente do trilho, a pedido do Alan. */
.painel-filtros {
    border: 1px solid rgba(255, 255, 255, .08);
    border-radius: 16px;
    background: var(--rail-bg);
    padding: 18px 20px 16px;
    margin-bottom: 14px;
    box-shadow: 0 10px 30px rgba(0, 45, 74, .18);
}

.painel-filtros .form-label {
    color: rgba(234, 241, 246, .72);
    font-size: 10px;
    font-weight: 600;
    letter-spacing: 1.4px;
    text-transform: uppercase;
}

.painel-filtros .form-control,
.painel-filtros .form-select,
.painel-filtros input[type="date"] {
    background: var(--surface);
    height: 40px;
    border: 1px solid rgba(255, 255, 255, .22);
    border-radius: 10px;
    color: var(--ink);
}

.painel-filtros .form-control::placeholder {
    color: var(--ink-4);
}

.painel-filtros .form-control:focus,
.painel-filtros .form-select:focus,
.painel-filtros input[type="date"]:focus {
    outline: none;
    border-color: #4A9BD1;
    box-shadow: 0 0 0 3px rgba(74, 155, 209, .35);
}

/* T25.1/T32.3 (GAP-4): "Todos os registros" (e qualquer outro botão neutro do painel) vira
   fantasma claro sobre o fundo azul — hover próprio em vez de herdar a superfície clara de
   .link-todos-registros:hover (que ficaria invertida sobre o painel escuro). */
.painel-filtros .link-todos-registros {
    background: rgba(255, 255, 255, .06);
    border: 1px solid rgba(255, 255, 255, .3);
    color: #EAF1F6;
}

.painel-filtros .link-todos-registros:hover {
    background: rgba(255, 255, 255, .12);
    border-color: rgba(255, 255, 255, .3);
    color: #EAF1F6;
}

/* T13.1: grid de 12 colunas numa linha só (≥1200px); 2 colunas entre 700 e 1199px; 1 coluna
   abaixo de 700px (D14). `.filtro` sem classe própria (telas admin) cai num span 3 genérico;
   os campos de Notas abaixo definem seu próprio span. */
.filtros-linha {
    display: grid;
    grid-template-columns: repeat(12, 1fr);
    gap: 14px 16px;
}

.filtros-linha + .filtros-linha {
    margin-top: 11px;
}

.filtro {
    display: flex;
    flex-direction: column;
    gap: 5px;
    min-width: 0;
    grid-column: span 3;
}

@media (max-width: 1199px) {
    .filtros-linha {
        grid-template-columns: repeat(2, 1fr);
    }

    .filtro, .filtro-destinatario, .filtro-numero, .filtro-chave {
        grid-column: span 1;
    }

    /* T14.1: mantém a busca de Usuários ocupando a linha inteira (2 colunas nesta faixa),
       em vez de herdar "span 12" num grid que só tem 2 colunas explícitas aqui. */
    .filtro-busca-usuarios {
        grid-column: span 2;
    }
}

@media (max-width: 699px) {
    .filtros-linha {
        grid-template-columns: 1fr;
    }
}

/* T13.2: linha de ações do card, fora do grid de filtros — Usuários, Cargas e Downloads. As
   regras próprias do painel de Notas do legado (form#filtros) saíram no S11 com ele. */
.filtros-acoes {
    display: flex;
    justify-content: flex-end;
    align-items: flex-end;
    gap: 12px;
    margin-top: 12px;
    flex-wrap: nowrap;
}

/* Chips de atalho. Nasceram no S08 sobre o trilho escuro (tokens --rail-*); desde o S11 vivem no
   corpo claro da consulta v3, e por isso usam a paleta de superfície do protótipo. */
.chips {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 7px;
}

.chip {
    display: inline-flex;
    align-items: center;
    gap: 7px;
    padding: 4px 11px;
    border-radius: 99px;
    border: 1px solid var(--line);
    background: var(--surface);
    color: var(--ink-2);
    font-size: 11.5px;
    line-height: 1.7;
    cursor: pointer;
    text-decoration: none;
    transition: .16s;
}

.chip:hover {
    border-color: var(--gold);
    color: var(--ink-2);
    text-decoration: none;
}

.chip.on {
    background: var(--gold);
    border-color: var(--gold);
    color: #fff;
    font-weight: 600;
}

.filtro-acao, .filtro-limpar {
    display: flex;
    align-items: center;
    grid-column: span 2;
}

/* T14.1: busca de Usuários ocupa a linha inteira (P-B/"input largo"), com ícone de lupa —
   mesma técnica de .destinatario-busca (T13.1), sem <span> extra no Razor. */
.filtro-busca-usuarios {
    grid-column: span 12;
    position: relative;
}

.filtro-busca-usuarios::before {
    content: "";
    position: absolute;
    left: 10px;
    top: 30px;
    width: 14px;
    height: 14px;
    background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%236B8496' stroke-width='1.4' stroke-linecap='round'%3E%3Ccircle cx='7' cy='7' r='4.3'/%3E%3Cline x1='10.3' y1='10.3' x2='13.6' y2='13.6'/%3E%3C/svg%3E") no-repeat center / contain;
    pointer-events: none;
}

.filtro-busca-usuarios input#busca {
    padding-left: 30px;
}

/* T14.1: "+" do botão "Novo" no page-head, sem markup extra no Razor. */
.botao-novo::before {
    content: "+";
    font-weight: 700;
}

/* T13.2: visual .btn.btn-ghost sob o mesmo nome (D1) */
.link-todos-registros {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    height: 38px;
    padding: 0 15px;
    border: 1px solid var(--line);
    border-radius: var(--r-s);
    background: none;
    color: var(--ink);
    font-size: 13px;
    font-weight: 500;
    white-space: nowrap;
    text-decoration: none;
    transition: .16s;
}

.link-todos-registros:hover {
    border-color: var(--gold);
    background: var(--surface-2);
    color: var(--ink);
    text-decoration: none;
}

.painel-formulario, .painel-carga, .painel-confirmacao, .painel-detalhe,
.painel-relatorio, .painel-historico, .painel-em-construcao, .painel-erro,
.painel-avisos, .painel-senha-provisoria {
    border: 1px solid var(--line);
    border-radius: var(--r-l);
    background: var(--surface);
    box-shadow: var(--shadow-sm);
    padding: 18px;
    margin-bottom: 18px;
}

/* T14.3: callout --warn-bg com borda --warn (era --ok-bg). */
.painel-senha-provisoria {
    background: var(--warn-bg);
    border-color: var(--warn);
}

/* T14.5: painel de avisos da carga manual como callout --warn-bg (mesma receita acima). */
.painel-avisos {
    background: var(--warn-bg);
    border-color: var(--warn);
}

.painel-senha-titulo {
    font-size: 15px;
    font-weight: 600;
    margin-bottom: 6px;
}

.senha-provisoria {
    font-family: var(--mono);
    font-size: 15px;
    background: var(--surface);
    border: 1px solid var(--line);
    border-radius: var(--r-s);
    padding: 8px 12px;
    display: inline-block;
    margin: 6px 0;
}

/* T14.3: o <code> em --mono 22px (o <p> ao redor mantém a caixa acima). */
.senha-provisoria code {
    font-size: 22px;
    font-weight: 700;
}

.painel-senha-explicacao {
    color: var(--ink-3);
    font-size: 12.5px;
    line-height: 1.55;
}

.titulo-secao {
    font-size: 15px;
    font-weight: 600;
    letter-spacing: -.2px;
    margin-bottom: 12px;
}

.painel-avisos-titulo {
    font-weight: 600;
    font-size: 13px;
    margin-bottom: 6px;
}

.painel-erro {
    text-align: center;
    max-width: 560px;
    margin: 60px auto;
    padding: 40px 30px;
}

.painel-erro-codigo {
    font-family: var(--mono);
    font-size: 12px;
    letter-spacing: 1.5px;
    text-transform: uppercase;
    color: var(--ink-3);
    margin-bottom: 8px;
}

.painel-erro-identificador {
    margin-top: 14px;
    font-size: 12px;
    color: var(--ink-3);
}

.painel-erro-identificador code {
    font-family: var(--mono);
}

.painel-em-construcao {
    text-align: center;
    padding: 40px 30px;
}

.painel-em-construcao-selo {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 3px 9px;
    border-radius: 99px;
    background: var(--gold-soft);
    color: var(--gold);
    font-size: 11px;
    font-weight: 600;
    margin-bottom: 10px;
}

.painel-em-construcao-pacote {
    color: var(--ink-3);
    font-size: 12.5px;
    margin-top: 10px;
}

/* títulos e avisos */
.titulo-pagina {
    font-size: clamp(20px, 2.4vw, 26px);
    font-weight: 600;
    letter-spacing: -.5px;
    color: var(--ink);
    margin-bottom: 10px;
}

/* T4: respiro entre o eyebrow (D10) e o h1 dentro do page-head */
.page-head .titulo-pagina {
    margin-top: 8px;
}

.carga-explicacao {
    color: var(--ink-3);
    font-size: 13.5px;
    line-height: 1.55;
    max-width: 64ch;
    margin-bottom: 16px;
}

/* T14.5: dropzone da carga manual — o <input type=file> nasce dentro do <label> (id/name/
   multiple/accept intactos) e some visualmente atrás dele (.visually-hidden do Bootstrap,
   T15.5); clicar/soltar arquivo em qualquer ponto do label aciona o campo nativo. */
.dropzone {
    position: relative;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 10px;
    padding: 34px 18px;
    border: 1.5px dashed var(--line);
    border-radius: var(--r-l);
    background: var(--surface-2);
    cursor: pointer;
    text-align: center;
    transition: .16s;
}

.dropzone::before {
    content: "";
    width: 30px;
    height: 30px;
    background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236B8496' stroke-width='1.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3v12'/%3E%3Cpath d='M7 8l5-5 5 5'/%3E%3Cpath d='M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2'/%3E%3C/svg%3E") no-repeat center / contain;
}

.dropzone:hover, .dropzone:focus-within, .dropzone.on {
    border-color: var(--gold);
    background: var(--gold-soft);
}

.dropzone-rotulo {
    font-size: 13px;
    font-weight: 500;
    color: var(--ink-2);
}

/* T39.1 (R27): os cards "Enviar arquivos" (.painel-carga) e "Como funciona" recebem o mesmo
   painel azul do T25.1 (.painel-filtros); Relatório da carga e Últimas cargas continuam brancos
   (regra genérica de .painel-* na linha ~2764). */
.painel-carga,
.painel-como-funciona {
    background: var(--rail-bg);
    border: 1px solid rgba(255, 255, 255, .08);
    border-radius: 16px;
    padding: 18px 20px 16px;
    box-shadow: 0 10px 30px rgba(0, 45, 74, .18);
}

.painel-carga .titulo-secao,
.painel-como-funciona .titulo-secao {
    color: #FFFFFF;
}

.painel-carga .carga-explicacao,
.painel-como-funciona .carga-explicacao,
.painel-carga .form-text,
.painel-como-funciona .form-text {
    color: rgba(255, 255, 255, .82);
}

.painel-carga .dropzone {
    border-color: rgba(255, 255, 255, .35);
    background: rgba(255, 255, 255, .06);
}

.painel-carga .dropzone::before {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23EAF1F6' stroke-width='1.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3v12'/%3E%3Cpath d='M7 8l5-5 5 5'/%3E%3Cpath d='M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2'/%3E%3C/svg%3E");
}

.painel-carga .dropzone-rotulo {
    color: #EAF1F6;
}

.painel-carga .dropzone:hover,
.painel-carga .dropzone.on {
    border-color: rgba(255, 255, 255, .35);
    background: rgba(255, 255, 255, .12);
}

/* T43.6 (R31): foco de teclado no input#arquivos (visually-hidden, não display:none) com o
   mesmo fundo do hover e borda mais forte, para não ficar imperceptível ao navegar com Tab. */
.painel-carga .dropzone:focus-within {
    border-color: rgba(255, 255, 255, .7);
    background: rgba(255, 255, 255, .12);
}

.regras-de-senha {
    font-size: 11.5px;
    color: var(--ink-3);
    line-height: 1.5;
    margin: 6px 0 15px;
}

/* tabelas: as classes tabela-* seguem o visual de .table (mesmo elemento) */

/* T45.2 (R33): "min-width" no elemento table (P5/T4/T19.8d) foi removido: tabela com
   table-layout: fixed e min-width some redistribui até o piso quando "−" pede uma soma menor,
   deixando o controle inerte (aprendizado do T44.4/GAP-1/GAP-2 da R13). A largura padrão passa a
   vir só da soma das colunas do <colgroup> (col-data + col-destinatario flexível + demais, abaixo),
   que já soma a largura útil do wrapper a 1280px. */

/* T36.3 (R24, GAP-2 da R8): 170+140+260+110+200+270 = 1150.
   T44.4 (R32, observação 1 da R12): o "min-width: 1150px" nesta regra (removido) travava o
   total da tabela nesse piso mesmo depois de "−" reduzir a largura de cada <col> via JS: o
   layout fixo redistribuía o espaço sobrante de volta até 1150px, então o clique mudava o valor
   guardado no localStorage sem mudar nada na tela. Com largura própria em TODAS as colunas
   (col-nome incluso, abaixo) a soma já nasce em 1150px pela via normal do table-layout: fixed,
   sem precisar de um piso à parte na tabela, e "−"/"+" passam a valer de verdade. */
.tabela-usuarios {
    table-layout: fixed;
}

/* T38.2 (GAP-1, R26): padding vertical reduzido só nesta tabela (0,1,1, declarado depois de
   ".table td" para vencer o empate de especificidade) — some com os 0,1 a 0,6px de excesso sobre
   o teto de 60px por linha, sem mexer nas demais listagens. */
.tabela-usuarios td {
    padding-top: 7px;
    padding-bottom: 7px;
}

/* T14.1/P-D: larguras via <colgroup>/<col> (mesma técnica do T13.5); col-nome sem largura
   própria fica com o espaço restante.
   T19.8a (GAP-8): recalculadas para caber em 1280px sem estourar o wrapper (documento 150,
   login 130, nome flexível, telefone 130, e-mail 220, ações 230).
   T21.3 (GAP-3, R14): a coluna Nome ficava com só 128px (avatar + nome + pill cortados a seco).
   As demais colunas cedem espaço (documento 140, login 110, telefone 120, e-mail 200, ações 200)
   e o min-width da tabela sobe para 1040px; o nome passa a ter ~220px garantidos e a tabela
   rola na horizontal em vez de espremer (a sombra-degradê já indica a rolagem).
   T22.1 (R15): CNPJ de 14 dígitos em mono 13px mede 109px e vazava os 110px da coluna Login por
   3px; largura sobe para 125px e a célula ganha reticências + title (Razor) como salvaguarda.
   T26.1 (R19): 109px de texto + 28px de padding da td ainda estouravam os 125px; sobe para 140px.
   T36.3 (R24, GAP-2 da R8): CNPJ quebrava em 2 linhas na coluna de Documento e os 3 botões de
   ação quebravam em 2 linhas — documento sobe para 170, telefone cede 10px (110), ações sobe
   para 270 (cabem os 3 botões numa linha só, gap: 6px), min-width da coluna Nome garantido.
   T45.1 (R33, GAP-1 da R13): a soma de 1150px estourava o wrapper de 988px e escondia Visualizar/
   Excluir por inteiro no estado padrão (só "Editar" aparecia). Recalibrada para somar 988px:
   Ações mede a largura natural de Editar+Visualizar+Excluir (191px de conteúdo + 28px de padding
   da td = 219px) e reserva 230px; documento e login mantêm folga sobre o CPF/CNPJ (140px) e o
   login (109px) medidos; telefone cede para 90px (a maioria dos registros mostra "-"); Nome e
   E-mail ficam com o que sobra (200/156), com reticências + title como salvaguarda (abaixo).
   172+140+200+90+156+230 = 988. */
.tabela-usuarios .col-documento {
    width: 172px;
}

.tabela-usuarios .col-login {
    width: 140px;
}

.tabela-usuarios .col-nome {
    width: 200px;
}

.tabela-usuarios .col-telefone {
    width: 90px;
}

.tabela-usuarios .col-email {
    width: 156px;
}

.tabela-usuarios .col-acoes {
    width: 230px;
}

/* T19.8a (GAP-8): E-mail/Telefone truncam com reticências (título completo no atributo "title"
   acrescentado no Razor) — texto invadia a coluna vizinha e os botões de ação. Nome (T21.3) tem
   o próprio tratamento de reticências em .nome-texto, dentro da célula flex. */
.tabela-usuarios td.celula-email, .tabela-usuarios td.celula-telefone {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.tabela-usuarios td.celula-login {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* T45.1 (R33, observação 2 da R13): com as colunas estreitadas por "−", o CNPJ (celula-documento)
   sangrava para a coluna vizinha (overflow: visible). Seletor ".table td.celula-documento"
   (aprendizado 2) para vencer a especificidade de ".table td" — global porque toda tabela que usa
   "celula-documento" (Usuários, Downloads) já tem "title" no Razor. */
.table td.celula-documento {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* T45.1 (R33, observação 2 da R13): mesma correção para o bloco avatar+nome (celula-nome, flex),
   mas escopada a ".tabela-usuarios" — em /admin/downloads a "celula-nome" não tem "title" nem o
   wrapper ".nome-texto" com a própria reticência (T21.3), então "overflow: hidden" ali cortaria o
   nome a seco, sem "..." (flex não aplica text-overflow aos filhos) e sem tooltip. */
.tabela-usuarios td.celula-nome {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* T36.3 (R24, GAP-2 da R8): Editar/Visualizar/Excluir (ou Reativar) numa linha só, com o mesmo
   respiro entre botões independente do espaço em branco do Razor. */
.tabela-usuarios td.celula-acoes {
    display: flex;
    justify-content: flex-end;
    align-items: center;
    gap: 6px;
    white-space: nowrap;
}

/* T45.2 (R33): "min-width: 760px" removido (mesma razão do .tabela-notas acima). */
.tabela-downloads {
    table-layout: fixed;
}

/* T14.8: larguras via <colgroup>/<col> (mesma técnica de T13.5/T14.1); Chave com reticências
   + title="" na td (o texto completo continua no HTML).
   T19.8c (GAP-8): Chave reduzida de 280 para 220px — a soma das colunas estourava o wrapper e
   escondia o IP em 1280px.
   T21.2 (GAP-2, R14): IP (::ffff:172.24.0.1, 147px em mono) estourava a coluna de 120px; sobe
   para 170px com reticências + title (Razor). Usuário ganha largura própria (218px) e Chave
   cede 20px (200px) para a soma caber nos 988px do wrapper: 150+218+140+200+110+170 = 988.
   T38.1 (GAP-2, R26): Documento (CPF/CNPJ, 18 caracteres em mono 13px) estourava os 140px e
   invadia a coluna Chave; sobe para 170px e Usuário cede 30px (188px) para a soma continuar em
   988px: 150+188+170+200+110+170 = 988. */
.tabela-downloads .col-data-hora {
    width: 150px;
}

.tabela-downloads .col-usuario {
    width: 188px;
}

.tabela-downloads .col-documento {
    width: 170px;
}

.tabela-downloads .col-chave {
    width: 200px;
}

.tabela-downloads .col-tipo {
    width: 110px;
}

.tabela-downloads .col-ip {
    width: 170px;
}

/* T38.1 (GAP-2, R26): CPF/CNPJ com reticências + title (Razor) — mesma receita de celula-chave/
   celula-ip abaixo, para não transbordar sobre a coluna Chave. */
.tabela-downloads td.celula-documento {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.tabela-downloads .celula-chave {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.tabela-downloads td.celula-ip {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* T45.2 (R33): "min-width: 760px"/"min-width: 980px" removidos das duas regras acima: em
   /admin/cargas (wrapper 988px) o layout automático já preenchia 988 em 988 por conta própria
   (T44.2 confirmou isso); no histórico da Carga manual (wrapper 950px, .painel-historico-rolagem)
   o piso de 980px estourava 30px e cortava "REJEITADAS" (GAP-2 da R13). Larguras próprias de
   .tabela-carga-manual, abaixo, garantem a soma de 950px sem depender de nenhum piso na tabela. */

/* T19.8b (GAP-8): sem <colgroup> nesta tabela (layout auto) o Lote sem tamanho máximo estourava
   a largura real da tabela para além do wrapper e escondia "Ver itens"; título completo no
   atributo "title" acrescentado no Razor. */
.tabela-cargas td.celula-lote {
    max-width: 160px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* T45.2 (R33): Usuário (CPF/CNPJ de quem fez o upload manual) ganha o mesmo tratamento de
   reticências + title (Razor) do Lote, tanto em /admin/cargas quanto no histórico da Carga
   manual — as duas tabelas compartilham a classe "celula-usuario". */
.table td.celula-usuario {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* T45.2 (R33): larguras próprias do histórico da Carga manual via <colgroup>/<col> (mesma
   técnica de T13.5/T14.1), somando exatamente os 950px do wrapper .painel-historico-rolagem a
   1280px: data 150 + origem 150 + usuário 140 + lote 190 (bate com o max-width:160px + 28px de
   padding de ".tabela-cargas td.celula-lote", acima) + total 90 + aceitas 90 + rejeitadas 140
   (folga generosa para "REJEITADAS", 10 letras maiúsculas, não repetir o corte da R13) = 950.
   table-layout: fixed (só nesta tabela) para o <colgroup> valer como largura exata, não como
   piso do layout automático.
   T46.1 (R34): "width: auto" (tentativa da R14 para o "−" não ficar diluído) resolvia um lado do
   problema e quebrava o outro: com a tabela presa a 950px por um "width" fixo no elemento table,
   "+" não tinha como crescer além do wrapper (a soma gravada mudava, o renderizado quase não).
   Revertido ao padrão: quem passa a fixar a largura da tabela é a JS (site.js,
   aplicarLarguraDaTabela), somando as colunas em uso a cada ação; sem ação nenhuma (padrão,
   localStorage vazio), as larguras abaixo já somam 950px, que é o que "table { width: 100% }"
   também dá com table-layout: fixed. */
.tabela-carga-manual {
    table-layout: fixed;
}

.tabela-carga-manual .col-data {
    width: 150px;
}

.tabela-carga-manual .col-origem {
    width: 150px;
}

.tabela-carga-manual .col-usuario {
    width: 140px;
}

.tabela-carga-manual .col-lote {
    width: 190px;
}

.tabela-carga-manual .col-total {
    width: 90px;
}

.tabela-carga-manual .col-aceitas {
    width: 90px;
}

.tabela-carga-manual .col-rejeitadas {
    width: 140px;
}

.tabela-rejeicoes {
    min-width: 620px;
}

/* T45.2 (R33): ".tabela-itens-carga { min-width: 680px }" removido por inteiro (mesma razão do
   .tabela-notas acima; tabela com controles de largura, T35) — sem outra propriedade, a regra
   não volta (T6, CSS morto). */

/* T21.5 (R14): Arquivo (nome de arquivo pode ser longo) reduzido de ~360px para 220px com
   reticências + title (Razor), sem <colgroup> nesta tabela (mesma técnica de T19.8b/celula-lote,
   table-layout auto) — libera espaço para "Motivo" caber no wrapper em 1280px sem rolar. */
.tabela-itens-carga td.celula-arquivo {
    max-width: 220px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* T46.2 (R34, GAP-1 da R14): no padrão, Resultado (110,5) + Arquivo (220) + Chave (318,4, sem
   reticências, já que os 44 dígitos cabem por inteiro) + Motivo (360, o max-width global de
   ".celula-motivo") somavam 1008,9px, 59px além do wrapper de 950px do Detalhe da carga; a coluna
   Motivo, a única sem limite fixo de conteúdo, absorve a diferença (360 -> 300, sobra de 1px).
   Especificidade acima da regra global ".celula-motivo" (0,1,0) por conta própria (0,2,1). */
.tabela-itens-carga td.celula-motivo {
    max-width: 300px;
}

/* células específicas */
.celula-nome, .celula-login, .celula-documento, .celula-email, .celula-telefone,
.celula-tipo, .celula-ip, .celula-data, .celula-destinatario, .celula-numero {
    font-size: 13px;
}

/* T14.1/P-D: CPF/CNPJ e Login em mono (Login também --ink-4); Nome vira flex para caber
   avatar + nome + pills na mesma célula; Telefone/E-mail em --ink-2; IP em mono --ink-3
   (compartilhado com a tabela de downloads, T14.3/T14.8).
   T36.3 (R24): CPF/CNPJ formatado ("111.222.333/0001-81") não pode quebrar em 2 linhas na
   coluna de Usuários/Downloads — nowrap (a coluna já tem largura suficiente, D8/T36.3). */
.celula-documento {
    font-family: var(--mono);
    white-space: nowrap;
}

.celula-login {
    font-family: var(--mono);
    color: var(--ink-4);
}

/* T21.3 (GAP-3, R14): nome em bloco próprio (avatar + nome-bloco), pills numa segunda linha
   dentro do nome-bloco — evita que a pill mais larga ("Primeiro acesso pendente") estoure a
   célula, e dá ao texto do nome uma largura definida para as reticências funcionarem. */
.celula-nome {
    display: flex;
    gap: 10px;
    align-items: flex-start;
}

/* T36.2 (R24): avatar de 24px na linha de Usuários (era 27px, o padrão de .av). */
.celula-nome .av {
    width: 24px;
    height: 24px;
}

/* T38.2 (GAP-1, R26): gap de 4px para 2px — reduz a altura do bloco nome+pills em Usuários,
   ainda dentro do teto de 60px por linha. */
.celula-nome .nome-bloco {
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 2px;
}

.nome-texto {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    display: block;
}

.celula-telefone, .celula-email {
    color: var(--ink-2);
}

.celula-ip {
    font-family: var(--mono);
    color: var(--ink-3);
}

/* T14.1: ações da linha alinhadas à direita; Editar/Visualizar no tamanho .btn-xs (mesma
   receita de .btn-outline-primary.btn-sm).
   T46.4b (R34): Excluir ficava fora dessa receita (12px/padding 0 11px contra 11px/0 9px de
   Editar e Visualizar) e saía 5px mais alto, com o "top" 2,5px acima dos outros dois; entra na
   mesma regra para os três terminarem com a mesma altura/padding/fonte/"top". */
.celula-acoes {
    text-align: right;
}

.botao-editar.btn-sm, .botao-visualizar.btn-sm, .botao-excluir.btn-sm {
    height: 26px;
    padding: 0 9px;
    font-size: 11px;
    border-radius: 6px;
}

/* tags de origem/tipo (T8.3, R4): mesma técnica de T8.1; texto cru intacto na td, visual via
   ::before + attr(); o texto original some (font-size:0) para não duplicar.
   T19.1 (GAP-1): mesma causa dos selos de status — selector elevado a ".table td.celula-*"
   (0,1,2) para não perder de ".table td" (0,1,1); "color: transparent" como reforço. */
.table td.celula-origem, .table td.celula-tipo {
    font-size: 0;
    line-height: 0;
    color: transparent;
}

.celula-origem::before {
    content: attr(data-origem);
    display: inline-flex;
    align-items: center;
    padding: 2px 8px;
    border-radius: 6px;
    background: var(--gold-soft);
    color: var(--gold);
    font-family: var(--mono);
    font-size: 11px;
    line-height: 1.4;
    font-weight: 500;
    white-space: nowrap;
}

.celula-tipo::before {
    content: attr(data-tipo);
    display: inline-flex;
    align-items: center;
    padding: 2px 8px;
    border-radius: 6px;
    background: var(--gold-soft);
    color: var(--gold);
    font-family: var(--mono);
    font-size: 11px;
    line-height: 1.4;
    font-weight: 500;
    white-space: nowrap;
}

/* T14.7: .tag literal (protótipo) — usado onde o Razor pode mostrar o texto direto, sem a
   técnica attr()/::before (elemento fora da lista fechada da regra mestra). */
.tag {
    display: inline-flex;
    align-items: center;
    padding: 2px 8px;
    border-radius: 5px;
    font-family: var(--mono);
    font-size: 10.5px;
    font-weight: 500;
    background: var(--gold-soft);
    color: var(--gold);
    border: 1px solid var(--line-soft);
}

/* etiquetas (pills, D8). T36.2/T37.2 (R24/R25): sempre dentro de uma td — 10.5px, padding
   1px 8px (recalibrado pelo T37.2 sobre o 2px 8px do T36.2), para caber na densidade da linha. */
.etiqueta {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 1px 8px;
    border-radius: 99px;
    font-size: 10.5px;
    font-weight: 600;
    letter-spacing: .2px;
    white-space: nowrap;
    border: 1px solid transparent;
    margin-left: 6px;
}

.etiqueta::before {
    content: "";
    width: 5px;
    height: 5px;
    border-radius: 50%;
    background: currentColor;
}

.etiqueta-admin {
    background: var(--info-bg);
    color: var(--info);
    border-color: rgba(99, 166, 180, .3);
}

.etiqueta-pendente {
    background: var(--warn-bg);
    color: var(--warn);
    border-color: rgba(217, 150, 63, .3);
}

.etiqueta-desativado {
    background: var(--crit-bg);
    color: var(--crit);
    border-color: rgba(208, 106, 80, .3);
}

.etiqueta-aceita {
    background: var(--ok-bg);
    color: var(--ok);
    border-color: rgba(72, 176, 143, .3);
}

.usuario-desativado {
    opacity: .6;
}

/* T14.2/T14.3: pill literal (span autônomo) — mesmo visual de .etiqueta, usado onde o Razor
   precisa de um selo por item (vínculos selecionados do formulário, pills do cabeçalho da ficha). */
.pill {
    display: inline-flex;
    align-items: center;
    /* O espaço entre a bolinha e o texto mora AQUI, como no protótipo (`gap:6px` no .pill base).
       Antes cada tela v3 compensava com `margin-right` no ::before — e a gaveta do S12, que nasceu
       sem a compensação, saiu com a bolinha colada no texto (achado do Caio, 27/08). Uma regra só
       na raiz resolve para todas as superfícies, presentes e futuras. */
    gap: 6px;
    padding: 3px 9px;
    border-radius: 99px;
    font-size: 11px;
    font-weight: 600;
    letter-spacing: .2px;
    white-space: nowrap;
    border: 1px solid transparent;
}

.pill.mute {
    background: var(--surface-3);
    color: var(--ink-2);
    border-color: var(--line);
}

.pill.info {
    background: var(--info-bg);
    color: var(--info);
    border-color: rgba(99, 166, 180, .3);
}

.pill.ok {
    background: var(--ok-bg);
    color: var(--ok);
    border-color: rgba(72, 176, 143, .3);
}

.pill.warn {
    background: var(--warn-bg);
    color: var(--warn);
    border-color: rgba(217, 150, 63, .3);
}

.pill.crit {
    background: var(--crit-bg);
    color: var(--crit);
    border-color: rgba(208, 106, 80, .3);
}

/* rodapé */
.rodape {
    padding: 16px 0;
    margin-top: auto;
    border-top: 1px solid var(--line);
    color: var(--ink-3);
    font-size: 12px;
    text-align: center;
}

.rodape a {
    color: var(--gold);
    text-decoration: none;
}

.rodape a:hover {
    text-decoration: underline;
}

/* T19.3 (GAP-3): ".gate-foot a" (0,1,1) e ".rodape a" (0,1,1) empatavam em especificidade — a
   ordem no arquivo decidia, e ".rodape a" vinha depois. Selector elevado (0,2,1) e declarado
   depois de ".rodape a" para garantir o contraste sobre o fundo escuro do gate (≥ 4,5:1),
   também herdado pelo shell "documento". */
.rodape.gate-foot a {
    color: rgba(255, 255, 255, .85);
    text-decoration: none;
}

/* T23.1: sublinhado só em hover/foco; em repouso o link fica limpo sobre o fundo escuro. */
.rodape.gate-foot a:hover, .rodape.gate-foot a:focus-visible {
    text-decoration: underline;
}

.rodape-listagem {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: 10px;
    margin-top: 16px;
}

.rodape-usuarios {
    justify-content: space-between;
}

.paginacao, .paginacao-usuarios {
    display: flex;
    align-items: center;
    gap: 8px;
    flex-wrap: wrap;
}

.paginacao-usuarios .btn {
    height: 31px;
    padding: 0 11px;
    font-size: 12px;
}

.indicador-de-pagina {
    font-family: var(--mono);
    font-size: 12px;
    color: var(--ink-2);
}

.total-de-registros, .total-de-usuarios {
    margin-top: 12px;
    font-size: 12px;
    color: var(--ink-3);
}

/* Utilidade de grade do protótipo v3 — usada pela Central fiscal e por Pacotes. O painel de
   três tiles ".kpi" que o S08 punha acima da listagem saiu no S11: a consulta v3 publica os
   mesmos números na linha de totais (ver ".notas .totais-linha", no fim desta folha). */
.grid {
    display: grid;
    gap: 16px;
}

/* T14.1/P-C: resumo "Exibindo…" movido para acima da tabela de Usuários. */
.total-de-usuarios {
    margin-top: 0;
    margin-bottom: 10px;
}

/* T14.6/T14.8 (P-C): mesmo respiro acima, para Cargas e Downloads (que dividem a classe
   .total-de-registros). */
.total-de-registros {
    margin-top: 0;
    margin-bottom: 10px;
}

/* formulários e campos de gestão de usuários / carga */
.formulario-linha {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
    gap: 16px;
    margin-bottom: 16px;
}

/* T14.2: layout em 2 colunas (≥1100px) do formulário de usuário — "Dados" e "Destinatários
   vinculados" lado a lado; abaixo disso, uma coluna só (a ordem do Razor já é essa).
   T19.6 (GAP-6): "minmax(0,1fr)" no lugar de "1fr" evita que o conteúdo force a coluna a
   crescer além do card; gap reduzido a 16px (spec). */
.formulario-grid {
    display: grid;
    gap: 16px;
}

@media (min-width: 1100px) {
    .formulario-grid {
        grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
        align-items: start;
    }
}

/* T19.6 (GAP-6): CPF/CNPJ+Nome, E-mail+Telefone e Papel+Situação sempre lado a lado no card
   "Dados" — a regra geral de ".formulario-linha" (auto-fit, minmax 220px) colapsava para 1
   coluna quando o card ficava com ~449px de largura (< 220px*2 + gap). */
.formulario-secao-dados .formulario-linha {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 12px;
}

.formulario-secao {
    background: var(--surface-2);
    border-radius: var(--r-m);
    padding: 16px 18px;
}

.campo {
    display: flex;
    flex-direction: column;
    gap: 5px;
}

.campo-opcional {
    font-weight: 400;
    text-transform: none;
    letter-spacing: 0;
    color: var(--ink-4);
}

/* T14.2: "Situação como selo" — mesmo visual do selo neutro de dd[data-campo] (T8.2). */
.valor-somente-leitura {
    display: inline-flex;
    align-items: center;
    width: fit-content;
    padding: 3px 9px;
    border-radius: 99px;
    background: var(--surface-3);
    color: var(--ink-2);
    border: 1px solid var(--line);
    font-size: 11px;
    font-weight: 600;
    letter-spacing: .2px;
}

.formulario-acoes, .acoes-detalhe, .formulario-confirmacao {
    display: flex;
    gap: 10px;
    flex-wrap: wrap;
    margin-top: 18px;
}

/* T14.2: barra de ações fixa ao fim do formulário de usuário. */
.formulario-acoes-fixa {
    position: sticky;
    bottom: 0;
    z-index: 2;
    padding: 14px 0 4px;
    background: var(--surface);
    border-top: 1px solid var(--line);
}

.formulario-em-linha {
    display: inline-flex;
}

.campo-vinculos {
    margin-top: 8px;
}

.rotulo-vinculos {
    display: block;
}

.vinculos-explicacao {
    margin-bottom: 10px;
}

.vinculos-busca {
    margin-bottom: 10px;
}

.vinculos-busca-linha {
    display: flex;
    gap: 8px;
    flex-wrap: wrap;
}

.vinculos-busca-linha .form-control {
    flex: 1;
    min-width: 220px;
}

.vinculos-resumo, .vinculos-selecionados-resumo {
    margin-top: 6px;
    font-size: 11.5px;
    color: var(--ink-3);
}

/* T14.2: vínculos selecionados como pills separadas (em vez da string unida por ";"). */
.vinculos-selecionados-resumo .pill {
    margin: 3px 6px 0 0;
}

.select-vinculos {
    margin-top: 8px;
}

/* T14.2: size="12", altura 320px, opções com padding — especificidade igual à de
   "select[multiple].form-select" (que zera a altura); a ordem no arquivo decide o empate. */
select.select-vinculos[multiple] {
    height: 320px;
    padding: 6px 0;
}

.select-vinculos option {
    padding: 6px 10px;
}

.nota-de-pacote {
    margin-top: 14px;
    font-size: 12.5px;
    color: var(--ink-3);
}

/* histórico e cargas */
.historico-vazio, .detalhe-vazio {
    padding: 24px;
    text-align: center;
    color: var(--ink-3);
    font-size: 13px;
}

.lista-totais {
    display: flex;
    flex-wrap: wrap;
    gap: 18px;
    list-style: none;
    margin-bottom: 10px;
}

.rotulo-total {
    color: var(--ink-3);
    font-size: 11.5px;
    margin-right: 4px;
}

.total-aceitas {
    color: var(--ok);
}

.total-rejeitadas {
    color: var(--crit);
}

/* T32.5 (R22, GAP-6): dentro de tabela o Bootstrap repõe --bs-emphasis-color (preto) com
   ".table > :not(caption) > * > *" (0,1,3), que vence a regra acima (0,1,0); sobe a
   especificidade sem !important. */
.table td .total-aceitas,
.table td.total-aceitas,
.lista-totais .total-aceitas {
    color: var(--ok);
}

.table td .total-rejeitadas,
.table td.total-rejeitadas,
.lista-totais .total-rejeitadas {
    color: var(--crit);
}

.carga-identificador, .carga-sem-rejeicoes {
    color: var(--ink-3);
    font-size: 12.5px;
    margin-top: 8px;
}

/* T14.7: lote em --mono; identificador da carga em --ink-4 --mono (specificidade igual à regra
   acima — como aparece depois no arquivo, esta vence). */
.carga-lote {
    font-family: var(--mono);
}

.carga-id {
    font-family: var(--mono);
    color: var(--ink-4);
}

/* T14.5/T14.7 (P-D): tiles .kpi dentro de .lista-totais — o <li> continua <li>, só ganha a
   classe (ADITIVO); barra lateral colorida + valor em destaque, no espírito do .kpi do
   protótipo (aqui reaproveitando o rótulo/strong já existentes, sem duplicar markup). */
.lista-totais li.kpi {
    position: relative;
    flex: 1;
    min-width: 150px;
    padding: 14px 16px;
    border: 1px solid var(--line);
    border-radius: var(--r-l);
    background: var(--surface-2);
    overflow: hidden;
}

.lista-totais li.kpi::before {
    content: "";
    position: absolute;
    left: 0;
    top: 0;
    bottom: 0;
    width: 3px;
    background: var(--cta);
    opacity: .9;
}

.lista-totais li.kpi.ok::before {
    background: var(--ok);
}

.lista-totais li.kpi.crit::before {
    background: var(--crit);
}

.lista-totais li.kpi .rotulo-total {
    display: block;
    margin-right: 0;
    margin-bottom: 6px;
    font-size: 10.5px;
    font-weight: 600;
    letter-spacing: 1.2px;
    text-transform: uppercase;
}

.lista-totais li.kpi strong {
    font-family: var(--mono);
    font-size: 22px;
    font-weight: 500;
    color: var(--ink);
}

/* T14.7: cabeçalho do detalhe da carga — Origem/Usuário/Início/Fim ficam numa lista à parte
   dos tiles .kpi (duas <ul class="lista-totais">, mesmo nome, nenhuma removida). "Início → Fim"
   numa linha só via ::before no segundo item, sem markup novo. */
.lista-totais-cabecalho {
    margin-bottom: 10px;
}

.lista-totais-cabecalho li.carga-periodo {
    display: inline-flex;
    align-items: baseline;
    gap: 6px;
}

.lista-totais-cabecalho li.carga-periodo + li.carga-periodo::before {
    content: "→";
    color: var(--ink-3);
}

/* T14.5/T14.6/T14.7 (P-D): zero em --ink-4 (não chama atenção como se fosse ok/crit).
   T32.5 (R22): sobe junto com a especificidade do bloco acima (0,3,1 nas células de tabela),
   para continuar vencendo mesmo com o zero numa linha par (zebra) ou numa célula de tabela. */
.total-aceitas.total-zero, .total-rejeitadas.total-zero {
    color: var(--ink-4);
}

.table td .total-aceitas.total-zero,
.table td.total-aceitas.total-zero,
.table td .total-rejeitadas.total-zero,
.table td.total-rejeitadas.total-zero,
.lista-totais .total-aceitas.total-zero,
.lista-totais .total-rejeitadas.total-zero {
    color: var(--ink-4);
}

/* T14.5/T14.7: motivo da rejeição em --ink-2.
   T38.2 (GAP-1, R26): motivo em texto livre quebrava em até 3 linhas e estourava o teto de
   altura da linha; reticências + title (Razor) mantêm o texto completo no HTML. */
.celula-motivo {
    color: var(--ink-2);
    max-width: 360px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* T14.7: linhas rejeitadas com fundo --crit-bg suave (os selos/pills já existem, D8/T8.4). */
.item-rejeitado {
    background: var(--crit-bg);
}

/* T27.1 (R20): zebra em todas as listagens — ímpares em --surface (branco, já a base do .table),
   pares em azul-clarinho; hover um tom acima em qualquer linha. As três regras deste bloco empatam
   em especificidade (0,2,3): a ordem no arquivo decide o empate, então a linha rejeitada vem por
   último e vence sobre a zebra/hover. */
.table > tbody > tr:nth-child(even) > td {
    background-color: var(--surface-2);
}

.table > tbody > tr:hover > td {
    background-color: var(--gold-soft);
}

/* T19.7 (GAP-7) + T27.1: o Bootstrap repõe "--bs-table-bg" na própria td
   (".table > :not(caption) > * > *"), então o fundo da tr some — pinta a td também. O seletor
   ganhou o "tbody" explícito para empatar em especificidade com a zebra/hover acima (linha
   rejeitada mantém --crit-bg mesmo em linha par ou sob hover). */
.table > tbody > tr.item-rejeitado > td {
    background-color: var(--crit-bg);
}

/* detalhe de usuário */
/* T14.3: "dl em grid 160px/1fr" (era 180px) — classe usada só nas telas de Visualizar/Excluir. */
.lista-detalhe {
    display: grid;
    grid-template-columns: 160px 1fr;
    gap: 9px 14px;
    font-size: 13px;
    margin-bottom: 8px;
}

.lista-detalhe dt {
    color: var(--ink-3);
    font-size: 12px;
}

.lista-detalhe dd {
    color: var(--ink);
    word-break: break-word;
}

.lista-detalhe-compacta {
    grid-template-columns: 140px 1fr;
}

/* T14.4: "dl compacta abaixo em --ink-3" (tela de exclusão). */
.lista-detalhe-compacta dd {
    color: var(--ink-3);
}

/* T14.3: cabeçalho da ficha do usuário — avatar grande, nome, documento e ações à direita. */
.ficha-cabecalho {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 16px;
    flex-wrap: wrap;
    margin-bottom: 18px;
}

.ficha-identidade {
    display: flex;
    align-items: flex-start;
    gap: 14px;
}

.ficha-identidade .av {
    width: 48px;
    height: 48px;
    font-size: 18px;
}

.ficha-nome {
    margin-bottom: 2px;
}

.ficha-documento {
    font-family: var(--mono);
    color: var(--ink-3);
    font-size: 13px;
}

.ficha-pills {
    display: flex;
    gap: 6px;
    flex-wrap: wrap;
    margin-top: 6px;
}

.ficha-cabecalho .acoes-detalhe {
    margin-top: 0;
}

/* T19.6 (GAP-6): garante as ações à direita mesmo quando ".ficha-cabecalho" (flex-wrap) quebra
   a linha e ".acoes-detalhe" vira o único item da sua própria linha (o "justify-content:
   space-between" do container não alcança esse caso). */
.acoes-detalhe.acts {
    margin-left: auto;
    justify-content: flex-end;
}

/* T14.3: grid de 2 colunas (≥1100px) para as seções "Dados" e "Vínculos com destinatários". */
.ficha-grid {
    display: grid;
    gap: 18px;
    margin-bottom: 18px;
}

.ficha-grid .painel-detalhe {
    margin-bottom: 0;
}

@media (min-width: 1100px) {
    .ficha-grid {
        grid-template-columns: 1fr 1fr;
        align-items: start;
    }
}

/* T14.3: "Últimos acessos e downloads" em tiles .kpi — dt/dd continuam intactos dentro. */
.lista-detalhe-kpis {
    display: flex;
    gap: 14px;
    flex-wrap: wrap;
}

.lista-detalhe-kpis .kpi {
    flex: 1;
    min-width: 160px;
    padding: 14px 16px;
    border: 1px solid var(--line);
    border-radius: var(--r-m);
    background: var(--surface-2);
}

.lista-detalhe-kpis .kpi dt {
    margin-bottom: 4px;
}

.lista-detalhe-kpis .kpi dd {
    font-size: 20px;
    font-weight: 600;
    color: var(--ink);
}

/* selo neutro (T8.2, R4): dd[data-campo] literal, só o visual vira selo */
.lista-detalhe dd[data-campo="situacao"],
.lista-detalhe dd[data-campo="papel"] {
    display: inline-block;
    width: fit-content;
    padding: 3px 9px;
    border-radius: 99px;
    background: var(--surface-3);
    color: var(--ink-2);
    border: 1px solid var(--line);
    font-size: 11px;
    font-weight: 600;
    letter-spacing: .2px;
}

.documento-do-vinculo {
    color: var(--ink-3);
    font-size: 12px;
    font-family: var(--mono);
}

.lista-vinculos-leitura {
    list-style: none;
    display: flex;
    flex-direction: column;
    gap: 6px;
    font-size: 13px;
}

/* confirmação de exclusão (T14.4) */
/* card centralizado 640px, com faixa superior --crit e ícone de alerta (::before, sem markup) */
.painel-confirmacao {
    max-width: 640px;
    margin: 0 auto;
    border-top: 4px solid var(--crit);
    text-align: center;
    padding-top: 28px;
}

.painel-confirmacao::before {
    content: "!";
    display: flex;
    align-items: center;
    justify-content: center;
    width: 42px;
    height: 42px;
    margin: 0 auto 14px;
    border-radius: 50%;
    background: var(--crit-bg);
    color: var(--crit);
    font-size: 20px;
    font-weight: 700;
    font-style: normal;
}

/* "pergunta em .h2" (T14.4): o tamanho da fonte vem da classe .h2 (utilitário tipográfico,
   acrescentada no Razor); aqui só o respiro abaixo do texto. */
.confirmacao-pergunta {
    margin-bottom: 12px;
}

.confirmacao-consequencias {
    padding-left: 18px;
    color: var(--ink-3);
    font-size: 12.5px;
    line-height: 1.6;
    margin-bottom: 14px;
    text-align: left;
}

/* "consequências como lista com marcador --crit" — ::marker colore só o marcador, o texto
   segue --ink-3 acima */
.confirmacao-consequencias li::marker {
    color: var(--crit);
}

/* T19.4 (GAP-4): dl movida para dentro do card, abaixo dos botões, separada por filete. */
.painel-confirmacao .lista-detalhe-compacta {
    margin-top: 20px;
    padding-top: 20px;
    border-top: 1px solid var(--line-soft);
    text-align: left;
}

.confirmacao-impedimento {
    padding: 12px 14px;
    border-radius: var(--r-m);
    background: var(--warn-bg);
    color: var(--warn);
    font-size: 13px;
    margin-bottom: 14px;
}

/* avisos operacionais */
.aviso-listagem-todos {
    margin-bottom: 14px;
    font-size: 12.5px;
    color: var(--ink-3);
}

.aviso-operacao, .erro-operacao {
    margin-bottom: 16px;
}

.lista-erros {
    margin: 0;
    padding-left: 18px;
}

/* ───────────────────────── (10) responsivo ───────────────────────── */
@media (max-width: 980px) {
    .app {
        grid-template-columns: 1fr;
    }

    .rail {
        position: fixed;
        left: 0;
        top: 0;
        bottom: 0;
        z-index: 120;
        width: 250px;
        height: 100vh;
        transform: translateX(-102%);
        transition: transform .3s cubic-bezier(.2, .8, .2, 1);
    }

    .rail.on {
        transform: none;
        box-shadow: var(--shadow);
    }

    .menu-btn {
        display: grid !important;
    }

    .stage {
        grid-template-columns: 1fr;
        height: auto;
        min-height: 0;
    }

    .show {
        order: -1;
        min-height: 200px;
        margin: 10px;
    }

    .show-in {
        padding: 24px 26px;
    }

    .pitch h1 {
        font-size: 26px;
    }

    .pulse {
        gap: 22px;
        margin-top: 20px;
        padding-top: 14px;
    }

    .gate {
        padding: 30px 28px 34px;
    }

    #gatehost {
        padding: 14px;
    }
}

@media (max-width: 620px) {
    .view {
        padding: 18px 15px 60px;
    }

    /* T28 (S08b): .cabecalho-identificacao agora é sempre visually-hidden (C3) — a regra que a
       escondia por completo em telas estreitas foi removida (regrediria a leitura por leitor de
       tela só nesse breakpoint). */

    /* T42.1 (R30): em ≤620px só o avatar (40px) do chip do usuário fica visível. */
    .who {
        padding: 8px;
    }

    .who-info {
        display: none;
    }

    /* T23.3 (R16): em ≤620px a página volta ao fluxo normal de sempre (não trava altura, não
       corta o corpo do card, sem rolagem interna). */
    .documento-pagina {
        height: auto;
        overflow: visible;
        justify-content: flex-start;
        padding: 32px 16px 48px;
    }

    /* T21.6 (R14): card de leitura da Política de Privacidade com respiro menor e o botão
       "Voltar" sem esticar a largura toda do card. */
    .card.documento {
        display: block;
        max-height: none;
        overflow: visible;
        padding: 24px 18px 28px;
    }

    .documento-cabecalho {
        padding: 0 0 18px;
    }

    .documento-cabecalho .acts {
        margin-left: 0;
    }

    .documento-corpo {
        overflow-y: visible;
        padding: 18px 0 0;
    }

    .documento-voltar {
        width: auto;
    }
}

/* ───────────────────────── (11) prefers-reduced-motion ───────────────────────── */
@media (prefers-reduced-motion: reduce) {
    *, *::before, *::after {
        animation-duration: .01ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: .01ms !important;
    }

    /* T19.9: desliga o "scroll-behavior: smooth" que o Bootstrap liga em
       "@media (prefers-reduced-motion: no-preference)". */
    html {
        scroll-behavior: auto;
    }

    /* T21.7: animation-duration já cai para .01ms acima, mas o animation-delay (.4s a .64s, T24.1)
       não é zerado; sem isto o conteúdo ficaria opacity:0 (invisível) até o delay passar. */
    .pitch h1, .pitch p, .pulse {
        opacity: 1;
        transform: none;
    }
}

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   (11) SHELL v3 E CENTRAL FISCAL — S09
   Transcrição do protótipo v3 aprovado (docs/prototipos/prototipo-v3.html). Duas regras valem
   para todo este bloco:
     · nenhum `style` embutido no HTML (critério 10 do S09) — o que no protótipo era inline
       (altura de barra, tamanho de ícone, traço do anel) vira classe aqui ou atributo de SVG;
     · nenhuma cor literal fora das que já são de marca nos dois temas — tudo por token, para o
       tema escuro sair de graça.
   ═══════════════════════════════════════════════════════════════════════════════════════════ */

/* ── ícones oficiais da marca ─────────────────────────────────────────────────────────────── */
.ng {
    width: 17px;
    height: 17px;
    flex: none;
}

/* ── topbar v3: breadcrumb, busca ⌘K, sino e chip do usuário ──────────────────────────────── */
.crumb .cabecalho-marca {
    color: var(--ink-3);
    text-decoration: none;
}

.crumb .cabecalho-marca:hover {
    color: var(--ink);
}

.crumb-sep {
    margin: 0 5px;
    opacity: .4;
}

.icon-btn {
    display: grid;
    place-items: center;
    flex: none;
    width: 36px;
    height: 36px;
    cursor: pointer;
    border: 1px solid var(--line);
    border-radius: var(--r-s);
    background: var(--surface);
    color: var(--ink-2);
}

.icon-btn:hover {
    border-color: var(--gold);
    color: var(--gold);
}

.kbd-btn {
    display: flex;
    align-items: center;
    gap: 9px;
    height: 36px;
    padding: 0 12px;
    cursor: pointer;
    border: 1px solid var(--line);
    border-radius: var(--r-s);
    background: var(--surface);
    color: var(--ink-3);
    font-size: 12.5px;
}

.kbd-btn:hover {
    border-color: var(--gold);
    color: var(--ink);
}

.kbd-btn kbd {
    padding: 2px 5px;
    border-radius: 4px;
    background: var(--gold-soft);
    color: var(--gold);
    font-family: var(--mono);
    font-size: 10.5px;
}

.whowrap {
    position: relative;
}

.who {
    cursor: pointer;
    text-align: left;
}

.who .cv {
    width: 13px;
    height: 13px;
    flex: none;
    margin-left: 2px;
    color: var(--ink-4);
}

/* Menu do chip: abre no clique (site.js liga .on) e também no :focus-within — assim teclado e
   leitor de tela alcançam "Minha conta" e "Desconectar" mesmo sem JavaScript. */
.whomenu {
    position: absolute;
    right: 0;
    top: calc(100% + 9px);
    z-index: 80;
    width: 260px;
    padding: 9px;
    border: 1px solid var(--line);
    border-radius: var(--r-m);
    background: var(--surface);
    box-shadow: var(--shadow);
    opacity: 0;
    visibility: hidden;
    transform: translateY(-6px);
    transition: .18s;
}

.whomenu.on,
.whowrap:focus-within .whomenu {
    opacity: 1;
    visibility: visible;
    transform: none;
}

.wm-cap {
    padding: 5px 8px 8px;
    font-size: 9.5px;
    font-weight: 600;
    letter-spacing: 1.9px;
    text-transform: uppercase;
    color: var(--ink-4);
}

.wm-item {
    display: flex;
    gap: 11px;
    align-items: center;
    width: 100%;
    padding: 9px;
    border: 0;
    border-radius: var(--r-s);
    background: none;
    color: var(--ink);
    font-size: 13px;
    text-align: left;
    text-decoration: none;
    cursor: pointer;
    transition: .15s;
}

.wm-item:hover {
    background: var(--surface-3);
    color: var(--ink);
    text-decoration: none;
}

.wm-item .ng {
    color: var(--ink-3);
}

/* ── botão de tema no rodapé do trilho ────────────────────────────────────────────────────── */
.btn-tema {
    width: 100%;
    background: none;
    border-color: var(--rail-line);
    color: var(--rail-ink-2);
}

.btn-tema:hover {
    border-color: var(--rail-gold);
    color: var(--rail-ink);
    background: var(--rail-hover);
}

.btn-tema .ng {
    width: 15px;
    height: 15px;
}

/* ═══════════════════════ CENTRAL FISCAL (/central) ═══════════════════════════════════════ */
/* Tudo abaixo é escopado em .central: o portal já usa .kpi, .pill e .tag em outras telas com
   outra receita, e um pacote de tela nova não pode reformar as telas dos pacotes anteriores. */

.central .lead {
    margin-top: 6px;
    font-size: 13.5px;
    color: var(--ink-3);
    max-width: 64ch;
}

.central .h2,
.pacotes .h2 {
    flex: 1;
    min-width: 0;
    font-size: 17px;
    font-weight: 600;
    letter-spacing: -.3px;
}

.central .h3,
.notas .h3 {
    font-size: 13px;
    font-weight: 600;
}

.central .num,
.pacotes .num,
.notas .num {
    font-family: var(--mono);
    font-variant-numeric: tabular-nums;
    letter-spacing: -.2px;
}

.central .small,
.pacotes .small,
.notas .small {
    font-size: 12px;
}

.central .tiny,
.pacotes .tiny,
.notas .tiny {
    font-size: 11px;
}

.central .muted,
.pacotes .muted,
.notas .muted {
    color: var(--ink-3);
}

.central .card + .card,
.central .card + .grid,
.central .grid + .card,
.central .grid + .grid,
.pacotes .card + .card,
.pacotes .card + .grid,
.pacotes .grid + .card,
.pacotes .grid + .grid {
    margin-top: 16px;
}

.central .card-h,
.pacotes .card-h {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 15px 18px;
    border-bottom: 1px solid var(--line-soft);
}

.central .g-4 {
    grid-template-columns: repeat(4, minmax(0, 1fr));
}

.central .g-32 {
    grid-template-columns: minmax(0, 1.6fr) minmax(0, 1fr);
}

.central .coluna {
    display: flex;
    flex-direction: column;
    gap: 16px;
    min-width: 0;
}

/* ── (b) hero: a resposta ─────────────────────────────────────────────────────────────────── */
.central .hero {
    position: relative;
    display: grid;
    grid-template-columns: 1.35fr .95fr;
    margin-bottom: 18px;
    border: 1px solid var(--line);
    border-radius: var(--r-l);
    background: var(--surface);
    box-shadow: var(--shadow-sm);
    overflow: hidden;
}

.central .hero::before {
    content: "";
    position: absolute;
    left: 0;
    top: 0;
    bottom: 0;
    width: 4px;
    background: var(--gold);
}

.central .hero-l {
    padding: 24px 26px 22px 28px;
    min-width: 0;
}

.central .hero-r {
    display: flex;
    flex-direction: column;
    justify-content: center;
    padding: 24px 26px;
    min-width: 0;
    background: var(--surface-3);
    border-left: 1px solid var(--line);
}

.central .hero-cap {
    display: flex;
    align-items: center;
    gap: 9px;
    font-size: 10px;
    font-weight: 600;
    letter-spacing: 1.9px;
    text-transform: uppercase;
    color: var(--ink-3);
}

.central .hero-cap .dotlive {
    margin: 0;
}

.central .hero-comp {
    margin-top: 13px;
    font-size: clamp(26px, 3.1vw, 36px);
    font-weight: 600;
    letter-spacing: -1.1px;
    line-height: 1.05;
    text-wrap: balance;
}

.central .hero-sub {
    margin-top: 7px;
    font-size: 13px;
    color: var(--ink-3);
}

.central .hero-val {
    margin-top: 17px;
    font-family: var(--mono);
    font-size: clamp(30px, 3.6vw, 42px);
    font-weight: 500;
    letter-spacing: -1.6px;
    font-variant-numeric: tabular-nums;
    line-height: 1;
    color: var(--gold);
}

.central .hero-acts {
    margin-top: 20px;
    display: flex;
    gap: 10px;
    flex-wrap: wrap;
}

.central .hero-acts .btn {
    height: 44px;
    padding: 0 20px;
    font-size: 14px;
}

.central .hero-acts .btn .ng {
    width: 17px;
    height: 17px;
}

/* laranja cheio: o único lugar da tela onde o 152 C é área, e não acento */
.central .btn-p,
.pacotes .btn-p {
    background: var(--cta);
    border-color: var(--cta);
    color: #fff;
    font-weight: 600;
}

.central .btn-p:hover,
.pacotes .btn-p:hover {
    background: var(--cta-hi);
    border-color: var(--cta-hi);
    color: #fff;
}

.central .hero-vazio {
    grid-column: 1 / -1;
    padding: 34px 28px;
    text-align: center;
}

.central .hero-vazio .hero-comp {
    margin-top: 10px;
}

.central .hero-vazio .hero-acts {
    justify-content: center;
}

/* ── esteira "Da SEFAZ até você" ──────────────────────────────────────────────────────────── */
.central .est-t {
    margin-bottom: 15px;
    font-size: 10px;
    font-weight: 600;
    letter-spacing: 1.9px;
    text-transform: uppercase;
    color: var(--ink-3);
}

.central .est-i {
    position: relative;
    display: flex;
    gap: 12px;
    align-items: flex-start;
    padding-bottom: 16px;
}

.central .est-i:last-child {
    padding-bottom: 0;
}

.central .est-i::before {
    content: "";
    position: absolute;
    left: 6px;
    top: 15px;
    bottom: -1px;
    width: 1px;
    background: var(--line);
}

.central .est-i:last-child::before {
    display: none;
}

.central .est-d {
    width: 13px;
    height: 13px;
    flex: none;
    margin-top: 2px;
    border-radius: 50%;
    background: var(--surface);
    border: 2.5px solid var(--gold);
}

.central .est-i.cta .est-d {
    background: var(--cta);
    border-color: var(--cta);
}

.central .est-h {
    font-size: 12.5px;
    font-weight: 600;
    line-height: 1.3;
}

.central .est-m {
    margin-top: 2px;
    font-family: var(--mono);
    font-size: 11px;
    color: var(--ink-3);
}

.central .est-gap {
    display: flex;
    align-items: baseline;
    gap: 8px;
    margin-top: 16px;
    padding-top: 14px;
    border-top: 1px solid var(--line);
}

.central .est-gap b {
    font-family: var(--mono);
    font-size: 24px;
    font-weight: 500;
    letter-spacing: -.6px;
    color: var(--cta);
}

.central .est-gap span {
    font-size: 11.5px;
    line-height: 1.4;
    color: var(--ink-3);
}

/* ── (c) indicadores ──────────────────────────────────────────────────────────────────────── */
.central .kpi {
    position: relative;
    padding: 16px 17px;
    border: 1px solid var(--line);
    border-radius: var(--r-l);
    background: var(--surface);
    overflow: hidden;
}

/* o acento padrão é o 301 C; o laranja fica reservado ao cartão que pede ação */
.central .kpi::after {
    content: "";
    position: absolute;
    left: 0;
    top: 0;
    bottom: 0;
    width: 3px;
    background: var(--gold);
    opacity: .9;
}

.central .kpi.cta::after {
    background: var(--cta);
}

.central .kpi.ok::after {
    background: var(--ok);
}

.central .kpi-k {
    font-size: 10.5px;
    font-weight: 600;
    letter-spacing: 1.4px;
    text-transform: uppercase;
    color: var(--ink-3);
}

.central .kpi-v {
    margin-top: 8px;
    font-family: var(--mono);
    font-size: 29px;
    font-weight: 500;
    letter-spacing: -1px;
    font-variant-numeric: tabular-nums;
    line-height: 1.15;
}

.central .kpi-f {
    margin-top: 6px;
    font-size: 11.5px;
    color: var(--ink-3);
}

/* ── (d) valor faturado por competência ───────────────────────────────────────────────────── */
.central .months {
    display: flex;
    gap: 6px;
    padding: 4px 2px 6px;
    overflow-x: auto;
    scrollbar-width: none;
    /* a faixa rola: a máscara na borda direita diz isso sem precisar de legenda */
    -webkit-mask-image: linear-gradient(90deg, #000 calc(100% - 38px), transparent);
    mask-image: linear-gradient(90deg, #000 calc(100% - 38px), transparent);
}

.central .months::-webkit-scrollbar {
    display: none;
}

.central .mo {
    flex: none;
    width: 80px;
    padding: 9px 7px;
    border: 1px solid var(--line);
    border-radius: var(--r-m);
    background: var(--surface);
    color: var(--ink);
    text-align: center;
    text-decoration: none;
    cursor: pointer;
    transition: .16s;
}

.central .mo:hover {
    border-color: var(--gold);
    transform: translateY(-2px);
    color: var(--ink);
    text-decoration: none;
}

.central .mo .m {
    display: block;
    font-size: 10px;
    letter-spacing: 1.2px;
    text-transform: uppercase;
    color: var(--ink-3);
}

.central .mo .v {
    display: block;
    margin-top: 4px;
    font-family: var(--mono);
    font-size: 11.5px;
    font-weight: 500;
    letter-spacing: -.3px;
    font-variant-numeric: tabular-nums;
    color: var(--ink);
}

.central .mo-b {
    display: block;
    width: 100%;
    height: 30px;
    margin-top: 7px;
}

.central .mo-b rect {
    fill: var(--gold);
    opacity: .8;
}

/* competência sem nota é chamada de atenção, não erro de sistema: o manual reserva o vermelho ao
   erro, e o laranja é justamente a cor de atenção */
.central .mo.gap {
    border-color: var(--warn);
}

.central .mo.gap .v {
    color: var(--warn);
}

.central .mo.gap .mo-b rect {
    fill: var(--warn-fill);
    opacity: 1;
}

.central .sparkline {
    display: block;
    width: 100%;
    height: 44px;
    margin-top: 14px;
}

.central .sparkline .area {
    fill: var(--gold);
    opacity: .12;
}

.central .sparkline .traco {
    fill: none;
    stroke: var(--gold);
    stroke-width: 1.6;
}

.central .sparkline .ponta {
    fill: var(--gold);
}

/* ── notas explicativas ───────────────────────────────────────────────────────────────────── */
.central .note,
.pacotes .note,
.notas .note {
    display: flex;
    gap: 11px;
    padding: 13px 15px;
    border: 1px solid var(--line);
    border-radius: var(--r-m);
    background: var(--surface-2);
    color: var(--ink-2);
    font-size: 12.5px;
    line-height: 1.55;
}

.central .note .ng,
.pacotes .note .ng,
.notas .note .ng {
    width: 19px;
    height: 19px;
    margin-top: 1px;
    color: var(--gold);
}

.central .note b,
.pacotes .note b,
.notas .note b {
    color: var(--ink);
}

.central .note-rodape {
    margin-top: 16px;
}

/* ── (e) selo de integridade ──────────────────────────────────────────────────────────────── */
.central .seal {
    display: flex;
    align-items: center;
    gap: 15px;
    padding: 16px 18px;
    border: 1px solid var(--ok);
    border-radius: var(--r-l);
    background: var(--ok-bg);
}

.central .seal.warn {
    border-color: var(--warn);
    background: var(--warn-bg);
}

.central .seal .ring {
    position: relative;
    display: grid;
    place-items: center;
    flex: none;
    width: 50px;
    height: 50px;
}

.central .seal .ring svg {
    position: absolute;
    inset: 0;
    transform: rotate(-90deg);
}

.central .seal .ring .trilho {
    fill: none;
    stroke: var(--line);
    stroke-width: 4;
}

.central .seal .ring .arco {
    fill: none;
    stroke: var(--ok);
    stroke-width: 4;
    stroke-linecap: round;
}

.central .seal.warn .ring .arco {
    stroke: var(--warn);
}

.central .seal .ring b {
    font-family: var(--mono);
    font-size: 13px;
    color: var(--ok);
}

.central .seal.warn .ring b {
    color: var(--warn);
}

.central .seal-texto {
    min-width: 0;
}

/* ── (f) régua de retenção ────────────────────────────────────────────────────────────────── */
.central .regua {
    margin-top: 4px;
}

.central .rg-b {
    display: flex;
    gap: 3px;
    align-items: flex-end;
    height: 38px;
}

.central .rg-y {
    flex: 1;
    border-radius: 3px 3px 0 0;
}

.central .rg-y.fora {
    background: var(--line);
    height: 40%;
}

.central .rg-y.dentro {
    background: var(--gold-soft);
    border: 1px solid var(--gold);
    height: 100%;
}

.central .rg-y.corrente {
    background: var(--gold);
    height: 100%;
}

.central .rg-y.sai {
    background: var(--line);
    border: 1px dashed var(--warn);
    height: 100%;
}

.central .rg-l {
    display: flex;
    gap: 3px;
    margin-top: 6px;
}

.central .rg-l span {
    flex: 1;
    text-align: center;
    font-family: var(--mono);
    font-size: 10px;
    color: var(--ink-3);
}

.central .rg-l span.on {
    color: var(--ink);
    font-weight: 600;
}

/* ── (g) barra de filtros e tabela ────────────────────────────────────────────────────────── */
.central .fbar {
    display: flex;
    gap: 9px;
    flex-wrap: wrap;
    align-items: flex-end;
    padding: 14px 17px;
    border-bottom: 1px solid var(--line);
    background: var(--surface-2);
}

.central .fl,
.pacotes .fl,
.notas .fl {
    display: flex;
    flex-direction: column;
    gap: 5px;
    flex: 1 1 128px;
    min-width: 0;
}

.central .fl-chave {
    flex: 1.6 1 190px;
}

.central .fl > span,
.pacotes .fl > span,
.notas .fl > span {
    font-size: 9.5px;
    font-weight: 600;
    letter-spacing: 1.5px;
    text-transform: uppercase;
    color: var(--ink-3);
}

.central .fl input,
.central .fl select,
.pacotes .fl input,
.pacotes .fl select,
.notas .fl input,
.notas .fl select {
    height: 36px;
    width: 100%;
    padding: 0 10px;
    border: 1px solid var(--line);
    border-radius: var(--r-s);
    background: var(--bg);
    color: var(--ink);
    font-size: 13px;
}

.central .fl input:focus,
.central .fl select:focus,
.pacotes .fl input:focus,
.pacotes .fl select:focus,
.notas .fl input:focus,
.notas .fl select:focus {
    outline: none;
    border-color: var(--gold);
    box-shadow: var(--focus);
}

.central .fl-acts,
.pacotes .fl-acts,
.notas .fl-acts {
    display: flex;
    align-items: flex-end;
    gap: 7px;
}

.central .tablewrap,
.pacotes .tablewrap,
.notas .tablewrap {
    overflow-x: auto;
}

.central table.tb,
.pacotes table.tb,
.notas table.tb {
    width: 100%;
    border-collapse: collapse;
    min-width: 940px;
}

.central table.tb th,
.pacotes table.tb th,
.notas table.tb th {
    padding: 11px 14px;
    text-align: left;
    white-space: nowrap;
    font-size: 10px;
    font-weight: 600;
    letter-spacing: 1.5px;
    text-transform: uppercase;
    color: var(--ink-3);
    background: var(--surface-2);
    border-bottom: 1px solid var(--line);
}

.central table.tb td,
.pacotes table.tb td,
.notas table.tb td {
    padding: 11px 14px;
    border-bottom: 1px solid var(--line-soft);
    font-size: 13px;
    vertical-align: middle;
}

.central table.tb tbody tr:last-child td,
.pacotes table.tb tbody tr:last-child td,
.notas table.tb tbody tr:last-child td {
    border-bottom: 0;
}

.central table.tb tbody tr:hover,
.pacotes table.tb tbody tr:hover,
.notas table.tb tbody tr:hover {
    background: var(--gold-soft);
}

.central .cell-val,
.notas .cell-val {
    font-family: var(--mono);
    font-variant-numeric: tabular-nums;
    text-align: right;
    white-space: nowrap;
}

.central .th-val,
.notas .th-val {
    text-align: right;
}

.central .cell-acts,
.pacotes .cell-acts,
.notas .cell-acts {
    white-space: nowrap;
    text-align: right;
}

.central .cell-acts .btn,
.pacotes .cell-acts .btn,
.notas .cell-acts .btn {
    margin-left: 5px;
    vertical-align: middle;
}

.central .tabela-vazia,
.pacotes .tabela-vazia {
    padding: 34px;
    text-align: center;
}

.central .resumo-do-filtro {
    display: flex;
    align-items: center;
    gap: 9px;
    flex-wrap: wrap;
    padding: 13px 18px 15px;
    border-top: 1px solid var(--line-soft);
}

/* ── etiquetas e pílulas da Central ───────────────────────────────────────────────────────── */
/* A bolinha existe só nas telas v3 (as pílulas do cadastro antigo são texto puro). O ESPAÇO até o
   texto não mora mais aqui: é o `gap` do `.pill` base, como no protótipo — manter os dois somava
   12px onde o desenho pede 6px. */
.central .pill::before,
.pacotes .pill::before,
.notas .pill::before,
.detalhe .pill::before {
    content: "";
    width: 5px;
    height: 5px;
    border-radius: 50%;
    background: currentColor;
}

.central .tag,
.notas .tag {
    white-space: nowrap;
    border: 1px solid var(--line-soft);
    background: var(--gold-soft);
    color: var(--gold);
    border-radius: var(--r-btn);
}

.central .tag.emit,
.notas .tag.emit {
    background: none;
    border-color: var(--line);
    color: var(--ink-2);
    letter-spacing: .2px;
}

/* ── responsivo ───────────────────────────────────────────────────────────────────────────── */
@media (max-width: 1200px) {
    .central .g-4 {
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }

    .central .g-32 {
        grid-template-columns: minmax(0, 1fr);
    }
}

@media (max-width: 900px) {
    .central .hero {
        grid-template-columns: 1fr;
    }

    .central .hero-r {
        border-left: 0;
        border-top: 1px solid var(--line);
    }
}

@media (max-width: 620px) {
    .central .g-4 {
        grid-template-columns: minmax(0, 1fr);
    }

    .central .hero-l {
        padding: 20px 18px 18px 20px;
    }

    .central .hero-r {
        padding: 20px 18px;
    }
}

/* O protótipo anima o que chama atenção; quem pede menos movimento não recebe nenhum. */
@media (prefers-reduced-motion: reduce) {
    .central .mo:hover {
        transform: none;
    }

    .central .dotlive {
        animation: none;
    }
}

/* ═══════════════════════ PACOTES E DOWNLOADS (/pacotes) ══════════════════════════════════ */
/* Escopado em .pacotes pelo mesmo motivo da Central fiscal (S09): as primitivas do shell v3
   (.h2, .num, .note, table.tb, .pill…) já valem aqui por herança dos seletores acima; o que
   segue é só o que a tela do S10 tem de próprio. */

/* O protótipo divide o topo em 2:3 — o card de envio é o estreito, o "O que vem dentro" é o
   largo (é ele que carrega a árvore em mono, que não pode quebrar linha). */
.pacotes .g-23 {
    grid-template-columns: minmax(0, 2fr) minmax(0, 3fr);
    margin-bottom: 16px;
}

.pacotes .aviso-pacotes {
    margin-bottom: 18px;
}

/* O botão laranja do page-head vive dentro de um <form> (a geração é POST, não link). */
.pacotes .page-head .acts form {
    margin: 0;
}

/* ── card "Envio automático" ──────────────────────────────────────────────────────────────── */
.pacotes .card-envio {
    display: flex;
    flex-direction: column;
    gap: 14px;
}

.pacotes .alternador {
    margin: 0;
}

.pacotes .opcoes-do-pacote {
    display: flex;
    flex-direction: column;
    gap: 14px;
    margin: 0;
}

/* As caixas do S08 (tela de acesso) nasceram com cor fixa; aqui elas passam a seguir os tokens,
   senão o azul institucional sumiria dentro do cartão no tema escuro. */
.pacotes .check {
    color: var(--ink-2);
    align-items: flex-start;
}

.pacotes .check .bx {
    border-color: var(--ink-4);
    background: var(--surface-3);
}

.pacotes .check input:checked + .bx {
    background: var(--gold);
    border-color: var(--gold);
}

.pacotes .check .bx svg {
    color: #fff;
}

.pacotes .acoes-do-card {
    display: flex;
    gap: 9px;
    flex-wrap: wrap;
    align-items: flex-start;
}

/* <details> é o que dá "expandir o formulário" sem uma linha de JavaScript — e, portanto, sem
   script embutido: a CSP do S06 (`script-src 'self'`) continua byte a byte a mesma. */
.pacotes details {
    min-width: 0;
}

.pacotes details > summary {
    list-style: none;
    cursor: pointer;
}

.pacotes details > summary::-webkit-details-marker {
    display: none;
}

.pacotes details[open] > summary {
    border-color: var(--gold);
}

.pacotes .formulario-inline {
    display: flex;
    gap: 9px;
    flex-wrap: wrap;
    align-items: flex-end;
    margin: 11px 0 0;
    padding: 13px 14px;
    border: 1px solid var(--line);
    border-radius: var(--r-m);
    background: var(--surface-2);
}

.pacotes .formulario-inline .fl {
    flex: 1 1 172px;
}

.pacotes .formulario-nota {
    flex: 1 1 100%;
    margin: 0;
}

/* ── lista de destinatários de envio ──────────────────────────────────────────────────────── */
.pacotes .destinatarios {
    display: flex;
    flex-direction: column;
    gap: 7px;
    margin: 0;
    padding: 0;
    list-style: none;
}

.pacotes .destinatario {
    display: flex;
    align-items: center;
    gap: 9px;
    flex-wrap: wrap;
    padding: 8px 11px;
    border: 1px solid var(--line-soft);
    border-radius: var(--r-s);
    background: var(--surface-2);
    font-size: 12.5px;
}

.pacotes .destinatario-email {
    flex: 1;
    min-width: 0;
    word-break: break-all;
    color: var(--ink);
}

.pacotes .destinatario form {
    margin: 0;
}

.pacotes .destinatario-vazio {
    padding: 8px 0 0;
}

/* ── card "O que vem dentro" ──────────────────────────────────────────────────────────────── */
.pacotes .cell-key {
    font-family: var(--mono);
    font-size: 12.5px;
    line-height: 2;
    color: var(--ink);
    overflow-x: auto;
    white-space: nowrap;
}

.pacotes .note-conteudo {
    margin-top: 14px;
}

/* Guarda contra o defeito que a auditoria pegou em 375px (arbitragem §7c): ".h2" herda
   "flex: 1" (base 0%), então qualquer vizinho no card-h ganhava a linha inteira e o título
   encolhia até quebrar letra a letra. Com base "auto" o título conta o próprio conteúdo na hora
   de repartir a linha, e o vizinho que não couber desce em vez de espremê-lo. Só no escopo
   .pacotes — a Central fiscal segue exatamente como o S09 a entregou. */
.pacotes .card-h {
    flex-wrap: wrap;
}

.pacotes .card-h .h2 {
    flex-basis: auto;
}

/* ── tabela "Pacotes gerados" ─────────────────────────────────────────────────────────────── */
/* Nota de rodapé do card: largura inteira, separada da tabela pelo mesmo filete do ".resumo-do
   -filtro" da Central. */
.pacotes .nota-de-expiracao {
    margin: 0;
    padding: 13px 18px 15px;
    border-top: 1px solid var(--line-soft);
}

.pacotes .cell-envio {
    max-width: 260px;
    word-break: break-word;
}

.pacotes .cell-acts form {
    display: inline-block;
    margin: 0 0 0 5px;
    vertical-align: middle;
}

/* ── responsivo ───────────────────────────────────────────────────────────────────────────── */
@media (max-width: 1200px) {
    .pacotes .g-23 {
        grid-template-columns: minmax(0, 1fr);
    }
}

/* ═══════════════════════ CONSULTA COMPLETA (/notas) ══════════════════════════════════════ */
/* Escopado em .notas pelo mesmo motivo da Central fiscal (S09) e de Pacotes (S10): as primitivas
   do shell v3 (.fl, .tablewrap, table.tb, .tag, .pill, .num…) já valem aqui pelos seletores
   compartilhados acima; o que segue é só o que a tela do S11 tem de próprio. */

/* ── barra de filtros em grade ─────────────────────────────────────────────────────────────── */
/* A Central usa flex (poucos campos, larguras desiguais); aqui são nove, e a grade "auto-fit"
   do protótipo é o que faz a barra reflurir sozinha de 6 para 3 e para 1 coluna. */
.notas .filters {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(155px, 1fr));
    align-items: end;
    gap: 11px;
    padding: 16px 18px;
    margin-bottom: 14px;
    border: 1px solid var(--line);
    border-radius: var(--r-l);
    background: var(--surface);
}

.notas .fl {
    flex: none;
}

/* O campo "Cliente" do perfil interno ocupa duas colunas (é ele que carrega o placeholder longo
   com o exemplo de CNPJ e de nome). Com isso a barra fecha exatamente como no protótipo: seis
   campos na primeira linha nos dois perfis, e o resto na segunda. */
.notas .fl-cliente {
    grid-column: span 2;
}

.notas .fl-acts {
    align-self: end;
}

.notas .chips {
    margin-bottom: 14px;
}

.notas .chips-espaco {
    flex: 1;
}

/* ── seletor mini "único | faixa" ──────────────────────────────────────────────────────────── */
.notas .mini {
    display: inline-flex;
    gap: 2px;
    margin-left: 7px;
    vertical-align: middle;
}

.notas .mini-b {
    display: inline-flex;
    align-items: center;
    height: 17px;
    padding: 0 6px;
    border: 1px solid var(--line);
    border-radius: 3px;
    background: var(--surface);
    color: var(--ink-3);
    font-size: 9.5px;
    font-weight: 600;
    letter-spacing: .4px;
    text-transform: lowercase;
    text-decoration: none;
    cursor: pointer;
    transition: .14s;
}

.notas .mini-b:hover {
    border-color: var(--gold);
    color: var(--gold);
    text-decoration: none;
}

.notas .mini-b.on {
    background: var(--gold);
    border-color: var(--gold);
    color: #fff;
}

/* ── campo "Cliente" do perfil interno + autocomplete ──────────────────────────────────────── */
.notas .fl.escopo {
    position: relative;
}

.notas .fl.escopo > span {
    display: flex;
    align-items: center;
    gap: 5px;
    color: var(--cta);
}

.notas .fl.escopo > span::after {
    content: "perfil interno";
    padding: 1px 5px;
    border-radius: 3px;
    background: var(--cta-soft);
    color: var(--cta);
    font-size: 8.5px;
    font-weight: 600;
    letter-spacing: .7px;
    text-transform: uppercase;
}

.notas .fl.escopo input {
    border-color: var(--cta);
}

.notas .ac {
    position: absolute;
    left: 0;
    right: 0;
    top: 100%;
    z-index: 30;
    display: none;
    max-height: 236px;
    margin-top: 4px;
    overflow: auto;
    border: 1px solid var(--line);
    border-radius: var(--r-s);
    background: var(--surface);
    box-shadow: var(--shadow);
}

.notas .ac.on {
    display: block;
}

.notas .ac button {
    display: block;
    width: 100%;
    padding: 9px 12px;
    border: 0;
    border-bottom: 1px solid var(--line-soft);
    background: none;
    color: var(--ink);
    font-family: inherit;
    font-size: 12.5px;
    text-align: left;
    cursor: pointer;
}

.notas .ac button:last-child {
    border-bottom: 0;
}

.notas .ac button:hover,
.notas .ac button.act {
    background: var(--surface-3);
}

.notas .ac button.ac-vazio {
    cursor: default;
}

.notas .ac b {
    display: block;
    font-weight: 600;
}

.notas .ac i {
    display: block;
    font-family: var(--mono);
    font-size: 11px;
    font-style: normal;
    color: var(--ink-3);
}

.notas .ac em {
    padding: 0 1px;
    border-radius: 2px;
    background: var(--cta-soft);
    color: var(--cta);
    font-style: normal;
}

/* ── nota de escopo do perfil interno e aviso de desfecho ──────────────────────────────────── */
.notas .nota-escopo,
.notas .note-aviso {
    margin-bottom: 12px;
}

.notas .note-aviso {
    border-color: var(--warn);
    background: var(--warn-bg);
    color: var(--ink);
}

.notas .nota-escopo .ng {
    color: var(--cta);
}

/* ── linha de totais + "Por página" ────────────────────────────────────────────────────────── */
.notas .totais-linha {
    display: flex;
    align-items: center;
    gap: 14px;
    flex-wrap: wrap;
    margin-bottom: 12px;
}

.notas .totais-espaco {
    flex: 1;
}

.notas .total-valor {
    color: var(--ok);
}

.notas .total-canceladas {
    color: var(--crit);
}

.notas .por-pagina {
    display: flex;
    align-items: center;
    gap: 7px;
}

.notas .por-pagina select {
    height: 30px;
    padding: 0 6px;
    border: 1px solid var(--line);
    border-radius: var(--r-btn);
    background: var(--surface);
    color: var(--ink);
    font-size: 12px;
}

/* ── tabela ────────────────────────────────────────────────────────────────────────────────── */
/* A tabela é um CARD (protótipo v3, `.tablewrap`): papel branco, borda e canto arredondado.
   Na Central fiscal e em Pacotes o wrap vive DENTRO de um `.card`, que já entrega os três — e é
   por isso que a regra compartilhada lá em cima traz só o `overflow-x`. Em /notas a tabela é a
   peça principal da tela e não tem card em volta: sem esta regra as linhas assentavam direto no
   cinza da página e a listagem inteira lia como um bloco só (achado do Caio, 27/08).

   Escopado em .notas de propósito: dar o mesmo tratamento ao wrap das outras duas telas
   desenharia uma borda dentro da borda do card delas. */
.notas .tablewrap {
    border: 1px solid var(--line);
    border-radius: var(--r-l);
    background: var(--surface);
}

/* O <a> ocupa o th inteiro para a área de clique do cabeçalho ser a célula, não só o texto. */
.notas table.tb th.sortable {
    padding: 0;
}

.notas table.tb th .ordenacao {
    display: block;
    padding: 11px 14px;
    color: inherit;
    text-decoration: none;
    white-space: nowrap;
}

.notas table.tb th.sortable:hover {
    color: var(--gold);
}

.notas table.tb th .ar {
    margin-left: 5px;
    opacity: 0;
}

.notas table.tb th.asc .ar,
.notas table.tb th.desc .ar {
    opacity: 1;
    color: var(--gold);
}

.notas table.tb th.desc .ar {
    display: inline-block;
    transform: rotate(180deg);
}

.notas table.tb th.th-sel,
.notas table.tb td.cell-sel {
    width: 34px;
    padding-right: 0;
}

.notas table.tb th.th-acts {
    text-align: right;
}

.notas table.tb tbody tr.sel {
    background: color-mix(in srgb, var(--gold) 14%, transparent);
}

/* A coluna da chave é a menor da linha (11,5px no protótipo) — é o que a deixa discreta ao lado
   do valor. O seletor precisa incluir `table.tb td` porque a regra da célula genérica
   (`.notas table.tb td{font-size:13px}`) tem MAIS especificidade que `.notas .cell-key`: escrita
   sem isso, a chave vinha com 13px e a linha inteira parecia de outra régua tipográfica
   (divergência medida na conferência do S12 contra notas-cliente-claro.png). */
.notas table.tb td.cell-key {
    font-family: var(--mono);
    font-size: 11.5px;
    letter-spacing: -.3px;
    color: var(--ink-3);
    white-space: nowrap;
}

.notas input[type="checkbox"] {
    width: 15px;
    height: 15px;
    accent-color: var(--gold);
    cursor: pointer;
}

/* ── estado vazio ──────────────────────────────────────────────────────────────────────────── */
.notas .empty {
    padding: 56px 24px;
    text-align: center;
    color: var(--ink-3);
}

.notas .empty svg {
    display: block;
    width: 34px;
    height: 34px;
    margin: 0 auto 12px;
    color: var(--ink-4);
}

.notas .empty .h2 {
    margin-bottom: 6px;
}

.notas .empty p {
    margin-bottom: 14px;
}

/* ── paginação v3 ──────────────────────────────────────────────────────────────────────────── */
.notas .paginacao-v3 {
    display: flex;
    align-items: center;
    gap: 10px;
    flex-wrap: wrap;
    margin-top: 14px;
}

/* ── barra de seleção (o "carrinho fiscal" do protótipo) ───────────────────────────────────── */
.notas .selbar {
    position: sticky;
    bottom: 18px;
    z-index: 50;
    display: flex;
    align-items: center;
    gap: 14px;
    margin-top: 16px;
    padding: 12px 16px;
    border: 1px solid var(--gold);
    border-radius: var(--r-l);
    background: var(--surface);
    box-shadow: var(--shadow);
    transform: translateY(130%);
    opacity: 0;
    pointer-events: none;
    transition: .3s cubic-bezier(.2, .8, .2, 1);
}

.notas .selbar.on {
    transform: none;
    opacity: 1;
    pointer-events: auto;
}

.notas .selbar .n {
    font-family: var(--mono);
    font-size: 20px;
    font-weight: 600;
    color: var(--cta);
}

.notas .selbar-texto {
    min-width: 0;
}

.notas .selbar-espaco {
    flex: 1;
}

/* ── responsivo ────────────────────────────────────────────────────────────────────────────── */
/* "Filtros avançados" só existe no celular — no desktop a barra já está inteira na tela. */
.only-mob {
    display: none;
}

@media (max-width: 980px) {
    .notas .fl-cliente {
        grid-column: span 1;
    }
}

@media (max-width: 620px) {
    .only-mob {
        display: inline-flex;
    }

    /* No celular a barra de filtros nasce recolhida: quem precisa dela abre pelo chip
       "Filtros avançados" (.only-mob). */
    .notas .filters {
        display: none;
    }

    .notas .filters.open {
        display: grid;
        grid-template-columns: minmax(0, 1fr);
    }

    .notas .selbar {
        flex-wrap: wrap;
        bottom: 10px;
    }

    .notas .page-head .acts {
        width: 100%;
    }
}

/* ── trilha de consultas internas na auditoria (S11) ───────────────────────────────────────── */
/* Mesma tabela do restante da administração; só a coluna do detalhe pede tratamento próprio,
   porque é uma frase (e não um dado curto) e não pode empurrar as outras colunas. */
/* A trilha vem depois da paginação dos downloads: precisa de ar para ler como outra seção. */
.titulo-secao-auditoria {
    margin-top: 26px;
}

.tabela-consultas-internas {
    margin-bottom: 4px;
}

.tabela-consultas-internas .celula-detalhe {
    max-width: 460px;
    font-size: 12.5px;
    color: var(--ink-2);
}

/* ═══════════════════════ GAVETA DE DETALHE DA NOTA (/notas/{chave}/detalhe) ═══════════════ */
/* S12. O MESMO bloco `.detalhe` é servido em dois lugares — dentro da gaveta que desliza da
   direita e dentro da página standalone —, então o escopo aqui é `.detalhe`, e não a tela: é o
   que garante que os dois destinos fiquem idênticos sem duplicar uma linha de CSS.

   As primitivas do shell v3 (.btn, .pill, .eyebrow, .icon-btn) já são globais; as que nasceram
   escopadas em .central/.pacotes/.notas ganham aqui o mesmo tratamento para o detalhe. */

.detalhe .h3 {
    font-size: 13px;
    font-weight: 600;
}

.detalhe .num {
    font-family: var(--mono);
    font-variant-numeric: tabular-nums;
    letter-spacing: -.2px;
}

.detalhe .small {
    font-size: 12px;
}

.detalhe .tiny {
    font-size: 11px;
}

.detalhe .muted {
    color: var(--ink-3);
}

.detalhe .note {
    display: flex;
    align-items: flex-start;
    gap: 11px;
    padding: 12px 14px;
    border: 1px solid var(--line);
    border-radius: var(--r-m);
    background: var(--surface-2);
    font-size: 12.5px;
    line-height: 1.55;
    color: var(--ink-2);
}

.detalhe .note .ng {
    width: 18px;
    height: 18px;
    flex: none;
    margin-top: 1px;
}

.detalhe .note b {
    color: var(--ink);
}

/* A bolinha da pílula da gaveta é desenhada com as das outras telas v3 (regra única, acima). */

/* ── o painel ──────────────────────────────────────────────────────────────────────────── */
/* Acima do scrim do trilho (z-index 110): a gaveta é a camada mais alta da tela logada. */
.scrim-gaveta {
    z-index: 200;
}

.drawer {
    position: fixed;
    top: 0;
    right: 0;
    bottom: 0;
    z-index: 210;
    display: flex;
    flex-direction: column;
    width: min(560px, 100vw);
    background: var(--bg);
    border-left: 1px solid var(--line);
    box-shadow: var(--shadow);
    transform: translateX(100%);
    transition: transform .38s cubic-bezier(.2, .8, .2, 1);
}

/* `display:flex` acima venceria o `hidden`, que é só uma regra do agente de usuário. */
.drawer[hidden] {
    display: none;
}

.drawer.on {
    transform: none;
}

/* Enquanto a gaveta está aberta a página de trás não rola — o que rola é o corpo da gaveta. */
body.com-gaveta {
    overflow: hidden;
}

.drawer .detalhe {
    display: flex;
    flex-direction: column;
    flex: 1;
    min-height: 0;
}

.drawer.carregando::after {
    content: "Carregando o detalhe…";
    position: absolute;
    inset: 0;
    display: grid;
    place-items: center;
    background: var(--bg);
    color: var(--ink-3);
    font-size: 12.5px;
}

/* ── cabeçalho, corpo e rodapé do bloco ────────────────────────────────────────────────── */
.detalhe .dr-h {
    display: flex;
    align-items: flex-start;
    gap: 14px;
    padding: 20px 22px;
    border-bottom: 1px solid var(--line);
}

.detalhe .dr-h-t {
    flex: 1;
    min-width: 0;
}

.detalhe .detalhe-titulo {
    margin: 7px 0 0;
    font-size: 24px;
    font-weight: 700;
    letter-spacing: -.5px;
    color: var(--ink);
}

.detalhe .detalhe-titulo .muted {
    font-weight: 400;
}

.detalhe .pills {
    display: flex;
    gap: 8px;
    flex-wrap: wrap;
    margin-top: 8px;
}

.detalhe .dr-b {
    flex: 1;
    min-height: 0;
    overflow-y: auto;
    padding: 20px 22px 40px;
}

.detalhe .dr-f {
    display: flex;
    gap: 9px;
    padding: 14px 22px;
    border-top: 1px solid var(--line);
    background: var(--surface);
}

.detalhe .dr-f .btn {
    flex: 1;
    justify-content: center;
}

.detalhe .bloco-titulo {
    margin: 0 0 9px;
}

.detalhe .bloco-espacado {
    margin-top: 22px;
}

.detalhe .note + .bloco-titulo,
.detalhe .note + .note {
    margin-top: 16px;
}

.detalhe .note-cancelada {
    border-color: var(--warn);
    background: var(--warn-bg);
}

.detalhe .note-cancelada .ng {
    color: var(--warn);
}

.detalhe .note-arquivo {
    border-color: var(--line);
    background: var(--surface-3);
}

/* ── chave de acesso ───────────────────────────────────────────────────────────────────── */
.detalhe .chave-caixa {
    padding: 11px 13px;
    border: 1px solid var(--line);
    border-radius: var(--r-s);
    background: var(--surface);
    font-family: var(--mono);
    font-size: 12.5px;
    color: var(--ink);
    word-break: break-all;
}

.detalhe .botao-copiar {
    margin-top: 8px;
}

/* ── lista de dados ────────────────────────────────────────────────────────────────────── */
.detalhe .dl {
    display: grid;
    grid-template-columns: 126px 1fr;
    gap: 9px 14px;
    margin: 0;
    font-size: 13px;
}

.detalhe .dl dt {
    color: var(--ink-3);
    font-size: 12px;
    font-weight: 400;
}

.detalhe .dl dd {
    margin: 0;
    color: var(--ink);
    word-break: break-word;
}

.detalhe .dl .valor-forte {
    font-size: 16px;
    font-weight: 600;
}

.detalhe .pill-leiaute {
    margin-left: 6px;
}

/* ── linha do tempo ────────────────────────────────────────────────────────────────────── */
.detalhe .tl {
    position: relative;
    margin-top: 6px;
    padding-left: 22px;
}

.detalhe .tl::before {
    content: "";
    position: absolute;
    left: 5px;
    top: 6px;
    bottom: 6px;
    width: 1px;
    background: var(--line);
}

.detalhe .tl-i {
    position: relative;
    padding-bottom: 16px;
}

.detalhe .tl-i::before {
    content: "";
    position: absolute;
    left: -21px;
    top: 5px;
    width: 11px;
    height: 11px;
    border-radius: 50%;
    border: 2px solid var(--bg);
    background: var(--gold);
}

.detalhe .tl-i.ok::before {
    background: var(--ok);
}

.detalhe .tl-i.crit::before {
    background: var(--crit);
}

.detalhe .tl-i:last-child {
    padding-bottom: 0;
}

.detalhe .tl-t {
    font-size: 13px;
    font-weight: 600;
}

.detalhe .tl-m {
    font-family: var(--mono);
    font-size: 11.5px;
    color: var(--ink-3);
}

/* ── prévia do DANFE ───────────────────────────────────────────────────────────────────── */
/* O papel é BRANCO nos dois temas: documento fiscal não segue tema de tela (mesma decisão do
   S08). Por isso as cores deste bloco são literais, e não tokens. */
.detalhe .danfe {
    position: relative;
    overflow: hidden;
    padding: 0;
    border: 1px solid #c9c2b6;
    border-radius: 6px;
    background: #fff;
    color: #12211f;
    font-family: var(--mono);
    font-size: 8.6px;
    line-height: 1.4;
}

.detalhe .dfx {
    padding: 9px 10px;
}

.detalhe .dfx + .dfx {
    border-top: 1px solid #c9c2b6;
}

.detalhe .dfx-limpo {
    padding: 0;
}

.detalhe .dfx-produto {
    padding-bottom: 9px;
    overflow-x: auto;
}

.detalhe .dfh {
    display: flex;
    gap: 12px;
    align-items: flex-start;
}

.detalhe .dfh .mk {
    width: 74px;
    flex: none;
    margin-top: 2px;
    color: #004571;
}

.detalhe .dfmid {
    flex: 1;
    padding: 0 10px;
    text-align: center;
    border-left: 1px solid #c9c2b6;
    border-right: 1px solid #c9c2b6;
}

.detalhe .dft {
    font-family: var(--font);
    font-size: 14px;
    font-weight: 700;
    letter-spacing: 1.2px;
    line-height: 1.1;
}

.detalhe .dfsub {
    margin-top: 2px;
    font-size: 7.6px;
    line-height: 1.35;
}

.detalhe .dfns {
    margin-top: 5px;
    font-family: var(--mono);
    font-size: 9.6px;
    font-weight: 600;
}

.detalhe .dfes {
    display: flex;
    justify-content: center;
    gap: 9px;
    margin-top: 4px;
    font-size: 7.6px;
}

.detalhe .dfes b {
    display: inline-grid;
    place-items: center;
    width: 11px;
    height: 11px;
    margin-right: 3px;
    border: 1px solid #12211f;
    font-size: 8px;
    line-height: 1;
    vertical-align: -2px;
}

.detalhe .dfr {
    flex: 1.15;
    min-width: 0;
}

.detalhe .dflb {
    font-family: var(--font);
    font-size: 6.6px;
    font-weight: 600;
    letter-spacing: .7px;
    text-transform: uppercase;
    color: #5d6b6a;
}

.detalhe .dflb-espacado {
    margin-top: 5px;
}

.detalhe .dflb-bloco {
    margin-bottom: 4px;
}

.detalhe .dfvl {
    margin-top: 1px;
    font-size: 9px;
    word-break: break-word;
}

.detalhe .dfvl-mini {
    font-size: 8px;
}

.detalhe .dfr .dfvl-mini {
    font-size: 7.6px;
}

.detalhe .dfvl-forte {
    font-size: 9.6px;
    font-weight: 600;
}

.detalhe .dfvl-crit {
    color: #d3222a;
    font-weight: 600;
}

.detalhe .dfvl-total {
    font-size: 10px;
    font-weight: 700;
}

.detalhe .dfg {
    display: grid;
    gap: 0;
    overflow: hidden;
    border: 1px solid #c9c2b6;
    border-radius: 3px;
}

.detalhe .dfg > div {
    min-width: 0;
    padding: 4px 6px;
    border-right: 1px solid #c9c2b6;
    border-bottom: 1px solid #c9c2b6;
}

.detalhe .dfg > div:last-child {
    border-right: 0;
}

.detalhe .dfg-cheio {
    border: 0;
    border-radius: 0;
}

.detalhe .dfg-espacado {
    margin-top: 5px;
}

.detalhe .dfg-total {
    background: #f2efe9;
}

.detalhe .dfc6 {
    grid-template-columns: repeat(6, 1fr);
}

.detalhe .dfc4 {
    grid-template-columns: repeat(4, 1fr);
}

.detalhe .dfc3 {
    grid-template-columns: 1.6fr 1fr 1fr;
}

.detalhe .dfc3i {
    grid-template-columns: repeat(3, 1fr);
}

.detalhe .danfe table {
    width: 100%;
    margin: 0;
    border-collapse: collapse;
}

.detalhe .danfe th,
.detalhe .danfe td {
    padding: 3px 5px;
    border: 1px solid #d8d2c7;
    font-size: 8.4px;
    text-align: left;
    color: #12211f;
}

.detalhe .danfe th {
    background: #f2efe9;
    font-family: var(--font);
    font-size: 6.8px;
    font-weight: 600;
    letter-spacing: .5px;
    text-transform: uppercase;
    color: #5d6b6a;
}

.detalhe .danfe td.r,
.detalhe .danfe th.r {
    text-align: right;
}

.detalhe .barcode {
    height: 30px;
    background: repeating-linear-gradient(90deg, #12211f 0 1px, transparent 1px 3px, #12211f 3px 5px, transparent 5px 6px, #12211f 6px 8px, transparent 8px 11px);
}

.detalhe .dfkey {
    margin-top: 3px;
    padding: 3px 5px;
    border: 1px solid #c9c2b6;
    background: #faf8f4;
    font-size: 8.4px;
    letter-spacing: .4px;
    text-align: center;
}

/* Marca d'água de cancelamento: o cliente precisa enxergar que a nota não vale. */
.detalhe .danfe.canc::after {
    content: "NOTA CANCELADA";
    position: absolute;
    inset: 0;
    display: grid;
    place-items: center;
    font-family: var(--font);
    font-size: 34px;
    font-weight: 700;
    letter-spacing: 5px;
    color: rgba(211, 34, 42, .16);
    transform: rotate(-19deg);
    white-space: nowrap;
    pointer-events: none;
}

.detalhe .nota-leiaute {
    margin: 9px 0 0;
    line-height: 1.6;
}

/* ── página standalone (a MESMA URL, sem JavaScript) ───────────────────────────────────── */
.detalhe-pagina .detalhe {
    max-width: 640px;
    overflow: hidden;
    border: 1px solid var(--line);
    border-radius: var(--r-l);
    background: var(--surface);
}

.detalhe-pagina .dr-b {
    padding-bottom: 24px;
}

/* ── avisos curtos ("Chave de acesso copiada.") ────────────────────────────────────────── */
/* NÃO se chamam ".toast": o Bootstrap tem uma classe com esse nome e ela esconde o elemento
   (`.toast:not(.show){display:none}`) — o aviso nascia invisível. Nome próprio, em pt-BR, como
   o resto do portal. */
.avisos-curtos {
    position: fixed;
    left: 50%;
    bottom: 24px;
    z-index: 400;
    display: flex;
    flex-direction: column;
    gap: 8px;
    align-items: center;
    transform: translateX(-50%);
    pointer-events: none;
}

.aviso-curto {
    max-width: min(420px, 92vw);
    padding: 10px 16px;
    border-radius: var(--r-s);
    background: var(--bg-deep);
    box-shadow: var(--shadow);
    color: #fff;
    font-size: 12.5px;
    line-height: 1.45;
    transition: opacity .3s, transform .3s;
}

.aviso-curto.crit {
    background: var(--crit);
}

.aviso-curto.saindo {
    opacity: 0;
    transform: translateY(8px);
}

/* ── a linha da consulta vira destino (S12) ────────────────────────────────────────────── */
.notas .cell-numero .link-detalhe {
    color: inherit;
    text-decoration: none;
}

.notas .cell-numero .link-detalhe:hover {
    color: var(--gold);
    text-decoration: underline;
}

/* O cursor só promete o clique da linha quando o JavaScript o entregou de fato: a classe é
   posta por ~/js/detalhe.js. */
.notas table.tb.linhas-clicaveis tbody tr {
    cursor: pointer;
}

.notas table.tb.linhas-clicaveis tbody tr:hover {
    background: var(--gold-soft);
}

/* ── acabamento herdado do S11: o select não pode comer a última letra ─────────────────── */
/* O <select> NATIVO reserva um pedaço da própria caixa para a seta, por dentro, e o texto é
   cortado ali — sem aviso e sem reticência: era assim que "Todos os 2 destinatários" perdia o
   "s" final. Aumentar o padding não resolvia (a reserva do navegador continua depois dele).

   A saída é assumir a seta: `appearance: none` devolve a caixa inteira ao texto, e o cursor é
   desenhado com dois gradientes — sem imagem, sem data-URI e, principalmente, na cor do TEMA
   (var(--ink-3)), que uma seta em arquivo não conseguiria acompanhar. Vale para os selects das
   três telas v3, que passam a ter exatamente o mesmo cursor.

   A RESERVA da seta é 24px, não 28px: a errata de terminologia (27/08) trocou o rótulo da opção
   vazia por "Todas as {N} unidades", que na coluna de 156,6px da grade pedia 117,7px de texto
   contra os 116,6px que sobravam — faltava UM pixel, e a reticência voltava. Com 24px sobram
   120,6px (folga de ~3px) e ainda restam 4px entre o texto e o cursor, que continua desenhado no
   mesmo lugar. Mexer na grade não era opção: `minmax(155px,1fr)` é a do protótipo, e alargar a
   coluna empurraria o oitavo campo para uma segunda linha. O `text-overflow: ellipsis` fica como
   rede — se um dia N tiver dois dígitos, o texto degrada com "…" em vez do corte seco da letra,
   que era o bug original do S11. */
.central .fl select,
.pacotes .fl select,
.notas .fl select {
    appearance: none;
    -webkit-appearance: none;
    padding-right: 24px;
    text-overflow: ellipsis;
    background-image:
        linear-gradient(45deg, transparent 50%, var(--ink-3) 50%),
        linear-gradient(135deg, var(--ink-3) 50%, transparent 50%);
    background-position: right 15px center, right 10px center;
    background-size: 5px 5px;
    background-repeat: no-repeat;
}

.central .fl select:hover,
.pacotes .fl select:hover,
.notas .fl select:hover {
    background-image:
        linear-gradient(45deg, transparent 50%, var(--gold) 50%),
        linear-gradient(135deg, var(--gold) 50%, transparent 50%);
}

/* ── responsivo: no celular a gaveta é a tela inteira ──────────────────────────────────── */
@media (max-width: 620px) {
    .drawer {
        width: 100vw;
        border-left: 0;
    }

    .detalhe .dr-h,
    .detalhe .dr-b,
    .detalhe .dr-f {
        padding-left: 16px;
        padding-right: 16px;
    }

    .detalhe .dl {
        grid-template-columns: minmax(0, 1fr);
        gap: 2px 0;
    }

    .detalhe .dl dd + dt {
        margin-top: 9px;
    }

    .detalhe .dfh {
        flex-wrap: wrap;
    }

    .detalhe .dfmid {
        border-left: 0;
        border-right: 0;
        padding: 0;
    }

    .detalhe .dfc6,
    .detalhe .dfc4 {
        grid-template-columns: repeat(2, 1fr);
    }

    .detalhe .dfc3,
    .detalhe .dfc3i {
        grid-template-columns: minmax(0, 1fr);
    }
}
