/* =============================================================================
   PUMANGOL — TOKENS DE DESENHO
   Fonte única de cor, espaçamento, raio, sombra e tipografia dos módulos.

   Porquê este ficheiro
   --------------------
   O MGF e o MGS tinham 119 cores distintas entre as duas folhas de estilo,
   mais 7 903 linhas de CSS embutido em 29 ecrãs — quatro dos quais
   redefiniam :root com os mesmos nomes de variável e valores diferentes,
   alterando os tokens de todas as outras páginas enquanto estavam carregados.
   Coexistiam quatro sistemas de cor: a paleta Pumangol, o teal #0E676F de um
   esquema antigo, uma escala Tailwind e um esquema azul-escuro próprio.

   Regra
   -----
   Nenhum valor de cor é escrito fora deste ficheiro. Os ficheiros de módulo
   (mgf-module.css, mgs-module.css) consomem estes tokens e não redefinem
   nenhum. Os ecrãs não declaram :root.

   Contraste
   ---------
   Todos os pares fundo/texto abaixo foram verificados contra WCAG 2.1 AA
   (4.5:1 para texto normal). O rácio medido está anotado em cada par.

   Ordem de carregamento: pumangol-cores.css antes de qualquer folha de módulo.
   ============================================================================= */

:root {

    /* -------------------------------------------------------------------------
       1. MARCA
       ------------------------------------------------------------------------- */

    --pum-verde:            #017649;   /* verde institucional Pumangol */
    --pum-verde-escuro:     #01502F;   /* estados hover e activo */
    --pum-verde-claro:      #E8F3EE;   /* fundos de realce */
    --pum-verde-borda:      #C4E0D4;
    --pum-vermelho:         #DE1827;   /* EXCLUSIVAMENTE destrutivo ou crítico */
    --pum-vermelho-escuro:  #B01220;
    --pum-vermelho-claro:   #FDECEE;
    --pum-vermelho-borda:   #F6C9CE;

    /* verde sobre branco ...... 5.69:1  AA
       verde-escuro sobre claro  8.44:1  AA
       verde sobre verde-claro   5.01:1  AA
       vermelho sobre branco ... 4.92:1  AA */

    /* -------------------------------------------------------------------------
       2. NEUTROS

       A escala é ligeiramente esverdeada, para assentar sobre o verde da marca
       sem cinzento frio a competir com ele.
       ------------------------------------------------------------------------- */

    --pum-tela:             #F5F7F6;   /* fundo da página */
    --pum-superficie:       #FFFFFF;   /* cartões, tabelas, diálogos */
    --pum-superficie-alt:   #FAFBFA;   /* cabeçalho de tabela, linha alternada */
    --pum-borda:            #E2E8E5;
    --pum-borda-clara:      #F0F3F2;

    --pum-texto:            #12211B;   /* títulos e valores .... 15.50:1  AA */
    --pum-texto-corpo:      #4A5A53;   /* texto corrente .........7.30:1  AA */
    --pum-texto-apoio:      #67736E;   /* rótulos e legendas .... 4.94:1  AA */

    /* Nota: --pum-texto-apoio era #8A9A93, que dava 2.95:1 sobre branco e
       falhava AA mesmo para texto grande. Foi escurecido para o valor mais
       claro da mesma família que passa 4.5:1 sobre branco e sobre a tela. */

    /* -------------------------------------------------------------------------
       3. CRITICIDADE

       Cinco níveis, cada um com par fundo/texto/borda garantindo AA.
       O vermelho é reservado ao nível crítico; nada mais o usa.
       ------------------------------------------------------------------------- */

    /* Crítico — exige acção imediata */
    --pum-critico:          #B01220;
    --pum-critico-fundo:    #FDECEE;
    --pum-critico-borda:    #F6C9CE;   /* 6.23:1  AA */

    /* Alto — desvio relevante, ainda recuperável */
    --pum-alto:             #A34A2E;
    --pum-alto-fundo:       #FDEFEA;
    --pum-alto-borda:       #F2D3C7;

    /* Médio — atenção, sem urgência */
    --pum-medio:            #A36100;
    --pum-medio-fundo:      #FFF6E5;
    --pum-medio-borda:      #F0DCB4;   /* 4.59:1  AA */

    /* Baixo — informativo */
    --pum-baixo:            #1F5C7A;
    --pum-baixo-fundo:      #EAF2F6;
    --pum-baixo-borda:      #C3DAE5;   /* 6.46:1  AA */

    /* Nulo — conforme, nada a assinalar */
    --pum-nulo:             #01502F;
    --pum-nulo-fundo:       #E8F3EE;
    --pum-nulo-borda:       #C4E0D4;   /* 8.44:1  AA */

    /* -------------------------------------------------------------------------
       4. SEMÂNTICA DE ESTADO

       Nomes pelo que significam, não pela cor. Um estado que passe de verde a
       âmbar muda aqui, e não nos 67 ecrãs.
       ------------------------------------------------------------------------- */

    --pum-ok:               var(--pum-verde);
    --pum-ok-fundo:         var(--pum-verde-claro);
    --pum-ok-borda:         var(--pum-verde-borda);

    --pum-espera:           var(--pum-medio);
    --pum-espera-fundo:     var(--pum-medio-fundo);
    --pum-espera-borda:     var(--pum-medio-borda);

    --pum-recusa:           var(--pum-critico);
    --pum-recusa-fundo:     var(--pum-critico-fundo);
    --pum-recusa-borda:     var(--pum-critico-borda);

    --pum-info:             var(--pum-baixo);
    --pum-info-fundo:       var(--pum-baixo-fundo);
    --pum-info-borda:       var(--pum-baixo-borda);

    /* Em curso / ocupado — distinto de «espera» e de «ok» */
    --pum-curso:            #B23A48;
    --pum-curso-fundo:      #FCEFF0;
    --pum-curso-borda:      #F0CDD1;   /* 5.22:1  AA */

    /* Inerte — expirado, arquivado, sem efeito */
    --pum-inerte:           #627077;
    --pum-inerte-fundo:     #F1F4F3;
    --pum-inerte-borda:     var(--pum-borda);   /* 4.62:1  AA */

    /* Acento secundário — usado em classificações e gráficos, nunca em estado */
    --pum-acento:           #4A3D9E;
    --pum-acento-fundo:     #F1EFFA;
    --pum-acento-borda:     #D8D2F0;   /* 7.53:1  AA */

    /* -------------------------------------------------------------------------
       5. ESPAÇAMENTO

       Escala de 4px. Usar sempre o token, nunca o valor.
       ------------------------------------------------------------------------- */

    --pum-esp-1:            4px;
    --pum-esp-2:            8px;
    --pum-esp-3:            12px;
    --pum-esp-4:            16px;
    --pum-esp-5:            24px;
    --pum-esp-6:            32px;
    --pum-esp-7:            48px;

    /* Folga entre o menu e o conteúdo, e entre o conteúdo e a borda
       direita. Em ecrã estreito volta ao valor anterior, para a página
       não perder largura útil. */
    --pum-margem-pagina:    40px;

    /* -------------------------------------------------------------------------
       6. RAIO E SOMBRA

       O portal usa cantos discretos e não usa sombra em superfícies planas —
       a separação é feita por borda. A sombra fica reservada ao que flutua.
       ------------------------------------------------------------------------- */

    --pum-raio-sm:          3px;
    --pum-raio:             4px;
    --pum-raio-lg:          6px;
    --pum-raio-pill:        999px;

    --pum-sombra:           none;
    --pum-sombra-md:        none;
    --pum-sombra-flutuante: 0 16px 48px rgba(18, 33, 27, .18);

    /* -------------------------------------------------------------------------
       7. TIPOGRAFIA
       ------------------------------------------------------------------------- */

    --pum-fonte:            "Inter", "Segoe UI", system-ui, -apple-system, sans-serif;

    --pum-txt-xs:           10.5px;   /* rótulos em maiúsculas */
    --pum-txt-sm:           12px;     /* tabelas */
    --pum-txt-base:         13px;     /* corpo */
    --pum-txt-md:           15px;
    --pum-txt-lg:           18px;     /* títulos de bloco */
    --pum-txt-xl:           22px;     /* título de página */
    --pum-txt-kpi:          28px;     /* valor de indicador */

    --pum-peso-normal:      400;
    --pum-peso-medio:       600;
    --pum-peso-forte:       700;

    --pum-track-rotulo:     .1em;     /* espaçamento de letra em rótulos */
    --pum-linha:            1.5;

    /* -------------------------------------------------------------------------
       8. MEDIDAS DE TABELA
       ------------------------------------------------------------------------- */

    --pum-tabela-linha-h:   38px;
    --pum-tabela-cabec-h:   34px;

    /* -------------------------------------------------------------------------
       9. PONTO DE CORTE DE REFERÊNCIA

       O parque instalado é maioritariamente 1366×768. Havia nove pontos de
       corte diferentes espalhados pelos dois módulos e nenhum em 1366.
       ------------------------------------------------------------------------- */

    --pum-largura-max:      1320px;   /* cabe em 1366 com margem lateral */

    /* -------------------------------------------------------------------------
       10. BARRA SUPERIOR — título e filtros

       Medidas do componente que o `app-barra-superior.css` consome. Estavam
       repetidas em literal em oito folhas de módulo e no `<style>` embutido do
       `topbarFiltros.xhtml`; mudar a altura de um campo de filtro obrigava a
       editar nove ficheiros.

       O fundo da barra é o único azul-acinzentado do portal. Fica aqui como
       token para poder ser convergido para a escala neutra numa fase posterior,
       sem caçar o literal por 1 010 ecrãs.
       ------------------------------------------------------------------------- */

    --pum-barra-fundo:      #F3F6FB;

    /* O gradiente da barra superior. Vivia inline com !important no
       topbar.xhtml, invencível por qualquer folha; agora o inline consome o
       token, a identidade no claro é byte a byte a mesma, e o tema escuro
       pode enfim mudá-lo. */
    --pum-barra-sup:        linear-gradient(135deg, #005c3b, #00794e);
    --pum-barra-h:          55px;     /* altura da barra; igual ao topbar */

    --pum-filtro-h:         36px;     /* altura de cada campo de filtro */
    --pum-filtro-w:         150px;    /* largura de referência */
    --pum-filtro-w-min:     130px;
    --pum-filtro-w-max:     180px;
    --pum-filtro-w-busca:   210px;    /* campo de pesquisa livre, mais largo */

    /* Cinco é o número de filtros que cabem em 1366px ao lado do título sem
       comprimir. Do sexto em diante, o `topbarFiltros.xhtml` recolhe-os para o
       painel «Mais filtros». O valor está fixado no selector `:nth-child(n+6)`
       da folha e no contador em JavaScript — se mudar, mudam os dois. */

    /* -------------------------------------------------------------------------
       11. ACÇÃO E TEXTO INVERSO

       Um mesmo token não pode servir de texto sobre superfície escura E de
       fundo de botão sob texto claro: os dois papéis exigem luminâncias
       incompatíveis — 4.5:1 contra quase-preto e contra branco ao mesmo
       tempo não existe. No tema claro estes tokens valem exactamente o que
       os ecrãs já usam; no escuro divergem, e é isso que mantém os botões
       legíveis. A migração dos botões para *-accao faz-se módulo a módulo
       na entrada de cada um no tema escuro.
       ------------------------------------------------------------------------- */

    --pum-texto-inverso:    #FFFFFF;                    /* texto sobre a marca */
    --pum-inverso-80:       rgba(255, 255, 255, .8);
    --pum-inverso-18:       rgba(255, 255, 255, .18);

    --pum-verde-accao:      var(--pum-verde);           /* fundo de botão primário */
    --pum-vermelho-accao:   var(--pum-vermelho);        /* fundo de botão destrutivo */

    /* -------------------------------------------------------------------------
       12. LEGADO A CONVERGIR

       Identidades de módulo fora da paleta, centralizadas aqui para que
       nenhuma folha de módulo escreva um valor de cor — nem as que ainda
       não convergiram. O teal é «o esquema antigo» referido no cabeçalho
       deste ficheiro; os azuis são a identidade do painel do MGA. Convergem
       (ou ganham par escuro) quando cada módulo entrar no tema escuro — até
       lá, mudá-los aqui muda-os em todo o lado, que é o objectivo.
       ------------------------------------------------------------------------- */

    --pum-leg-teal:         #0E676F;   /* MCA — esquema antigo */
    --pum-leg-teal-escuro:  #0A4D53;

    --pum-leg-azul-mga:         #2563EB;   /* MGA — painel */
    --pum-leg-azul-mga-escuro:  #1E3A8A;
    --pum-leg-azul-mga-claro:   #3B82F6;

    /* MMP. Único tom que ganhou token próprio na Fase 5, e ganhou-o por
       peso: 185 ocorrências em duro, todas texto, e das poucas que já
       passavam em AA (7,40:1). Convergi-lo para um azul da paleta mudava a
       identidade do módulo sem nada ganhar em legibilidade. */
    --pum-leg-azul-mmp:         #01579B;   /* sobre superfície ....... 7.40:1  AA */

    /* Escala sequencial de gráficos, herdada do MGI — seis verdes do mais
       escuro ao mais claro, com o contraste do texto sobreposto documentado
       na folha de origem. É a única escala sequencial do portal e fica
       central como candidata a paleta oficial de dataviz. */
    --pum-seq-verde-1:      #083324;
    --pum-seq-verde-2:      #1B4B3B;
    --pum-seq-verde-3:      #356455;
    --pum-seq-verde-4:      #4E7E71;
    --pum-seq-verde-5:      #73978D;
    --pum-seq-verde-6:      #98B0AA;
    --pum-seq-verde-7:      #C8D4D1;   /* superfícies e linhas de base */
    --pum-seq-verde-8:      #E3E9E8;   /* superfícies e grelhas */

    /* -------------------------------------------------------------------------
       13. MOVIMENTO

       Quatro durações e três curvas. O movimento diz ao olho o que mudou e
       de onde veio; o que não responde a uma pergunta do utilizador não
       anima. Anima-se transform e opacity; nunca width, height, top, left
       ou margin — com 662 tabelas e 1 378 cartões, o reflow vê-se.

       Nota: a escala tipográfica que o plano pedia como secção 11 já existe
       — é a secção 7 deste ficheiro. Não se duplica; faz-se valer.
       ------------------------------------------------------------------------- */

    --pum-dur-instantaneo:  90ms;    /* realce, foco, estado de botão */
    --pum-dur-rapido:      160ms;    /* abrir menu, mostrar painel */
    --pum-dur-normal:      240ms;    /* transição de disposição, diálogo */
    --pum-dur-lento:       380ms;    /* só mudança de tema */

    --pum-curva:           cubic-bezier(.4, 0, .2, 1);   /* entrada e saída */
    --pum-curva-saida:     cubic-bezier(.4, 0, 1, 1);    /* a sair */
    --pum-curva-entrada:   cubic-bezier(0, 0, .2, 1);    /* a entrar */

    /* -------------------------------------------------------------------------
       13.1 Foco (Fase 7)

       O anel de foco é um elemento não textual: o mínimo é 3:1 pela 1.4.11, e
       o verificar-contraste.py mede-o contra a superfície, a tela e a barra de
       migalhas.

       Não leva par escuro: `var(--pum-verde)` resolve-se no momento do uso, e
       no tema escuro o --pum-verde já é #4CC38A. Repetir a linha na §14 não
       mudava nada e passava a haver dois sítios para manter a mesma decisão.

       Sobre a barra superior o anel é --pum-texto-inverso, porque ali o verde
       da marca é o próprio fundo. Ver app-acabamento.css §1.
       ---------------------------------------------------------------------- */
    --pum-foco-cor:        var(--pum-verde);
    --pum-foco-anel:       2px;
    --pum-foco-desvio:     2px;   /* sem desvio, o anel funde-se com a borda */
}

@media (max-width: 992px) {
    :root {
        --pum-margem-pagina: 20px;
    }
}

/* =============================================================================
   14. TEMA ESCURO

   Só os tokens que mudam. Os aliases da secção 4 (ok/espera/recusa/info)
   seguem automaticamente. O atributo data-tema é escrito no <html> pelo
   template a partir da preferência do utilizador (Fase 3); enquanto ninguém
   o escrever, este bloco é inerte e nada muda.

   prefers-color-scheme NÃO liga o tema sozinho, de propósito: com 19 128
   estilos em duro por converter nos ecrãs, um utilizador com o sistema
   operativo em escuro receberia metade dos ecrãs partidos sem nunca ter
   escolhido nada. A detecção do sistema entra como valor INICIAL da
   preferência, no bean, quando o utilizador ainda não escolheu (decisão
   aprovada na Fase 0).

   Todos os pares fundo/texto verificados WCAG 2.1 AA pela ferramenta
   ferramentas/verificar-contraste.py; o rácio medido está anotado.
   ============================================================================= */

:root[data-tema="escuro"] {

    /* 1. Marca */
    --pum-verde:            #4CC38A;   /* sobre superfície ....... 7.59:1  AA */
    --pum-verde-escuro:     #6FD3A5;   /* hover/activo ........... 9.24:1  AA */
    --pum-verde-claro:      #12291E;   /* verde sobre este fundo   6.96:1  AA */
    --pum-verde-borda:      #1F4630;
    --pum-vermelho:         #F2707C;   /* sobre superfície ....... 5.92:1  AA */
    --pum-vermelho-escuro:  #F58F99;   /* sobre superfície ....... 7.43:1  AA */
    --pum-vermelho-claro:   #351418;
    --pum-vermelho-borda:   #57242B;

    /* 2. Neutros */
    --pum-tela:             #101714;   /* texto sobre tela ...... 15.57:1  AA */
    --pum-superficie:       #171F1B;   /* texto sobre superfície  14.40:1  AA */
    --pum-superficie-alt:   #1D2621;
    --pum-borda:            #2C3833;
    --pum-borda-clara:      #232D28;

    --pum-texto:            #E8EFEB;
    --pum-texto-corpo:      #B6C4BD;   /* sobre superfície ....... 9.31:1  AA */
    /* CORRIGIDO DEPOIS DE VER O PORTAL A CORRER.
       Era #8FA098, escolhido contra --pum-superficie (#171F1B). Mas o texto de
       apoio não assenta só aí: o Poseidon pinta o corpo a #394149 e o
       cabeçalho de tabela a #434B54, ambos muito mais claros do que a
       superfície que a conta assumia. Sobre eles, o #8FA098 dava 3,78:1 e
       3,22:1 — abaixo do mínimo, e visível a olho num painel do MGP.

       O valor de agora passa sobre a mais clara das três: 4,66:1 no cabeçalho,
       5,46:1 no corpo, 9,14:1 no cartão. Aproxima-se do --pum-texto-corpo e a
       hierarquia entre os dois perde força no escuro — é o preço, e a ordem do
       plano é clara: primeiro a informação lê-se. */
    --pum-texto-apoio:      #B0C0B7;   /* cabeçalho 4.66 · corpo 5.46 ... AA */

    /* 3. Criticidade — o rácio anotado é texto sobre o próprio fundo e
       texto sobre superfície, por esta ordem */
    --pum-critico:          #F2818C;   /* 6.56 · 6.64  AA */
    --pum-critico-fundo:    #351418;
    --pum-critico-borda:    #57242B;

    --pum-alto:             #E89B7B;   /* 7.31 · 7.54  AA */
    --pum-alto-fundo:       #2F1B12;
    --pum-alto-borda:       #4D2E1F;

    --pum-medio:            #DDAE5A;   /* 7.65 · 8.23  AA */
    --pum-medio-fundo:      #2C2210;
    --pum-medio-borda:      #4A3A1C;

    --pum-baixo:            #7FB6D9;   /* 7.43 · 7.69  AA */
    --pum-baixo-fundo:      #12222C;
    --pum-baixo-borda:      #23404F;

    --pum-nulo:             #7CCFA6;   /* 8.71 · 9.08  AA */
    --pum-nulo-fundo:       #10251A;
    --pum-nulo-borda:       #1F4630;

    /* 4. Semântica sem alias directo */
    --pum-curso:            #E58E9B;   /* 7.01 · 6.95  AA */
    --pum-curso-fundo:      #2C161A;
    --pum-curso-borda:      #4A272E;

    --pum-inerte:           #9AA8A1;   /* 6.42 · 6.80  AA */
    --pum-inerte-fundo:     #1C2420;
    --pum-inerte-borda:     #2C3833;

    --pum-acento:           #B7A9F0;   /* 8.06 · 7.97  AA */
    --pum-acento-fundo:     #1D1930;
    --pum-acento-borda:     #363057;

    /* 6. Sombra — no escuro a elevação precisa de mais peso */
    --pum-sombra-flutuante: 0 16px 48px rgba(0, 0, 0, .55);

    /* 10. Barra superior */
    --pum-barra-fundo:      #151B21;   /* texto sobre a barra ... 14.85:1  AA */
    --pum-barra-sup:        linear-gradient(135deg, #0A231A, #0E3325);
                            /* texto inverso sobre os extremos: 13.9 e 12.1:1  AA */

    /* 11. Acção e inverso */
    --pum-texto-inverso:    #F2F7F4;
    --pum-inverso-80:       rgba(242, 247, 244, .8);
    --pum-inverso-18:       rgba(242, 247, 244, .18);
    --pum-verde-accao:      #0E7A4E;   /* texto inverso sobre ele  4.95:1  AA */
    --pum-vermelho-accao:   #C4313F;   /* texto inverso sobre ele  5.02:1  AA */

    /* 12. Legado

       Ganharam par escuro na Fase 5, e a premissa que estava aqui escrita
       caiu: não são só fundos. O levantamento do estilo em duro encontrou
       116 `color: teal` e 57 `color: #0A4D53` nos ecrãs — são texto, e
       texto de módulo com o valor claro sobre superfície escura dava 2,55:1
       e 1,76:1. Ilegível.

       Os tons abaixo mantêm a identidade de cada módulo — continuam a ser
       o teal do MCA e os azuis do MGA e do MMP — mas na claridade que uma
       superfície escura exige. */
    --pum-leg-teal:             #5FB8C2;   /* sobre superfície ....... 7.31:1  AA */
    --pum-leg-teal-escuro:      #3E9AA4;   /* sobre superfície ....... 5.10:1  AA */

    --pum-leg-azul-mga:         #7FA9F5;   /* sobre superfície ....... 7.13:1  AA */
    --pum-leg-azul-mga-escuro:  #5B8AE8;   /* sobre superfície ....... 5.00:1  AA */
    --pum-leg-azul-mga-claro:   #93BAF8;   /* sobre superfície ....... 8.51:1  AA */

    --pum-leg-azul-mmp:         #5FB0E8;   /* sobre superfície ....... 7.10:1  AA */
}

/* =============================================================================
   15. MOVIMENTO REDUZIDO

   Quem pediu ao sistema operativo para reduzir o movimento não recebe
   nenhum. A regra é global e definitiva — o interruptor do painel de
   preferências (Fase 3) permitirá ainda desligar por cima disto.
   ============================================================================= */

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

/* =============================================================================
   16. REFORMA 2026 — PRIMITIVAS, MEDIDAS, PONTE E VOCABULÁRIO DOS VENDORIZADOS

   Porquê quatro blocos à parte
   ----------------------------
   A reforma visual liga-se por utilizador: o ReformaVisualBean escreve
   data-visual="2026" no <html>. Tem de se poder desligar sem deixar rasto,
   e por isso nada do que é novo, ou muda de valor, entra nas secções 1 a 15.
   Vive aqui e nas secções 17 a 19, todas presas a esse atributo. Sem ele os
   quatro blocos são inertes e o portal pinta exactamente o que pintava.

   Regra
   -----
   Este bloco tem especificidade (0,2,0): empata com o bloco escuro da secção
   14 e ganha só por vir depois. Um token da secção 14 declarado aqui passava
   a valer o mesmo nos dois temas e apagava o escuro — por isso NENHUM token
   da secção 14 entra neste bloco (o verificar-reforma.py --so tokens
   confirma-o). O que muda com o tema vai para a secção 17 (claro) ou 18
   (escuro). Aqui fica só o que vale para os dois: primitivas, medidas,
   tipografia, a ponte do PrimeFaces e o vocabulário --pum-tema-*.

   As escalas vão em HEX porque o verificar-contraste.py só lê #RRGGBB e o
   oklch() exige Chrome 111; o OKLCH de cada passo fica anotado ao lado.
   ============================================================================= */

:root[data-visual="2026"] {

    /* -------------------------------------------------------------------------
       16.1 Escala da marca

       Onze passos com matiz constante (h≈158°). O 700 é o verde institucional
       e o 900 o verde-escuro de sempre; os outros verdes do portal ficam a
       menos de um passo da escala. Texto verde sobre fundo claro só do 700
       para baixo; sobre fundo escuro só do 400 para cima; preenchimento com
       texto branco só do 600 para baixo.
       ------------------------------------------------------------------------- */

    --pum-verde-50:         #F1FBF5;   /* oklch(.979 .013 160) */
    --pum-verde-100:        #E4F5EA;   /* oklch(.955 .023 158) */
    --pum-verde-200:        #C9EBD6;   /* oklch(.910 .046 158) */
    --pum-verde-300:        #9BDAB5;   /* oklch(.836 .083 158) */
    --pum-verde-400:        #5DC08C;   /* oklch(.734 .121 158) */
    --pum-verde-500:        #2BA16A;   /* oklch(.631 .132 158) */
    --pum-verde-600:        #0A8554;   /* oklch(.545 .124 158)  pivô */
    --pum-verde-700:        #017649;   /* oklch(.499 .116 158)  MARCA */
    --pum-verde-800:        #05633D;   /* oklch(.441 .101 158) */
    --pum-verde-900:        #01502F;   /* oklch(.380 .089 158) */
    --pum-verde-950:        #0B2E1D;   /* oklch(.270 .051 159) */

    /* -------------------------------------------------------------------------
       16.2 Neutros esverdeados

       Doze passos para o claro e doze para o escuro, com a semântica de
       sempre: 1–2 fundos, 3–5 fundos de componente, 6–8 bordas, 9 ícone e
       desactivado, 10–12 texto. Treze são valores que o portal já usava.
       ------------------------------------------------------------------------- */

    --pum-neutro-1:         #FAFBFA;   /* oklch(.987 .002 146) */
    --pum-neutro-2:         #F5F7F6;   /* oklch(.974 .002 165) */
    --pum-neutro-3:         #F0F3F2;   /* oklch(.962 .003 174) */
    --pum-neutro-4:         #E9EEEC;   /* oklch(.945 .006 170) */
    --pum-neutro-5:         #E2E8E5;   /* oklch(.926 .008 165) */
    --pum-neutro-6:         #D7DEDA;   /* oklch(.894 .009 161) */
    --pum-neutro-7:         #C2CAC6;   /* oklch(.832 .010 165) */
    --pum-neutro-8:         #85908B;   /* oklch(.643 .015 167) */
    --pum-neutro-9:         #75807B;   /* oklch(.589 .015 167) */
    --pum-neutro-10:        #626E69;   /* oklch(.526 .016 169) */
    --pum-neutro-11:        #4A5A53;   /* oklch(.452 .023 167) */
    --pum-neutro-12:        #12211B;   /* oklch(.232 .024 167) */

    --pum-neutro-e1:        #101714;   /* oklch(.196 .012 167) */
    --pum-neutro-e2:        #171F1B;   /* oklch(.230 .014 163) */
    --pum-neutro-e3:        #1D2621;   /* oklch(.258 .016 161) */
    --pum-neutro-e4:        #232D28;   /* oklch(.286 .017 164) */
    --pum-neutro-e5:        #28322D;   /* oklch(.306 .016 164) */
    --pum-neutro-e6:        #2C3833;   /* oklch(.328 .018 168) */
    --pum-neutro-e7:        #3B4741;   /* oklch(.385 .019 164) */
    --pum-neutro-e8:        #6B7772;   /* oklch(.558 .016 169) */
    --pum-neutro-e9:        #7D8A83;   /* oklch(.621 .018 162) */
    --pum-neutro-e10:       #8D9C94;   /* oklch(.678 .021 163) */
    --pum-neutro-e11:       #B6C4BD;   /* oklch(.807 .018 165) */
    --pum-neutro-e12:       #E8EFEB;   /* oklch(.946 .009 161) */

    /* -------------------------------------------------------------------------
       16.3 Paletas do menu — primitivas

       Três paletas com os mesmos 18 sufixos. As folhas do menu só lêem os
       tokens de uso (--pum-menu-<sufixo>, nas secções 17 a 19), e trocar de
       paleta é trocar para onde eles apontam. As primitivas ficam aqui, num
       só sítio, para o verificar-contraste.py as medir todas.

       sufixos: fundo borda texto texto-hover fundo-hover icone icone-caixa
                seccao activo-fundo activo-texto activo-icone
                activo-icone-caixa activo-barra ramo foco rolagem
                cracha-fundo cracha-texto

       O rácio anotado é o do par da linha: texto sobre o fundo da paleta,
       texto-hover sobre fundo-hover, ícone sobre a sua caixa, activo-texto
       sobre activo-fundo, barra e ícone activos sobre activo-fundo.
       ------------------------------------------------------------------------- */

    --pum-menu-claro-fundo:                 #FFFFFF;
    --pum-menu-claro-borda:                 #E2E8E5;
    --pum-menu-claro-texto:                 #4A5A53;   /* 7,30 */
    --pum-menu-claro-texto-hover:           #12211B;   /* 14,94 */
    --pum-menu-claro-fundo-hover:           #F0F3F2;
    --pum-menu-claro-icone:                 #626E69;   /* 4,76 sobre a caixa */
    --pum-menu-claro-icone-caixa:           #F0F3F2;
    --pum-menu-claro-seccao:                #626E69;   /* 5,31 */
    --pum-menu-claro-activo-fundo:          #E4F5EA;
    --pum-menu-claro-activo-texto:          #01502F;   /* 8,47 */
    --pum-menu-claro-activo-icone:          #017649;   /* 5,03 */
    --pum-menu-claro-activo-icone-caixa:    #C9EBD6;   /* ícone activo sobre ela 4,43 */
    --pum-menu-claro-activo-barra:          #017649;   /* 5,03 */
    --pum-menu-claro-ramo:                  #05633D;   /* 7,35 */
    --pum-menu-claro-foco:                  #017649;   /* 5,69 */
    --pum-menu-claro-rolagem:               #C2CAC6;
    --pum-menu-claro-cracha-fundo:          #017649;
    --pum-menu-claro-cracha-texto:          #FFFFFF;   /* 5,69 */

    --pum-menu-escuro-fundo:                #101714;
    --pum-menu-escuro-borda:                #2C3833;
    --pum-menu-escuro-texto:                #B6C4BD;   /* 10,06 */
    --pum-menu-escuro-texto-hover:          #E8EFEB;   /* 13,30 */
    --pum-menu-escuro-fundo-hover:          #1D2621;
    --pum-menu-escuro-icone:                #8D9C94;   /* 5,41 sobre a caixa */
    --pum-menu-escuro-icone-caixa:          #1D2621;
    --pum-menu-escuro-seccao:               #8D9C94;   /* 6,34 */
    --pum-menu-escuro-activo-fundo:         #0B2E1D;
    --pum-menu-escuro-activo-texto:         #E8EFEB;   /* 12,64 */
    --pum-menu-escuro-activo-icone:         #5DC08C;   /* 6,60 */
    --pum-menu-escuro-activo-icone-caixa:   #01502F;   /* ícone activo sobre ela 4,29 */
    --pum-menu-escuro-activo-barra:         #5DC08C;   /* 6,60 */
    --pum-menu-escuro-ramo:                 #9BDAB5;   /* 11,34 */
    --pum-menu-escuro-foco:                 #5DC08C;   /* 8,13 */
    --pum-menu-escuro-rolagem:              #3B4741;
    --pum-menu-escuro-cracha-fundo:         #5DC08C;
    --pum-menu-escuro-cracha-texto:         #101714;   /* 8,13 */

    --pum-menu-profundo-fundo:              #0B2E1D;
    --pum-menu-profundo-borda:              #01502F;
    --pum-menu-profundo-texto:              #F0F3F2;   /* 13,22 */
    --pum-menu-profundo-texto-hover:        #F0F3F2;   /* 10,72 */
    --pum-menu-profundo-fundo-hover:        #1C3D2D;
    --pum-menu-profundo-icone:              #C2CAC6;   /* 6,53 sobre a caixa */
    --pum-menu-profundo-icone-caixa:        #234334;
    --pum-menu-profundo-seccao:             #9BDAB5;   /* 9,20 — o N8 dava 4,47 */
    --pum-menu-profundo-activo-fundo:       #01502F;
    --pum-menu-profundo-activo-texto:       #FFFFFF;   /* 9,59 */
    --pum-menu-profundo-activo-icone:       #9BDAB5;   /* 5,98 */
    --pum-menu-profundo-activo-icone-caixa: #0B2E1D;   /* ícone activo sobre ela 9,20 */
    --pum-menu-profundo-activo-barra:       #5DC08C;   /* 6,60 sobre o fundo */
    --pum-menu-profundo-ramo:               #FFFFFF;   /* 14,76 */
    --pum-menu-profundo-foco:               #FFFFFF;   /* 14,76 */
    --pum-menu-profundo-rolagem:            #234334;
    --pum-menu-profundo-cracha-fundo:       #5DC08C;
    --pum-menu-profundo-cracha-texto:       #0B2E1D;   /* 6,60 */

    /* -------------------------------------------------------------------------
       16.4 Preenchimentos de severidade

       Os botões de severidade levam todos texto branco, nos dois temas, e
       saem das mesmas famílias das mensagens. Por isso o aviso troca o
       amarelo do Poseidon, que pedia texto escuro, pelo âmbar do «médio»
       escurecido. O rácio anotado é o do branco sobre o preenchimento.
       ------------------------------------------------------------------------- */

    --pum-preench-info:         #1F5C7A;   /* 7,32 */
    --pum-preench-info-hover:   #184A63;
    --pum-preench-aviso:        #925700;   /* 5,86 */
    --pum-preench-aviso-hover:  #7A4900;
    --pum-preench-ajuda:        #4A3D9E;   /* 8,56 */
    --pum-preench-ajuda-hover:  #3D3285;

    /* -------------------------------------------------------------------------
       16.5 Sucesso deixa de ser a marca

       O verde de estado e o verde de acção eram o mesmo, e um «ok» lia-se
       como um botão. Passam a distinguir-se pela forma e não pelo matiz: a
       acção é texto ou preenchimento 700; o estado é sempre um contentor
       (fundo 100, borda 200, texto 900), que é o que o «nulo» já desenha.
       ------------------------------------------------------------------------- */

    --pum-ok:               var(--pum-nulo);
    --pum-ok-fundo:         var(--pum-nulo-fundo);
    --pum-ok-borda:         var(--pum-nulo-borda);

    /* -------------------------------------------------------------------------
       16.6 Raios, tipografia, camadas e medidas

       A escala tipográfica --pum-tipo-* soma-se à --pum-txt-* da secção 7,
       que não muda: as folhas novas usam esta, as existentes ficam com a sua.
       A «Inter Fallback» é a Segoe UI com métricas acertadas, para o texto
       não saltar quando a Inter chega.
       ------------------------------------------------------------------------- */

    --pum-raio-sm:          4px;      /* eram 3 / 4 / 6 */
    --pum-raio:             6px;
    --pum-raio-lg:          8px;
    --pum-raio-xs:          4px;
    --pum-raio-ctl:         6px;      /* campos e botões */
    --pum-raio-cartao:      8px;
    --pum-raio-dialogo:     12px;

    --pum-fonte:            "Inter", "Inter Fallback", "Segoe UI", system-ui, -apple-system, sans-serif;
    --pum-fonte-mono:       ui-monospace, "Cascadia Mono", Consolas, "Courier New", monospace;

    --pum-tipo-legenda:     11px;
    --pum-tipo-pequeno:     12px;
    --pum-tipo-corpo:       13px;
    --pum-tipo-destaque:    15px;
    --pum-tipo-titulo:      18px;
    --pum-tipo-pagina:      22px;
    --pum-tipo-indicador:   28px;

    --pum-peso-texto:       400;
    --pum-peso-rotulo:      500;
    --pum-peso-titulo:      600;
    --pum-peso-alerta:      700;

    --pum-tabela-peso:        500;
    --pum-tabela-numeros:     tabular-nums;
    --pum-tabela-cabec-tam:   11px;
    --pum-tabela-cabec-peso:  600;
    --pum-tabela-cabec-track: .06em;

    /* Camadas: a barra colante fica abaixo do menu flutuante, a barra de
       carga por cima dele, e a paleta, o tooltip e o «saltar para o
       conteúdo» acima dos diálogos do PrimeFaces. */
    --pum-z-colante:        99;
    --pum-z-menu-flutuante: 1001;
    --pum-z-carga:          1002;
    --pum-z-paleta:         11000;
    --pum-z-tooltip:        12000;
    --pum-z-saltar:         12001;

    --pum-menu-w:           240px;
    --pum-carril-w:         64px;
    /* Valores do regime de secretária; os outros regimes redefinem-nos no
       app-reforma.css por largura de ecrã e por disposição do menu. */
    --pum-barra-top:        55px;
    --pum-carga-top:        56px;
    --pum-carga-h:          3px;

    --pum-topo-fundo:       var(--pum-barra-sup);
    --pum-topo-texto:       #FFFFFF;
    --pum-cracha-texto:     #FFFFFF;

    /* A linha seleccionada leva uma segunda pista além do fundo (WCAG 1.4.1):
       quem não distingue o verde-100 do branco vê a barra à esquerda. */
    --pum-tabela-sel-fundo: var(--pum-realce-fundo);
    --pum-tabela-sel-texto: var(--pum-realce-texto);
    --pum-tabela-sel-pista: inset 3px 0 0 var(--pum-realce-indicador);

    /* -------------------------------------------------------------------------
       16.7 Ponte para as variáveis do PrimeFaces

       O theme.css declara estas variáveis em :root, (0,1,0), e quase não as
       lê; quem as lê é a PrimeFlex, as folhas demo-* e o JavaScript de alguns
       painéis. Este bloco (0,2,0) vence-o sem tocar no ficheiro vendorizado.
       ------------------------------------------------------------------------- */

    --primary-color:        var(--pum-verde);
    --primary-color-text:   var(--pum-texto-sobre-verde);
    --primary-50:           var(--pum-verde-50);
    --primary-100:          var(--pum-verde-100);
    --primary-200:          var(--pum-verde-200);
    --primary-300:          var(--pum-verde-300);
    --primary-400:          var(--pum-verde-400);
    --primary-500:          var(--pum-verde-500);
    --primary-600:          var(--pum-verde-600);
    --primary-700:          var(--pum-verde-700);
    --primary-800:          var(--pum-verde-800);
    --primary-900:          var(--pum-verde-900);
    --surface-a:            var(--pum-superficie);
    --surface-b:            var(--pum-superficie-alt);
    --surface-c:            var(--pum-hover);
    --surface-d:            var(--pum-borda);
    --surface-e:            var(--pum-superficie);
    --surface-f:            var(--pum-superficie);
    --surface-ground:       var(--pum-tela);
    --surface-section:      var(--pum-superficie);
    --surface-card:         var(--pum-superficie);
    --surface-overlay:      var(--pum-superficie-elevada);
    --surface-border:       var(--pum-borda);
    --surface-hover:        var(--pum-hover);
    --text-color:           var(--pum-texto-corpo);
    --text-color-secondary: var(--pum-texto-apoio);
    --focus-ring:           0 0 0 2px var(--pum-superficie), 0 0 0 4px var(--pum-foco-cor);
    --maskbg:               var(--pum-mascara);
    --highlight-bg:         var(--pum-realce-fundo);
    --highlight-text-color: var(--pum-realce-texto);
    --font-family:          var(--pum-fonte);
    --border-radius:        var(--pum-raio);
    --content-alt-bg-color: var(--pum-superficie-alt);   /* lida por JS: dashboard_1-4.xhtml:124, mfin/index.xhtml:150 */

    /* -------------------------------------------------------------------------
       16.8 Vocabulário dos ficheiros vendorizados

       O tema e o layout do Poseidon passam a escrever cada cor como
       var(--pum-tema-<papel>, <literal de hoje>). Não podem usar os --pum-*
       clássicos, que existem com a reforma desligada: um var(--pum-verde, …)
       no tema pintava o verde novo mesmo sem o interruptor. Os --pum-tema-*
       existem SÓ neste bloco, e sem data-visual="2026" vale o literal, byte
       a byte.

       Todos são aliases: o valor por tema vem das secções 17 e 18. A PT-07
       só pode ACRESCENTAR linhas --pum-tema-<papel>: var(--pum-<papel>) a
       este bloco, e só para papéis que já existam nas secções 16 a 18.
       ------------------------------------------------------------------------- */

    /* acção primária: botão, caixa e rádio marcados, switch, paginador,
       separador activo, slider, progressbar */
    --pum-tema-primario:            var(--pum-verde-accao);
    --pum-tema-primario-hover:      var(--pum-accao-hover);
    --pum-tema-primario-activo:     var(--pum-accao-activo);
    --pum-tema-primario-texto:      var(--pum-texto-inverso);

    --pum-tema-ligacao:             var(--pum-verde);
    --pum-tema-ligacao-hover:       var(--pum-verde-escuro);
    --pum-tema-anel:                var(--pum-foco-cor);

    --pum-tema-realce-fundo:        var(--pum-realce-fundo);
    --pum-tema-realce-texto:        var(--pum-realce-texto);
    --pum-tema-realce-indicador:    var(--pum-realce-indicador);

    /* o desactivado está isento de contraste pela 1.4.3 */
    --pum-tema-texto:               var(--pum-texto-corpo);
    --pum-tema-texto-forte:         var(--pum-texto);
    --pum-tema-texto-apoio:         var(--pum-texto-apoio);
    --pum-tema-texto-desactivado:   var(--pum-texto-desactivado);

    /* a elevada serve diálogos, sobreposições e menus pendentes; no escuro
       é mais clara do que a superfície, que é como a elevação se lê ali */
    --pum-tema-superficie:          var(--pum-superficie);
    --pum-tema-superficie-alt:      var(--pum-superficie-alt);
    --pum-tema-superficie-elevada:  var(--pum-superficie-elevada);
    --pum-tema-hover:               var(--pum-hover);
    --pum-tema-seleccao:            var(--pum-seleccao);
    --pum-tema-tela:                var(--pum-tela);

    /* a borda de campo é a que a 1.4.11 mede (3:1) */
    --pum-tema-borda:               var(--pum-borda);
    --pum-tema-borda-forte:         var(--pum-borda-forte);
    --pum-tema-borda-campo:         var(--pum-borda-campo);

    --pum-tema-inverso:             var(--pum-texto-inverso);
    --pum-tema-mascara:             var(--pum-mascara);

    --pum-tema-erro:                var(--pum-vermelho);
    --pum-tema-erro-texto:          var(--pum-critico);

    /* o secundário passa a neutro delineado */
    --pum-tema-sec-fundo:           var(--pum-superficie);
    --pum-tema-sec-texto:           var(--pum-texto-corpo);
    --pum-tema-sec-borda:           var(--pum-borda-campo);
    --pum-tema-sec-hover:           var(--pum-hover);

    --pum-tema-info:                var(--pum-preench-info);
    --pum-tema-info-hover:          var(--pum-preench-info-hover);
    --pum-tema-sucesso:             var(--pum-verde-accao);
    --pum-tema-sucesso-hover:       var(--pum-accao-hover);
    --pum-tema-aviso:               var(--pum-preench-aviso);
    --pum-tema-aviso-hover:         var(--pum-preench-aviso-hover);
    --pum-tema-ajuda:               var(--pum-preench-ajuda);
    --pum-tema-ajuda-hover:         var(--pum-preench-ajuda-hover);
    --pum-tema-perigo:              var(--pum-vermelho-accao);
    --pum-tema-perigo-hover:        var(--pum-vermelho-accao-hover);
    /* Branco nos dois temas: os seis preenchimentos acima são escuros nos
       dois, e nenhum token de papel vale branco em ambos sem ser por acaso. */
    --pum-tema-sev-texto:           #FFFFFF;

    /* p:messages, p:message e p:growl */
    --pum-tema-msg-info-texto:      var(--pum-info);
    --pum-tema-msg-info-fundo:      var(--pum-info-fundo);
    --pum-tema-msg-info-borda:      var(--pum-info-borda);
    --pum-tema-msg-aviso-texto:     var(--pum-espera);
    --pum-tema-msg-aviso-fundo:     var(--pum-espera-fundo);
    --pum-tema-msg-aviso-borda:     var(--pum-espera-borda);
    --pum-tema-msg-erro-texto:      var(--pum-recusa);
    --pum-tema-msg-erro-fundo:      var(--pum-recusa-fundo);
    --pum-tema-msg-erro-borda:      var(--pum-recusa-borda);
    --pum-tema-msg-sucesso-texto:   var(--pum-nulo);
    --pum-tema-msg-sucesso-fundo:   var(--pum-nulo-fundo);
    --pum-tema-msg-sucesso-borda:   var(--pum-nulo-borda);

    /* blocos .layout-menu-dim, -dark e -light do layout */
    --pum-tema-menu-fundo:              var(--pum-menu-fundo);
    --pum-tema-menu-borda:              var(--pum-menu-borda);
    --pum-tema-menu-texto:              var(--pum-menu-texto);
    --pum-tema-menu-texto-hover:        var(--pum-menu-texto-hover);
    --pum-tema-menu-fundo-hover:        var(--pum-menu-fundo-hover);
    --pum-tema-menu-icone:              var(--pum-menu-icone);
    --pum-tema-menu-icone-caixa:        var(--pum-menu-icone-caixa);
    --pum-tema-menu-seccao:             var(--pum-menu-seccao);
    --pum-tema-menu-activo-fundo:       var(--pum-menu-activo-fundo);
    --pum-tema-menu-activo-texto:       var(--pum-menu-activo-texto);
    --pum-tema-menu-activo-icone:       var(--pum-menu-activo-icone);
    --pum-tema-menu-activo-icone-caixa: var(--pum-menu-activo-icone-caixa);
    --pum-tema-menu-activo-barra:       var(--pum-menu-activo-barra);
    --pum-tema-menu-ramo:               var(--pum-menu-ramo);
    --pum-tema-menu-foco:               var(--pum-menu-foco);
    --pum-tema-menu-rolagem:            var(--pum-menu-rolagem);
    --pum-tema-menu-cracha-fundo:       var(--pum-menu-cracha-fundo);
    --pum-tema-menu-cracha-texto:       var(--pum-menu-cracha-texto);

    /* blocos .layout-topbar do layout */
    --pum-tema-topo-fundo:          var(--pum-topo-fundo);
    --pum-tema-topo-texto:          var(--pum-topo-texto);
    /* o botão do menu, o campo de pesquisa e o sobrevoo vivem por cima da
       barra: com o fundo da barra desapareciam, e levam o véu branco */
    --pum-tema-inverso-18:          var(--pum-inverso-18);

    /* .ui-tooltip do tema: o mesmo par dos tooltips da reforma, que no
       escuro se inverte (fundo claro, texto escuro) */
    --pum-tema-tooltip-fundo:       var(--pum-tooltip-fundo);
    --pum-tema-tooltip-texto:       var(--pum-tooltip-texto);

    /* .personal_label, --pac-font, --mgv-font, --kyc-font, cinto-module.css */
    --pum-tema-fonte:               var(--pum-fonte);
    --pum-tema-peso-texto:          var(--pum-peso-texto);
}

/* =============================================================================
   17. REFORMA 2026 — PAPÉIS NO TEMA CLARO

   Especificidade (0,3,0), um degrau acima da secção 16. O :not() cala o
   bloco quando o tema escuro está ligado, e assim a secção 18 não tem de
   desfazer nenhum valor claro. Os papéis apontam para os passos das escalas
   da secção 16; o rácio anotado é o do par em que o papel trabalha.

   Não mudam, porque já são os valores da escala: tela (N2), superfície,
   superfície alternativa (N1), borda (N5), borda clara (N3), texto (N12) e
   texto corrente (N11).
   ============================================================================= */

:root[data-visual="2026"]:not([data-tema="escuro"]) {

    /* Marca e acção */
    --pum-verde:                var(--pum-verde-700);    /* 5,69 sobre branco */
    --pum-verde-escuro:         var(--pum-verde-800);    /* 7,35 */
    --pum-verde-claro:          var(--pum-verde-100);
    --pum-verde-borda:          var(--pum-verde-200);
    --pum-verde-accao:          var(--pum-verde-700);
    --pum-accao-hover:          var(--pum-verde-800);    /* branco 7,35 */
    --pum-accao-activo:         var(--pum-verde-900);    /* branco 9,59 */
    --pum-verde-claro-hover:    var(--pum-verde-200);
    --pum-verde-veu-hover:      rgba(1, 118, 73, .06);
    --pum-verde-veu-activo:     rgba(1, 118, 73, .14);
    --pum-texto-sobre-verde:    #FFFFFF;                 /* 5,69 sobre o 700 */

    /* Superfícies, bordas e texto */
    --pum-superficie-elevada:   #FFFFFF;
    --pum-hover:                var(--pum-neutro-3);
    --pum-seleccao:             var(--pum-neutro-4);
    --pum-borda-forte:          var(--pum-neutro-7);
    --pum-borda-campo:          var(--pum-neutro-8);     /* 3,30 branco · 3,07 tela */
    --pum-texto-apoio:          var(--pum-neutro-10);    /* 5,31 · 4,94 tela · 4,76 hover */
    --pum-texto-desactivado:    var(--pum-neutro-9);

    /* Realce (linha ou item seleccionado). O fundo 100 quase não se separa
       do hover, por isso o indicador é que diz «escolhido». */
    --pum-realce-fundo:         var(--pum-verde-100);
    --pum-realce-texto:         var(--pum-neutro-12);    /* 14,73 */
    --pum-realce-indicador:     var(--pum-verde-700);    /* 5,03 sobre o realce · 5,10 sobre o hover */

    --pum-foco-cor:             var(--pum-verde-700);    /* 5,69 · 5,29 tela */
    --pum-mascara:              rgba(18, 33, 27, .45);

    /* Estados */
    --pum-nulo:                 var(--pum-verde-900);    /* 8,47 sobre o fundo */
    --pum-nulo-fundo:           var(--pum-verde-100);
    --pum-nulo-borda:           var(--pum-verde-200);
    --pum-curso:                var(--pum-acento);       /* o vermelho fica só para o crítico */
    --pum-curso-fundo:          var(--pum-acento-fundo);
    --pum-curso-borda:          var(--pum-acento-borda);
    --pum-medio:                #925700;                 /* 5,46 sobre o fundo */
    --pum-inerte:               var(--pum-neutro-10);    /* 5,31 */

    /* Barras: o gradiente dá lugar ao 800 plano */
    --pum-barra-fundo:          var(--pum-neutro-1);
    --pum-barra-sup:            var(--pum-verde-800);    /* branco 7,35 */

    /* Elevação: no claro a sombra separa o que flutua, a borda o resto */
    --pum-sombra-1:             0 1px 2px rgba(18, 33, 27, .06), 0 1px 1px rgba(18, 33, 27, .04);
    --pum-sombra-2:             0 4px 12px rgba(18, 33, 27, .10);
    --pum-sombra-3:             0 16px 48px rgba(18, 33, 27, .18);
    --pum-sombra-flutuante:     var(--pum-sombra-3);     /* o mesmo valor de hoje */

    /* Menu: paleta clara */
    --pum-menu-fundo:               var(--pum-menu-claro-fundo);
    --pum-menu-borda:               var(--pum-menu-claro-borda);
    --pum-menu-texto:               var(--pum-menu-claro-texto);
    --pum-menu-texto-hover:         var(--pum-menu-claro-texto-hover);
    --pum-menu-fundo-hover:         var(--pum-menu-claro-fundo-hover);
    --pum-menu-icone:               var(--pum-menu-claro-icone);
    --pum-menu-icone-caixa:         var(--pum-menu-claro-icone-caixa);
    --pum-menu-seccao:              var(--pum-menu-claro-seccao);
    --pum-menu-activo-fundo:        var(--pum-menu-claro-activo-fundo);
    --pum-menu-activo-texto:        var(--pum-menu-claro-activo-texto);
    --pum-menu-activo-icone:        var(--pum-menu-claro-activo-icone);
    --pum-menu-activo-icone-caixa:  var(--pum-menu-claro-activo-icone-caixa);
    --pum-menu-activo-barra:        var(--pum-menu-claro-activo-barra);
    --pum-menu-ramo:                var(--pum-menu-claro-ramo);
    --pum-menu-foco:                var(--pum-menu-claro-foco);
    --pum-menu-rolagem:             var(--pum-menu-claro-rolagem);
    --pum-menu-cracha-fundo:        var(--pum-menu-claro-cracha-fundo);
    --pum-menu-cracha-texto:        var(--pum-menu-claro-cracha-texto);

    /* Barra superior, tooltip, teclas e carga */
    --pum-cracha-fundo:         #B01220;                 /* branco 7,11 */
    --pum-vermelho-accao-hover: #B01220;                 /* branco 7,11 */
    --pum-tooltip-fundo:        var(--pum-neutro-12);
    --pum-tooltip-texto:        #FFFFFF;                 /* 16,68 */
    --pum-kbd-fundo:            var(--pum-neutro-2);
    --pum-kbd-borda:            var(--pum-neutro-7);
    --pum-kbd-texto:            var(--pum-neutro-11);    /* 6,78 */
    --pum-carga-cor:            var(--pum-verde-700);

    /* Gráficos: a ordem é a da série, e o primeiro é sempre a marca */
    --pum-grafico-1:            #017649;
    --pum-grafico-2:            #2A78D6;
    --pum-grafico-3:            #EB6834;
    --pum-grafico-4:            #4A3AA7;
    --pum-grafico-5:            #EDA100;
    --pum-grafico-6:            #E87BA4;

    /* Escalas da PrimeFlex, para as classes surface-* e gray-* lerem os
       neutros do portal e não o cinzento-azulado do Poseidon */
    --surface-0:                #FFFFFF;
    --surface-50:               var(--pum-neutro-1);
    --surface-100:              var(--pum-neutro-3);
    --surface-200:              var(--pum-neutro-5);
    --surface-300:              var(--pum-neutro-6);
    --surface-400:              var(--pum-neutro-7);
    --surface-500:              var(--pum-neutro-8);
    --surface-600:              var(--pum-neutro-10);
    --surface-700:              var(--pum-neutro-11);
    --surface-800:              var(--pum-neutro-e6);
    --surface-900:              var(--pum-neutro-12);
    --gray-50:                  var(--pum-neutro-1);
    --gray-100:                 var(--pum-neutro-3);
    --gray-200:                 var(--pum-neutro-5);
    --gray-300:                 var(--pum-neutro-6);
    --gray-400:                 var(--pum-neutro-7);
    --gray-500:                 var(--pum-neutro-8);
    --gray-600:                 var(--pum-neutro-10);
    --gray-700:                 var(--pum-neutro-11);
    --gray-800:                 var(--pum-neutro-e6);
    --gray-900:                 var(--pum-neutro-12);
}

/* =============================================================================
   18. REFORMA 2026 — PAPÉIS NO TEMA ESCURO

   Especificidade (0,3,0): vence o bloco escuro da secção 14, que é (0,2,0),
   pela especificidade e não pela ordem. Só declara o que a reforma muda no
   escuro; o resto continua a vir da secção 14.

   O --pum-texto-apoio NÃO se redefine: fica no valor da secção 14 enquanto
   o tema escuro do PrimeFaces pintar cabeçalhos a #434B54, onde o neutro E10
   dava 3,08:1. Também ficam o --pum-medio e o --pum-inerte.
   ============================================================================= */

:root[data-visual="2026"][data-tema="escuro"] {

    /* Marca e acção. Texto verde sobre fundo escuro só do 400 para cima;
       preenchimento com texto branco só do 600 para baixo. */
    --pum-verde:                var(--pum-verde-400);    /* 7,52 sobre a superfície */
    --pum-verde-escuro:         var(--pum-verde-300);    /* 10,49 */
    --pum-verde-claro:          var(--pum-verde-950);
    --pum-verde-borda:          var(--pum-verde-900);
    --pum-verde-accao:          var(--pum-verde-600);    /* branco 4,67 */
    --pum-accao-hover:          var(--pum-verde-700);    /* branco 5,69 */
    --pum-accao-activo:         var(--pum-verde-800);    /* branco 7,35 */
    --pum-verde-claro-hover:    var(--pum-verde-900);
    --pum-verde-veu-hover:      rgba(93, 192, 140, .10);
    --pum-verde-veu-activo:     rgba(93, 192, 140, .18);
    --pum-texto-sobre-verde:    var(--pum-neutro-e1);    /* 8,13 sobre o 400 */

    /* Superfícies, bordas e texto */
    --pum-superficie-elevada:   var(--pum-neutro-e3);
    --pum-hover:                var(--pum-neutro-e4);
    --pum-seleccao:             var(--pum-neutro-e5);
    --pum-borda-forte:          var(--pum-neutro-e7);
    --pum-borda-campo:          var(--pum-neutro-e8);    /* 3,61 superfície · 3,90 tela · 3,05 hover */
    --pum-texto-desactivado:    var(--pum-neutro-e9);
    --pum-texto-inverso:        #FFFFFF;
    --pum-inverso-80:           rgba(255, 255, 255, .8);
    --pum-inverso-18:           rgba(255, 255, 255, .18);

    /* Realce */
    --pum-realce-fundo:         var(--pum-verde-950);
    --pum-realce-texto:         var(--pum-neutro-e12);   /* 12,64 */
    --pum-realce-indicador:     var(--pum-verde-400);    /* 6,60 sobre o realce · 6,35 sobre o hover */

    --pum-foco-cor:             var(--pum-verde-400);    /* 7,52 · 8,13 tela */
    --pum-mascara:              rgba(0, 0, 0, .60);

    /* Estados */
    --pum-nulo:                 var(--pum-verde-300);    /* 9,20 sobre o fundo */
    --pum-nulo-fundo:           var(--pum-verde-950);
    --pum-nulo-borda:           var(--pum-verde-900);
    --pum-curso:                var(--pum-acento);
    --pum-curso-fundo:          var(--pum-acento-fundo);
    --pum-curso-borda:          var(--pum-acento-borda);

    /* Barras */
    --pum-barra-fundo:          var(--pum-neutro-e2);
    --pum-barra-sup:            var(--pum-verde-950);    /* branco 14,76 */

    /* Elevação: no escuro a sombra precisa de mais peso para se ver */
    --pum-sombra-1:             0 1px 2px rgba(0, 0, 0, .40);
    --pum-sombra-2:             0 6px 16px rgba(0, 0, 0, .45);
    --pum-sombra-3:             0 16px 48px rgba(0, 0, 0, .55);
    --pum-sombra-flutuante:     var(--pum-sombra-3);     /* o mesmo valor de hoje */

    /* Menu: paleta escura */
    --pum-menu-fundo:               var(--pum-menu-escuro-fundo);
    --pum-menu-borda:               var(--pum-menu-escuro-borda);
    --pum-menu-texto:               var(--pum-menu-escuro-texto);
    --pum-menu-texto-hover:         var(--pum-menu-escuro-texto-hover);
    --pum-menu-fundo-hover:         var(--pum-menu-escuro-fundo-hover);
    --pum-menu-icone:               var(--pum-menu-escuro-icone);
    --pum-menu-icone-caixa:         var(--pum-menu-escuro-icone-caixa);
    --pum-menu-seccao:              var(--pum-menu-escuro-seccao);
    --pum-menu-activo-fundo:        var(--pum-menu-escuro-activo-fundo);
    --pum-menu-activo-texto:        var(--pum-menu-escuro-activo-texto);
    --pum-menu-activo-icone:        var(--pum-menu-escuro-activo-icone);
    --pum-menu-activo-icone-caixa:  var(--pum-menu-escuro-activo-icone-caixa);
    --pum-menu-activo-barra:        var(--pum-menu-escuro-activo-barra);
    --pum-menu-ramo:                var(--pum-menu-escuro-ramo);
    --pum-menu-foco:                var(--pum-menu-escuro-foco);
    --pum-menu-rolagem:             var(--pum-menu-escuro-rolagem);
    --pum-menu-cracha-fundo:        var(--pum-menu-escuro-cracha-fundo);
    --pum-menu-cracha-texto:        var(--pum-menu-escuro-cracha-texto);

    /* Barra superior, tooltip, teclas e carga */
    --pum-cracha-fundo:         #C4313F;                 /* branco 5,44 */
    --pum-vermelho-accao-hover: #A82835;                 /* branco 6,95 */
    --pum-tooltip-fundo:        var(--pum-neutro-e12);
    --pum-tooltip-texto:        var(--pum-neutro-e1);    /* 15,57 */
    --pum-kbd-fundo:            var(--pum-neutro-e3);
    --pum-kbd-borda:            var(--pum-neutro-e7);
    --pum-kbd-texto:            var(--pum-neutro-e11);   /* 8,60 */
    --pum-carga-cor:            var(--pum-verde-400);

    --pum-grafico-1:            #0A8554;
    --pum-grafico-2:            #3987E5;
    --pum-grafico-3:            #D95926;
    --pum-grafico-4:            #9085E9;
    --pum-grafico-5:            #C98500;
    --pum-grafico-6:            #D55181;

    /* Escalas da PrimeFlex invertidas: o 0 é o fundo mais escuro */
    --surface-0:                var(--pum-neutro-e1);
    --surface-50:               var(--pum-neutro-e2);
    --surface-100:              var(--pum-neutro-e3);
    --surface-200:              var(--pum-neutro-e4);
    --surface-300:              var(--pum-neutro-e5);
    --surface-400:              var(--pum-neutro-e6);
    --surface-500:              var(--pum-neutro-e7);
    --surface-600:              var(--pum-neutro-e8);
    --surface-700:              var(--pum-neutro-e10);
    --surface-800:              var(--pum-neutro-e11);
    --surface-900:              var(--pum-neutro-e12);
    --gray-50:                  var(--pum-neutro-e2);
    --gray-100:                 var(--pum-neutro-e3);
    --gray-200:                 var(--pum-neutro-e4);
    --gray-300:                 var(--pum-neutro-e5);
    --gray-400:                 var(--pum-neutro-e6);
    --gray-500:                 var(--pum-neutro-e7);
    --gray-600:                 var(--pum-neutro-e8);
    --gray-700:                 var(--pum-neutro-e10);
    --gray-800:                 var(--pum-neutro-e11);
    --gray-900:                 var(--pum-neutro-e12);
}

/* =============================================================================
   19. REFORMA 2026 — MENU «VERDE PROFUNDO» NO TEMA CLARO

   Especificidade (0,4,0): a classe pum-menu-profundo no <html> (posta pela
   pré-pintura a partir da preferência do utilizador) põe este bloco acima
   da secção 17, e ele troca só os tokens de uso do menu. No tema escuro não
   tem efeito, de propósito: o menu escuro já é a paleta própria do tema.
   ============================================================================= */

:root[data-visual="2026"].pum-menu-profundo:not([data-tema="escuro"]) {
    --pum-menu-fundo:               var(--pum-menu-profundo-fundo);
    --pum-menu-borda:               var(--pum-menu-profundo-borda);
    --pum-menu-texto:               var(--pum-menu-profundo-texto);
    --pum-menu-texto-hover:         var(--pum-menu-profundo-texto-hover);
    --pum-menu-fundo-hover:         var(--pum-menu-profundo-fundo-hover);
    --pum-menu-icone:               var(--pum-menu-profundo-icone);
    --pum-menu-icone-caixa:         var(--pum-menu-profundo-icone-caixa);
    --pum-menu-seccao:              var(--pum-menu-profundo-seccao);
    --pum-menu-activo-fundo:        var(--pum-menu-profundo-activo-fundo);
    --pum-menu-activo-texto:        var(--pum-menu-profundo-activo-texto);
    --pum-menu-activo-icone:        var(--pum-menu-profundo-activo-icone);
    --pum-menu-activo-icone-caixa:  var(--pum-menu-profundo-activo-icone-caixa);
    --pum-menu-activo-barra:        var(--pum-menu-profundo-activo-barra);
    --pum-menu-ramo:                var(--pum-menu-profundo-ramo);
    --pum-menu-foco:                var(--pum-menu-profundo-foco);
    --pum-menu-rolagem:             var(--pum-menu-profundo-rolagem);
    --pum-menu-cracha-fundo:        var(--pum-menu-profundo-cracha-fundo);
    --pum-menu-cracha-texto:        var(--pum-menu-profundo-cracha-texto);
}
