/* ============================================================
   RARE — Estilos principais (Material Design 3)
   Mobile-first · funciona sem JS · reflow até 400% de zoom ·
   alvos de toque ≥ 44px · foco sempre visível.
   ============================================================ */

/* ---------- Base ---------- */
*,
*::before,
*::after {
  box-sizing: border-box;
}

html {
  -webkit-text-size-adjust: 100%;
}

body {
  margin: 0;
  font: var(--tipo-corpo);
  line-height: var(--leitura-entrelinha);
  letter-spacing: var(--leitura-entre-letras);
  word-spacing: var(--leitura-entre-palavras);
  background: var(--cor-superficie);
  color: var(--cor-sobre-superficie);
}

p,
ul,
ol {
  line-height: inherit;
}

/* `inherit`, e não --cor-sobre-superficie (correção de 30/08/2026): fixar a
   cor da superfície da PÁGINA num título faz com que ele ignore o bloco
   colorido onde está. No tema claro isso passava despercebido — a cor fixada
   por acaso coincidia com a do bloco. No modo alto contraste não: o hero de
   /recomendacoes é preto com texto branco, e o h1 continuava preto sobre
   preto, invisível. Herdando, o título usa sempre a cor "sobre" do contêiner
   que o contém, que é a que foi verificada contra aquele fundo. O corpo já
   entrega --cor-sobre-superficie por herança de <body>. */
h1,
h2,
h3,
h4 {
  color: inherit;
  line-height: 1.3;
  text-wrap: balance;
}

h1 {
  font: var(--tipo-display);
  margin: 0 0 var(--esp-4);
}
h2 {
  font: var(--tipo-headline);
  margin: var(--esp-6) 0 var(--esp-3);
}
h3 {
  font: var(--tipo-titulo);
  margin: var(--esp-5) 0 var(--esp-2);
}
h4 {
  font: var(--tipo-subtitulo);
  margin: var(--esp-4) 0 var(--esp-2);
}

a {
  color: var(--cor-link);
  text-decoration: underline;
  text-underline-offset: 0.2em;
}

a:hover {
  text-decoration-thickness: 2px;
}

img,
svg {
  max-inline-size: 100%;
  block-size: auto;
}

/* Foco visível em tudo que é interativo (WCAG 2.4.7 / 2.4.13) */
:focus-visible {
  outline: 3px solid var(--cor-foco);
  outline-offset: 2px;
  border-radius: var(--raio-xs);
}

/* ---------- Utilitários ---------- */
.visualmente-oculto {
  position: absolute;
  inline-size: 1px;
  block-size: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

.skip-link {
  position: absolute;
  inset-block-start: -100vh;
  inset-inline-start: var(--esp-4);
  z-index: 100;
  padding: var(--esp-3) var(--esp-5);
  background: var(--cor-primaria);
  color: var(--cor-sobre-primaria);
  border-radius: 0 0 var(--raio-m) var(--raio-m);
  font: var(--tipo-rotulo);
}

.skip-link:focus {
  inset-block-start: 0;
}

/* ---------- Barra superior (top app bar do M3) ---------- */
/* Aparece abaixo de 64em — e também no desktop com o texto ampliado, quando
   a trilha sai do layout (ver o bloco [data-fonte] no fim do arquivo).
   Três alvos: menu, busca e idioma. Em repouso é plana; ao rolar ganha sombra
   (data-rolado no <html>, posto por main.js a partir de uma sentinela de 1px
   — ver .topbar-sentinela).

   A cor é a MESMA da trilha do desktop (--cor-superficie-container-baixa),
   antes e depois de rolar. Até 30/08/2026 a barra nascia um tom acima e
   subia outro ao rolar, e a mesma navegação tinha três cores conforme a
   largura da janela e a posição da rolagem. Quem separa a barra do conteúdo
   agora é a sombra, sozinha — que é o que o M3 pede. */
.topbar {
  position: sticky;
  inset-block-start: 0;
  z-index: 20;
  display: flex;
  align-items: center;
  gap: var(--esp-1);
  min-block-size: 4rem;
  /* O ícone do menu é um alvo de 3rem com o desenho de 1.5rem centrado: meia
     folga (0.75rem) de cada lado. Descontá-la da margem da página põe o TRAÇO
     do ícone exatamente na mesma vertical em que o texto da página começa.
     A folga é medida em rem, e não nos 12px de antes, porque o alvo passou a
     acompanhar o tamanho de texto escolhido (ver .topbar__acao): com valor
     fixo, no passo "Máximo" o ícone saía da vertical do conteúdo. */
  padding-inline: calc(var(--margem-pagina) - 0.75rem);
  background: var(--cor-superficie-container-baixa);
  transition: box-shadow var(--duracao-curta) var(--movimento-padrao);
}

:root[data-rolado] .topbar {
  box-shadow: var(--elevacao-2);
}

.topbar-sentinela {
  block-size: 1px;
}

/* Sem JS não há sentinela nem sombra: a borda garante a separação do
   conteúdo que passa por baixo da barra fixa. */
html:not(.js) .topbar {
  border-block-end: 1px solid var(--cor-contorno-variante);
}

/* Ícone-ação da barra (menu e busca): quadrado de 3rem com o realce do M3.
   O rótulo textual não é exibido — vive em .visualmente-oculto, portanto o
   nome acessível continua o mesmo de quando era visível.

   O alvo é medido em rem (3rem = 48px no tamanho padrão, o mínimo do WCAG
   2.5.8) para ACOMPANHAR o tamanho de texto escolhido no painel: a barra tem
   4rem de altura e cresce com ele, e um alvo de 48px cravados virava um botão
   perdido no meio de uma barra de 96px no passo "Máximo" — pequeno demais para
   quem justamente pediu tudo maior. O piso de 48px protege o caso em que a
   pessoa DIMINUI o texto pelo navegador. */
.topbar__acao {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  inline-size: max(48px, 3rem);
  block-size: max(48px, 3rem);
  padding: 0;
  border: none;
  border-radius: var(--raio-pilula);
  background: transparent;
  color: var(--cor-sobre-superficie);
  text-decoration: none;
  cursor: pointer;
}

/* State layer do M3: camada de currentColor por cima, com a opacidade
   respondendo ao estado. O realce acompanha tema e modos de cor sem precisar
   de uma cor de hover declarada para cada combinação. */
.topbar__acao::before {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: inherit;
  background: currentColor;
  opacity: 0;
  transition: opacity var(--duracao-curta) var(--movimento-padrao);
}

.topbar__acao:hover::before {
  opacity: 0.08;
}

.topbar__acao:active::before {
  opacity: 0.12;
}

/* O ícone sobe acima do state layer (que é irmão anterior no fluxo). O tamanho
   vem daqui, e não dos atributos width/height do <svg>, para acompanhar o alvo:
   1.5rem é exatamente os 24px do desenho no tamanho padrão. */
.topbar__acao svg {
  position: relative;
  inline-size: max(24px, 1.5rem);
  block-size: max(24px, 1.5rem);
}

/* Empurra a busca para a borda oposta, isolando-a do par menu + marca. */
.topbar__busca {
  margin-inline-start: auto;
}

.topbar__busca[hidden] {
  display: none;
}

/* Marca sem a escrita (ver partials/logo-rare-marca.php). Hoje ela aparece só
   no topo da gaveta (.nav__marca) — saiu da barra em 30/08/2026.

   Com o logotipo RARE (02/09/2026) ela deixou de ser um símbolo compacto e
   virou uma faixa braille de 4,3:1: 1.5rem de altura dá 104px de largura, que
   cabe na gaveta ao lado do botão de fechar. A altura é o que manda aqui, e não
   a largura, porque é ela que define o diâmetro do ponto (~6px em 1.5rem) — o
   piso para o ponto ainda se ler como ponto, e não como poeira. */
.logo-rare-marca {
  display: block;
  block-size: 1.5rem;
  inline-size: auto;
}

/* Nota de canonicidade das traduções (ver pages/grupo.php): fica logo abaixo do
   texto transcrito do Quadro 8, em corpo menor, sem competir com ele. Só
   aparece em /en e /es. */
.nota-traducao {
  margin-block-start: var(--esp-3);
  font: var(--tipo-rotulo);
  color: var(--cor-sobre-superficie-variante);
}

/* ---------- Interruptor de idioma ---------- */
/* Um só controle, redondo, mostrando a sigla do idioma atual e levando ao
   próximo: PT → EN → ES → PT (decisão de 26/07/2026). É um link, não um
   botão — funciona sem JS e anuncia-se pelo que é.

   O contorno é o que o separa do fundo: sem ele, um disco de texto solto na
   barra não se lê como controle. Fica em 3rem — 48px no tamanho de texto
   padrão, acima do mínimo de 44 do WCAG 2.5.8 —, medida em rem para crescer
   junto com o texto e com as demais ações da barra (ver .topbar__acao); e o
   contraste do par texto/fundo é o mesmo do resto da barra.

   Aparece duas vezes no HTML — topbar (mobile) e trilha (desktop) —, mas cada
   breakpoint esconde uma delas com display:none, o que também a remove da
   árvore de acessibilidade: o leitor de tela encontra sempre um só. */
.idioma {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  inline-size: max(48px, 3rem);
  block-size: max(48px, 3rem);
  border: 1px solid var(--cor-contorno-variante);
  border-radius: 50%;
  background: transparent;
  color: var(--cor-sobre-superficie);
  text-decoration: none;
  cursor: pointer;
}

/* Mesmo state layer do M3 usado nas ações da barra: uma camada de currentColor
   por cima, com a opacidade respondendo ao estado. Assim o realce acompanha
   tema e modos de cor sem precisar de uma cor de hover para cada combinação. */
.idioma::before {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: inherit;
  background: currentColor;
  opacity: 0;
  transition: opacity var(--duracao-curta) var(--movimento-padrao);
}

.idioma:hover::before {
  opacity: 0.08;
}

.idioma:active::before {
  opacity: 0.12;
}

/* O foco acompanha a forma: a regra global de :focus-visible arredonda pouco
   (--raio-xs) e desenharia um quadrado de cantos macios em volta do disco. */
.idioma:focus-visible {
  border-radius: 50%;
}

/* A sigla sobe acima do state layer (que é irmão anterior no fluxo). O
   tabular-nums não se aplica a letras, mas o tracking leve compensa a
   diferença de largura entre "PT", "EN" e "ES" no disco. */
.idioma__sigla {
  position: relative;
  font: var(--tipo-rotulo);
  font-weight: 700;
  letter-spacing: 0.02em;
  line-height: 1;
}

/* Na barra do mobile, fica na borda oposta ao menu, ao lado da busca. Quando
   a busca está escondida (sem JS), o auto aqui garante que o interruptor
   continue empurrado para o fim da barra. */
.idioma--topbar {
  margin-inline-start: auto;
}

/* Na trilha do desktop, ancorado no pé da coluna — o lugar dos controles que
   valem para o site inteiro, não para uma seção. A trilha é position:fixed e
   serve de bloco de contenção. */
.idioma--rail {
  position: absolute;
  inset-block-end: var(--esp-3);
  inset-inline-start: 50%;
  transform: translateX(-50%);
}

/* Com a busca visível (com JS), as duas ações do fim da barra ficam juntas e
   só o par inteiro é empurrado para a borda. */
.topbar__busca:not([hidden]) + .idioma--topbar {
  margin-inline-start: 0;
}

/* ---------- Estrutura ---------- */
/* A margem lateral do site vem daqui e só daqui: --margem-pagina (tokens.css).
   Nenhum bloco de conteúdo deve trazer margem ou recuo lateral próprio — ver
   a nota do token. */
.app__main {
  padding: var(--esp-5) var(--margem-pagina) var(--esp-7);
  max-inline-size: 56rem;
  margin-inline: auto;
}

/* Títulos do conteúdo quebram palavra quando não couberem. Com o texto em
   "Máximo" e o espaçamento entre letras ligado, uma palavra só — como
   "multissensorial" em --tipo-headline — mede mais que uma tela de 320px:
   o título transbordava a caixa e levava a página inteira a rolar para os
   lados (WCAG 1.4.10). A hifenização vem primeiro, e quebra em sílaba
   porque o <html lang="pt-BR"> dá ao navegador o dicionário certo; o
   "anywhere" só entra quando nem hifenizando cabe. Nas larguras e tamanhos
   normais nenhuma das duas se manifesta. */
.app__main :is(h1, h2, h3, h4, h5, h6) {
  overflow-wrap: anywhere;
  hyphens: auto;
}

.pagina__lead {
  font-size: 1.15em;
  color: var(--cor-sobre-superficie-variante);
}

.secao {
  margin-block-end: var(--esp-6);
}

.rodape {
  margin-block-start: var(--esp-8);
  padding-block-start: var(--esp-5);
  border-block-start: 1px solid var(--cor-contorno-variante);
  color: var(--cor-sobre-superficie-variante);
  font-size: 0.95em;
}

/* ---------- Navegação lateral ---------- */
.app__nav {
  background: var(--cor-superficie-container-baixa);
  border-block-start: 1px solid var(--cor-contorno-variante);
}

.nav {
  padding: var(--esp-4);
}

.nav__brand {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-block-end: var(--esp-3);
}

/* Mesma marca da topbar: a gaveta aberta continua a barra em vez de repetir
   o nome do site em texto logo abaixo dele. */
.nav__marca {
  display: inline-flex;
  align-items: center;
  min-block-size: 44px;
  padding: var(--esp-2) var(--esp-3);
  border-radius: var(--raio-s);
  color: var(--cor-sobre-superficie);
  text-decoration: none;
}

.nav__fechar {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-block-size: 44px;
  min-inline-size: 44px;
  background: transparent;
  border: none;
  border-radius: var(--raio-pilula);
  color: var(--cor-sobre-superficie);
  cursor: pointer;
}

.nav__fechar:hover {
  background: var(--cor-superficie-container-alta);
}

.nav__titulo {
  font: var(--tipo-rotulo);
  color: var(--cor-sobre-superficie-variante);
  text-transform: uppercase;
  letter-spacing: 0.08em;
  margin: var(--esp-5) 0 var(--esp-2);
  padding-inline: var(--esp-3);
}

/* Cabeçalho de seção que tem página própria (Fundamentos): vira link, com
   alvo de toque de 44px — por isso o padding sai do <h2> e vai para o <a>. */
.nav__titulo:has(.nav__titulo-link) {
  padding-inline: 0;
}

.nav__titulo-link {
  display: flex;
  align-items: center;
  min-block-size: 44px;
  padding-inline: var(--esp-3);
  border-radius: var(--raio-pilula);
  color: inherit;
  text-decoration: none;
}

.nav__titulo-link:hover {
  background: var(--cor-superficie-container-alta);
}

.nav__titulo-link--atual {
  background: var(--cor-secundaria-container);
  color: var(--cor-sobre-secundaria-container);
  font-weight: 700;
}

.nav__separador {
  border: none;
  border-block-start: 1px solid var(--cor-contorno-variante);
  margin: var(--esp-4) 0;
}

.nav__lista,
.nav__sublista {
  list-style: none;
  margin: 0;
  padding: 0;
}

.nav__item {
  display: flex;
  align-items: center;
  min-block-size: 56px; /* altura de item de navigation drawer (M3) */
  padding: var(--esp-2) var(--esp-4);
  border-radius: var(--raio-pilula);
  color: var(--cor-sobre-superficie);
  text-decoration: none;
  font: var(--tipo-rotulo);
  font-size: 0.95rem;
}

.nav__item:hover {
  background: var(--cor-superficie-container-alta);
}

.nav__item--atual {
  background: var(--cor-secundaria-container);
  color: var(--cor-sobre-secundaria-container);
  font-weight: 700;
}

.nav__grupo-titulo {
  display: flex;
  align-items: center;
  min-block-size: 56px;
  padding: var(--esp-2) var(--esp-4);
  border-radius: var(--raio-pilula);
  font: var(--tipo-rotulo);
  font-size: 0.95rem;
  cursor: pointer;
}

.nav__grupo-titulo:hover {
  background: var(--cor-superficie-container-alta);
}

.nav__sublista {
  margin-inline-start: var(--esp-4);
}

.nav__subitem {
  font-weight: 400;
}

/* Desktop: trilha vertical (rail) à esquerda + conteúdo; topbar e gaveta
   do mobile ficam escondidas (a trilha assume). */
@media (min-width: 64em) {
  /* Medidas em rem (não px): a trilha precisa acompanhar o tamanho do texto
     escolhido no painel, senão os rótulos estouram a coluna. 7rem/15rem/22rem
     valem exatamente os antigos 112px/240px/352px no corpo padrão de 16px. */
  .app {
    display: grid;
    grid-template-columns: var(--rail-largura) minmax(0, 1fr);
    transition: grid-template-columns 180ms ease;
  }

  /* Flyout de navegação aberto: a coluna da trilha cresce para a largura da
     trilha + a do flyout, empurrando o conteúdo para a direita em vez de
     deixar o painel sobrepô-lo. A classe é posta no <html> pelo JS. */
  :root.rail-flyout-aberto .app {
    grid-template-columns:
      calc(var(--rail-largura) + var(--rail-flyout-largura))
      minmax(0, 1fr);
  }

  .rail {
    display: block;
  }

  .app__main {
    grid-column: 2;
    grid-row: 1;
    padding-inline: var(--esp-7);
    /* Item de grade tem min-width:auto, que o proíbe de encolher abaixo do
       próprio min-content — então ele transbordava a faixa minmax(0,1fr) e
       levava a página inteira a rolar para os lados assim que o texto era
       ampliado. Zerar devolve o controle à faixa. */
    min-inline-size: 0;
  }

  .topbar {
    display: none;
  }
  .app__nav {
    display: none;
  }
}

/* Mobile com JS: a navegação vira gaveta (drawer) */
@media (max-width: 63.99em) {
  html.js .app__nav {
    display: none;
  }

  /* Tela cheia (decisão de 30/08/2026), não a gaveta de 22rem encostada na
     borda: numa tela de celular a gaveta antiga deixava uma faixa inútil de
     conteúdo escurecido à direita e apertava rótulos como "Papel da
     Instituição de Ensino Superior – IES" em meia largura. Ocupando tudo, os
     itens de navegação ganham a mesma medida do texto da página.

     Com a folha inteira coberta, o scrim perde a função e sai junto: não há
     mais nada por baixo para escurecer. */
  html.js[data-menu-aberto] .app__nav {
    display: block;
    position: fixed;
    inset: 0;
    z-index: 94; /* acima do stack de acessibilidade */
    overflow-y: auto;
    overscroll-behavior: contain;
    background: var(--cor-superficie-container-baixa);
  }

  /* A rolagem da página fica travada enquanto a gaveta está aberta — duas
     barras ao mesmo tempo confundem quem usa mouse e quem amplia a tela.
     Mesmo tratamento da busca em tela cheia e do painel de preferências. */
  html.js[data-menu-aberto],
  html.js[data-menu-aberto] body {
    overflow: hidden;
  }

  html.js .nav__fechar[hidden] {
    display: inline-flex;
  }
}

/* ---------- Trilha vertical (rail) — desktop ---------- */
/* Escondida por padrão; o @media (min-width: 64em) acima a exibe.
   position: fixed (não sticky): a trilha nunca deve se mover com a
   rolagem da página. Usar sticky aqui expunha um bug de recomputação
   quando html/body recebem overflow: hidden (trava de rolagem da busca
   em tela cheia) com a página já rolada — a trilha "subia" para fora da
   tela. fixed independe do estado de rolagem do documento. */
.rail {
  display: none;
  position: fixed;
  inset-block-start: 0;
  inset-inline-start: 0;
  inline-size: var(--rail-largura);
  block-size: 100vh;
  z-index: 20;
  background: var(--cor-superficie-container-baixa);
  border-inline-end: 1px solid var(--cor-contorno-rail);
}

/* Reasserido aqui (depois da regra base) para vencer o display:none acima. */
@media (min-width: 64em) {
  .rail {
    display: block;
  }
}

/* Skip links específicos por breakpoint (só um par visível de cada vez). */
.skip-link--so-desktop {
  display: none;
}
@media (min-width: 64em) {
  .skip-link--so-mobile {
    display: none;
  }
  .skip-link--so-desktop {
    display: inline-block;
  }
}

.rail__nav {
  display: flex;
  flex-direction: column;
  block-size: 100%;
  padding-block: var(--esp-3);
  overflow: visible;
}

.rail__lista {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: var(--esp-1);
}

/* Empurra Preferências para o rodapé da trilha. */
.rail__lista--fim {
  margin-block-start: auto;
}

/* Item da trilha: ícone em cima, rótulo embaixo, centralizado (padrão M3). */
.rail__item {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 4px;
  inline-size: 100%;
  min-block-size: 56px;
  padding: var(--esp-2) 4px;
  border: none;
  background: transparent;
  color: var(--cor-sobre-superficie);
  text-decoration: none;
  font: var(--tipo-rotulo);
  cursor: pointer;
}

.rail__icone {
  display: flex;
  align-items: center;
  justify-content: center;
  inline-size: 3.5rem;
  block-size: 2rem;
  border-radius: var(--raio-pilula);
  color: var(--cor-icone-rail);
  transition: background-color var(--duracao-curta) var(--movimento-padrao);
}

.rail__rotulo {
  font-size: 0.8rem;
  line-height: 1.15;
  text-align: center;
  /* "Recomendações" e "Acessibilidade" não cabem em uma linha assim que o
     espaçamento entre letras é ligado; deixá-las quebrar é melhor que
     estourar a largura da trilha. */
  overflow-wrap: anywhere;
}

/* Início (link): hover discreto. */
a.rail__item:hover .rail__icone {
  background: var(--cor-superficie-container-alta);
}

/* Grupos de navegação: ícone vira pílula no hover, ao abrir e quando é a
   seção atual. O rótulo fica em negrito. */
.rail__grupo-nav > a.rail__item:hover .rail__icone,
.rail__grupo-nav--aberto > .rail__item .rail__icone,
.rail__item--atual .rail__icone,
.rail__item--ativo .rail__icone {
  background: var(--cor-secundaria-container);
  color: var(--cor-sobre-secundaria-container);
}

.rail__grupo-nav--aberto > .rail__item,
.rail__item--atual,
.rail__item--ativo {
  font-weight: 700;
}

/* Busca: tile sempre destacado, inclusive no hover e com a tela aberta. */
.rail__item--busca .rail__icone,
.rail__item--busca:hover .rail__icone,
.rail__item--busca[aria-expanded="true"] .rail__icone {
  background: var(--cor-busca-fundo);
  color: var(--cor-busca-frente);
  border-radius: var(--raio-l);
}

/* ---------- Flyout lateral da trilha ---------- */
/* Painel absoluto à direita da trilha, altura total. Quem o esconde é o
   atributo [hidden] que o JS alterna.
   Com o conteúdo empurrado (ver :root.rail-flyout-aberto), o painel ocupa a
   faixa que a grade abriu ao lado da trilha em vez de cobrir a página. */
.rail-flyout[hidden] {
  display: none;
}

.rail-flyout {
  position: absolute;
  inset-block: 0;
  inset-inline-start: 100%;
  inline-size: var(--rail-flyout-largura);
  block-size: 100vh;
  overflow-y: auto;
  z-index: 21;
  padding: var(--esp-5) var(--esp-4);
  background: var(--cor-superficie-container-baixa);
  border-inline-end: 1px solid var(--cor-contorno-rail);
  border-inline-start: 1px solid var(--cor-contorno-rail);
  border-start-end-radius: var(--raio-xl);
  border-end-end-radius: var(--raio-xl);
}

/* Título do flyout: bloco roxo, ligado visualmente ao botão ativo da trilha. */
.rail-flyout__titulo {
  font: var(--tipo-subtitulo);
  margin: 0 0 var(--esp-3);
  padding: var(--esp-2) var(--esp-3);
  border-radius: var(--raio-s);
  background: var(--cor-secundaria-container);
  color: var(--cor-sobre-secundaria-container);
}

/* Título "Fundamentos": vira link para /fundamentos, então perde o bloco
   roxo fixo (redundante com a página que ele já representa) e se comporta
   como os demais links do flyout. */
.rail-flyout__titulo--link {
  display: block;
  background: none;
  color: var(--cor-sobre-superficie);
  text-decoration: none;
}

.rail-flyout__titulo--link:hover {
  background: var(--cor-superficie-container-alta);
}

/* Na própria página /fundamentos o título volta a ficar em destaque, igual
   ao item atual da lista abaixo (.rail-flyout__link--atual). */
.rail-flyout__titulo--link[aria-current="page"] {
  background: var(--cor-primaria);
  color: var(--cor-sobre-primaria);
  font-weight: 700;
}

.rail-flyout__lista {
  list-style: none;
  margin: 0;
  padding: 0;
}

.rail-flyout__link {
  display: block;
  min-block-size: 44px;
  padding: var(--esp-3);
  border-radius: var(--raio-s);
  color: var(--cor-sobre-superficie);
  text-decoration: none;
  font-size: 0.98rem;
  margin-bottom: var(--esp-2);
}

.rail-flyout__link:hover {
  background: var(--cor-superficie-container-alta);
}

.rail-flyout__link--atual {
  background: var(--cor-primaria);
  color: var(--cor-sobre-primaria);
  font-weight: 700;
}

.rail-flyout__link--atual:hover {
  background: var(--cor-primaria);
  color: var(--cor-sobre-primaria);
  font-weight: 700;
}

/* Com a busca em tela cheia aberta, trava a rolagem da página: só a
   rolagem interna do .busca-tela fica ativa (evita duas barras de
   rolagem simultâneas). */
html.busca-tela-aberta,
html.busca-tela-aberta body {
  overflow: hidden;
}

/* ---------- Busca: search view em tela cheia (padrão M3) ----------
   Segue o layout de referência do próprio m3.material.io: campo grande em
   pílula no topo, resultados abaixo agrupados por seção, em texto simples e
   espaçoso — sem scrim e sem cartão flutuante.

   Mobile-first: por padrão ocupa a tela inteira (é a única navegação de
   busca que existe quando a trilha não está no layout). A partir de 64em
   recua para a faixa à direita da trilha, que continua visível e clicável.
   Componente único do layout (partials/busca.php), alternado por [hidden]
   em main.js — antes era filha de um <details> da trilha e sumia com ela. */
.busca-tela[hidden] {
  display: none;
}

.busca-tela {
  position: fixed;
  inset: 0;
  z-index: 92; /* acima do stack de acessibilidade (90), abaixo da gaveta */
  display: flex;
  flex-direction: column;
  background: var(--cor-superficie-container-baixa);
  overflow-y: auto;
}

/* Barra do campo: seta de voltar + pílula + fechar. O gap pequeno mantém os
   três alvos de 44px sem espremer a pílula em telas de 320px. */
.busca-tela__barra {
  flex-shrink: 0;
  position: sticky;
  inset-block-start: 0;
  z-index: 1;
  display: flex;
  align-items: center;
  gap: var(--esp-2);
  padding: var(--esp-3);
  background: var(--cor-superficie-container-baixa);
}

/* Voltar (mobile) e fechar (desktop) são o mesmo comando com afordância
   diferente: no mobile a busca cobre a tela e "voltar" descreve o que
   acontece; no desktop ela é um painel ao lado da trilha, e o "x" é o que
   se espera. Só um dos dois aparece de cada vez. */
.busca-tela__voltar,
.busca-tela__fechar {
  flex-shrink: 0;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  inline-size: 44px;
  block-size: 44px;
  border: none;
  border-radius: var(--raio-pilula);
  background: transparent;
  color: var(--cor-sobre-superficie);
  cursor: pointer;
}

.busca-tela__voltar:hover,
.busca-tela__fechar:hover {
  background: var(--cor-superficie-container-alta);
}

.busca-tela__fechar {
  display: none;
}

/* A pílula em si: contorno (papel "outline" do M3), cantos totalmente
   arredondados — campo e botão de limpar vivem dentro dela, como no
   layout de referência. */
.busca-tela__pilula {
  flex: 1;
  min-inline-size: 0;
  display: flex;
  align-items: center;
  min-block-size: 3.5rem;
  padding-inline-start: var(--esp-4);
  padding-inline-end: var(--esp-2);
  border-radius: var(--raio-pilula);
  background: var(--cor-superficie);
  border: 2px solid transparent;
}

/* Só uma borda: aparece quando a pílula está selecionada (campo em foco)
   — sem outline por cima (evita a borda dupla). border transparente acima
   evita "pulo" de layout quando a borda aparece/some. */
.busca-tela__pilula:focus-within {
  border-color: var(--cor-contorno);
}

.busca-tela__campo {
  flex: 1;
  min-inline-size: 0;
  min-block-size: 3.5rem;
  border: none;
  background: transparent;
  color: var(--cor-sobre-superficie);
  font: var(--tipo-corpo);
  font-size: 1.25rem;
}

.busca-tela__campo::placeholder {
  color: var(--cor-sobre-superficie-variante);
}

.busca-tela__campo:focus {
  outline: none;
}

/* O campo é type="search": o "x" nativo do navegador some — só existe
   o botão .busca-tela__limpar, que faz a limpeza. */
.busca-tela__campo::-webkit-search-cancel-button,
.busca-tela__campo::-webkit-search-decoration {
  -webkit-appearance: none;
  appearance: none;
  display: none;
}

.busca-tela__limpar {
  flex-shrink: 0;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-block-size: 44px;
  min-inline-size: 44px;
  border: none;
  border-radius: var(--raio-pilula);
  background: transparent;
  color: var(--cor-sobre-superficie-variante);
  cursor: pointer;
}

/* Só aparece quando há texto digitado (ver data-busca-limpar-campo em
   main.js). Precisa reforçar display aqui: display: inline-flex acima tem
   a mesma especificidade do [hidden] { display: none } do navegador, e a
   regra de autor venceria por padrão. */
.busca-tela__limpar[hidden] {
  display: none;
}

.busca-tela__limpar:hover {
  background: var(--cor-superficie-container-alta);
}
.busca-tela__limpar:focus {
  outline: none;
}

.busca-tela__corpo {
  flex: 1;
  padding: var(--esp-4) var(--esp-4) var(--esp-6);
}

/* A partir de 64em a trilha volta ao layout: a tela de busca recua para a
   faixa ao lado dela (que segue visível e clicável) e a seta de voltar cede
   lugar ao "x". */
@media (min-width: 64em) {
  .busca-tela {
    inset-inline-start: var(--rail-largura);
  }

  .busca-tela__barra {
    padding: var(--esp-3) var(--esp-5);
  }

  .busca-tela__voltar {
    display: none;
  }

  .busca-tela__fechar {
    display: inline-flex;
  }

  .busca-tela__pilula {
    padding-inline-start: var(--esp-5);
  }

  .busca-tela__corpo {
    padding: var(--esp-5) var(--esp-6) var(--esp-6);
  }
}

@media (prefers-reduced-motion: no-preference) {
  .busca-tela {
    animation: busca-tela-entra var(--duracao-curta) var(--movimento-padrao);
  }
}
@keyframes busca-tela-entra {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}

/* Resultados: agrupados por seção, texto grande e simples. No hover/foco
   cada item vira uma pílula cinza com o trecho buscado em negrito e uma
   seta ao final — ver "Hover dos botões.png". */
.busca-tela__status {
  margin: 0 0 var(--esp-4);
  font-size: 0.9rem;
  color: var(--cor-sobre-superficie-variante);
}

.busca-resultados__grupo + .busca-resultados__grupo {
  margin-block-start: var(--esp-6);
}

.busca-resultados__titulo {
  font: var(--tipo-rotulo);
  margin: 0 0 var(--esp-2);
  color: var(--cor-sobre-superficie);
}

.busca-resultados__lista {
  list-style: none;
  margin: 0;
  padding: 0;
}

/* Corpo em 1.15rem no estreito e 1.4rem a partir de 48em: em 320px, um
   título como "Papel da instituição de ensino superior – IES" em 1.4rem
   ocupava cinco linhas por resultado. */
.busca-resultado {
  display: inline-flex;
  align-items: center;
  gap: var(--esp-2);
  max-inline-size: 100%;
  min-block-size: 44px;
  padding: var(--esp-2) var(--esp-4);
  margin-inline-start: calc(var(--esp-4) * -1);
  border-radius: var(--raio-pilula);
  color: var(--cor-sobre-superficie-variante);
  font: var(--tipo-corpo);
  font-size: 1.15rem;
  font-weight: 400;
  text-decoration: none;
}

@media (min-width: 48em) {
  .busca-resultado {
    font-size: 1.4rem;
  }
}

.busca-resultado__texto {
  min-inline-size: 0;
  overflow-wrap: anywhere;
}

/* O trecho buscado destaca só pela cor (mesmo peso do restante do
   texto) — sem negrito. */
.busca-resultado strong {
  color: var(--cor-sobre-superficie);
  font-weight: 400;
}

.busca-resultado svg {
  flex-shrink: 0;
  opacity: 0;
}

.busca-resultado:hover,
.busca-resultado:focus-visible {
  background: var(--cor-superficie-container-alta);
}

.busca-resultado:hover svg,
.busca-resultado:focus-visible svg {
  opacity: 1;
}

.busca-resultado:focus-visible {
  outline: 3px solid var(--cor-foco);
  outline-offset: 2px;
}

/* ---------- Rodapé (padrão m3.material.io — ver rodapé-ref.png) ----------
   Duas camadas: marca + descrição à esquerda e colunas do mapa do site à
   direita; embaixo, a marca da instituição e a fila Privacidade e Termos ·
   Feedback · Créditos. As marcas usam os logotipos RARE e UTFPR (ver
   partials/logo-rare.php e logo-utfpr.php), que acompanham o tema pelas
   variáveis --cor-marca-rare e --cor-logo-utfpr (tokens.css). */
.rodape__topo {
  display: grid;
  gap: var(--esp-6);
  margin-block-end: var(--esp-7);
}

@media (min-width: 48em) {
  .rodape__topo {
    grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);
    gap: var(--esp-7);
  }
}

.rodape__marca {
  margin: 0 0 var(--esp-5);
}

.rodape__marca a {
  display: inline-flex;
  align-items: center;
  min-block-size: 44px;
  text-decoration: none;
}

.logo-rare {
  inline-size: 10rem;
  block-size: auto;
}

.rodape__marca a:hover .logo-rare,
.rodape__marca a:focus-visible .logo-rare {
  opacity: 0.8;
}

.rodape__descricao {
  margin: 0;
  max-inline-size: 36rem;
}

/* Grade, e não flex-wrap (decisão de 30/08/2026): com wrap, as três colunas
   se acomodavam onde coubessem — "Fundamentos" e "Recomendações" na primeira
   linha, "Ferramentas" sozinha na segunda e desalinhada da primeira, porque
   cada uma tinha a largura do seu texto. Na grade elas dividem a largura em
   partes iguais e as segundas linhas caem embaixo das primeiras. O auto-fit
   com piso de 9rem devolve uma coluna só quando a tela é estreita demais ou o
   texto está ampliado. */
.rodape__colunas {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(9rem, 1fr));
  gap: var(--esp-5) var(--esp-6);
}

@media (min-width: 48em) {
  .rodape__colunas {
    gap: var(--esp-5) var(--esp-7);
  }
}

.rodape__coluna-titulo {
  margin: 0 0 var(--esp-2);
  font: var(--tipo-rotulo);
  color: var(--cor-sobre-superficie);
}

.rodape__lista {
  list-style: none;
  margin: 0;
  padding: 0;
}

.rodape__link {
  display: inline-flex;
  align-items: center;
  min-block-size: 44px;
}

/* Empilhado no mobile: a marca da UTFPR numa linha, os links legais na
   seguinte. Em fila, os quatro links quebravam em duas linhas irregulares
   coladas ao logotipo. A partir de 48em cabem lado a lado. */
.rodape__base {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--esp-4);
  margin-block-start: var(--esp-6);
  margin-block-end: var(--esp-7);
  padding-block-start: var(--esp-5);
  border-block-start: 1px solid var(--cor-contorno-variante);
}

@media (min-width: 48em) {
  .rodape__base {
    flex-direction: row;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--esp-2) var(--esp-6);
  }
}

.rodape__instituicao {
  display: flex;
  align-items: center;
  margin: 0;
}

.logo-utfpr {
  inline-size: 6rem;
  block-size: auto;
}

.rodape__legal {
  list-style: none;
  display: flex;
  flex-wrap: wrap;
  gap: var(--esp-1) var(--esp-5);
  margin: 0;
  padding: 0;
}

/* ---------- Botões (M3) ---------- */
.botao {
  display: inline-flex;
  align-items: center;
  gap: var(--esp-2);
  min-block-size: 44px;
  padding: var(--esp-2) var(--esp-5);
  border: none;
  border-radius: var(--raio-pilula);
  font: var(--tipo-rotulo);
  font-size: 1rem;
  text-decoration: none;
  cursor: pointer;
}

.botao--preenchido {
  background: var(--cor-primaria);
  color: var(--cor-sobre-primaria);
}

.botao--preenchido:hover {
  opacity: 0.92;
}

.botao--tonal {
  background: var(--cor-primaria);
  color: var(--cor-sobre-primaria);
}

/* Botão de texto: usa a cor PRIMÁRIA, não a de link. São coisas diferentes
   desde 25/07/2026 — no tema claro a primária é o Azul Escuro e o link é o
   Azul Médio. O sublinhado abaixo é que o faz ler como acionável. */
.botao--texto {
  background: transparent;
  color: var(--cor-primaria);
  text-decoration: underline;
  text-underline-offset: 0.2em;
}

/* ---------- Chips ---------- */
.chips,
.rec-secao__chips {
  display: flex;
  flex-wrap: wrap;
  gap: var(--esp-2);
  list-style: none;
  margin: var(--esp-3) 0 0;
  padding: 0;
}

.chip {
  display: inline-flex;
  align-items: center;
  min-block-size: 2rem;
  padding: var(--esp-1) var(--esp-3);
  border: 1px solid var(--cor-contorno);
  border-radius: var(--raio-s);
  font: var(--tipo-rotulo);
  font-size: 0.9rem;
  color: var(--cor-sobre-superficie);
  background: var(--cor-superficie-container-baixa);
}

.chip--grupo {
  background: var(--cor-primaria-container);
  color: var(--cor-sobre-primaria-container);
  border-color: transparent;
}

.chip--situacao {
  background: var(--cor-superficie-container-alta);
  border-style: dashed;
}

/* ---------- Início: hero ---------- */
/* Duas colunas independentes separadas por 8px: o painel de texto tem fundo,
   raio e padding próprios; a figura preenche a coluna inteira, sem padding
   em volta (o fundo da página aparece no gap). Ver hero-ref.png. */
.hero {
  display: grid;
  /* Explícito em minmax(0, 1fr): a coluna implícita de uma grade é `auto`, que
     não encolhe abaixo do min-content dos filhos — em tela estreita com texto
     ampliado o hero empurrava a página para fora. */
  grid-template-columns: minmax(0, 1fr);
  gap: 8px;
  margin-block-end: var(--esp-6);
  align-items: stretch;
}

/* Recuo interno do cartão do hero. No mobile ele é o mesmo da margem da
   página: com 32px por dentro somados aos 16px por fora, o título do hero
   começava 48px adentro enquanto o texto logo abaixo começava em 16 — o
   degrau que a autora apontou em 30/08/2026. A partir de 48em, onde há
   largura de sobra, o cartão volta a respirar. */
.hero__texto {
  display: flow-root;
  padding: var(--esp-5) var(--margem-pagina);
  background: var(--cor-superficie-container);
  border-radius: var(--raio-xl);
  min-inline-size: 0;
  /* Títulos e rótulos do hero são longos e ganham largura com o espaçamento
     entre letras; sem isto uma palavra só estoura o painel. A hifenização
     entra antes do "anywhere": o <html lang="pt-BR"> dá ao navegador o
     dicionário certo, e "INSTITUIÇÃO" quebra em INSTI-TUIÇÃO em vez de num
     ponto qualquer. O "anywhere" segue como último recurso. */
  overflow-wrap: anywhere;
  hyphens: auto;
}

.hero__marca {
  font: var(--tipo-rotulo);
  text-transform: uppercase;
  letter-spacing: 0.14em;
  color: var(--cor-sobre-superficie-variante);
  margin: 0 0 var(--esp-2);
}

.hero__subtitulo {
  font-size: 1.1em;
  max-inline-size: 44rem;
}

.hero__tese {
  font: var(--tipo-subtitulo);
  padding: var(--esp-4) var(--esp-5);
  background: var(--cor-primaria-container);
  color: var(--cor-sobre-primaria-container);
  border-radius: var(--raio-l);
  max-inline-size: 40rem;
}

.hero__acoes {
  margin-block-start: var(--esp-5);
  margin-block-end: 0;
}

/* Espaço de imagem do hero (placeholder até a autora inserir a imagem).
   Surface arredondada, proporção estável, some com "Ocultar imagens". */
.hero__figura {
  min-inline-size: 0;
  /* O aspect-ratio converte a altura mínima em largura mínima: 12rem viram
     16rem de largura — e como rem acompanha o tamanho de texto escolhido, em
     "Máximo" isso dava 384px numa tela de 320px, e a página rolava para os
     lados (WCAG 1.4.10). Com o teto de 100%, a proporção cede antes da
     largura; é um espaço de imagem, não uma imagem com enquadramento. */
  max-inline-size: 100%;
  min-block-size: 12rem;
  aspect-ratio: 4 / 3;
  background: var(--cor-superficie-container-alta);
  border-radius: var(--raio-xl);
  overflow: hidden;
}

/* ---------- Hero full-bleed (páginas de índice: Início, Fundamentos) ---------- */
/* Estas páginas escapam do container de leitura de 56rem: o hero ocupa toda a
   área ao lado da trilha. A folga lateral é a margem da página, a mesma de
   todo o resto (--margem-pagina, tokens.css) — até 30/08/2026 cada bloco
   trazia os seus 8px e o texto de uma página começava em quatro lugares
   diferentes conforme o bloco. */
.app__main:has(.pagina--largura-total) {
  max-inline-size: none;
  padding: 0 var(--margem-pagina);
  /* Sem o limite de 56rem as margens automáticas não centram mais nada — e,
     como item da grade, `margin: auto` fazia o <main> ser dimensionado por
     encolher-para-caber em vez de esticar na faixa. Ele então adotava o
     min-content da barra de abas e escapava da coluna, levando a página a
     rolar para os lados assim que o texto era ampliado. */
  margin-inline: 0;
}

/* O rodapé segue a mesma largura centralizada das seções de cards. */
.app__main:has(.pagina--largura-total) > .rodape {
  max-inline-size: 75rem;
  margin-inline: auto;
}

.hero--largo {
  margin-block: 8px;
}

@media (min-width: 48em) {
  .hero__texto {
    padding: var(--esp-6);
  }

  .hero--largo {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    min-height: 34rem;
  }

  .hero--largo .hero__texto {
    padding: var(--esp-7);
    display: flex;
    flex-direction: column;
    justify-content: center;
  }

  /* A figura acompanha a altura do painel de texto em vez de impor proporção. */
  .hero--largo .hero__figura {
    aspect-ratio: auto;
  }
}

/* Animações desligadas: preferência do sistema OU painel de preferências.
   A alternativa estática é a própria composição parada. */
@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
}

:root[data-sem-animacoes="on"] *,
:root[data-sem-animacoes="on"] *::before,
:root[data-sem-animacoes="on"] *::after {
  animation-duration: 0.01ms !important;
  animation-iteration-count: 1 !important;
  transition-duration: 0.01ms !important;
}

/* ---------- Container centralizado das seções ---------- */
/* As seções de cards ficam limitadas a ~1200px e centralizadas, enquanto o
   hero acima é full-bleed. */
.faixa-central {
  max-inline-size: 75rem;
  margin-inline: auto;
}

/* ============================================================
   Páginas de documentação com abas (O projeto, Metodologia…)
   Componentes: .doc-abas, .nesta-pagina, .doc-trilha.
   ============================================================ */

/* Altura da barra grudada acima do conteúdo: no mobile é a topbar (4rem);
   no desktop a topbar some e a trilha assume, então é 0. Serve de referência
   para o sticky das abas e para o scroll-margin das âncoras. */
.pagina--doc {
  --doc-topo: 4rem;
  /* Reserva para quem navega SEM JavaScript. Com JS, main.js mede a barra de
     verdade e sobrescreve esta variável (a altura depende de quantas linhas
     os rótulos ocupam, o que muda com a largura da tela e com o tamanho de
     texto — não há como saber em CSS).
     O valor é deliberadamente GENEROSO: 5.5rem supunham rótulos de uma linha
     só e, medido, a barra já ocupava 121px com duas linhas — a barra grudada
     cobria o título ao pular por uma âncora do índice. Errar para mais só
     faz o título aparecer um pouco mais abaixo; errar para menos o esconde. */
  --doc-abas-altura: 9rem;
}

@media (min-width: 64em) {
  .pagina--doc {
    --doc-topo: 0px;
  }
}

/* Página de documentação sem barra de abas (Assistente): não há barra grudada,
   então nada precisa ser descontado no sticky do "Nesta página" nem no
   scroll-margin das âncoras. */
.pagina--doc-sem-abas {
  --doc-abas-altura: 0px;
}

/* Referências não tem "Nesta página": sem a grade de duas colunas, a coluna de
   leitura fica centrada no lugar do recuo que as outras páginas de Fundamentos
   têm à esquerda. */
.pagina--referencias .doc__conteudo {
  margin-inline: auto;
}

/* A margem lateral vem do <main> (--margem-pagina); aqui só não pode ser
   reintroduzida. */
.doc {
  margin-inline: 0;
}

/* ---------- Barra de abas ---------- */
/* Trilho arredondado com a aba atual em pílula preenchida. Gruda no topo ao
   rolar, e só: altura, tipografia e sombra são as mesmas antes e depois de
   grudar — nada muda de tamanho embaixo do ponteiro de leitura. */
.doc-abas {
  position: sticky;
  /* +8px: a mesma folga das bordas do hero, para a pílula não encostar no
     topo da janela quando gruda. */
  inset-block-start: calc(var(--doc-topo) + 8px);
  z-index: 15;
  margin-block: var(--esp-5) var(--esp-6);
  background: var(--cor-superficie-container-baixa);
  /* Pílula é a forma da FILA de abas do desktop. No mobile o mesmo trilho
     abre uma lista de cinco linhas, e um raio de 999px a transformava numa
     elipse gigante com as pontas cortando os rótulos. */
  border-radius: var(--raio-xl);
}

/* A barra continua GRUDADA quando a lista abre. Chegou a sair do sticky
   nesse estado, para não cobrir o texto, mas o efeito era pior do que o
   problema: quem estivesse lendo no meio da página via a barra sumir do topo
   no clique e tinha de rolar tudo de volta para escolher a seção. Aberta ela
   cobre o conteúdo, como qualquer menu suspenso — o fundo é opaco, a altura
   tem teto de 60vh e escolher uma aba fecha a lista. */

@media (min-width: 48em) {
  .doc-abas {
    border-radius: var(--raio-pilula);
  }
}

/* ----- Mobile: disclosure (ver partials/doc-abas.php) -----
   Até 48em a fila vira uma lista vertical que abre a partir de um resumo.
   Antes daqui ela era um trilho que rolava de lado e sangrava pelas margens
   da página; num celular, uma página de grupo com cinco recomendações
   mostrava duas. O resumo diz onde a pessoa está sem precisar abrir nada. */
.doc-abas__resumo {
  display: flex;
  align-items: center;
  gap: var(--esp-3);
  min-block-size: 3.5rem;
  padding: var(--esp-3) var(--esp-4);
  border-radius: var(--raio-xl);
  color: var(--cor-sobre-superficie);
  cursor: pointer;
  list-style: none; /* tira o triângulo do UA (Firefox) */
}

/* WebKit/Blink pedem este pseudo-elemento à parte. */
.doc-abas__resumo::-webkit-details-marker {
  display: none;
}

.doc-abas__resumo:hover {
  background: var(--cor-superficie-container-alta);
}

.doc-abas__resumo:focus-visible {
  outline: 3px solid var(--cor-foco);
  outline-offset: 2px;
}

.doc-abas__resumo-texto {
  display: flex;
  flex-direction: column;
  gap: 2px;
  min-inline-size: 0;
}

.doc-abas__resumo-rotulo {
  font: var(--tipo-rotulo);
  font-size: 0.8rem;
  color: var(--cor-sobre-superficie-variante);
}

.doc-abas__resumo-atual {
  font: var(--tipo-rotulo);
  font-weight: 700;
  overflow-wrap: anywhere;
}

.doc-abas__seta {
  flex-shrink: 0;
  margin-inline-start: auto;
  transition: rotate var(--duracao-curta) var(--movimento-padrao);
}

.doc-abas__sanfona[open] .doc-abas__seta {
  rotate: 180deg;
}

.doc-abas__lista {
  display: flex;
  flex-direction: column;
  margin: 0;
  padding: var(--esp-2);
  padding-block-start: 0;
  list-style: none;
  /* Grupo longo com o texto ampliado: a lista rola dentro de si em vez de
     empurrar o conteúdo da página para fora da tela. */
  max-block-size: 60vh;
  overflow-y: auto;
}

.doc-abas__item {
  min-inline-size: 0;
}

/* ----- Desktop: a fila de pílulas de sempre -----
   O resumo sai do layout E da árvore de acessibilidade (display:none), e o
   <details>, sempre aberto neste breakpoint, volta a ser só um contêiner. */
@media (min-width: 48em) {
  .doc-abas__resumo {
    display: none;
  }

  .doc-abas__lista {
    flex-direction: row;
    padding: 0;
    max-block-size: none;
    overflow-y: visible;
  }

  /* No desktop as abas dividem a largura em partes iguais (ver referência). */
  .doc-abas__item {
    flex: 1 1 0;
  }
}

@media (prefers-reduced-motion: reduce) {
  .doc-abas__seta {
    transition: none;
  }
}

/* No mobile cada aba é uma linha da lista: alinhada ao início, como o texto
   ao redor, e na altura de item de lista do M3 — 5rem empilhados cinco vezes
   virariam uma parede. O desktop restaura a pílula alta logo abaixo. */
.doc-abas__link {
  display: flex;
  align-items: center;
  min-block-size: 3rem;
  padding: var(--esp-2) var(--esp-4);
  border-radius: var(--raio-pilula);
  font: var(--tipo-rotulo);
  color: var(--cor-sobre-superficie-variante);
  text-decoration: none;
  transition: background-color 120ms var(--movimento-padrao);
}

@media (min-width: 48em) {
  .doc-abas__link {
    justify-content: center;
    /* Altura fixa da aba (folgada acima dos 44px que a CLAUDE.md §5 exige de
       alvo de toque). Se mudar, atualize --doc-abas-altura junto. */
    min-block-size: 5rem;
    padding: 0 var(--esp-4);
    text-align: center;
  }
}

.doc-abas__link:hover {
  background: var(--cor-superficie-container-alta);
}

.doc-abas__link--atual {
  background: var(--cor-primaria);
  color: var(--cor-sobre-primaria);
  font-weight: 700;
}

.doc-abas__link--atual:hover {
  background: var(--cor-primaria);
  color: var(--cor-sobre-primaria);
}

/* ---------- Grade: conteúdo + "Nesta página" ---------- */
.doc__grade {
  display: grid;
  gap: var(--esp-6);
  /* Coluna única, mas travada em minmax(0,…): sem isso a coluna implícita
     vale "auto", cujo mínimo é o min-content da coluna — e a tabela de
     downloads tem min-inline-size própria (ela rola dentro do wrapper).
     A coluna crescia até caber a tabela inteira e levava a página junto:
     386px de conteúdo numa tela de 360px. */
  grid-template-columns: minmax(0, 1fr);
}

/* Item de grade nasce com min-width:auto, que o impede de encolher abaixo do
   próprio min-content — mesma correção já aplicada em .app__main. */
.doc__conteudo {
  min-inline-size: 0;
}

@media (min-width: 64em) {
  .doc__grade {
    /* minmax(0, 16rem) e não 16rem seco: com o texto ampliado, 16rem viram
       384px e a coluna do "Nesta página" sozinha passava a ser mais larga
       que o espaço restante, empurrando a página inteira para fora da tela
       (rolagem horizontal — WCAG 1.4.10). Assim ela cede quando precisa. */
    grid-template-columns: minmax(0, 1fr) minmax(0, 16rem);
    margin-left: var(--doc-recuo-leitura);
  }
}

/* Foco programático (o JS foca aqui ao trocar de aba): sem anel visível,
   já que não é navegação por teclado do usuário. */
.doc__conteudo:focus:not(:focus-visible) {
  outline: none;
}

.doc__intro {
  font-size: 1.05em;
  color: var(--cor-sobre-superficie-variante);
}

.doc__topico {
  /* A barra de abas grudada não pode cobrir o título ao pular pela âncora. */
  scroll-margin-block-start: calc(
    var(--doc-topo) + var(--doc-abas-altura) + var(--esp-4)
  );
  margin-block-end: var(--esp-7);
}

#bibliografia .doc__topico-titulo {
  margin-block-end: var(--esp-3);
  margin-left: var(--doc-recuo-leitura);
}

/* Subtítulo (h3) dentro de um tópico — ex.: "Objetivo geral" / "Objetivos
   específicos" sob o h2 "Objetivos". */
.doc__subtitulo {
  font: var(--tipo-subtitulo);
  margin-block: var(--esp-5) var(--esp-2);
}

/* ---------- Citação recuada (blockquote) ---------- */
/* Citação formal de fonte legal/acadêmica, transcrita no corpo do texto.
   O recuo é a pista visual; o <blockquote> + <cite> garantem a semântica
   para tecnologia assistiva. */
.doc__citacao {
  margin: var(--esp-6) 0;
  padding-inline-start: var(--esp-4);
}

.doc__citacao blockquote {
  margin: 0;
}

.doc__citacao blockquote > p {
  color: var(--cor-sobre-superficie-variante);
}

.doc__citacao blockquote > p + p {
  margin-block-start: var(--esp-3);
}

.doc__citacao-fonte {
  display: block;
  margin-block-start: var(--esp-2);
  font: var(--tipo-rotulo);
  color: var(--cor-sobre-superficie-variante);
}

.doc__citacao-fonte cite {
  font-style: normal;
}

/* ---------- Lista de referências (página Referências) ---------- */
/* Bibliografia, legislações e diretrizes numa única lista alfabética. Sem
   marcador; recuo deslocado (hanging indent) faz o sobrenome de cada entrada
   começar na margem e as linhas seguintes recuarem — ajuda a varrer a lista.
   URLs longas quebram em vez de estourar a largura da coluna. */
.referencias {
  list-style: none;
  margin: var(--esp-5) 0 0;
  padding: 0;
  margin-left: var(--doc-recuo-leitura);
  max-inline-size: calc(75rem - 2rem);
}

.referencias__item {
  padding-inline-start: var(--esp-5);
  text-indent: calc(var(--esp-5) * -1);
  margin-block-end: var(--esp-4);
  color: var(--cor-sobre-superficie-variante);
  overflow-wrap: anywhere;
}

.referencias__item:last-child {
  margin-block-end: 0;
}

/* ---------- Quadro (tabela dentro do conteúdo) ---------- */
.doc__quadro {
  margin: var(--esp-6) 0;
}

/* Chamada para ação ao fim de um tópico (bloco 'botao' do doc). */
.doc__acao {
  margin-block-start: var(--esp-6);
}

.doc__quadro-titulo {
  font: var(--tipo-rotulo);
  color: var(--cor-sobre-superficie-variante);
  margin-block-end: var(--esp-3);
}

.doc__quadro-fonte {
  margin-block-start: var(--esp-3);
  color: var(--cor-sobre-superficie-variante);
  font: var(--tipo-rotulo);
}

/* Descrição textual do quadro — e a audiodescrição das figuras animadas, que
   usa a mesma peça: disponível a todos, aberta por padrão (o conteúdo é para
   leitura de todos, não só de tecnologia assistiva). O chevron torna evidente
   que dá para recolher. */
.doc__quadro-descricao,
.doc__figura-descricao {
  margin-block-start: var(--esp-3);
}

.doc__quadro-descricao > summary,
.doc__figura-descricao > summary {
  cursor: pointer;
  min-block-size: 44px;
  display: flex;
  align-items: center;
  gap: var(--esp-2);
  color: var(--cor-primaria);
  font: var(--tipo-rotulo);
  list-style: none;
}

.doc__quadro-descricao > summary::-webkit-details-marker,
.doc__figura-descricao > summary::-webkit-details-marker {
  display: none;
}
.doc__quadro-descricao > summary::marker,
.doc__figura-descricao > summary::marker {
  content: "";
}

/* Chevron desenhado em CSS: aponta para cima quando aberta (clique recolhe),
   para baixo quando fechada (clique abre). */
.doc__quadro-descricao > summary::after,
.doc__figura-descricao > summary::after {
  content: "";
  inline-size: 0.5em;
  block-size: 0.5em;
  border-inline-end: 2px solid currentColor;
  border-block-end: 2px solid currentColor;
  transform: rotate(-135deg);
  transition: transform 150ms var(--movimento-padrao);
}

.doc__quadro-descricao:not([open]) > summary::after,
.doc__figura-descricao:not([open]) > summary::after {
  transform: rotate(45deg);
}

.doc__quadro-descricao > p,
.doc__figura-descricao > p {
  margin-block-start: var(--esp-2);
  color: var(--cor-sobre-superficie-variante);
}

/* ---------- Figura dentro do conteúdo ---------- */
/* Imagem sempre embaixo do texto a que se refere, nunca ao lado (CLAUDE.md §4).
   A legenda é visível para todo mundo, não só para leitor de tela. */
.doc__figura {
  margin: var(--esp-6) 0;
}

.doc__figura > img {
  inline-size: 100%;
  block-size: auto;
  border-radius: var(--raio-l);
}

/* Moldura do espaço de imagem ainda não produzida: tracejada, como
   .doc__placeholder, para não passar por imagem de verdade. */
.doc__figura-vazia {
  display: grid;
  place-items: center;
  aspect-ratio: 16 / 9;
  padding: var(--esp-5);
  border: 1px dashed var(--cor-contorno);
  border-radius: var(--raio-l);
  background: var(--cor-superficie-container-baixa);
}

.doc__figura-pendente {
  margin: 0;
  text-align: center;
  color: var(--cor-sobre-superficie-variante);
  font: var(--tipo-rotulo);
}

.doc__figura-legenda {
  margin-block-start: var(--esp-3);
  color: var(--cor-sobre-superficie-variante);
  font-size: 0.95em;
}

/* A legenda é texto, não imagem: sobrevive a "Ocultar imagens" junto com a
   moldura vazia, que some. */
:root[data-sem-imagens="on"] .doc__figura-vazia,
:root[data-sem-imagens="on"] .doc__figura .figura-animada,
:root[data-sem-imagens="on"] .doc__figura > img {
  display: none;
}

/* Espaço honesto de conteúdo ainda não produzido (ver CLAUDE.md §9). */
.doc__placeholder {
  padding: var(--esp-4) var(--esp-5);
  border: 1px dashed var(--cor-contorno);
  border-radius: var(--raio-l);
  color: var(--cor-sobre-superficie-variante);
}

/* ---------- "Nesta página" ---------- */
.nesta-pagina {
  position: sticky;
  inset-block-start: calc(
    var(--doc-topo) + var(--doc-abas-altura) + var(--esp-4)
  );
  align-self: start;
  max-block-size: calc(100vh - var(--doc-abas-altura) - var(--esp-6));
  overflow-y: auto;
}

/* Índice duplicado dos headings da página: no mobile sai de cena para não
   empurrar o conteúdo (os tópicos seguem todos acessíveis na página). */
@media (max-width: 63.99em) {
  .nesta-pagina {
    display: none;
  }
}

.nesta-pagina__rotulo {
  font: var(--tipo-rotulo);
  color: var(--cor-sobre-superficie-variante);
  margin: 0 0 var(--esp-2);
}

.nesta-pagina__titulo {
  font: var(--tipo-headline);
  margin: 0 0 var(--esp-4);
}

.nesta-pagina__lista {
  display: grid;
  gap: 4px;
  margin: 0;
  padding: 0;
  list-style: none;
}

.nesta-pagina__link {
  display: flex;
  align-items: center;
  min-block-size: 44px;
  padding: var(--esp-2) var(--esp-3);
  border: 1px solid transparent;
  border-radius: var(--raio-m);
  color: var(--cor-sobre-superficie-variante);
  text-decoration: none;
}

.nesta-pagina__link:hover {
  background: var(--cor-superficie-container);
  color: var(--cor-sobre-superficie);
}

/* Tópico em leitura: borda + peso (nunca só cor — CLAUDE.md §11). */
.nesta-pagina__link--atual {
  border-color: var(--cor-contorno);
  color: var(--cor-sobre-superficie);
  font-weight: 700;
}

/* ---------- Trilha Anterior/Próximo ---------- */
/* Largura fixa de 576px, centralizada (decisão da Thalia, 17/07/2026: bater
   com o rodapé na janela dela). Em rem, e não em px, para acompanhar o
   controle de tamanho de fonte do painel de preferências.
   A barra de abas acima segue na largura cheia do .doc, de propósito. */
.doc-trilha {
  display: grid;
  gap: var(--esp-4);
  margin-block: var(--esp-8) var(--esp-6);
  max-width: 75rem;
  margin-inline: auto;
}

@media (min-width: 48em) {
  .doc-trilha {
    /* minmax(0, 1fr) e não 1fr: `1fr` é minmax(AUTO, 1fr), que proíbe a
       coluna de encolher abaixo do min-content do título. Com espaçamento
       entre letras ligado, os títulos longos das recomendações passavam a
       empurrar o card para fora da tela. */
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  }

  /* Sozinho na trilha (primeira seção), o "Próximo" fica na coluna direita. */
  .doc-trilha__item--proximo {
    grid-column: 2;
  }
}

.doc-trilha__item {
  display: grid;
  gap: var(--esp-2);
  align-content: start;
  padding: var(--esp-5);
  background: var(--cor-superficie-container-baixa);
  border-radius: var(--raio-xl);
  color: var(--cor-sobre-superficie);
  text-decoration: none;
}

.doc-trilha__item:hover {
  background: var(--cor-superficie-container);
}

.doc-trilha__rotulo {
  display: inline-flex;
  align-items: center;
  gap: var(--esp-2);
  font: var(--tipo-rotulo);
  color: var(--cor-sobre-superficie-variante);
}

.doc-trilha__titulo {
  font: var(--tipo-headline);
  /* Títulos de recomendação são longos e ganham largura com o espaçamento
     entre letras; sem isto uma palavra só estoura o card. */
  overflow-wrap: anywhere;
  hyphens: auto;
}

/* ---------- Seção "card grande + grade de cards" ---------- */
.secao-cards {
  margin-block-start: var(--esp-7);
}
.secao-cards__titulo {
  margin-block-end: var(--esp-4);
}

/* Card grande em destaque: link de bloco (imagem à esquerda, texto à
   direita no desktop; empilhado no mobile). A imagem é flush com a borda do
   card — o padding vive no __corpo (ver component-ref.png).
   auto-fit colapsa a segunda coluna quando não há figura (ou quando ela some
   com a preferência "Ocultar imagens"), evitando meia-coluna vazia. */
.card-destaque {
  display: grid;
  /* min() evita que a coluna force 20rem e estoure o reflow em 320px. */
  grid-template-columns: repeat(auto-fit, minmax(min(20rem, 100%), 1fr));
  background: var(--cor-superficie-container-baixa);
  border-radius: var(--raio-xl);
  overflow: hidden;
  color: inherit;
  text-decoration: none;
}

.card-destaque:hover {
  background: var(--cor-superficie-container-alta);
}

/* Flush com a borda do card, mas arredondada nos quatro cantos: nos cantos
   externos o raio coincide com o do card; nos internos o fundo do card
   aparece na curva. */
.card-destaque__figura {
  aspect-ratio: 16 / 9;
  background: var(--cor-superficie-container-alta);
  border-radius: var(--raio-xl);
  overflow: hidden;
}

.card-destaque__corpo {
  display: flex;
  flex-direction: column;
  justify-content: center;
  gap: var(--esp-2);
  padding: var(--esp-5);
}

@media (min-width: 48em) {
  .card-destaque__corpo {
    padding: var(--esp-6);
  }
  /* A figura acompanha a altura do card em vez de impor proporção. */
  .card-destaque__figura {
    aspect-ratio: auto;
    min-block-size: 16rem;
  }
}

.card-destaque__titulo {
  margin: 0;
  font: var(--tipo-headline);
}
.card-destaque__texto {
  color: var(--cor-sobre-superficie-variante);
}

.card-destaque__chamada {
  display: inline-flex;
  align-items: center;
  gap: var(--esp-2);
  margin-block-start: var(--esp-2);
  font: var(--tipo-rotulo);
  font-size: 1rem;
  color: var(--cor-link);
}

/* Grade de cards abaixo do destaque. */
.cards-grade {
  display: grid;
  gap: var(--esp-4);
  list-style: none;
  margin: var(--esp-4) 0 0;
  padding: 0;
  /* minmax(0,…) e não "1fr" seco: o mínimo de 1fr é o min-content da coluna,
     e com o texto em "Máximo" o título de um card inflava a coluna para além
     da tela. Vale para todas as grades de card do site. */
  grid-template-columns: minmax(0, 1fr);
}

@media (min-width: 40em) {
  .cards-grade--2col,
  .cards-grade--3col {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

@media (min-width: 64em) {
  .cards-grade--3col {
    grid-template-columns: repeat(3, minmax(0, 1fr));
  }
}

/* Imagem flush com a borda do card: o padding vive no __corpo. */
.card {
  display: flex;
  flex-direction: column;
  block-size: 100%;
  background: var(--cor-superficie-container-baixa);
  border-radius: var(--raio-l);
  overflow: hidden;
  color: inherit;
  text-decoration: none;
}

.card:hover {
  background: var(--cor-superficie-container-alta);
}

.card__figura {
  aspect-ratio: 16 / 10;
  background: var(--cor-superficie-container-alta);
  border-radius: var(--raio-l);
  overflow: hidden;
}

.card__corpo {
  display: flex;
  flex-direction: column;
  gap: var(--esp-2);
  padding: var(--esp-5);
  min-inline-size: 0;
}

/* Quando a autora inserir <img> nos espaços de mídia. */
.hero__figura > img,
.card-destaque__figura > img,
.card__figura > img {
  display: block;
  inline-size: 100%;
  block-size: 100%;
  object-fit: cover;
}

.card__eyebrow {
  font: var(--tipo-rotulo);
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--cor-sobre-superficie-variante);
}

.card__titulo {
  display: flex;
  align-items: baseline;
  gap: var(--esp-2);
  margin: 0;
  font: var(--tipo-titulo);
  min-inline-size: 0;
  /* Títulos de recomendação são longos e engordam com o espaçamento entre
     letras. A hifenização quebra em sílaba (o <html lang="pt-BR"> dá o
     dicionário certo); o anywhere fica como último recurso. */
  overflow-wrap: anywhere;
  hyphens: auto;
}

.card__numero {
  font: var(--tipo-display);
  font-size: 1.6rem;
  color: var(--cor-primaria);
}

.card__texto {
  color: var(--cor-sobre-superficie-variante);
}

/* ---------- Início: próximos passos (proximo.png) ---------- */
.secao-proximos {
  margin-block-start: var(--esp-7);
}
.secao-proximos__titulo {
  margin-block-end: var(--esp-4);
}

.proximos {
  display: grid;
  gap: var(--esp-4);
  list-style: none;
  margin: 0;
  padding: 0;
  grid-template-columns: minmax(0, 1fr);
}

/* 40em, como as demais grades de card do site. */
@media (min-width: 40em) {
  .proximos {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

.proximos__item {
  display: flex;
  flex-direction: column;
  gap: var(--esp-2);
  block-size: 100%;
  padding: var(--esp-5);
  background: var(--cor-superficie-container-baixa);
  border-radius: var(--raio-l);
  color: inherit;
  text-decoration: none;
}

.proximos__item:hover {
  background: var(--cor-superficie-container-alta);
}

.proximos__titulo-card {
  margin: 0;
  font: var(--tipo-titulo);
}
.proximos__texto {
  color: var(--cor-sobre-superficie-variante);
}

.proximos__chamada {
  display: inline-flex;
  align-items: center;
  gap: var(--esp-2);
  margin-block-start: auto;
  padding-block-start: var(--esp-2);
  font: var(--tipo-rotulo);
  font-size: 1rem;
  color: var(--cor-link);
}

/* ============================================================
   Visão geral das recomendações
   Hero de índice (recomedacoes-hero-ref.png) + uma seção por
   recomendação com figura grudada (recomendacoes-texto-ref.png).
   ============================================================ */

/* ---------- Hero de índice ---------- */
/* Um único bloco arredondado: título e subtítulo centralizados no topo, cards
   de grupo dentro do mesmo bloco. Diferente do hero de Início, que é partido
   em duas colunas (texto + figura). */
.hero--indice {
  margin-block: 8px;
  margin-inline: 0;
  /* Recuo lateral igual ao da margem da página (ver .hero__texto). */
  padding: var(--esp-7) var(--margem-pagina) var(--esp-6);
  background: var(--cor-primaria-container);
  color: var(--cor-sobre-primaria-container);
  border-radius: var(--raio-xl);
  gap: var(--esp-6);
}

.hero--indice.hero--recomendacoes {
  min-height: 80dvh;
  display: flex;
  flex-direction: column;
  justify-content: center;
}

.hero--indice.hero--recomendacoes .card__corpo {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: var(--esp-2);
  padding: var(--esp-5);
  height: 100%;
}

.hero--indice.hero--recomendacoes .hero__texto {
  max-inline-size: 66rem;
}

.hero--indice.hero--recomendacoes .hero__subtitulo {
  margin-inline: 0;
  max-inline-size: 100%;
}

.hero--indice .hero__texto {
  padding: 0;
  background: none;
  text-align: center;
  margin-inline: auto;
}

.hero--indice .hero__subtitulo {
  color: inherit;
  margin-inline: auto;
  margin-block-end: 0;
}

.hero__cards {
  display: grid;
  gap: var(--esp-4);
  list-style: none;
  margin: 0;
  padding: 0;
  grid-template-columns: minmax(0, 1fr);
  max-inline-size: 66rem;
  inline-size: 100%;
  margin-inline: auto;
}

/* Mesmo ritmo de .cards-grade: 1 → 2 em 40em → 3 em 64em. Ir direto a três
   colunas em 48em dava faixas de ~230px, e títulos como "Recomendações para
   o(a) professor(a)" quebravam em cinco linhas. */
@media (min-width: 40em) {
  .hero__cards {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

@media (min-width: 48em) {
  .hero--indice {
    padding: var(--esp-8) var(--esp-7) var(--esp-7);
  }
}

@media (min-width: 64em) {
  .hero__cards {
    grid-template-columns: repeat(3, minmax(0, 1fr));
  }
}

/* Card do hero: superfície clara sobre o bloco colorido, como no M3. */
.card--hero {
  background: var(--cor-superficie);
  color: var(--cor-sobre-superficie);
}

.card--hero:hover {
  background: var(--cor-superficie-container-baixa);
}

/* ---------- Seções: texto rolando, figura grudada ---------- */
/* As 12 correm em sequência única: o agrupamento vive no hero e no rótulo de
   cada seção, não em blocos que partam o corpo da página. As âncoras
   #grupo-… (cards do hero, trilha lateral) ficam na primeira seção do grupo. */
.rec-secoes {
  margin-inline: 0;
}

.rec-secao {
  display: grid;
  gap: var(--esp-5);
  align-items: start;
  padding-block: var(--esp-6);
  /* A âncora vinda do hero/trilha não pode encostar no topo da janela. */
  scroll-margin-block-start: 8px;
}

/* Sem recuo próprio: o texto começa na margem da página, e a figura acima
   dele tem exatamente a mesma largura. */
.rec-secao__texto {
  min-inline-size: 0;
}

.rec-secao__eyebrow {
  font: var(--tipo-rotulo);
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--cor-sobre-superficie-variante);
  margin: 0;
}

.rec-secao__titulo {
  margin-block: var(--esp-2) 0;
  font: var(--tipo-headline);
}

.rec-secao__recomendacao {
  max-inline-size: 38rem;
  margin-block: var(--esp-4) 0;
}

.rec-secao__acoes {
  margin-block: var(--esp-5) 0;
}

/* Espaço de imagem. Desde 29/08/2026 traz o número da recomendação em
   braille, animado (components/braille-numero.css) — antes era um placeholder
   empilhado, e daí vinha o display:flex que saiu junto com ele: tanto o SVG
   quanto um <img> preenchem a figura inteira, e centralizar era o que
   atrapalhava os dois. */
.rec-secao__figura {
  position: relative;
  aspect-ratio: 4 / 3;
  background: var(--cor-superficie-container-alta);
  border-radius: var(--raio-xl);
  overflow: hidden;
}

.rec-secao__figura > img {
  display: block;
  inline-size: 100%;
  block-size: 100%;
  object-fit: cover;
}

/* Empilhado (mobile e janelas baixas), a figura vem ANTES do texto — a ordem
   que a autora usa no material impresso: imagem em cima, escrita embaixo, as
   duas na mesma largura. No HTML ela continua depois, para o leitor de tela
   receber título e recomendação primeiro; inverter aqui não custa nada porque
   a figura é decorativa (aria-hidden) e não recebe foco. A partir de 64em o
   arranjo vira duas colunas e a ordem do documento volta a valer. */
@media (max-width: 63.99em), (max-height: 33.99rem) {
  .rec-secao__figura {
    order: -1;
  }
}

/* Duas colunas com a figura grudada só onde há altura e largura para isso.
   Cada seção tem a altura da janela: o texto fica centrado à esquerda e a
   figura gruda enquanto a seção passa, cedendo lugar à da seção seguinte.
   É sticky puro — sem JS e sem sequestrar o scroll. Abaixo deste ponto (e em
   janelas baixas) a seção vira empilhamento simples: figura, depois texto. */
@media (min-width: 64em) and (min-height: 34rem) {
  .rec-secao {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    gap: 8px;
    padding-block: 0;
  }

  .rec-secao__texto {
    display: flex;
    flex-direction: column;
    justify-content: center;
    min-block-size: calc(100vh - 16px);
    padding-block: var(--esp-6);
    /* Folga contra a trilha/flyout à esquerda: o texto não tem cartão em
       volta, então a margem tem que vir daqui. */
    padding-inline: var(--esp-7) var(--esp-6);
  }

  .rec-secao__figura {
    position: sticky;
    inset-block-start: 8px;
    aspect-ratio: auto;
    block-size: calc(100vh - 16px);
  }

  /* ---------- Modo painel (com JS) ---------- */
  /* O painel da direita fica parado: o JS move as doze figuras para dentro
     dele e alterna qual está visível conforme a seção cruza a metade da tela.
     Sem JS, este bloco nunca entra e vale o sticky por seção acima — a
     diferença é só a emenda entre uma figura e a seguinte.
     O scroll continua sendo o do navegador: nada aqui o intercepta. */
  .rec-secoes[data-modo="painel"] {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    gap: 8px;
    align-items: start;
  }

  /* Só o texto sobrou nas seções; a figura vive no painel. */
  .rec-secoes[data-modo="painel"] .rec-secao {
    display: block;
  }

  .rec-secoes[data-modo="painel"] .rec-painel {
    position: sticky;
    inset-block-start: 8px;
    block-size: calc(100vh - 16px);
  }

  /* As doze empilhadas no mesmo lugar; só a ativa aparece. A troca é só de
     opacidade — de propósito: qualquer estado intermediário aqui é uma
     opacidade, nunca uma figura presa visível por causa de uma transição que
     não terminou. Com "Pausar animações" (ou prefers-reduced-motion), a regra
     global zera a duração e a troca vira instantânea. */
  .rec-secoes[data-modo="painel"] .rec-secao__figura {
    position: absolute;
    inset: 0;
    block-size: auto;
    aspect-ratio: auto;
    opacity: 0;
    transition: opacity var(--duracao-curta) ease;
  }

  .rec-secoes[data-modo="painel"] .rec-secao__figura[data-ativo="sim"] {
    opacity: 1;
  }
}

/* Sem JS o painel fica vazio — não deve ocupar coluna nenhuma. */
.rec-painel:empty {
  display: none;
}

/* ---------- Página de grupo (uma aba por recomendação) ----------
   O h1 é o nome do grupo, no hero. A barra de abas já diz qual recomendação
   está aberta, por isso o conteúdo começa direto no primeiro sub-tópico. */
.rec-texto__destaque {
  margin: var(--esp-4) 0 0;
  padding: var(--esp-5) var(--esp-6);
  background: var(--cor-primaria-container);
  color: var(--cor-sobre-primaria-container);
  border-inline-start: 6px solid var(--cor-primaria);
  border-radius: var(--raio-l);
  font-size: 1.15em;
}

.rec-texto__destaque p {
  margin: 0;
}

/* ---------- Fazer / não fazer ---------- */
.praticas {
  display: grid;
  gap: var(--esp-4);
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 20rem), 1fr));
}

.praticas__coluna {
  padding: var(--esp-4) var(--esp-5);
  border-radius: var(--raio-l);
  border: 1px solid var(--cor-contorno-variante);
}

.praticas__coluna h3 {
  display: flex;
  align-items: center;
  gap: var(--esp-2);
  margin-block-start: 0;
}

.praticas__coluna--fazer {
  background: var(--cor-sucesso-container);
}

.praticas__coluna--fazer h3,
.icone-ok {
  color: var(--cor-sucesso);
}

.praticas__coluna--nao-fazer {
  background: var(--cor-erro-container);
}

.praticas__coluna--nao-fazer h3,
.icone-nao {
  color: var(--cor-erro);
}

.praticas__coluna ul {
  margin: 0;
  padding-inline-start: var(--esp-5);
}
.praticas__coluna li {
  margin-block-end: var(--esp-2);
}
.praticas__coluna p {
  margin: 0;
}

/* ---------- Exemplos visuais (antes/depois) ---------- */
.exemplo__par {
  display: grid;
  gap: var(--esp-5);
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 20rem), 1fr));
  /* As três faixas de cada lado (imagem · rótulo · textos) para o subgrid
     abaixo alinhar. Ver .exemplo-visual. */
  grid-template-rows: auto auto auto;
  margin-block-start: var(--esp-4);
}

.exemplo-visual {
  margin: 0;
  border: 1px solid var(--cor-contorno-variante);
  border-radius: var(--raio-l);
  overflow: hidden;
}

/* Faça e Não faça lado a lado só ensinam se der para comparar linha a linha:
   as duas imagens terminam na mesma altura e as duas faixas começam na mesma
   altura, como no M3 (recomendacoes-exemplos-ref.png). Sem subgrid cada lado
   fica com a sua altura — a comparação continua legível, só menos exata. */
@supports (grid-template-rows: subgrid) {
  .exemplo-visual {
    display: grid;
    grid-row: span 3;
    grid-template-rows: subgrid;
  }
}

.exemplo-visual__rotulo {
  display: flex;
  align-items: center;
  gap: var(--esp-2);
  padding: var(--esp-3) var(--esp-4);
  font: var(--tipo-subtitulo);
}

.exemplo-visual--dont .exemplo-visual__rotulo {
  background: var(--cor-erro-container);
  color: var(--cor-erro);
}

.exemplo-visual--do .exemplo-visual__rotulo {
  background: var(--cor-sucesso-container);
  color: var(--cor-sucesso);
}

.exemplo-visual__simulacao {
  padding: var(--esp-4);
  background: var(--cor-superficie-container);
}

.exemplo-visual__textos {
  padding: var(--esp-3) var(--esp-4) var(--esp-4);
}

.exemplo-visual__subtitulo {
  font: var(--tipo-rotulo);
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--cor-sobre-superficie-variante);
  margin: var(--esp-3) 0 var(--esp-1);
}

.exemplo-visual__textos p {
  margin: 0 0 var(--esp-2);
}

/* Simulação de slide — os estilos "inacessíveis" são deliberados:
   demonstram a barreira dentro de um exemplo rotulado e descrito. */
.ex-slide {
  border-radius: var(--raio-s);
  padding: var(--esp-4) var(--esp-5);
  min-block-size: 11rem;
  border: 1px solid var(--cor-contorno-variante);
}

.ex-slide--neutro {
  background: #ffffff;
  color: #1d1b20;
}

.ex-slide--neutro .ex-slide__titulo {
  font-weight: 700;
  font-size: 1.05rem;
  margin: 0 0 var(--esp-2);
}

.ex-slide--neutro .ex-slide__linha {
  margin: 0 0 var(--esp-1);
  font-size: 0.95rem;
}

.ex-slide--inacessivel {
  background: #ffffff;
  color: #a8a8a8;
  font-family: Georgia, "Times New Roman", serif;
}

.ex-slide--inacessivel .ex-slide__titulo {
  font-size: 0.9rem;
  font-weight: 400;
  margin: 0 0 var(--esp-1);
}

.ex-slide--inacessivel .ex-slide__linha {
  font-size: 0.72rem;
  line-height: 1.15;
  text-align: justify;
  margin: 0;
}

.ex-slide--acessivel {
  background: #fffde9;
  color: #131313;
}

.ex-slide--acessivel .ex-slide__titulo {
  font-size: 1.35rem;
  font-weight: 700;
  margin: 0 0 var(--esp-3);
}

.ex-slide--acessivel .ex-slide__linha {
  font-size: 1.05rem;
  line-height: 1.5;
  margin: 0 0 var(--esp-2);
  max-inline-size: 39ch;
}

/* Acessível em fundo escuro: amarelo/branco sobre preto — combinações de
   "altíssimo desempenho" de Arditi. Usado quando a descrição do exemplo pede
   contraste invertido (recs. 01, 03, 05, 09). */
.ex-slide--acessivel-escuro {
  background: #101010;
  color: #ffe14d;
}

.ex-slide--acessivel-escuro .ex-slide__titulo {
  font-size: 1.35rem;
  font-weight: 700;
  color: #ffffff;
  margin: 0 0 var(--esp-3);
}

.ex-slide--acessivel-escuro .ex-slide__linha {
  font-size: 1.05rem;
  line-height: 1.5;
  margin: 0 0 var(--esp-2);
  max-inline-size: 39ch;
}

/* Vibração óptica: vermelho sobre verde, serifado, justificado e apertado —
   a barreira exata descrita na rec. 09. */
.ex-slide--vibra {
  background: #1f7a34;
  color: #e02424;
  font-family: Georgia, "Times New Roman", serif;
}

.ex-slide--vibra .ex-slide__titulo {
  font-size: 0.95rem;
  font-weight: 400;
  margin: 0 0 var(--esp-1);
}

.ex-slide--vibra .ex-slide__linha {
  font-size: 0.75rem;
  line-height: 1.15;
  text-align: justify;
  margin: 0;
}

/* Post-it: vermelho sobre amarelo, cursiva (rec. 05). */
.ex-slide--postit {
  background: #ffe873;
  color: #d01e1e;
  font-family: "Segoe Script", "Comic Sans MS", cursive;
  min-block-size: 8rem;
}

.ex-slide--postit .ex-slide__titulo {
  font-size: 1.2rem;
  font-weight: 700;
  margin: 0 0 var(--esp-2);
}

.ex-slide--postit .ex-slide__linha {
  font-size: 1rem;
  line-height: 1.3;
  margin: 0 0 var(--esp-1);
}

/* Anotação "à caneta vermelha": manuscrito vermelho sobre papel branco,
   cor como único diferenciador (rec. 07). */
.ex-slide--manuscrito {
  background: #ffffff;
  color: #d01e1e;
  font-family: "Segoe Script", "Comic Sans MS", cursive;
}

.ex-slide--manuscrito .ex-slide__titulo {
  font-size: 1.05rem;
  font-weight: 400;
  color: #1d1b20;
  margin: 0 0 var(--esp-2);
}

.ex-slide--manuscrito .ex-slide__linha {
  font-size: 1rem;
  line-height: 1.4;
  margin: 0 0 var(--esp-1);
}

/* Simulação de lista de arquivos */
.ex-arquivos {
  background: #ffffff;
  color: #1d1b20;
  border-radius: var(--raio-s);
  padding: var(--esp-4);
  border: 1px solid var(--cor-contorno-variante);
}

.ex-arquivos__titulo {
  font-weight: 700;
  margin: 0 0 var(--esp-3);
}

.ex-arquivos__item {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--esp-2);
  margin: 0 0 var(--esp-2);
  font-size: 0.95rem;
}

.ex-arquivos__nome {
  font-family: var(--fonte-mono);
  font-size: 0.9em;
}
.ex-arquivos__detalhe {
  color: #49454f;
  font-size: 0.85em;
}

/* Simulação de gráfico de barras */
.ex-grafico {
  background: #ffffff;
  color: #1d1b20;
  border-radius: var(--raio-s);
  padding: var(--esp-4);
  border: 1px solid var(--cor-contorno-variante);
}

.ex-grafico__titulo {
  font-weight: 700;
  margin: 0 0 var(--esp-3);
}

.ex-grafico__linha {
  display: flex;
  align-items: center;
  gap: var(--esp-3);
  margin-block-end: var(--esp-2);
}

.ex-grafico__label {
  min-inline-size: 3rem;
  font-size: 0.9rem;
}

.ex-grafico__barra {
  display: block;
  block-size: 1.4rem;
  background: #4f378b;
  border-radius: 0 var(--raio-xs) var(--raio-xs) 0;
  max-inline-size: calc(100% - 4rem);
}

.ex-grafico__legenda {
  margin: var(--esp-3) 0 0;
  padding: var(--esp-3);
  background: #f3edf7;
  border-radius: var(--raio-s);
  font-size: 0.92rem;
  color: #1d1b20;
}

/* Simulação de planilha densa — o exagero de colunas e o corpo minúsculo são
   deliberados: demonstram a barreira descrita na rec. 04. */
.ex-tabela {
  background: #ffffff;
  color: #1d1b20;
  border-radius: var(--raio-s);
  padding: var(--esp-4);
  border: 1px solid var(--cor-contorno-variante);
}

.ex-tabela__titulo {
  font-weight: 700;
  margin: 0 0 var(--esp-3);
  font-size: 0.9rem;
}

.ex-tabela__grade {
  inline-size: 100%;
  border-collapse: collapse;
  font-size: 0.62rem;
  table-layout: fixed;
}

.ex-tabela__grade th,
.ex-tabela__grade td {
  border: 1px solid #cac4d0;
  padding: 2px 3px;
  text-align: center;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.ex-tabela__grade th {
  background: #f3edf7;
  font-weight: 700;
}

/* ---------- Metodologia ---------- */
.estagio__numero {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  inline-size: 2.2rem;
  block-size: 2.2rem;
  border-radius: 50%;
  background: var(--cor-primaria);
  color: var(--cor-sobre-primaria);
  font-size: 1.1rem;
  margin-inline-end: var(--esp-2);
  vertical-align: middle;
}

.participantes {
  list-style: none;
  padding: 0;
}

.participantes__item {
  padding: var(--esp-3) var(--esp-4);
  border-block-end: 1px solid var(--cor-contorno-variante);
}

/* ---------- Assistente ---------- */
/* Subtítulo (h3) dentro de um tópico de documentação — usado em "O que é o
   assistente" e "Limites e cuidados". Mesmo teto de largura dos parágrafos. */
.doc__subtitulo {
  font: var(--tipo-subtitulo);
  margin: var(--esp-5) 0 var(--esp-2);
}

.doc__lista {
  padding-inline-start: var(--esp-5);
}
.doc__lista li {
  margin-block-end: var(--esp-2);
}

.passos {
  padding-inline-start: var(--esp-5);
}
.passos__item {
  margin-block-end: var(--esp-5);
}

/* Ilustração de cada passo: decorativa (aria-hidden), construída só com CSS e
   os ícones do próprio site, sempre EMBAIXO do texto do passo (CLAUDE.md §4).
   Cores só por token, para acompanhar tema e modos de cor. A legenda visível
   descreve a cena — e permanece quando "Ocultar imagens" esconde a cena. */
.passo-figura {
  margin: var(--esp-3) 0 0;
  max-inline-size: 28rem;
}

.ilus {
  display: grid;
  /* Sem o minmax(0,…) a coluna implícita cresce até o min-content dos filhos
     — e .ilus__campo-texto é uma linha de mono com white-space: nowrap, que
     não tem min-content pequeno. Em 360px isso jogava a ilustração 200px
     para fora da tela em vez de truncar o texto, como a elipse manda. */
  grid-template-columns: minmax(0, 1fr);
  gap: var(--esp-3);
  justify-items: start;
  padding: var(--esp-4);
  background: var(--cor-superficie-container);
  border: 1px solid var(--cor-contorno-variante);
  border-radius: var(--raio-m);
}

/* "Folha" com linhas de texto simuladas (o bloco do prompt em miniatura). */
.ilus__folha {
  display: grid;
  gap: var(--esp-2);
  inline-size: 100%;
  padding: var(--esp-3);
  background: var(--cor-superficie);
  border: 1px solid var(--cor-contorno-variante);
  border-radius: var(--raio-s);
}

.ilus__linha {
  display: inline-block;
  block-size: 0.5rem;
  border-radius: var(--raio-pilula);
  background: var(--cor-contorno-variante);
}

/* Botão simulado — parece o "Copiar prompt" real, mas não é interativo. */
.ilus__botao {
  display: inline-flex;
  align-items: center;
  gap: var(--esp-2);
  padding: var(--esp-2) var(--esp-4);
  background: var(--cor-primaria);
  color: var(--cor-sobre-primaria);
  border-radius: var(--raio-pilula);
  font: var(--tipo-rotulo);
}

/* Campo de mensagem simulado de um assistente (pílula + botão de enviar). */
.ilus__campo {
  display: flex;
  align-items: center;
  gap: var(--esp-3);
  inline-size: 100%;
  padding: var(--esp-2) var(--esp-2) var(--esp-2) var(--esp-4);
  background: var(--cor-superficie);
  border: 1px solid var(--cor-contorno);
  border-radius: var(--raio-pilula);
}

.ilus__campo-texto {
  flex: 1;
  min-inline-size: 0;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  font-family: var(--fonte-mono);
  font-size: 0.8rem;
  color: var(--cor-sobre-superficie-variante);
}

.ilus__enviar {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  inline-size: 2rem;
  block-size: 2rem;
  background: var(--cor-primaria);
  color: var(--cor-sobre-primaria);
  border-radius: 50%;
}

/* Balão de resposta simulado: linhas de diagnóstico com ✓/✗ (os mesmos
   ícones dos exemplos "Faça / Não faça" — nunca só a cor diferencia). */
.ilus__balao {
  inline-size: 100%;
  padding: var(--esp-3) var(--esp-4);
  background: var(--cor-superficie);
  border: 1px solid var(--cor-contorno-variante);
  border-radius: var(--raio-m) var(--raio-m) var(--raio-m) var(--raio-xs);
}

.ilus__balao-item {
  display: flex;
  align-items: center;
  gap: var(--esp-2);
  margin: 0 0 var(--esp-2);
}

.ilus__balao-item:last-child {
  margin-block-end: 0;
}
.ilus__balao-item .ilus__linha {
  flex-shrink: 1;
}

.passo-figura__legenda {
  margin-block-start: var(--esp-2);
  font: var(--tipo-rotulo);
  color: var(--cor-sobre-superficie-variante);
}

/* ---------- Veja um exemplo (transcrição da conversa real) ---------- */
.dialogo {
  display: grid;
  gap: var(--esp-5);
  margin-block-start: var(--esp-4);
}

.dialogo__rotulo {
  font: var(--tipo-rotulo);
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--cor-sobre-superficie-variante);
  margin: 0 0 var(--esp-2);
}

.dialogo__figura {
  margin: var(--esp-3) 0 0;
}

.dialogo__slide {
  max-inline-size: 26rem;
}

.dialogo__resposta {
  margin: 0;
  padding: var(--esp-4);
  background: var(--cor-superficie-container-baixa);
  border: 1px solid var(--cor-contorno-variante);
  border-radius: var(--raio-l) var(--raio-l) var(--raio-l) var(--raio-xs);
}

.dialogo__resposta p {
  margin: 0 0 var(--esp-3);
}
.dialogo__resposta p:last-child {
  margin-block-end: 0;
}

/* Subtítulos DA RESPOSTA CITADA: parágrafos com estilo, não headings — a
   hierarquia da página não muda por causa de uma citação. */
.dialogo__sub {
  font: var(--tipo-subtitulo);
}

.dialogo__corte {
  color: var(--cor-sobre-superficie-variante);
}

.dialogo__lista {
  margin: 0 0 var(--esp-3);
  padding-inline-start: var(--esp-5);
}
.dialogo__lista li {
  margin-block-end: var(--esp-2);
}

/* ---------- Mensagens de tarefa ---------- */
.mensagens {
  list-style: none;
  margin: var(--esp-4) 0 0;
  padding: 0;
  display: grid;
  gap: var(--esp-4);
  grid-template-columns: minmax(0, 1fr);
}

.mensagem {
  border: 1px solid var(--cor-contorno-variante);
  border-radius: var(--raio-l);
  padding: var(--esp-4);
}

.mensagem__cabecalho {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: var(--esp-2) var(--esp-3);
  margin-block-end: var(--esp-3);
}

.mensagem__titulo {
  font: var(--tipo-subtitulo);
  margin: 0;
}

/* Mesma família do bloco do prompt, em escala menor; o trecho entre
   colchetes é para a pessoa completar, então quebra de linha é bem-vinda. */
.mensagem__texto {
  margin: 0;
  padding: var(--esp-3) var(--esp-4);
  background: var(--cor-superficie-container);
  border-radius: var(--raio-s);
  font-family: var(--fonte-mono);
  font-size: 0.9rem;
  line-height: 1.55;
  white-space: pre-wrap;
  overflow-wrap: break-word;
}

/* Referência ABNT copiável (Materiais): mesmo bloco das mensagens de tarefa,
   mas em fonte de texto — é prosa acadêmica, não código. */
.mensagem__texto--citacao {
  font-family: var(--fonte-base);
  font-size: 1rem;
}

.nota {
  padding: var(--esp-4);
  background: var(--cor-superficie-container);
  border-radius: var(--raio-m);
}

/* Cartões de texto do Assistente e do Materiais: a folga interna de --esp-5
   custa 48px de largura, e no estreito ela sai do conteúdo. Em 360px a linha
   de texto ia a ~280px; devolver esses 16px de cada lado é a diferença entre
   caber e não caber. A folga cheia volta a partir de 48em. */
@media (min-width: 48em) {
  .mensagem,
  .nota {
    padding: var(--esp-4) var(--esp-5);
  }

  .dialogo__resposta {
    padding: var(--esp-4) var(--esp-5);
  }
}

.prompt__cabecalho {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: var(--esp-3);
}

.prompt__aviso {
  min-block-size: 1.5rem;
  font: var(--tipo-rotulo);
  color: var(--cor-sucesso);
}

/* Bloco do prompt. No estreito, o padding de --esp-5 e o corpo de 0.9rem
   deixavam ~30 caracteres por linha numa tela de 360px, e o teto fixo de
   32rem ocupava quase toda a altura útil — uma caixa rolante dentro de uma
   página rolante. Daí o teto em vh e a folga menor abaixo de 48em. */
.prompt {
  padding: var(--esp-4);
  background: var(--cor-superficie-container);
  border: 1px solid var(--cor-contorno-variante);
  border-radius: var(--raio-l);
  font-family: var(--fonte-mono);
  font-size: 0.85rem;
  line-height: 1.55;
  white-space: pre-wrap;
  overflow-wrap: break-word;
  max-block-size: min(32rem, 65vh);
  overflow-y: auto;
}

@media (min-width: 48em) {
  .prompt {
    padding: var(--esp-5);
    font-size: 0.9rem;
  }
}

/* ---------- Tabelas (padrão "Resources" do M3 — ver modelo-tabela-ref.png) ---------- */
/* Contêiner arredondado com contorno; o mesmo scroll horizontal quando estreito.
   O raio recorta os cantos do fundo do cabeçalho.

   A tabela continua sendo uma <table> de verdade em qualquer largura: virar
   cards no estreito exigiria display:block, que derruba os papéis de tabela
   nos leitores de tela — justamente onde a relação linha/coluna é o que dá
   sentido ao dado (formato × indicado para × ação).

   Sombras de rolagem: as duas primeiras camadas são "capas" opacas presas às
   bordas (background-attachment: local) e as duas últimas, as sombras — que
   ficam escondidas atrás das capas enquanto não há conteúdo cortado daquele
   lado. É o único aviso de que a tabela rola; sem ele, em 360px a coluna de
   ações simplesmente não existe para quem não tentar arrastar. */
.tabela-scroll {
  overflow-x: auto;
  border: 1px solid var(--cor-contorno-variante);
  border-radius: var(--raio-l);
  background:
    linear-gradient(to right, var(--cor-superficie) 30%, transparent) 0 0 / 2.5rem 100% no-repeat local,
    linear-gradient(to left, var(--cor-superficie) 30%, transparent) 100% 0 / 2.5rem 100% no-repeat local,
    radial-gradient(farthest-side at 0 50%, rgb(0 0 0 / 0.16), transparent) 0 0 / 1rem 100% no-repeat scroll,
    radial-gradient(farthest-side at 100% 50%, rgb(0 0 0 / 0.16), transparent) 100% 0 / 1rem 100% no-repeat scroll;
}

/* 24rem cabe em 384px: numa tela de 360px a tabela ainda rola, mas só um
   pouco. Com os 32rem de antes, quase metade dela ficava fora da vista. */
.tabela {
  border-collapse: collapse;
  inline-size: 100%;
  min-inline-size: 24rem;
}

.tabela th,
.tabela td {
  padding: var(--esp-3) var(--esp-4);
  text-align: start;
  vertical-align: top;
}

@media (min-width: 48em) {
  .tabela {
    min-inline-size: 32rem;
  }

  .tabela th,
  .tabela td {
    padding: var(--esp-4) var(--esp-5);
  }
}

/* Divisórias como border-block-START: a última linha não deixa linha sobrando
   junto ao contêiner e, sob um rótulo com rowspan, a divisória aparece só nas
   colunas não mescladas — a célula agrupada fica um bloco contínuo, como no
   modelo M3. */
.tabela tbody th,
.tabela tbody td {
  border-block-start: 1px solid var(--cor-contorno-variante);
}

/* Cabeçalho tonalizado, como no modelo. */
.tabela thead th {
  font: var(--tipo-rotulo);
  color: var(--cor-sobre-superficie-variante);
  background: var(--cor-superficie-container-baixa);
}

/* Primeira coluna (rótulo de linha): mesmo peso do corpo, como a coluna "Type"
   do modelo — a semântica de cabeçalho fica no scope, não no negrito. */
.tabela tbody th {
  font-weight: 400;
  color: var(--cor-sobre-superficie);
}

/* ---------- Tabela de assistentes ---------- */
/* Célula com botão de copiar + link de abrir. Empilha no estreito para os dois
   alvos manterem 44x44px sem se espremerem (CLAUDE.md §5). */
.tabela__acoes {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--esp-2) var(--esp-4);
}

.link-externo {
  display: inline-flex;
  align-items: center;
  gap: var(--esp-2);
  min-block-size: 44px;
  color: var(--cor-primaria);
}

.chip--testado {
  background: var(--cor-primaria-container);
  color: var(--cor-sobre-primaria-container);
  border-color: transparent;
}

/* ---------- Créditos ---------- */
.creditos {
  list-style: none;
  padding: 0;
}

.creditos__item {
  display: flex;
  flex-direction: column;
  padding: var(--esp-3) var(--esp-4);
  border-block-end: 1px solid var(--cor-contorno-variante);
}

.creditos__item span {
  color: var(--cor-sobre-superficie-variante);
}

/* ---------- Stack de acessibilidade: abas fixas à direita ---------- */
/* Duas abas iguais empilhadas na borda direita (convenção de recursos de
   acessibilidade): Recursos assistivos e Libras. Só o ícone fica à mostra;
   hover/foco revelam o rótulo. O nome acessível independe disso — o rótulo
   nunca sai da árvore de acessibilidade, é só clipado.

   O empilhamento vem do container, não de coordenadas por botão: antes o
   gatilho de recursos era posicionado em calc(50% - 6.5rem) para ficar
   "acima do VLibras", um alinhamento que dependia de o CDN não mudar a
   altura do botão dele. */
.a11y-stack {
  position: fixed;
  inset-inline-end: 0;
  inset-block-start: 50%;
  transform: translateY(-50%);
  z-index: 90; /* abaixo da busca (92) e da gaveta; diálogos ficam acima */
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: 2px;
}

/* As duas abas do stack. .recursos-gatilho é nosso <button>; o seletor de
   atributo alcança o <div> que o plugin do VLibras injeta (ver adiante). */
.recursos-gatilho,
.a11y-stack [vw-access-button] {
  position: relative; /* tira do fixed do CDN: quem posiciona é o stack */
  display: flex;
  align-items: center;
  /* Sem folga em repouso: o gap continuaria ocupando 8px mesmo com o rótulo
     colapsado em max-inline-size: 0, e a aba fechada ficaria 8px mais larga
     que os 48px do alvo de toque. */
  gap: 0;
  /* Alvo em rem (3rem = 48px no tamanho padrão, o mínimo do WCAG 2.5.8) para
     acompanhar o tamanho de texto escolhido — como o recuo e o rótulo já
     faziam. O piso de 48px protege quem DIMINUI o texto pelo navegador.
     A folha que vlibras-init.js injeta na shadow root do plugin repete estas
     mesmas medidas: é o que mantém as duas abas do mesmo tamanho. */
  min-block-size: max(48px, 3rem);
  min-inline-size: max(48px, 3rem);
  padding: var(--esp-3);
  font: var(--tipo-rotulo);
  background: var(--cor-primaria);
  color: var(--cor-sobre-primaria);
  border: none;
  border-start-start-radius: var(--raio-l);
  border-end-start-radius: var(--raio-l);
  box-shadow: var(--elevacao-2);
  cursor: pointer;
}

.recursos-gatilho:hover,
.a11y-stack [vw-access-button]:hover {
  box-shadow: var(--elevacao-3);
}

/* O desenho da aba: 1.5rem são os 24px dos atributos do <svg> no tamanho
   padrão. Vem do CSS, e não dos atributos, para crescer com o alvo — e para
   casar com o ícone do VLibras, que também é dimensionado em rem. */
.recursos-gatilho svg {
  flex-shrink: 0;
  inline-size: max(24px, 1.5rem);
  block-size: max(24px, 1.5rem);
}

/* Rótulo que abre no hover/foco. O teto acompanha a viewport: em 320px com
   o texto em 150% e espaçamento entre letras ligado, 12rem fixos cortavam
   "Recursos assistivos" — e, como a aba está encostada na borda direita, o
   corte comia o COMEÇO da palavra. As reticências deixam o corte explícito. */
.recursos-gatilho__rotulo,
.a11y-stack [vw-access-button]::after {
  max-inline-size: 0;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  transition: max-inline-size var(--duracao-media) var(--movimento-padrao);
}

.recursos-gatilho:hover,
.recursos-gatilho:focus-visible,
.a11y-stack [vw-access-button]:hover,
.a11y-stack [vw-access-button]:focus-visible {
  gap: var(--esp-2);
}

.recursos-gatilho:hover .recursos-gatilho__rotulo,
.recursos-gatilho:focus-visible .recursos-gatilho__rotulo,
.a11y-stack [vw-access-button]:hover::after,
.a11y-stack [vw-access-button]:focus-visible::after {
  max-inline-size: min(12rem, 45vw);
}

/* ---------- VLibras ---------- */
/* A partir da versão 7.8.0 o plugin não usa mais o <div vw-access-button>
   como gatilho: ele injeta um botão próprio dentro de uma shadow root, fixo
   na borda direita, bem em cima das nossas abas (ver assets/js/vlibras-init.js,
   que o traz para dentro do stack). O gatilho antigo vira markup morto — um
   botão que não abre nada — e some daqui. A classe é posta pelo JS só depois
   de confirmar que o gatilho novo existe: se o CDN voltar atrás, o antigo
   continua à mostra e funcionando. */
.a11y-stack--libras-shadow [vw-access-button] {
  display: none !important;
}

/* O <div vw> deixa de ser uma aba visível: ele só hospeda o wrapper do player.
   Sem isso ele ocuparia um lugar vazio de 48px no stack. */
.a11y-stack--libras-shadow [vw] {
  display: contents;
}

/* Modo de convivência: o encaixe do gatilho do VLibras foi tentado, MEDIDO e
   reprovado — o botão do plugin continua preso à viewport, onde ele quis
   (vlibras-init.js explica a verificação). Nesse caso o site não insiste: as
   nossas abas sobem para fora do caminho e o botão do plugin fica com a cara
   e o lugar dele.

   O plugin se ancora em `top: calc(50vh - 20px)` com ~48px de altura, ou seja,
   ocupa de 50vh−20px a 50vh+28px. Subindo o stack até 2,5rem acima do meio da
   tela e ancorando-o pela base, sobra folga entre a nossa aba de baixo e o
   botão dele nas duas direções.

   Se um dia isto aparecer em produção, é sinal de que o CDN mudou de novo: o
   site continua utilizável, e o conserto é olhar o encaixe em vlibras-init.js.
   O gatilho antigo continua escondido — nessa versão do plugin ele não abre
   nada. */
.a11y-stack--libras-fora {
  inset-block-start: calc(50% - 2.5rem);
  transform: translateY(-100%);
}

.a11y-stack--libras-fora [vw-access-button] {
  display: none !important;
}

.a11y-stack--libras-fora [vw] {
  display: contents;
}

/* O VLibras é o único terceiro autorizado no site (CLAUDE.md §5): plugin
   oficial de tradução para Libras, não um overlay de acessibilidade.
   Reestilizá-lo não muda isso — o que ele faz continua sendo dele; aqui só
   trocamos a aparência do gatilho, para ele não destoar do botão ao lado.

   Por que TANTO !important: o plugin injeta a folha dele em runtime, depois
   da nossa, então empata em especificidade e vence pela ordem; e ainda
   posiciona o contêiner [vw] por style inline via JS (right/top/transform),
   que só !important de folha alcança. Cada declaração abaixo neutraliza uma
   do plugin — nenhuma é decorativa.

   O ícone vem por mask-image, e não background-image, para herdar
   currentColor e acompanhar tema e modos de cor como o resto do site. */
.a11y-stack [vw] {
  position: static !important;
  inset: auto !important;
  transform: none !important;
  /* O plugin dá 10px de margem ao contêiner: sem zerar, a aba de Libras
     ficava 10px à esquerda da de Recursos em vez de alinhada à borda. */
  margin: 0 !important;
  padding: 0 !important;
}

.a11y-stack [vw-access-button] {
  position: relative !important; /* quem posiciona é o stack */
  inset: auto !important;
  /* O plugin deixa o botão em row-reverse: com isso o ícone (::before) era
     empilhado a partir da borda direita e ficava parado no lugar enquanto o
     rótulo (::after) abria para a esquerda DELE — o oposto da aba de Recursos
     assistivos, onde ícone e rótulo deslizam juntos e a escrita nasce à
     direita do ícone. */
  flex-direction: row !important;
  inline-size: auto !important;
  block-size: auto !important;
  margin: 0 !important;
  background-image: none !important;
  border-radius: var(--raio-l) 0 0 var(--raio-l) !important;
  overflow: visible !important;
  opacity: 1 !important;
}

/* O que o plugin desenha DENTRO do botão — o sprite do avatar e o balão
   "Abrir Tradutor", que tem min-width de 150px e empurrava a página para
   fora no mobile — é substituído pelo nosso ícone (::before) e rótulo
   (::after). O elemento continua no DOM: quem o remove é o plugin. */
.a11y-stack [vw-access-button] > * {
  display: none !important;
}

.a11y-stack [vw-access-button]::before {
  content: "";
  flex-shrink: 0;
  inline-size: max(24px, 1.5rem);
  block-size: max(24px, 1.5rem);
  background: currentColor;
  /* Mão em sinal — o mesmo pictograma de Libras do plugin, redesenhado como
     silhueta para poder receber a cor do tema. Shorthand `mask` (e não
     `mask-image`, que não aceita posição/tamanho): com a declaração
     inválida, a máscara não se aplicava e o ícone virava um quadrado
     sólido de 24px. */
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M9.5 2a1.2 1.2 0 0 0-1.2 1.2v6.1L7.1 7.6a1.2 1.2 0 0 0-2 1.3l2.6 4.3v2.2a5 5 0 0 0 5 5h1.1a5 5 0 0 0 5-5V9.2a1.2 1.2 0 0 0-2.4 0v2.6h-.7V6.5a1.2 1.2 0 0 0-2.4 0v5.3h-.7V4.6a1.2 1.2 0 0 0-2.4 0v7.2h-.7V3.2A1.2 1.2 0 0 0 9.5 2Z'/%3E%3C/svg%3E") center / contain no-repeat;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M9.5 2a1.2 1.2 0 0 0-1.2 1.2v6.1L7.1 7.6a1.2 1.2 0 0 0-2 1.3l2.6 4.3v2.2a5 5 0 0 0 5 5h1.1a5 5 0 0 0 5-5V9.2a1.2 1.2 0 0 0-2.4 0v2.6h-.7V6.5a1.2 1.2 0 0 0-2.4 0v5.3h-.7V4.6a1.2 1.2 0 0 0-2.4 0v7.2h-.7V3.2A1.2 1.2 0 0 0 9.5 2Z'/%3E%3C/svg%3E") center / contain no-repeat;
}

.a11y-stack [vw-access-button]::after {
  content: "Libras";
}

/* O player do VLibras (avatar em tela) continua sendo do plugin: fica fora
   do stack visualmente e precisa cobrir tudo quando aberto. */
.a11y-stack [vw-plugin-wrapper] {
  z-index: 96;
}

/* Sem JS o painel não existe: nota estática no fim da página, no fluxo. */
.recursos-sem-js {
  margin: var(--esp-4) auto;
  padding: var(--esp-3) var(--esp-4);
  background: var(--cor-superficie-container);
  border-radius: var(--raio-m);
  color: var(--cor-sobre-superficie-variante);
  font-size: 0.95em;
}

/* ---------- Recursos assistivos: painel (side sheet M3) ---------- */
/* Com o painel aberto, trava a rolagem da página: só a rolagem interna do
   painel fica ativa (duas barras ao mesmo tempo confundem quem usa o mouse e
   quem amplia a tela). Mesmo tratamento da busca em tela cheia. */
html.prefs-aberto,
html.prefs-aberto body {
  overflow: hidden;
}

.prefs {
  position: fixed;
  inset-block: 0;
  inset-inline: auto 0;
  margin: 0;
  inline-size: min(26rem, 100%);
  max-inline-size: 100%;
  block-size: 100%;
  max-block-size: none;
  border: none;
  border-inline-start: 1px solid var(--cor-contorno-variante);
  background: var(--cor-superficie);
  color: var(--cor-sobre-superficie);
  box-shadow: var(--elevacao-3);
  padding: 0;
}

.prefs[open] {
  display: flex;
}

@keyframes prefs-entrar {
  from {
    transform: translateX(100%);
  }
}

.prefs[open] {
  animation: prefs-entrar var(--duracao-media) var(--movimento-padrao);
}

.prefs::backdrop {
  background: rgb(0 0 0 / 0.35);
}

.prefs__form {
  display: flex;
  flex-direction: column;
  inline-size: 100%;
  block-size: 100%;
}

/* Duas vistas no mesmo diálogo: preferências e estrutura da página. Só uma
   está no layout de cada vez — display:none tira a outra também da árvore de
   acessibilidade, sem precisar de inert. */
.prefs__vista,
.prefs__subvista {
  display: flex;
  flex-direction: column;
  inline-size: 100%;
  block-size: 100%;
  min-block-size: 0;
}

.prefs[data-subvista] .prefs__vista {
  display: none;
}

/* O display:flex acima é mais específico que o [hidden] da folha do
   navegador — sem esta regra a sub-vista ficaria sempre no layout, empilhada
   abaixo das preferências. */
.prefs__subvista[hidden] {
  display: none;
}

.prefs__subvista .prefs__titulo {
  flex: 1;
}

.prefs__cabecalho {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--esp-3);
  padding: var(--esp-4) var(--esp-5);
  border-block-end: 1px solid var(--cor-contorno-variante);
}

.prefs__titulo {
  display: flex;
  align-items: center;
  gap: var(--esp-3);
  margin: 0;
  font: var(--tipo-titulo);
}

.prefs__titulo svg {
  color: var(--cor-primaria);
  flex-shrink: 0;
}

.prefs__fechar {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-block-size: 44px;
  min-inline-size: 44px;
  background: transparent;
  border: none;
  border-radius: var(--raio-pilula);
  color: var(--cor-sobre-superficie);
  cursor: pointer;
}

.prefs__fechar:hover {
  background: var(--cor-superficie-container-alta);
}

.prefs__corpo {
  flex: 1;
  overflow-y: auto;
  padding: var(--esp-4) var(--esp-5) var(--esp-5);
}

.prefs__descricao {
  margin-block-start: 0;
  color: var(--cor-sobre-superficie-variante);
  font-size: 0.95em;
}

/* Gatilho da sub-vista "Estrutura da página": mesma anatomia dos
   interruptores (ícone, rótulo + descrição, indicador à direita), mas leva a
   outra vista em vez de alternar um estado — daí a seta, não o trilho. */
.prefs__navegar {
  display: flex;
  align-items: center;
  gap: var(--esp-3);
  inline-size: 100%;
  min-block-size: 44px;
  padding: var(--esp-3);
  margin-block-start: var(--esp-3);
  background: var(--cor-superficie-container);
  border: none;
  border-radius: var(--raio-m);
  color: var(--cor-sobre-superficie);
  font: inherit;
  text-align: start;
  cursor: pointer;
}

.prefs__navegar:hover {
  background: var(--cor-superficie-container-alta);
}

.prefs__navegar > svg:first-child,
.prefs__navegar-seta {
  flex-shrink: 0;
  color: var(--cor-primaria);
}

.prefs__navegar-texto {
  display: flex;
  flex-direction: column;
  gap: var(--esp-1);
  flex: 1;
}

.prefs__navegar-texto small {
  color: var(--cor-sobre-superficie-variante);
  font-size: 0.85em;
}

/* Sumário da página. O aninhamento das listas espelha o dos títulos: um
   <ul> por nível, para o leitor de tela anunciar a profundidade. */
.prefs__estrutura ul {
  list-style: none;
  margin: 0;
  padding: 0;
}

.prefs__estrutura ul ul {
  margin-inline-start: var(--esp-3);
  padding-inline-start: var(--esp-3);
  border-inline-start: 1px solid var(--cor-contorno-variante);
}

.prefs__estrutura a {
  display: flex;
  align-items: center;
  min-block-size: 44px;
  padding: var(--esp-2) var(--esp-3);
  border-radius: var(--raio-s);
  color: var(--cor-sobre-superficie);
  text-decoration: none;
}

.prefs__estrutura a:hover {
  background: var(--cor-superficie-container);
  text-decoration: underline;
}

/* Última seção visitada pelo sumário. A barra à esquerda acompanha o
   aria-current: a marca nunca é só a cor. */
.prefs__estrutura a[aria-current] {
  background: var(--cor-superficie-container);
  box-shadow: inset 3px 0 0 var(--cor-primaria);
  font-weight: 700;
}

.prefs__estrutura > ul > li > a {
  font: var(--tipo-rotulo);
}

.prefs__estrutura ul ul a {
  color: var(--cor-sobre-superficie-variante);
  font-size: 0.95em;
}

.prefs__estrutura-vazio {
  color: var(--cor-sobre-superficie-variante);
}

/* Título de seção (Texto, Cor e tema, Leitura e navegação) */
.prefs__secao {
  margin: var(--esp-5) 0 var(--esp-3);
  padding-block-start: var(--esp-4);
  border-block-start: 1px solid var(--cor-contorno-variante);
  font: var(--tipo-rotulo);
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--cor-sobre-superficie-variante);
}

.prefs__secao:first-of-type {
  margin-block-start: var(--esp-4);
  padding-block-start: 0;
  border-block-start: none;
}

.prefs__campo {
  border: none;
  padding: 0;
  margin: 0 0 var(--esp-4);
}

.prefs__campo legend {
  padding: 0;
  margin-block-end: var(--esp-2);
  font: var(--tipo-rotulo);
}

/* Segmented button (M3): radios nativos invisíveis cobrindo cada segmento;
   o anel de foco global desenha sobre o input, que ocupa o segmento todo. */
.prefs__segmentos {
  display: flex;
  border: 1px solid var(--cor-contorno);
  border-radius: var(--raio-pilula);
  overflow: hidden;
}

.prefs__segmento {
  flex: 1;
  position: relative;
  cursor: pointer;
}

.prefs__segmento + .prefs__segmento {
  border-inline-start: 1px solid var(--cor-contorno);
}

.prefs__segmento input {
  position: absolute;
  inset: 0;
  margin: 0;
  opacity: 0;
  cursor: pointer;
}

.prefs__segmento span {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--esp-1);
  min-block-size: 44px;
  padding: var(--esp-1) var(--esp-2);
  font: var(--tipo-rotulo);
  text-align: center;
}

.prefs__segmento:hover span {
  background: var(--cor-superficie-container-alta);
}

.prefs__segmento input:checked + span {
  background: var(--cor-secundaria-container);
  color: var(--cor-sobre-secundaria-container);
  font-weight: 700;
}

/* Estado marcado nunca é só cor: o segmento ganha a marca ✓. */
.prefs__segmento input:checked + span::before {
  content: "✓";
}

/* Modo de cor: cartões com amostra real do par fundo/frente + rádio nativo
   com o rótulo textual (cor nunca é o único diferenciador). */
.prefs__amostras {
  display: grid;
  /* minmax(0, …): o painel é justamente onde vive quem ligou texto grande e
     espaçamento — os cartões precisam poder ceder. */
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--esp-3);
}

.prefs__amostra {
  display: grid;
  grid-template-columns: auto 1fr;
  grid-template-areas: "visual visual" "radio rotulo";
  align-items: center;
  column-gap: var(--esp-2);
  row-gap: var(--esp-2);
  cursor: pointer;
}

.prefs__amostra input {
  grid-area: radio;
  inline-size: 1.25rem;
  block-size: 1.25rem;
  margin: 0;
  accent-color: var(--cor-primaria);
}

.prefs__amostra-visual {
  grid-area: visual;
  display: flex;
  align-items: center;
  justify-content: center;
  block-size: 3.25rem;
  border: 1px solid var(--cor-contorno);
  border-radius: var(--raio-m);
  font: 700 1.35rem/1 var(--fonte-base);
}

.prefs__amostra input:checked ~ .prefs__amostra-visual {
  border-color: var(--cor-primaria);
  box-shadow: 0 0 0 1px var(--cor-primaria);
}

.prefs__amostra-rotulo {
  grid-area: rotulo;
  font: var(--tipo-rotulo);
}

/* Interruptor (switch M3): trilho + bolinha desenhados no próprio checkbox;
   ligado, a bolinha cresce, muda de lado e ganha a marca ✓ (não só cor). */
.prefs__interruptor {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--esp-4);
  min-block-size: 44px;
  padding-block: var(--esp-2);
  cursor: pointer;
}

.prefs__interruptor-texto {
  display: flex;
  flex-direction: column;
  gap: 2px;
}

.prefs__interruptor-texto small {
  color: var(--cor-sobre-superficie-variante);
}

.prefs__trilho {
  appearance: none;
  -webkit-appearance: none;
  flex-shrink: 0;
  inline-size: 52px;
  block-size: 32px;
  margin: 0;
  position: relative;
  border: 2px solid var(--cor-contorno);
  border-radius: var(--raio-pilula);
  background: var(--cor-superficie-container-alta);
  cursor: pointer;
  transition:
    background var(--duracao-curta) var(--movimento-padrao),
    border-color var(--duracao-curta) var(--movimento-padrao);
}

.prefs__trilho::before {
  content: "";
  position: absolute;
  inset-block: 0;
  inset-inline-start: 5px;
  margin-block: auto;
  inline-size: 16px;
  block-size: 16px;
  border-radius: var(--raio-pilula);
  background: var(--cor-contorno);
  display: flex;
  align-items: center;
  justify-content: center;
  font: 700 0.85rem/1 var(--fonte-base);
  transition: all var(--duracao-curta) var(--movimento-padrao);
}

.prefs__trilho:checked {
  background: var(--cor-primaria);
  border-color: var(--cor-primaria);
}

.prefs__trilho:checked::before {
  content: "✓";
  inset-inline-start: 24px;
  inline-size: 24px;
  block-size: 24px;
  background: var(--cor-sobre-primaria);
  color: var(--cor-primaria);
}

.prefs__acoes {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--esp-3);
  padding: var(--esp-3) var(--esp-5);
  border-block-start: 1px solid var(--cor-contorno-variante);
}

.prefs__status {
  margin: 0;
  font: var(--tipo-rotulo);
  color: var(--cor-sucesso);
}

/* ---------- Preferências aplicadas ---------- */

/* ---------- Texto grande no desktop: a trilha vira gaveta ----------
   Decisão de 25/07/2026 (Thalia). A trilha e o seu flyout ocupam 22rem —
   uma medida que ACOMPANHA o tamanho do texto. Nos passos "Maior" e
   "Máximo" isso vira 440px e 528px, e num monitor de 1024px sobra menos da
   metade da tela para ler: a página passava a rolar para os lados (medido:
   126px de excesso em "Maior", 350px em "Máximo").

   Acima do passo "Grande", portanto, o desktop volta ao arranjo do mobile —
   barra superior + gaveta — e devolve a largura inteira ao conteúdo. Não é
   uma degradação: é o mesmo padrão M3 que o site já usa em telas estreitas.

   Um `@media` não enxerga o tamanho de texto escolhido (as unidades de media
   query ignoram o font-size da raiz), por isso a condição é o atributo. */
@media (min-width: 64em) {
  :root:is([data-fonte="2"], [data-fonte="3"]) .app {
    display: block;
  }

  :root:is([data-fonte="2"], [data-fonte="3"]) .rail {
    display: none;
  }

  :root:is([data-fonte="2"], [data-fonte="3"]) .topbar {
    display: flex;
  }

  /* A barra superior volta a existir, então o sticky das abas e o
     scroll-margin das âncoras precisam descontá-la de novo. */
  :root:is([data-fonte="2"], [data-fonte="3"]) .pagina--doc {
    --doc-topo: 4rem;
  }

  /* Sem a trilha, o conteúdo não precisa mais do recuo largo da coluna. */
  :root:is([data-fonte="2"], [data-fonte="3"]) .app__main {
    padding-inline: var(--esp-4);
  }

  /* Idem para a busca, que se afasta da trilha por padrão no desktop: sem a
     trilha no layout, o recuo seria uma faixa vazia à esquerda. Quem a abre
     aqui é o gatilho da barra superior. */
  :root:is([data-fonte="2"], [data-fonte="3"]) .busca-tela {
    inset-inline-start: 0;
  }

  :root:is([data-fonte="2"], [data-fonte="3"]) .busca-tela__voltar {
    display: inline-flex;
  }

  :root:is([data-fonte="2"], [data-fonte="3"]) .busca-tela__fechar {
    display: none;
  }

  /* Os dois skip-links são pareados por breakpoint; aqui o par se inverte,
     senão "Pular para a navegação" apontaria para a trilha em display:none. */
  :root:is([data-fonte="2"], [data-fonte="3"]) .skip-link--so-desktop {
    display: none;
  }

  :root:is([data-fonte="2"], [data-fonte="3"]) .skip-link--so-mobile {
    display: inline-block;
  }

  /* Gaveta: sem JS a navegação fica aberta em bloco (é a única forma de
     navegar); com JS ela se recolhe e o botão da barra superior a abre —
     as mesmas regras do bloco mobile mais acima. */
  :root:is([data-fonte="2"], [data-fonte="3"]) .app__nav {
    display: block;
  }

  html.js:is([data-fonte="2"], [data-fonte="3"]) .app__nav {
    display: none;
  }

  html.js:is([data-fonte="2"], [data-fonte="3"])[data-menu-aberto] .app__nav {
    display: block;
    position: fixed;
    inset: 0;
    z-index: 94; /* acima do stack de acessibilidade */
    inline-size: min(22rem, 90vw);
    overflow-y: auto;
    background: var(--cor-superficie-container-baixa);
    border-inline-end: 1px solid var(--cor-contorno-variante);
    border-radius: 0 var(--raio-l) var(--raio-l) 0;
  }

  html.js:is([data-fonte="2"], [data-fonte="3"])[data-menu-aberto]::after {
    content: "";
    position: fixed;
    inset: 0;
    z-index: 93; /* scrim: cobre inclusive o stack da direita */
    background: rgb(0 0 0 / 0.45);
  }

  html.js:is([data-fonte="2"], [data-fonte="3"]) .nav__fechar[hidden] {
    display: inline-flex;
  }
}

/* Ocultar imagens (mantém as descrições em texto) */
:root[data-sem-imagens="on"] img,
:root[data-sem-imagens="on"] .hero__figura,
:root[data-sem-imagens="on"] .card-destaque__figura,
:root[data-sem-imagens="on"] .card__figura,
:root[data-sem-imagens="on"] .rec-secao__figura,
:root[data-sem-imagens="on"] .exemplo-visual__simulacao,
:root[data-sem-imagens="on"] .ilus,
:root[data-sem-imagens="on"] .dialogo__slide {
  display: none !important;
}

/* Sem a figura, o texto da recomendação ocupa a linha inteira em vez de
   deixar meia tela vazia — e a seção deixa de precisar da altura da janela. */
:root[data-sem-imagens="on"] .rec-secao {
  grid-template-columns: minmax(0, 1fr);
}

:root[data-sem-imagens="on"] .rec-secao__texto {
  min-block-size: 0;
}

/* Sem a figura, o painel de texto do hero ocupa a linha inteira em vez de
   deixar a coluna da imagem vazia. (Nos cards, o auto-fit já colapsa a
   coluna sozinho.) */
:root[data-sem-imagens="on"] .hero--largo {
  grid-template-columns: minmax(0, 1fr);
}

/* ---------- Modo leitura ----------
   Decisão de 25/07/2026 (Thalia): coluna única, sem cromo. Some tudo o que
   não é o texto — trilha, barra superior, abas, hero, "Nesta página" e
   rodapé — e o conteúdo assume uma medida de leitura confortável.

   Duas coisas ficam de propósito:
     · a trilha Anterior/Próximo (.doc-trilha), senão a pessoa entra numa
       recomendação e não tem como avançar para a seguinte;
     · o botão de recursos assistivos, que é como se volta ao painel.
   A saída fica na barra fixa do topo (.barra-leitura, ver layout.php). */
:root[data-leitura="on"] .rail,
:root[data-leitura="on"] .topbar,
:root[data-leitura="on"] .app__nav,
:root[data-leitura="on"] .hero,
:root[data-leitura="on"] .doc-abas,
:root[data-leitura="on"] .nesta-pagina,
:root[data-leitura="on"] .rodape {
  display: none !important;
}

:root[data-leitura="on"] .app {
  display: block;
}

:root[data-leitura="on"] .app__main {
  padding-inline: var(--esp-4);
  max-inline-size: none;
  margin-inline: 0;
}

/* Sem a trilha e sem a coluna do índice, os recuos que existiam para
   conviver com elas perdem o sentido. */
:root[data-leitura="on"] .pagina--doc {
  --doc-abas-altura: 0px;
  --doc-topo: 0px;
}

:root[data-leitura="on"] .doc {
  margin-inline: 0;
}

:root[data-leitura="on"] .doc__grade {
  display: block;
  margin-left: 0;
}

:root[data-leitura="on"] #bibliografia .doc__topico-titulo,
:root[data-leitura="on"] .referencias {
  margin-left: 0;
}

/* A medida de leitura: uma coluna só, centrada. */
:root[data-leitura="on"] .doc__conteudo,
:root[data-leitura="on"] .doc-trilha,
:root[data-leitura="on"] .pagina > :not(.doc):not(.rodape) {
  max-inline-size: var(--leitura-medida);
  margin-inline: auto;
}

/* Barra de saída do modo leitura. Fora de .app, gruda no topo da janela. */
.barra-leitura {
  position: sticky;
  inset-block-start: 0;
  z-index: 40;
  display: flex;
  align-items: center;
  padding: var(--esp-2) var(--esp-4);
  background: var(--cor-superficie-container);
  border-block-end: 1px solid var(--cor-contorno-variante);
}

.barra-leitura[hidden] {
  display: none;
}

.barra-leitura__sair {
  display: inline-flex;
  align-items: center;
  gap: var(--esp-2);
  min-block-size: 44px;
  padding: var(--esp-2) var(--esp-4);
  border: none;
  border-radius: var(--raio-pilula);
  background: transparent;
  color: var(--cor-sobre-superficie);
  font: var(--tipo-rotulo);
  cursor: pointer;
}

.barra-leitura__sair:hover {
  background: var(--cor-superficie-container-alta);
}

/* Guia de leitura: faixa criada por JS que segue o cursor e o foco */
.mascara-leitura {
  position: fixed;
  inset-inline: 0;
  block-size: 7.5rem;
  z-index: 89; /* logo abaixo do stack de acessibilidade, que não deve escurecer */
  pointer-events: none;
  box-shadow: 0 0 0 200vmax rgb(0 0 0 / 0.4);
}

/* Sublinhar links: sublinhado em todo link, sem depender de cor */
:root[data-sublinhar-links="on"] a {
  text-decoration: underline !important;
  text-underline-offset: 0.12em;
}

/* Cursor ampliado: seta e mão grandes (48px), escuras com contorno claro,
   desenhadas em SVG embutido — visíveis em qualquer fundo/modo de cor */
:root[data-cursor-grande="on"],
:root[data-cursor-grande="on"] * {
  cursor:
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='48' height='48' viewBox='0 0 24 24'%3E%3Cpath d='M5 2v16.5l4.4-4.2 2.8 6.3 2.8-1.2-2.8-6.2h6.3z' fill='%231a1a1a' stroke='%23ffffff' stroke-width='1.3'/%3E%3C/svg%3E")
      10 4,
    default;
}

:root[data-cursor-grande="on"] a,
:root[data-cursor-grande="on"] button,
:root[data-cursor-grande="on"] [role="button"],
:root[data-cursor-grande="on"] summary,
:root[data-cursor-grande="on"] label,
:root[data-cursor-grande="on"] input,
:root[data-cursor-grande="on"] select {
  cursor:
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='48' height='48' viewBox='0 0 24 24'%3E%3Cpath d='M10 2c.8 0 1.5.7 1.5 1.5V10h1V4.5c0-.8.7-1.5 1.5-1.5s1.5.7 1.5 1.5V10h1V6.5c0-.8.7-1.5 1.5-1.5s1.5.7 1.5 1.5V15c0 4-3 7-7 7h-.5c-2.4 0-4.6-1.2-5.9-3.2l-2.6-4c-.5-.8-.3-1.8.5-2.2.7-.4 1.6-.2 2.1.4l1.4 1.8V3.5C8.5 2.7 9.2 2 10 2z' fill='%231a1a1a' stroke='%23ffffff' stroke-width='1.2'/%3E%3C/svg%3E")
      20 4,
    pointer;
}

/* ---------- Formulário de feedback ---------- */
.pagina--feedback .pagina__intro,
.feedback {
}

.campo {
  display: flex;
  flex-direction: column;
  gap: var(--esp-1);
  margin-block: var(--esp-4);
}

.campo label {
  font: var(--tipo-rotulo);
  font-size: 1rem;
  color: var(--cor-sobre-superficie);
}

.campo__indicador {
  font-weight: 400;
  color: var(--cor-sobre-superficie-variante);
}

.campo__dica {
  font-size: 0.95em;
  color: var(--cor-sobre-superficie-variante);
}

/* Campos no padrão outlined do M3, com alvo mínimo de 44px. */
.campo input,
.campo textarea {
  font: var(--tipo-corpo);
  font-size: 1rem;
  color: var(--cor-sobre-superficie);
  background: var(--cor-superficie);
  border: 1px solid var(--cor-contorno);
  border-radius: var(--raio-xs);
  padding: var(--esp-2) var(--esp-3);
  min-block-size: 44px;
}

.campo textarea {
  resize: vertical;
}

/* O erro nunca é dito só pela cor: há mensagem de texto junto do campo
   (CLAUDE.md §11); a borda mais grossa é reforço visual. */
.campo--erro input,
.campo--erro textarea {
  border: 2px solid var(--cor-erro);
}

.campo__erro {
  color: var(--cor-erro);
  font: var(--tipo-rotulo);
  font-size: 0.95rem;
}

/* Honeypot anti-spam: fora da tela para pessoas, mas presente para robôs.
   Sem display:none de propósito — robôs simples pulam campos invisíveis. */
.campo--honeypot {
  position: absolute;
  inset-inline-start: -9999px;
  inline-size: 1px;
  block-size: 1px;
  overflow: hidden;
  margin: 0;
}

.feedback__nota,
.colaborar__nota {
  font-size: 0.95em;
  color: var(--cor-sobre-superficie-variante);
}

.feedback__acoes,
.colaborar__acoes {
  margin-block: var(--esp-5);
}

/* ---------- Grupo de caixas de seleção (formas de colaborar) ---------- */
/* fieldset/legend em vez de um rótulo solto: é o que faz o leitor de tela
   anunciar a pergunta ao entrar em cada caixa. O reset do fieldset é
   necessário porque o navegador lhe dá borda e recuo próprios. */
.campo-grupo {
  border: none;
  margin: var(--esp-4) 0;
  padding: 0;
  min-inline-size: 0;
}

.campo-grupo legend {
  font: var(--tipo-rotulo);
  font-size: 1rem;
  color: var(--cor-sobre-superficie);
  padding: 0;
  margin-block-end: var(--esp-2);
}

.campo-grupo__lista {
  list-style: none;
  margin: 0;
  padding: 0;
}

/* A linha inteira é alvo de clique (o label envolve o texto e o input fica ao
   lado), com 44px de altura mínima — alvo de toque do CLAUDE.md §5. */
.campo-opcao {
  display: flex;
  align-items: center;
  gap: var(--esp-3);
  min-block-size: 44px;
}

.campo-opcao input[type='checkbox'] {
  inline-size: 1.25rem;
  block-size: 1.25rem;
  flex: none;
  accent-color: var(--cor-primaria);
  margin: 0;
}

.campo-opcao label {
  font: var(--tipo-corpo);
  font-size: 1rem;
  color: var(--cor-sobre-superficie);
  flex: 1;
  padding-block: var(--esp-2);
  cursor: pointer;
}

/* ---------- Avisos de status (sucesso/erro do formulário) ---------- */
.aviso {
  border: 1px solid;
  border-radius: var(--raio-m);
  padding: var(--esp-4);
  margin-block: var(--esp-4);
}

.aviso--sucesso {
  background: var(--cor-sucesso-container);
  border-color: var(--cor-sucesso);
}

.aviso--erro {
  background: var(--cor-erro-container);
  border-color: var(--cor-erro);
}

.aviso__titulo {
  font: var(--tipo-subtitulo);
  margin: 0 0 var(--esp-1);
}

.aviso--sucesso .aviso__titulo {
  color: var(--cor-sucesso);
}
.aviso--erro .aviso__titulo {
  color: var(--cor-erro);
}

.aviso p {
  margin: 0;
}

.aviso__lista {
  margin: 0;
  padding-inline-start: 1.2em;
}

/* ---------- Painel lateral de feedback (side sheet M3) ---------- */
/* Com o painel de feedback ou o de colaboração aberto, trava a rolagem da
   página: só a rolagem interna do painel fica ativa (duas barras ao mesmo
   tempo confundem quem usa o mouse e quem amplia a tela). Mesmo tratamento do
   painel de recursos assistivos e da busca em tela cheia. */
html.form-painel-aberto,
html.form-painel-aberto body {
  overflow: hidden;
}

.feedback-painel {
  position: fixed;
  inset-block: 0;
  inset-inline: auto 0;
  margin: 0;
  inline-size: min(26rem, 100%);
  max-inline-size: 100%;
  block-size: 100%;
  max-block-size: none;
  border: none;
  border-inline-start: 1px solid var(--cor-contorno-variante);
  background: var(--cor-superficie);
  color: var(--cor-sobre-superficie);
  box-shadow: var(--elevacao-3);
  padding: 0;
}

.feedback-painel[open] {
  display: flex;
  flex-direction: column;
}

.feedback-painel::backdrop {
  background: rgb(0 0 0 / 0.35);
}

.feedback-painel__cabecalho {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--esp-3);
  padding: var(--esp-4) var(--esp-5);
  border-block-end: 1px solid var(--cor-contorno-variante);
}

.feedback-painel__cabecalho h2 {
  margin: 0;
  font: var(--tipo-titulo);
}

.feedback-painel__corpo {
  padding: var(--esp-4) var(--esp-5) var(--esp-6);
  overflow-y: auto;
}

.feedback-painel .campo:first-child,
.feedback-painel .aviso:first-child {
  margin-block-start: 0;
}

/* ---------- Impressão ---------- */
@media print {
  .topbar,
  .app__nav,
  .skip-link,
  .busca-tela,
  .a11y-stack,
  .feedback-painel,
  .prefs,
  .recursos-sem-js {
    display: none !important;
  }
  .app__main {
    max-inline-size: none;
    padding: 0;
  }
}
