/* ecommerce-enhance — aprimoramentos de frontend (5 waves) · brasilgeo.ai/ecommerce
   Gerado por scripts/ecommerce-enhance/build-enhance.mjs — NÃO editar à mão.
   Edite os módulos em scripts/ecommerce-enhance/src/ e rode: node build-enhance.mjs */

/* ===== w1-a11y.css ===== */
/* w1-a11y.css — WAVE 1 (Acessibilidade & Fundacao) do portal /ecommerce.
   Camada universal, aditiva e defensiva injetada no <head> das 182 paginas
   (familias A e B). Entrega: skip-link de alto contraste, foco sempre visivel,
   scroll-margin para header sticky, realce de :target, alvos de toque 44x44,
   color-scheme nativo e rede de seguranca de reduced-motion.
   Regras: contraste WCAG AA nos 2 temas; !important so em resets de a11y;
   nunca usar seletor universal `*`; toda animacao com guard de motion.
   Cor de marca com fallback encadeado: --color-brand (familia B) -> --brand
   (familia A) -> #0166c4. */

/* ---- Esquema de cores nativo (scrollbar, inputs, controles do SO) ---- */
:root {
  color-scheme: light dark;
}

/* ---- Skip-link universal -----------------------------------------------
   Serve tanto ao skip-link nativo da familia B (a[href="#conteudo"]) quanto
   ao injetado pelo JS na familia A (.ec-skip / a[href="#main"]).
   sr-only por padrao; torna-se visivel e contrastante ao receber foco. */
a.ec-skip,
a[href="#conteudo"].ec-skip,
a[href="#conteudo"]:not(.ec-skip),
a[href="#main"] {
  position: absolute !important;
  left: -9999px;
  top: auto;
  width: 1px;
  height: 1px;
  overflow: hidden;
  z-index: 100000;
  /* Cor de marca com fallback; texto branco garante AA sobre azul/indigo. */
  background: var(--color-brand, var(--brand, #0166c4)) !important;
  color: #ffffff !important;
  padding: 0.75rem 1.15rem;
  border-radius: 0.5rem;
  font: 600 1rem/1.2 system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
  text-decoration: none;
  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.35);
}

a.ec-skip:focus,
a.ec-skip:focus-visible,
a[href="#conteudo"]:focus,
a[href="#conteudo"]:focus-visible,
a[href="#main"]:focus,
a[href="#main"]:focus-visible {
  position: fixed !important;
  left: 1rem !important;
  top: 1rem !important;
  width: auto !important;
  height: auto !important;
  overflow: visible !important;
  outline: 3px solid #ffffff !important;
  outline-offset: 2px !important;
}

/* ---- Foco sempre visivel e harmonizado --------------------------------
   Outline de alta visibilidade nos 2 temas. Usa color-mix sobre currentColor
   para herdar e contrastar; fallback para a cor de marca em navegadores sem
   color-mix. !important permitido (reset de a11y). */
:is(a, button, summary, [tabindex], input, textarea, select, [role="button"]):focus-visible {
  outline: 3px solid var(--color-brand, var(--brand, #0166c4)) !important;
  outline-offset: 2px !important;
  border-radius: 4px;
}

@supports (outline-color: color-mix(in srgb, red, blue)) {
  :is(a, button, summary, [tabindex], input, textarea, select, [role="button"]):focus-visible {
    /* Mistura a cor de marca com o texto atual para garantir contraste em
       fundos claros e escuros sem cor fixa. */
    outline-color: color-mix(
      in srgb,
      var(--color-brand, var(--brand, #0166c4)) 70%,
      currentColor
    ) !important;
  }
}

/* Conservador: nao remover foco de quem usa teclado. So neutraliza o anel
   para ponteiro (mouse/touch), preservando :focus-visible. */
:is(a, button, summary, [tabindex], input, textarea, select, [role="button"]):focus:not(:focus-visible) {
  outline: none;
}

/* ---- scroll-margin para header sticky nao cobrir ancoras --------------- */
:where(h1, h2, h3, h4, [id]) {
  scroll-margin-top: calc(var(--ee-header-height, 4rem) + 1rem);
}

:target {
  scroll-margin-top: calc(var(--ee-header-height, 4rem) + 1rem);
}

/* Realce temporario do alvo de ancora (com guard de motion mais abaixo). */
:target {
  outline: 2px solid color-mix(
    in srgb,
    var(--color-brand, var(--brand, #0166c4)) 60%,
    transparent
  );
  outline-offset: 3px;
  border-radius: 4px;
  animation: ec-target-fade 2.2s ease-out 1;
}

@keyframes ec-target-fade {
  0% {
    outline-color: var(--color-brand, var(--brand, #0166c4));
    background-color: color-mix(
      in srgb,
      var(--color-brand, var(--brand, #0166c4)) 14%,
      transparent
    );
  }
  100% {
    outline-color: transparent;
    background-color: transparent;
  }
}

/* ---- Rolagem suave somente fora de reduced-motion --------------------- */
@media (prefers-reduced-motion: no-preference) {
  html {
    scroll-behavior: smooth;
  }
}

/* ---- Alvos de toque >= 44x44 em elementos de UI (nao em texto corrido) -
   Atua apenas em links de navegacao/sumario, nunca em links inline de
   paragrafo, para nao inflar a tipografia do corpo. */
.oc-toc a,
.oc-rail-link,
.oc-tr-step a {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
}

/* Preserva display e fluxo dos cards/links editoriais dentro de nav. */
.hd .nav-btn,
.hd .mega-grp a,
.hd .drawer .dl a,
[data-header] .menu-btn,
.drawer-links a,
.mega-cluster,
.oc-mini-nav a {
  min-height: 44px;
}

/* ---- Rede de seguranca de reduced-motion ------------------------------
   Catch-all conservador: encurta (nao remove abruptamente) qualquer
   animacao/transicao quando o usuario pede menos movimento. */
@media (prefers-reduced-motion: reduce) {
  html {
    scroll-behavior: auto;
  }

  :target {
    animation: none;
  }

  :where(a, button, summary, [tabindex], input, textarea, select, [role="button"], details, dialog) {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
}


/* ===== w2-layout.css ===== */
/* w2-layout.css — WAVE 2 (Responsividade & Robustez de Layout) do portal /ecommerce.
   Camada universal, aditiva e defensiva injetada no <head> das 182 paginas
   (familias A e B). Entrega: defesa contra overflow horizontal, quebra robusta
   de palavras/titulos, hifenizacao PT-BR no corpo, tabelas roláveis com
   indicadores de scroll e foco navegável por teclado, iframes/imagens fluidas.
   Regras: contraste WCAG AA nos 2 temas; nunca usar seletor universal `*`;
   `!important` apenas onde é estritamente necessário para vencer overflow
   herdado; toda animacao com guard de prefers-reduced-motion.
   Cor de marca com fallback encadeado: --color-brand (familia B) -> --brand
   (familia A) -> #0166c4.
   IMPORTANTE: nao reseta box/cores com `*` para nao quebrar data-astro-cid-*
   da familia B; usa :where()/:is() (especificidade 0) para nunca sobrescrever
   max-width/grids que já funcionam. */

/* ---- Defesa universal contra overflow horizontal -----------------------
   `clip` preserva position:sticky (diferente de `hidden`, que cria scroll
   container). Sem !important: usa a cascata natural; serve só de rede de
   seguranca quando nada mais define overflow no eixo X. */
html,
body {
  overflow-x: clip;
}

/* Mídia e blocos largos nunca estouram o container. `max-width:100%` em
   :where() (especificidade 0) não vence regras de layout já existentes;
   atua só onde não há regra. height:auto preserva proporção das imagens. */
:where(img, svg, video, canvas, iframe, table, pre, code) {
  max-width: 100%;
}

:where(img, video) {
  height: auto;
}

:where(pre) {
  overflow: auto;
}

:where(iframe) {
  width: 100%;
}

/* Placeholder leve enquanto a imagem carrega (raster); SVG inline ignora.
   color-mix adapta aos 2 temas via currentColor. Não força aspect-ratio
   (desconhecido) para evitar reflow incorreto. */
:where(img) {
  background: color-mix(in srgb, currentColor 6%, transparent);
}

/* ---- Quebra robusta de texto longo ------------------------------------
   Palavras longas (URLs, termos técnicos) quebram em vez de estourar. */
:where(p, li, figcaption) {
  overflow-wrap: break-word;
}

:where(h1, h2, h3) {
  overflow-wrap: anywhere;
  text-wrap: balance;
}

:where(p, li) {
  text-wrap: pretty;
}

/* Hifenizacao PT-BR somente no corpo de leitura (lang já é pt-BR nas pgs).
   Restrita a contextos de prosa para nao hifenizar rótulos/UI. */
:where(.oc-body, .guia-corpo) :where(p) {
  hyphens: auto;
}

/* ---- min-width:0 conservador em itens de grid/flex --------------------
   Sem min-width:0, um filho com conteúdo largo (tabela, pre) força o item
   a transbordar a coluna. Escopo deliberadamente estreito aos cards/figuras
   conhecidos dentro dos contêineres de conteúdo. */
:where(.oc-body, .wrap, main) :where(.oc-card, .ts-card, .vz-cc, figure) {
  min-width: 0;
}

/* ---- Tabelas roláveis (wrapper .ee-table-scroll criado pelo JS) -------
   Aplica-se apenas a tabelas que ainda não tinham wrapper .ec-table-wrap.
   O JS move a <table> para dentro de div.ee-table-scroll, marca tabindex=0
   e role=region. As regras abaixo dão o scroll horizontal, indicadores de
   sombra e foco navegável. */
.ee-table-scroll {
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  max-width: 100%;
  margin: 0 0 1rem;
  border: 1px solid color-mix(in srgb, currentColor 16%, transparent);
  border-radius: 12px;
}

/* Foco visível quando navegado por teclado (a região recebe tabindex=0). */
.ee-table-scroll:focus-visible {
  outline: 3px solid var(--color-brand, var(--brand, #0166c4));
  outline-offset: 2px;
}

/* Indicadores de scroll (sombras laterais) via técnica de gradientes com
   background-attachment:local + cobertura branca local. As sombras só
   aparecem quando há conteúdo escondido à esquerda/direita.
   Exibidas apenas quando o JS confirma overflow real (data-ee-scrollable).
   A "cobertura" usa a cor de fundo da página (Canvas) para mascarar a
   sombra nas extremidades; Canvas adapta-se a claro/escuro nativamente. */
.ee-table-scroll[data-ee-scrollable="true"] {
  background:
    linear-gradient(to right, Canvas 30%, transparent),
    linear-gradient(to right, transparent, Canvas 70%) 100% 0,
    radial-gradient(farthest-side at 0 50%, color-mix(in srgb, currentColor 22%, transparent), transparent),
    radial-gradient(farthest-side at 100% 50%, color-mix(in srgb, currentColor 22%, transparent), transparent) 100% 0;
  background-repeat: no-repeat;
  background-size: 40px 100%, 40px 100%, 14px 100%, 14px 100%;
  background-attachment: local, local, scroll, scroll;
}

/* A <table> embrulhada pelo JS: garante largura mínima útil para forçar o
   scroll em telas estreitas e tipografia/colapso de borda consistentes. */
.ee-table-scroll > table {
  width: 100%;
  min-width: 480px;
  border-collapse: collapse;
  margin: 0;
}

.ee-table-scroll > table th,
.ee-table-scroll > table td {
  padding: 0.6rem 0.8rem;
  vertical-align: top;
  text-align: left;
  border-bottom: 1px solid color-mix(in srgb, currentColor 14%, transparent);
}

/* Header com leve destaque que adapta aos 2 temas (sem cor fixa). */
.ee-table-scroll > table thead th {
  font-weight: 700;
  background: color-mix(in srgb, currentColor 7%, transparent);
}

/* Zebra leve, adaptativa, com contraste suficiente nos 2 temas. */
.ee-table-scroll > table tbody tr:nth-child(even) td {
  background: color-mix(in srgb, currentColor 4%, transparent);
}

.ee-table-scroll > table tr:last-child td {
  border-bottom: none;
}

/* Cabeçalho fixo no topo do scroll vertical (quando a tabela é alta);
   guardado para não fixar em quem prefere menos movimento de layout. */
@media (prefers-reduced-motion: no-preference) {
  .ee-table-scroll > table thead th {
    position: sticky;
    top: 0;
    z-index: 1;
  }
}

/* ---- Guard de reduced-motion ------------------------------------------
   Mantém o scroll suave de inércia desligado quando o usuário pede menos
   movimento (a rolagem em si continua funcional). */
@media (prefers-reduced-motion: reduce) {
  .ee-table-scroll {
    scroll-behavior: auto;
  }
}


/* Correções verificadas na auditoria de setembro de 2026.
   As grades preservam sua largura preferida, mas cabem também no espaço
   disponível a 320px e com zoom. O conteúdo largo continua rolável localmente. */
.oc-cards,
.fn-cards {
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr));
}

.mc-grid,
.ts-cards {
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 300px), 1fr));
}

.mc-grid-inline,
.mc-passos {
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 250px), 1fr));
}

.ca-hub {
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 290px), 1fr));
}

.oc-toc ul,
.oc-related-grid {
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 240px), 1fr));
}

.vz-ccs {
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 190px), 1fr));
}

.vz-nums,
.ca-results {
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 150px), 1fr));
}

.vz-bar-leg {
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 200px), 1fr));
}

.bv-list {
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 260px), 1fr));
}

/* Filhos de flex/grid precisam poder encolher antes de quebrar o texto.
   A matriz mantém dois eixos e quatro quadrantes; não perde sua semântica. */
.viz,
.viz-inline,
.viz-astro,
.viz-wrap,
.vz-step-tx,
.vz-rung-tx,
.vz-ly-tx,
.vz-cy-tx,
.vz-sw-tx,
.vz-destaque > div,
.oc-rcard,
.oc-card,
.fn-card,
.mc-card,
.ts-card,
.ca-panel {
  min-width: 0;
}

.viz :is(strong, .vz-src, .vz-step-tx, .vz-rung-tx, .vz-ly-tx, .vz-cy-tx, .vz-d-body),
.oc-rcard,
.oc-tr-head,
.oc-tr-nav span {
  overflow-wrap: anywhere;
}

.vz-mx {
  grid-template-columns: auto minmax(0, 1fr);
}

.vz-mx-grid {
  grid-template-columns: repeat(2, minmax(0, 1fr));
}

.vz-q {
  min-width: 0;
  overflow-wrap: anywhere;
}

.vz-mx-xl,
.vz-mx-xr {
  max-width: 48%;
  overflow-wrap: anywhere;
}

.vz-mx-xr {
  text-align: right;
}

.ec-table-wrap,
.ee-table-scroll,
.vz-barras-scroll,
.vz-sw-scroll,
.vz-hm-scroll,
.vz-cp-scroll {
  min-width: 0;
  max-width: 100%;
  overscroll-behavior-x: contain;
}

/* O parágrafo continha texto solto entre filhos flex, produzindo colunas
   comprimidas no celular. O fluxo de texto preserva o link dentro da frase. */
.oc-glosslink {
  display: block;
}

.oc-glosslink :is(i, svg) {
  display: inline-block;
  width: 1rem;
  height: 1rem;
  margin-right: .35rem;
  vertical-align: -.15em;
}

.oc-tr-head {
  flex-wrap: wrap;
}

/* Herda a marca Astro. A declaração anterior referenciava a própria variável
   no mesmo elemento, invalidando o token e os fundos derivados em 110 páginas. */
.viz-astro {
  --color-brand: inherit;
}

@media (max-width: 640px) {
  .vz-rung {
    flex-wrap: wrap;
    align-items: flex-start;
  }

  .vz-rung-tx {
    flex: 1 1 calc(100% - 3rem);
  }

  .vz-rung-tag {
    margin-left: 2.35rem;
  }

  .oc-tr-pos {
    white-space: nowrap;
  }

  .vz-rosca .vz-rosca-svg {
    width: 108px;
    height: 108px;
  }
}


/* Os visuais foram inseridos entre o ícone e o título em cabeçalhos flex.
   Uma linha exclusiva para a figura evita empurrar o título para fora da tela. */
.flex:has(> .viz-astro, > .viz-wrap, > .viz) {
  flex-wrap: wrap;
}

.flex:has(> .viz-astro, > .viz-wrap, > .viz) > :is(h2, h3) {
  min-width: 0;
  flex: 1 1 0;
}

/* O cabeçalho Astro tem nove entradas e busca. Duas linhas deixam a busca
   acessível e preservam o tamanho dos rótulos. O painel usa o header como
   referência, evitando transbordamento dos menus das pontas. */
[data-header] > nav {
  flex-wrap: wrap;
  max-width: 1600px;
}

[data-header] > nav > ul {
  order: 3;
  flex: 1 1 100%;
  min-width: 0;
  margin-left: 0;
  justify-content: space-between;
}

[data-header] .menu-item {
  position: static;
}

[data-header] .menu-btn {
  min-height: 44px;
  max-width: 100%;
  line-height: 1.3;
}

[data-header] .busca-btn {
  width: 250px;
  flex-shrink: 0;
  min-height: 44px;
}

[data-header] .mega {
  left: 50%;
  top: 100%;
  max-width: calc(100vw - 2rem);
  max-height: calc(100dvh - var(--ee-header-height, 9rem) - 1rem);
  overflow-y: auto;
  overscroll-behavior: contain;
}

.hd .mega {
  max-height: calc(100dvh - var(--ee-header-height, 4rem));
  overflow-y: auto;
  overscroll-behavior: contain;
}

.hd-in > .brand,
.hero-grid > div,
.flowcard,
.flow-step > div {
  min-width: 0;
}

.hd .burger {
  flex: 0 0 44px;
  width: 44px;
  height: 44px;
}

.hero .eyebrow,
.hero .btn,
.prod-card .btn {
  max-width: 100%;
  white-space: normal;
  overflow-wrap: anywhere;
}

@media (min-width: 1024px) and (max-width: 1099px) {
  [data-header] > nav > ul,
  [data-header] .busca-btn {
    display: none;
  }

  [data-header] [data-open-search]:not(.busca-btn),
  [data-header] [data-drawer-toggle] {
    display: grid;
  }
}

@media (max-width: 1100px) {
  .hd .nav {
    display: none;
  }

  .hd .burger {
    display: block;
  }
}

@media (max-width: 900px) {
  .hero-grid .flowcard {
    order: 0;
    max-width: 100%;
  }
}

@media (max-width: 600px) {
  .hd-in > .btn {
    display: none;
  }

  .hd-in {
    gap: .75rem;
  }

  .hero-cta .btn {
    width: 100%;
    justify-content: center;
    text-align: center;
  }
}


/* Os mínimos fixos do mapa e do playbook excediam os 305px úteis de
   um viewport de 320px com barra de rolagem do sistema. */
.mp-body {
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 320px), 1fr));
}

.mp-trans-grid {
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 300px), 1fr));
}

.mp-pillar {
  min-width: 0;
}

body:has(> .topbar) {
  min-width: 0;
}

/* Tabelas equivalentes de gráficos são mantidas para leitores de tela.
   O mínimo de uma tabela visual não pode ampliar a alternativa oculta. */
.ee-table-scroll > table:is(.sr-only, .visually-hidden) {
  min-width: 0;
}

@media (max-width: 640px) {
  .geo-nav {
    flex-wrap: wrap;
    gap: .4rem 1rem;
  }

  .geo-nav-brand {
    flex-shrink: 0;
    white-space: nowrap;
  }

  .geo-nav-links {
    flex-wrap: wrap;
    gap: .25rem 1rem;
  }

  .geo-nav-links a {
    white-space: nowrap;
  }
}

/* A grade do glossário respeita a coluna útil em telas de 320px. */
.gl-grid {
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 300px), 1fr));
}

.gl-term {
  min-width: 0;
}

/* O rótulo longo do glossário não pode expulsar a busca da barra de leitura. */
@media (max-width:480px) {
  .oc-mini-crumb {min-width:0;max-width:42vw;overflow:hidden;text-overflow:ellipsis;}
}


/* ===== w3-dataviz.css ===== */
/* w3-dataviz.css — WAVE 3 (Dataviz Cockpit & Polish de Componentes) do portal /ecommerce.
   Camada universal, ADITIVA e de BAIXA especificidade injetada no <head> das 182 paginas
   (familia A: onclick/teses/etc. com --ink/--paper/--brand; familia B: guias/ Astro com
   --color-* e data-astro-cid-*). Principio do dono (cockpit de decisao): nenhum dado
   depende SO de cor — sempre cor + seta/icone + numero. Bullet > gauge. tabular-nums.

   Regras observadas:
   - Acentuacao PT-BR em strings visiveis/aria; ZERO emojis.
   - Contraste WCAG AA nos 2 temas; semanticas (positivo/negativo/atencao) CLAREIAM no dark.
   - Tokens proprios com prefixo --ee-* definidos em :root e reescritos para o dark via
     @media (prefers-color-scheme:dark) E via [data-oc-theme="dark"] (toggle manual da familia A).
   - Sem seletor universal `*`. Sem !important em cor. Animacao com guard de reduced-motion.
   - Nao reescreve componentes existentes: REFORCA com seletores simples e :where() controlado.
   - Marca: var(--color-brand, var(--brand, #0166c4)). Texto: var(--color-text, var(--ink, #181818)).
     Superficie: var(--color-bg, var(--paper, #fff)) e var(--color-bg-section). */

/* =====================================================================
   1. Tokens semanticos proprios (--ee-*) que adaptam aos 2 temas.
   Valores claros (light) com bom contraste sobre fundo branco; no dark
   eles CLAREIAM para manter AA sobre fundo escuro. color-mix garante
   uma superficie tonal sutil derivada da propria semantica.
   ===================================================================== */
:root {
  --ee-brand: var(--color-brand, var(--brand, #0166c4));
  --ee-ink: var(--color-text, var(--ink, #181818));
  --ee-good: #1f7a45;   /* verde escuro AA sobre claro */
  --ee-bad: #c0341d;    /* vermelho AA sobre claro */
  --ee-warn: #9a6400;   /* ambar/marrom AA sobre claro */
  --ee-info: var(--ee-brand);
  /* Superficie neutra derivada do texto, util para faixas/realces sutis. */
  --ee-surface: color-mix(in srgb, var(--ee-ink) 5%, transparent);
  /* Sombras coerentes nos 2 temas. */
  --ee-shadow-1: 0 1px 2px rgba(16, 24, 40, 0.06), 0 1px 3px rgba(16, 24, 40, 0.10);
  --ee-shadow-2: 0 10px 28px rgba(16, 24, 40, 0.14);
}

/* Dark automatico (familia A e B usam data-theme-mode="auto"). */
@media (prefers-color-scheme: dark) {
  :root[data-theme-mode="auto"] {
    --ee-good: #5fd99a;   /* clareia no dark */
    --ee-bad: #ff8a73;
    --ee-warn: #f0c267;
    --ee-surface: color-mix(in srgb, var(--ee-ink) 12%, transparent);
    --ee-shadow-1: 0 1px 2px rgba(0, 0, 0, 0.45), 0 1px 3px rgba(0, 0, 0, 0.55);
    --ee-shadow-2: 0 12px 30px rgba(0, 0, 0, 0.55);
  }
}

/* Dark manual (toggle da familia A: :root[data-oc-theme="dark"]). */
:root[data-oc-theme="dark"] {
  --ee-good: #5fd99a;
  --ee-bad: #ff8a73;
  --ee-warn: #f0c267;
  --ee-surface: color-mix(in srgb, var(--ee-ink) 12%, transparent);
  --ee-shadow-1: 0 1px 2px rgba(0, 0, 0, 0.45), 0 1px 3px rgba(0, 0, 0, 0.55);
  --ee-shadow-2: 0 12px 30px rgba(0, 0, 0, 0.55);
}
/* Light manual explicito reverte para os valores claros (se o usuario forcar light
   num SO em dark, nao herda os tons claros do @media acima). */
:root[data-oc-theme="light"] {
  --ee-good: #1f7a45;
  --ee-bad: #c0341d;
  --ee-warn: #9a6400;
  --ee-surface: color-mix(in srgb, var(--ee-ink) 5%, transparent);
}

/* Fallback de superficie sem color-mix (navegadores antigos). */
@supports not (color: color-mix(in srgb, red, blue)) {
  :root { --ee-surface: rgba(24, 24, 24, 0.05); }
}

/* =====================================================================
   2. tabular-nums em numeros (nao herdado por padrao).
   Aplica figuras de largura fixa onde ha leitura comparativa de numeros,
   sem tocar a cor. :where() mantem especificidade ZERO p/ nao brigar com
   o CSS scoped do Astro.
   ===================================================================== */
:where(.oc-kpi, .statcounter, .vz-num, .vz-mt, .vz-num-n, .statcounter-num, .statcounter-value)
  :where(.num, [class*="value"], [class*="-num"], [class*="-n"], strong, b),
:where(.vz-num-n, .vz-mt-val, .statcounter-num, .statcounter-value),
:where(.ee-tnum) {
  font-variant-numeric: tabular-nums;
  font-feature-settings: "tnum" 1;
}

/* Celulas numericas de tabela: alinhamento e tabular-nums apenas quando marcadas
   pelo JS como numericas (evita afetar colunas de texto). */
:where(.ec-table) td.ee-numcell,
:where(.ec-table) th.ee-numcell {
  font-variant-numeric: tabular-nums;
  font-feature-settings: "tnum" 1;
  text-align: right;
}

/* =====================================================================
   3. Polish de cards (.oc-card, .ts-card, .vz-cc): borda/sombra/raio que
   adaptam aos 2 temas; elevacao leve no hover/focus-within (guard motion).
   NAO altera cor de texto. Baixa especificidade.
   ===================================================================== */
:where(.oc-card, .ts-card, .vz-cc) {
  border-color: color-mix(in srgb, var(--ee-ink) 12%, var(--color-border-light, transparent));
  box-shadow: var(--ee-shadow-1);
  transition: transform 0.16s ease, box-shadow 0.18s ease, border-color 0.18s ease;
}

@media (prefers-reduced-motion: no-preference) {
  :where(.oc-card, .ts-card):hover,
  :where(.oc-card, .ts-card):focus-within,
  :where(.vz-cc):hover {
    transform: translateY(-2px);
    box-shadow: var(--ee-shadow-2);
    border-color: color-mix(in srgb, var(--ee-brand) 38%, transparent);
  }
}
@media (prefers-reduced-motion: reduce) {
  :where(.oc-card, .ts-card):hover,
  :where(.oc-card, .ts-card):focus-within,
  :where(.vz-cc):hover {
    box-shadow: var(--ee-shadow-2);
    border-color: color-mix(in srgb, var(--ee-brand) 38%, transparent);
  }
}

/* =====================================================================
   4. KPIs (.oc-kpi) — reforco de layout claro: rotulo + valor grande
   tabular + delta. A marca lateral ::before ja existe na familia A; aqui
   so garantimos respiro e que o valor respire. NAO sobrescrevemos cores.
   ===================================================================== */
:where(.oc-kpi) {
  display: flex;
  flex-direction: column;
  gap: 0.2rem;
}
/* Valor grande quando o autor usa .ee-kpi-value (opt-in, nao quebra markup atual). */
:where(.oc-kpi) .ee-kpi-value {
  font-size: 1.5rem;
  font-weight: 800;
  line-height: 1.1;
  color: var(--ee-ink);
  font-variant-numeric: tabular-nums;
}

/* ---- Utilitarios de delta: cor + ICONE de seta + sinal + numero ----
   Nunca SO cor: a seta (caractere acessivel, aria-hidden no markup) garante
   leitura sem cor. O sinal textual fica a cargo do conteudo. */
.ee-delta {
  display: inline-flex;
  align-items: center;
  gap: 0.25rem;
  font-size: 0.85rem;
  font-weight: 700;
  line-height: 1.2;
  font-variant-numeric: tabular-nums;
  border-radius: 999px;
  padding: 0.1rem 0.45rem;
  white-space: nowrap;
}
.ee-delta::before {
  font-weight: 900;
  font-size: 0.9em;
  line-height: 1;
}
.ee-delta--up {
  color: var(--ee-good);
  background: color-mix(in srgb, var(--ee-good) 14%, transparent);
}
.ee-delta--up::before { content: "\2191"; } /* seta para cima */
.ee-delta--down {
  color: var(--ee-bad);
  background: color-mix(in srgb, var(--ee-bad) 14%, transparent);
}
.ee-delta--down::before { content: "\2193"; } /* seta para baixo */
.ee-delta--flat {
  color: var(--color-text-secondary, var(--ee-ink));
  background: var(--ee-surface);
}
.ee-delta--flat::before { content: "\2192"; } /* seta lateral (estavel) */

/* =====================================================================
   5. Reforco dos visuais .viz / .vz-* — respiro, legibilidade, contraste
   de borda e a fonte (.vz-src) discreta porem legivel. Sem tocar cores
   de texto principais; apenas reforca o que pode ficar pequeno demais.
   ===================================================================== */
:where(.viz) {
  box-shadow: var(--ee-shadow-1);
}
/* Fonte/legenda discreta porem com contraste AA garantido. */
:where(.vz-src),
:where(.viz figcaption) {
  font-size: 0.78rem;
  line-height: 1.5;
  color: color-mix(in srgb, var(--ee-ink) 62%, transparent);
}
/* Garante tamanho minimo legivel (>=14px) em textos auxiliares dos visuais. */
:where(.vz-num-r, .vz-cc span, .vz-mt-nota, .vz-step-tx span, .vz-rung-tx span) {
  font-size: clamp(0.875rem, 0.84rem + 0.15vw, 0.95rem);
}

/* Medidor .vz-mt (bullet/barra): o nivel ja vem legivel em .vz-mt-val; aqui so
   reforcamos contraste do trilho e da legenda, e tabular-nums no valor. */
:where(.vz-mt-val) {
  font-variant-numeric: tabular-nums;
  font-feature-settings: "tnum" 1;
}
:where(.vz-mt-track) {
  border-color: color-mix(in srgb, var(--ee-ink) 16%, var(--color-border-light, transparent));
}
/* Barra entra com animacao de largura SO fora de reduced-motion; nunca esconde
   o valor (que e textual e independe da barra). */
@media (prefers-reduced-motion: no-preference) {
  :where(.vz-mt-fill) {
    transition: width 0.9s cubic-bezier(0.22, 1, 0.36, 1);
  }
}

/* Escada de maturidade .vz-rung: a etiqueta .vz-rung-tag e o numero .vz-rung-n
   ja indicam o nivel sem depender de cor. Reforco de contraste da etiqueta. */
:where(.vz-rung-tag) {
  border: 1px solid color-mix(in srgb, var(--ee-brand) 28%, transparent);
}

/* Faixa de numeros .vz-num: leve realce de superficie e respiro. */
:where(.vz-num) {
  box-shadow: var(--ee-shadow-1);
}

/* =====================================================================
   6. Tabelas de comparacao Sim/Nao/Parcial: utilitarios marcados pelo JS.
   Icone (check/x/travessao) ANTES do texto, garantindo leitura sem cor.
   O JS adiciona um <span aria-hidden> com o glifo + a classe; o texto
   visivel permanece. Cores CLAREIAM no dark.
   ===================================================================== */
:where(.ee-yes, .ee-no, .ee-partial) {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  font-weight: 600;
}
:where(.ee-yes) { color: var(--ee-good); }
:where(.ee-no) { color: var(--ee-bad); }
:where(.ee-partial) { color: var(--ee-warn); }
/* O glifo e fornecido pelo JS num <span class="ee-ic" aria-hidden="true">. */
:where(.ee-ic) {
  display: inline-grid;
  place-items: center;
  width: 1.15em;
  height: 1.15em;
  flex: 0 0 auto;
  font-weight: 900;
  line-height: 1;
  border-radius: 50%;
}
:where(.ee-yes) .ee-ic {
  color: var(--ee-good);
  background: color-mix(in srgb, var(--ee-good) 16%, transparent);
}
:where(.ee-no) .ee-ic {
  color: var(--ee-bad);
  background: color-mix(in srgb, var(--ee-bad) 16%, transparent);
}
:where(.ee-partial) .ee-ic {
  color: var(--ee-warn);
  background: color-mix(in srgb, var(--ee-warn) 16%, transparent);
}

/* =====================================================================
   7. "scroll shadow" sutil para faixas de numeros que rolam (.vz-nums,
   .vz-num e wrappers de tabela com overflow). Indica conteudo cortado.
   Usa fundo fixo + gradiente local (tecnica de mascara de scroll).
   ===================================================================== */
:where(.ec-table-wrap, .vz-nums) {
  background:
    linear-gradient(to right, var(--color-bg, #fff) 30%, transparent),
    linear-gradient(to right, transparent, var(--color-bg, #fff) 70%) 100% 0,
    radial-gradient(farthest-side at 0 50%, color-mix(in srgb, var(--ee-ink) 16%, transparent), transparent),
    radial-gradient(farthest-side at 100% 50%, color-mix(in srgb, var(--ee-ink) 16%, transparent), transparent) 100% 0;
  background-repeat: no-repeat;
  background-size: 32px 100%, 32px 100%, 14px 100%, 14px 100%;
  background-attachment: local, local, scroll, scroll;
}

/* =====================================================================
   8. Rede de seguranca de reduced-motion para as animacoes desta wave.
   ===================================================================== */
@media (prefers-reduced-motion: reduce) {
  :where(.vz-mt-fill, .oc-card, .ts-card, .vz-cc) {
    transition-duration: 0.01ms;
  }
}


/* ===== w4-motion.css ===== */
/* w4-motion.css — WAVE 4 (Motion Moderno & Micro-interacoes) do portal /ecommerce.
   Camada universal, aditiva, defensiva e idempotente injetada no <head> das 182
   paginas (familias A e B). Entrega: reveal-on-scroll sutil (JS + versao nativa
   scroll-driven via @supports), entrada suave de details/popover/dialog com
   @starting-style, hover-lift e press-feedback em cards/CTAs, botao "Voltar ao
   topo" (.ee-top) com safe-area, barra de progresso de leitura (.ee-progress)
   so para conteudo longo da familia A, sheen de foco em navegacao e
   view-transition-name no h1.

   REGRA CRITICA DE MOTION: TODA animacao/transicao so LIGA dentro de
   @media (prefers-reduced-motion: no-preference) e e DESLIGADA por completo em
   @media (prefers-reduced-motion: reduce). @supports protege recursos novos
   (animation-timeline, @starting-style, allow-discrete) com fallback gracioso.

   Regras: contraste WCAG AA nos 2 temas via currentColor/color-mix; marca com
   fallback encadeado --color-brand (familia B) -> --brand (familia A) -> #0166c4;
   !important evitado; nunca usar seletor universal `*` (so na rede de seguranca
   de reduced-motion, padrao aceito); transform/opacity (compositaveis);
   will-change com parcimonia. NAO duplica o que a familia B ja faz
   (view-transitions, scroll-driven .viz, barra de progresso do TOC). */

/* =======================================================================
   1) REVEAL-ON-SCROLL SUTIL
   Estado inicial so quando o usuario aceita movimento. O JS marca alvos
   seguros com .ee-reveal e troca para .ee-in via IntersectionObserver.
   ======================================================================= */
@media (prefers-reduced-motion: no-preference) {
  .ee-reveal {
    opacity: 0;
    transform: translateY(12px);
    /* will-change pontual: removido pelo JS apos a transicao (.ee-in). */
    will-change: opacity, transform;
  }

  .ee-reveal.ee-in {
    opacity: 1;
    transform: none;
    transition: opacity 0.5s ease, transform 0.5s ease;
  }

  /* Stagger leve opcional por indice (data-ee-i no elemento). Aplicado
     apenas a delay; nao altera a duracao. */
  .ee-reveal[data-ee-i="1"] { transition-delay: 0.06s; }
  .ee-reveal[data-ee-i="2"] { transition-delay: 0.12s; }
  .ee-reveal[data-ee-i="3"] { transition-delay: 0.18s; }
  .ee-reveal[data-ee-i="4"] { transition-delay: 0.24s; }
  .ee-reveal[data-ee-i="5"] { transition-delay: 0.30s; }
}

/* Versao nativa sem JS (scroll-driven) para os mesmos alvos, quando o
   navegador suportar animation-timeline. So liga fora de reduced-motion.
   O atributo data-ee-scrolldriven e setado pelo JS quando ha suporte,
   evitando conflito com a transicao baseada em IntersectionObserver. */
@supports (animation-timeline: view()) {
  @media (prefers-reduced-motion: no-preference) {
    .ee-reveal[data-ee-scrolldriven] {
      opacity: 0;
      transform: translateY(12px);
      animation: ee-reveal-in linear both;
      animation-timeline: view();
      /* Anima na entrada do elemento na viewport e estabiliza cedo. */
      animation-range: entry 0% cover 22%;
      will-change: opacity, transform;
    }
  }

  @keyframes ee-reveal-in {
    to {
      opacity: 1;
      transform: none;
    }
  }
}

/* =======================================================================
   2) ENTRADA SUAVE DE details/popover/dialog (@starting-style)
   Fallback gracioso: sem suporte, abre instantaneo (comportamento atual).
   ======================================================================= */
@supports (transition-behavior: allow-discrete) {
  @media (prefers-reduced-motion: no-preference) {
    /* Conteudo de <details open> (exceto o resumo) entra suavemente. */
    details[open] > :not(summary) {
      animation: ee-disclose 0.32s ease both;
    }

    @keyframes ee-disclose {
      from {
        opacity: 0;
        transform: translateY(-4px);
      }
      to {
        opacity: 1;
        transform: none;
      }
    }

    /* Popover nativo: transicao de entrada/saida com display discreto. */
    :where([popover]):popover-open {
      opacity: 1;
      transform: none;
      transition: opacity 0.25s ease, transform 0.25s ease, overlay 0.25s allow-discrete,
        display 0.25s allow-discrete;
    }
    :where([popover]) {
      opacity: 0;
      transform: translateY(6px);
    }
    @starting-style {
      :where([popover]):popover-open {
        opacity: 0;
        transform: translateY(6px);
      }
    }

    /* Dialog nativo aberto: fade-in suave do painel. */
    dialog[open] {
      opacity: 1;
      transition: opacity 0.25s ease, overlay 0.25s allow-discrete,
        display 0.25s allow-discrete;
    }
    @starting-style {
      dialog[open] {
        opacity: 0;
      }
    }
  }
}

/* =======================================================================
   3) MICRO-INTERACOES: hover-lift e press-feedback
   transform + sombra via color-mix (herda currentColor). Compositavel.
   ======================================================================= */
@media (prefers-reduced-motion: no-preference) {
  .oc-card,
  .ts-card,
  .vz-cc,
  .oc-cta {
    transition: transform 0.2s ease, box-shadow 0.2s ease;
  }

  /* Sem :hover em dispositivos sem ponteiro fino (evita "grudar" no touch). */
  @media (hover: hover) and (pointer: fine) {
    .oc-card:hover,
    .ts-card:hover,
    .vz-cc:hover,
    .oc-cta:hover {
      transform: translateY(-2px);
      box-shadow: 0 8px 22px
        color-mix(in srgb, currentColor 14%, transparent);
    }
  }

  /* Press/active feedback leve (vale para teclado e ponteiro). */
  .oc-card:active,
  .ts-card:active,
  .vz-cc:active,
  .oc-cta:active,
  button:active,
  [role="button"]:active {
    transform: translateY(0) scale(0.99);
  }
}

/* =======================================================================
   4) BOTAO "VOLTAR AO TOPO" (.ee-top)
   Fixo, circular, alto contraste nos 2 temas, foco visivel, respeita
   safe-area. Aparece via .ee-show (controlado pelo JS).
   ======================================================================= */
.ee-top {
  position: fixed;
  right: calc(1rem + env(safe-area-inset-right, 0px));
  bottom: calc(1rem + env(safe-area-inset-bottom, 0px));
  z-index: 99990;
  width: 2.75rem;
  height: 2.75rem;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: 1px solid color-mix(in srgb, #ffffff 28%, transparent);
  border-radius: 999px;
  /* Marca como fundo + texto branco => AA garantido nos 2 temas. */
  background: var(--color-brand, var(--brand, #0166c4));
  color: #ffffff;
  cursor: pointer;
  box-shadow: 0 6px 18px rgba(0, 0, 0, 0.28);
  /* Escondido por padrao, sem capturar clique. */
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  padding: 0;
}

.ee-top svg {
  width: 1.25rem;
  height: 1.25rem;
  display: block;
  fill: none;
  stroke: currentColor;
  stroke-width: 2.25;
  stroke-linecap: round;
  stroke-linejoin: round;
}

.ee-top.ee-show {
  opacity: 1;
  visibility: visible;
  pointer-events: auto;
}

@media (hover: hover) and (pointer: fine) {
  .ee-top:hover {
    background: color-mix(
      in srgb,
      var(--color-brand, var(--brand, #0166c4)) 88%,
      #000000
    );
  }
}

@media (prefers-reduced-motion: no-preference) {
  .ee-top {
    transition: opacity 0.3s ease, visibility 0.3s ease, transform 0.18s ease,
      background-color 0.18s ease;
    transform: translateY(8px);
  }
  .ee-top.ee-show {
    transform: translateY(0);
  }
  .ee-top:active {
    transform: scale(0.94);
  }
}

/* =======================================================================
   5) BARRA DE PROGRESSO DE LEITURA (.ee-progress)
   So injetada/exibida pelo JS em paginas de conteudo longo da FAMILIA A
   (que NAO possuem .toc-progresso da familia B). Fina, fixa no topo.
   ======================================================================= */
.ee-progress {
  position: fixed;
  top: 0;
  left: 0;
  height: 3px;
  width: 0;
  z-index: 99991;
  background: var(--color-brand, var(--brand, #0166c4));
  transform-origin: 0 50%;
  pointer-events: none;
}

@media (prefers-reduced-motion: no-preference) {
  .ee-progress {
    transition: width 0.08s linear;
  }
}

/* =======================================================================
   6) SHEEN/REALCE DE FOCO EM NAVEGACAO + VIEW-TRANSITION NO H1
   Sublinhado sutil que cresce no hover/focus de links de navegacao.
   ======================================================================= */
@media (prefers-reduced-motion: no-preference) {
  :is(nav, .hd nav, [role="navigation"]) a {
    background-image: linear-gradient(
      currentColor,
      currentColor
    );
    background-repeat: no-repeat;
    background-position: 0 100%;
    background-size: 0% 1.5px;
    transition: background-size 0.25s ease;
  }

  @media (hover: hover) and (pointer: fine) {
    :is(nav, .hd nav, [role="navigation"]) a:hover {
      background-size: 100% 1.5px;
    }
  }

  :is(nav, .hd nav, [role="navigation"]) a:focus-visible {
    background-size: 100% 1.5px;
  }
}

/* Nome de view-transition no h1 para transicoes de pagina suaves, quando a
   navegacao usar a View Transitions API. So liga com suporte e sem reduce. */
@supports (view-transition-name: none) {
  @media (prefers-reduced-motion: no-preference) {
    h1 {
      view-transition-name: ee-page-title;
    }
  }
}

/* =======================================================================
   7) REDE DE SEGURANCA DE reduced-motion
   Desliga por completo tudo o que esta acima quando o usuario pede menos
   movimento. O `*` e permitido SOMENTE neste bloco (padrao aceito).
   ======================================================================= */
@media (prefers-reduced-motion: reduce) {
  .ee-reveal,
  .ee-reveal.ee-in,
  .ee-reveal[data-ee-scrolldriven] {
    opacity: 1 !important;
    transform: none !important;
    animation: none !important;
    transition: none !important;
    will-change: auto;
  }

  .ee-top {
    transition: none;
    transform: none;
  }

  .ee-progress {
    transition: none;
  }

  h1 {
    view-transition-name: none;
  }

  *,
  *::before,
  *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
}


/* ===== w5-perf.css ===== */
/* w5-perf.css — WAVE 5 (Performance, SEO/GEO & Robustez Final) do portal /ecommerce.
   Camada universal, aditiva e defensiva injetada no <head> das 182 paginas
   (familias A e B). Entrega:
   - content-visibility conservador via classe .ee-cv (adicionada pelo JS apenas
     a secoes ABAIXO da dobra; NUNCA no hero/primeira secao, para nao atrasar LCP);
   - fallback de stack de fonte de sistema em :root SO quando as variaveis de
     fonte estiverem ausentes (nao sobrescreve nada existente);
   - reforco de contraste em prefers-contrast: more (bordas e sublinhado de links);
   - print stylesheet (@media print) que esconde UI interativa, garante preto
     sobre branco e evita quebras ruins de figura/tabela;
   - scroll-padding-top defensivo para ancoras sob header sticky;
   - imagens fluidas (defensivo/idempotente; duplica regra inofensiva da wave 2).
   Regras: contraste WCAG AA nos 2 temas; nunca usar seletor universal `*`;
   `!important` so onde estritamente necessario; animacao com guard de motion.
   Cor de marca com fallback encadeado: --color-brand (familia B) -> --brand
   (familia A) -> #0166c4. */

/* ---- content-visibility conservador para secoes fora da primeira dobra ---
   A classe .ee-cv e adicionada pelo JS somente a secoes abaixo da dobra,
   pulando o hero/primeira secao. content-visibility:auto pula a renderizacao
   de subarvores fora da viewport (ganho de LCP/render); contain-intrinsic-size
   reserva altura estimada para evitar saltos no scrollbar. Valor generoso de
   600px reduz reflow ao entrar na viewport. */
.ee-cv {
  content-visibility: auto;
  contain-intrinsic-size: auto 600px;
}

/* Quem prefere menos movimento tende a sofrer mais com saltos de layout;
   relaxa a estimativa para reduzir reflow visivel ao revelar a secao. */
@media (prefers-reduced-motion: reduce) {
  .ee-cv {
    contain-intrinsic-size: auto 800px;
  }
}

/* ---- Fallback de stack de fonte de sistema (somente se ausente) ----------
   Nao e possivel forcar font-display:swap sobre @font-face de terceiros via
   CSS. Em vez disso, garantimos uma pilha de sistema coerente como FALLBACK
   nas variaveis de fonte — usando o proprio valor existente quando ele houver
   (var(--x, fallback)). Isso nunca sobrescreve fontes ja definidas; so cobre
   o caso de a variavel inexistir, evitando texto sem fonte definida. */
:root {
  --ee-font-sans-fallback: var(
    --color-font-sans,
    var(
      --font-sans,
      "Inter",
      system-ui,
      -apple-system,
      "Segoe UI",
      Roboto,
      Helvetica,
      Arial,
      sans-serif
    )
  );
  --ee-font-serif-fallback: var(
    --color-font-serif,
    var(--font-serif, "Newsreader", Georgia, "Times New Roman", serif)
  );
}

/* ---- prefers-contrast: more — reforco de contraste nos 2 temas -----------
   Em modo de alto contraste, reforca bordas de elementos de UI e sublinha
   links de conteudo (prosa) para garantir distinguibilidade sem cor.
   Escopo de sublinhado restrito a contextos de prosa para nao poluir a UI. */
@media (prefers-contrast: more) {
  :where(.ee-table-scroll, table, fieldset, .oc-card, .ts-card, figure) {
    border-width: 2px;
    border-style: solid;
    border-color: currentColor;
  }

  :where(.oc-body, .guia-corpo, article, main p, main li) a {
    text-decoration: underline;
    text-underline-offset: 2px;
    text-decoration-thickness: from-font;
  }

  :where(a, button, summary, [tabindex], input, textarea, select, [role="button"]):focus-visible {
    outline-width: 4px !important;
  }
}

/* Suporte equivalente para o legado -ms-high-contrast / forced-colors. */
@media (forced-colors: active) {
  :where(.oc-body, .guia-corpo, article, main p, main li) a {
    text-decoration: underline;
  }
}

/* ---- scroll-padding-top para ancoras sob header sticky -------------------
   Complementa o scroll-margin-top da wave 1 atuando no contêiner de rolagem.
   Valor coerente (5rem) com a wave 1; nao conflita pois age em eixo diferente
   (padding do scroll container vs. margin do alvo). */
:root {
  scroll-padding-top: 5rem;
}

/* ---- Imagens fluidas (defensivo/idempotente; duplica wave 2 sem dano) ----
   :where() tem especificidade 0: nao vence regras de layout existentes,
   atua so onde nada define. content-visibility em <img> seria arriscado
   (pode esconder LCP), entao NAO usamos — apenas garantimos fluidez. */
:where(img) {
  max-width: 100%;
  height: auto;
}

/* ---- Print stylesheet ----------------------------------------------------
   Esconde UI puramente interativa, normaliza para preto sobre branco e evita
   quebras ruins. Os seletores .ee-top/.ee-progress sao referencias futuras
   (waves 3/4): escondidos defensivamente mesmo que ainda nao existam. */
@media print {
  /* Esconder controles interativos e cromos de navegacao. */
  :where(
    .ee-top,
    .ee-progress,
    .ee-fab,
    .ee-back-to-top,
    .ee-drawer,
    [data-ee-drawer],
    [role="dialog"],
    dialog,
    .oc-skip,
    .ec-skip,
    [hidden]
  ) {
    display: none !important;
  }

  /* Navegacao sticky/fixa nao deve flutuar nem ocupar paginas impressas. */
  :where(nav, header, .hd, [role="navigation"], .oc-toc) {
    position: static !important;
    box-shadow: none !important;
  }

  /* Texto preto sobre branco para legibilidade e economia de tinta. */
  :where(html, body) {
    background: #ffffff !important;
    color: #000000 !important;
  }

  :where(p, li, td, th, h1, h2, h3, h4, h5, h6, figcaption, blockquote) {
    color: #000000 !important;
  }

  /* Links de conteudo legiveis: cor preta, sublinhados; URL nao expandida
     para nao poluir (decisao conservadora). */
  :where(a) {
    color: #000000 !important;
    text-decoration: underline;
  }

  /* Evitar cortes ruins de blocos coesos no meio de uma pagina. */
  :where(figure, table, pre, blockquote, .oc-card, .ts-card) {
    break-inside: avoid;
    page-break-inside: avoid;
  }

  :where(h1, h2, h3) {
    break-after: avoid;
    page-break-after: avoid;
  }

  /* Tabelas roladas pela wave 2 devem imprimir inteiras, sem barra. */
  :where(.ee-table-scroll) {
    overflow: visible !important;
    border-color: #000000 !important;
  }

  /* Sem animacao alguma na impressao. */
  :where(*) {
    animation: none !important;
    transition: none !important;
  }
}


/* ===== w6-components.css ===== */
/* Compatibilidade de tokens entre componentes publicados e a família Astro. */
:root[data-ee-family="astro"] {
  --color-bg:var(--color-ink-950);--color-bg-alt:var(--color-ink-900);--color-bg-section:var(--color-ink-900);
  --color-text:var(--color-paper);--color-text-secondary:var(--color-ink-300);--color-text-muted:var(--color-ink-400);
  --color-border:var(--color-ink-700);--color-border-light:var(--color-ink-800);
  --color-brand-dark:var(--color-brand-bright);--color-brand-light:var(--color-ink-800);--color-brand-lighter:var(--color-ink-900);
  --brand-ink:var(--color-brand-bright);--color-ink-850:var(--color-ink-900);
}
/* Os mapas antigos trazem a tinta de marca inline; a cor de texto precisa acompanhar o tema. */
:root[data-ee-family="astro"][data-oc-theme="dark"] strong[style*="color:var(--color-brand,"] {
  color:var(--color-brand-bright)!important;
}
:root[data-ee-family="astro"][data-oc-theme="light"] .mmc-nucleo-card-facetas li {background:var(--color-ink-900);}
:root[data-ee-family="astro"][data-oc-theme="light"] .heatmap-adocao__legenda-texto[style*="#c8962c"] {color:#815700!important;}
/* Rótulos de problema e resposta mantêm cores distintas e legíveis no fundo escuro. */
:root[data-oc-theme="dark"] .fn-dor-q > b {color:var(--warn-ink,#f4c879);}
:root[data-oc-theme="dark"] .fn-dor-a > b {color:var(--ee-good,#7fc99a);}


/* ===== w6-navigation.css ===== */
/* As folhas geradas e o roteador Astro têm ciclos de navegação distintos.
   A transição nativa entre documentos podia rejeitar ready com
   "Transition was skipped" ao abrir um guia pela busca da folha gerada.
   O portal mantém as animações dos componentes e as transições do Astro. */
@view-transition { navigation: none; }


/* ===== w6-theme.css ===== */
/* Tema explícito para as três famílias do portal. O atributo é definido antes da pintura. */
:root[data-oc-theme="light"] { color-scheme: light; }
:root[data-oc-theme="dark"] { color-scheme: dark; }
:root[data-ee-family="astro"] {
  --ee-ink: var(--color-paper);
  --ee-brand: var(--color-brand-bright);
}
:root[data-ee-family="astro"][data-oc-theme="light"] {
  --color-ink-950:#ffffff;--color-ink-900:#f5f7fb;--color-ink-800:#e4e9f2;--color-ink-700:#d0d9e7;
  --color-ink-400:#526078;--color-ink-300:#43516a;--color-ink-200:#293850;
  --color-paper:#111b2c;--color-paper-dim:#243249;
  --color-brand:#4f46d5;--color-brand-bright:#4937bd;--color-brand-violet:#6b38c4;
  --color-demand:#4f46d5;--color-experience:#036999;--color-offer:#08774f;--color-execution:#925b00;--color-operating:#b32763;
  --glow-paper-rgb:17 27 44;--glow-alpha:.15;--noise-alpha:.02;
  --ok-text:#167043;--danger-text:#ae2926;
}
:root[data-ee-family="astro"][data-oc-theme="dark"] {
  --color-ink-950:#0a0a0f;--color-ink-900:#12121a;--color-ink-800:#1c1c28;--color-ink-700:#2a2a3a;
  --color-ink-400:#a1a1b7;--color-ink-300:#b4b4c7;--color-ink-200:#d2d2df;
  --color-paper:#fbfbfd;--color-paper-dim:#f1f1f6;
  --color-brand:#6366f1;--color-brand-bright:#a3acff;--color-brand-violet:#ad8cff;
  --color-demand:#a3acff;--color-experience:#5cc6f7;--color-offer:#55dba8;--color-execution:#f9c45c;--color-operating:#f98abc;
}
:root[data-ee-family="commercial"][data-oc-theme="light"] {
  --ink:#0c1322;--ink-2:#33415c;--ink-3:#52617a;--paper:#fff;--paper-2:#f6f8fc;--paper-3:#eef2f9;
  --line:#e2e8f3;--brand:#0166c4;--brand-ink:#014e96;--brand-soft:#e7f1fc;
  --kpl:#0063b4;--kpl-soft:#e8f4fd;--erp:#a75500;--erp-soft:#fbf1e3;
  --accent:#7134de;--accent-soft:#efe8fc;--ok:#197541;--warn:#a24c08;--warn-soft:#fcefe2;
}
:root[data-ee-family="commercial"][data-oc-theme="dark"] {
  --ink:#eef3fb;--ink-2:#c2cde0;--ink-3:#a3b2ce;--paper:#0b1120;--paper-2:#0f1830;--paper-3:#152038;
  --line:#344564;--brand:#4ea3f5;--brand-ink:#8cc6fb;--brand-soft:#142c49;
  --kpl:#4ea3f5;--kpl-soft:#142c49;--erp:#e0a766;--erp-soft:#33260f;
  --accent:#b79bf3;--accent-soft:#231a3d;--ok:#5fc98a;--warn:#e0a766;--warn-soft:#33260f;
}
:root[data-ee-family="commercial"][data-oc-theme="dark"] .btn-primary { background:#0968b5;color:#fff; }
:root[data-ee-family="commercial"] .band { background:#152641; }
:root[data-ee-family="generated"][data-oc-theme="light"] {
  --color-bg:#fff;--color-bg-alt:#f3f3f3;--color-bg-section:#fafaf9;
  --color-text:#181818;--color-text-secondary:#444746;--color-text-muted:#625f5c;
  --color-border:#d8d8d8;--color-border-light:#e5e5e5;--color-brand-light:#e8f4fd;--color-brand-lighter:#f0f8ff;
  --brand-ink:#014486;--warn-ink:#8c4b00;
}
:root[data-oc-theme="light"] {--ee-good:#176b3c;--ee-warn:#825500;--ee-bad:#b52820;}
:root[data-oc-theme="dark"] {--ee-good:#7fc99a;--ee-warn:#e7b466;--ee-bad:#f0998c;}
:root[data-oc-theme] .viz {--vz-good:var(--ee-good);--vz-warn:var(--ee-warn);--vz-bad:var(--ee-bad);}
/* Etiquetas usam uma tinta distinta do preenchimento semântico claro no escuro. */
:root[data-oc-theme="dark"] :is(.vz-rung-agora .vz-rung-n,.vz-step-n,.vz-quad-tag) { color:#101a29; }
:root[data-oc-theme="dark"] .viz {--vz-ink:#8ec7f3;}
:root[data-ee-family="astro"][data-oc-theme="light"] .viz {--vz-ink:#4331b1;}
:root[data-oc-theme="dark"] .ee-yes,:root[data-oc-theme="dark"] .ee-partial,:root[data-oc-theme="dark"] .ee-no {background:transparent;}
.ee-theme {
  position:fixed;right:16px;bottom:72px;z-index:1000;display:grid;place-items:center;
  width:44px;height:44px;border:1px solid var(--color-border,var(--line,#566078));border-radius:50%;
  background:var(--color-bg,var(--paper,var(--color-ink-900,#fff)));
  color:var(--color-text,var(--ink,var(--color-paper,#111b2c)));
  cursor:pointer;box-shadow:0 4px 16px #0002;
}
.ee-theme svg {width:21px;height:21px;fill:none;stroke:currentColor;stroke-width:2;}
:root[data-ee-family="astro"] .ee-theme {background:var(--color-ink-900);color:var(--color-paper);border-color:var(--color-ink-700);}
body:has(.oc-dock) .ee-theme {bottom:180px;}
@media print {.ee-theme {display:none;}}

:root[data-ee-family="astro"] .side-cta {background:#514bdd;color:#fff;}

/* As ferramentas têm uma tinta de marca própria além dos tokens do geo-design. */
:root[data-ee-family="generated"][data-oc-theme="dark"] {--brand-ink:#8ec7f3;--warn-ink:#f4c879;}
:root[data-ee-family="generated"] :is(.oc-crumbs,.oc-glosslink,.oc-foot,.oc-uc-a,.gl-crumbs,.gl-long) a {
  text-decoration:underline;text-underline-offset:.16em;
}

/* Playbooks usa --bg e --panel. Mantém seus componentes nos dois temas explícitos. */
:root[data-ee-family="commercial"]:has(.tab-shell) {
  --color-bg:var(--panel);--color-bg-section:var(--panel-2);
  --color-text:var(--ink);--color-text-secondary:var(--muted);--color-text-muted:var(--subtle);
  --color-border-light:var(--line);--color-brand:var(--front);--color-brand-dark:var(--front);--color-brand-light:var(--panel-2);
}
:root[data-ee-family="commercial"][data-oc-theme="light"]:has(.tab-shell) {
  --bg:#ffffff;--ink:#132438;--muted:#435570;--subtle:#5b6b80;--line:#d1dbe8;
  --panel:#f5f7fb;--panel-2:#edf2f8;--front:#005982;--back:#815d00;--agent:#096444;
  --accent:#5038ab;--risk:#ac2948;--on-accent:#ffffff;--shadow:0 24px 70px #1324381f;
}
:root[data-ee-family="commercial"][data-oc-theme="dark"]:has(.tab-shell) {
  --bg:#091018;--ink:#f7fafc;--muted:#bac5d4;--subtle:#aab5c5;--line:#344354;
  --panel:#111a25;--panel-2:#172332;--front:#77d4ff;--back:#ffd166;--agent:#91f0bd;
  --accent:#b7a8ff;--risk:#ff9eb0;--on-accent:#071018;--shadow:0 24px 70px #00000057;
}
:root[data-ee-family="commercial"]:has(.tab-shell) :is(strong,.flow-row b,.metric b,.decision h4,.matrix-row b,.step h3,.vcard h3,.footer a) {color:var(--ink);}
:root[data-ee-family="commercial"]:has(.tab-shell) .lead {color:var(--muted);}
:root[data-ee-family="commercial"]:has(.tab-shell) :is(.eyebrow,.tag,.matrix-row a,.vcard span) {color:var(--front);border-color:var(--line);}
:root[data-ee-family="commercial"]:has(.tab-shell) .topbar {background:color-mix(in srgb,var(--bg) 90%,transparent);border-color:var(--line);}
:root[data-ee-family="commercial"]:has(.tab-shell) :is(.nav a:hover,.nav a[aria-current="page"],.tab:hover:not([aria-selected="true"])) {color:var(--ink);background:var(--panel-2);border-color:var(--line);}
:root[data-ee-family="commercial"]:has(.tab-shell) :is(.flow-row > *,.metric,.decision,.matrix-row > *,.board,.tabs,.panel,.step,.vcard) {background:var(--panel);border-color:var(--line);}
:root[data-ee-family="commercial"]:has(.tab-shell) :is(.panel-head,.matrix-row.head > *) {background:var(--panel-2);color:var(--ink);}
:root[data-ee-family="commercial"]:has(.tab-shell) :is(.board-flow,.flow-row,.metric-strip,.decision-grid,.matrix,.matrix-row) {background:var(--line);}
:root[data-ee-family="commercial"]:has(.tab-shell) .btn.secondary {background:var(--panel-2);color:var(--ink);border-color:var(--line);}
:root[data-ee-family="commercial"]:has(.tab-shell) :is(.btn:not(.secondary),.tab[aria-selected="true"],.brand-mark,.step small) {color:var(--on-accent);}
:root[data-ee-family="commercial"]:has(.tab-shell) .band {background:transparent;}
:root[data-ee-family="commercial"]:has(.tab-shell) .codebox {background:var(--panel-2);color:var(--agent);border-color:var(--line);}

/* Identificação e links inseridos em parágrafos continuam legíveis sem depender só da cor. */
:root[data-ee-family="astro"][data-oc-theme="dark"] .minicaso-rotulo > span {color:var(--color-brand-bright);}
:root[data-oc-theme] :is(.gl-foot,.vz-d-body) a {text-decoration:underline;text-underline-offset:.16em;}

:root[data-oc-theme="light"] :is(.vz-hm-l0,.vz-hm-l3) {color:#111b2c;}

:root[data-ee-family="astro"][data-oc-theme="light"] :is(.axis-k,.vertical-map > span) {color:color-mix(in srgb,var(--cor) 40%,#111b2c);}
:root[data-ee-family="astro"][data-oc-theme="dark"] .axis-k {color:color-mix(in srgb,var(--cor) 70%,#fbfbfd);}

:root[data-oc-theme] :is(main p,.mc-proc,.mc-trilho-legenda,.oc-foot,.mp-foot,.gl-foot,.vz-src) a:not(.btn,.cta,.oc-cta,.fn-cta,.geo-btn) {
  text-decoration:underline;text-underline-offset:.16em;
}
:root[data-ee-family][data-oc-theme="dark"] a:is(.oc-cta-primary,.fn-cta-primary) {color:#fff;}

:root[data-oc-theme] :is(article > ul > li,article > ol > li,.fn-dor-a,.viz li) a {text-decoration:underline;text-underline-offset:.16em;}

