/*
 * 20_navegacao.css — ONDA D
 * ═══════════════════════════════════════════════════════════════════════════
 * Cabeçalho, navegação e contêineres de conteúdo dos quatro chromes que a
 * Onda 0 deixou prontos em `app/views/layouts/`: publico, aluno, admin e
 * console. Os seletores de ESTRUTURA acompanham exatamente o HTML daqueles
 * layouts (`.cabecalho--aluno`, `.navegacao--admin`, `.painel-admin`, …).
 *
 * UMA COISA ESTA FOLHA PEDE, E ESTÁ PEDIDA NO RELATÓRIO DA ONDA: o item ativo
 * do menu é pintado por `a[aria-current]`, e hoje NENHUM dos quatro layouts
 * emite o atributo — `grep -rn aria-current app/views/layouts/` não devolve
 * nada, então nenhum item fica marcado em nenhuma tela. Quem decide "estou
 * aqui" é `UiHelper#item_de_navegacao`, num lugar só, e é ele que os
 * `link_to` dos layouts precisam passar a usar. `aria-current` não é enfeite
 * de CSS: é o que o leitor de tela anuncia.
 *
 * A decisão que mais muda a vida do aluno: no CELULAR a navegação principal é
 * uma BARRA INFERIOR. O motorista segura o telefone com uma mão, quase sempre
 * a direita, e o topo da tela de 6,7" está fora do alcance do polegar. Barra
 * no topo é padrão de desktop portado para o celular sem pensar.
 * No desktop (admin e console, que são tela de escritório) a navegação vira
 * BARRA LATERAL, porque lá a lista é longa e o mouse não tem alcance limitado.
 */

/* ═══ CONTÊINER ═══════════════════════════════════════════════════════════ */

.corpo { display: flex; flex-direction: column; min-height: 100dvh }

.conteudo {
  width: 100%;
  max-width: var(--largura-conteudo);
  margin: 0 auto;
  padding: var(--esp-5) var(--gutter);
  flex: 1;
}

/* ═══ CABEÇALHO ═══════════════════════════════════════════════════════════ */

.cabecalho {
  position: sticky;
  top: 0;
  z-index: var(--z-grudado);
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--esp-3);
  min-height: 3.5rem;
  /* O padding lateral ACOMPANHA A COLUNA DE CONTEÚDO. Enquanto era só
     `var(--gutter)`, o cabeçalho era full-bleed e o conteúdo era uma coluna
     centrada: a 1440 o logo ficava em x=32 e a primeira palavra da página em
     x=233 — 201 px de desalinhamento entre as duas primeiras coisas que o olho
     encontra. `max()` resolve sem wrapper novo e sem tocar em marcação: em tela
     estreita vence o gutter, em tela larga vence a metade da sobra. */
  padding-block: var(--esp-2);
  padding-inline: max(var(--gutter), calc((100% - var(--largura-conteudo)) / 2));
  /* As DUAS declarações de `background` são obrigatórias, nesta ordem. O
     `@supports` abaixo cobre `backdrop-filter`, não `color-mix`: um navegador
     que tem o primeiro e não o segundo (Chrome 76–110, Safari 15.4–16.1)
     descarta só a linha do `color-mix` e ficaria SEM fundo nenhum — cabeçalho
     `sticky` transparente, com o conteúdo rolando por baixo do texto. A
     cascata de valor inválido resolve sozinha: quem entende `color-mix` usa a
     segunda, quem não entende fica com a primeira. `color-mix` é Chrome 111,
     de 2023; o público é motorista com Android de 2019. */
  background: var(--fundo);
  background: color-mix(in srgb, var(--fundo) 88%, transparent);
  backdrop-filter: blur(12px);
  border-bottom: 1px solid var(--borda);
}
@supports not (backdrop-filter: blur(1px)) {
  .cabecalho { background: var(--fundo) }
}

/* A marca no cabeçalho: nome do tenant, ou o wordmark da Ellévu. Nunca imagem
   quebrada (§12.2) — quando não há logo, é TEXTO. */
.marca {
  display: inline-flex;
  align-items: center;
  gap: var(--esp-2);
  min-height: var(--alvo);
  padding-right: var(--esp-2);
  color: var(--texto);
  font-weight: var(--peso-forte);
  font-size: var(--texto-md);
  letter-spacing: var(--espacamento-titulo);
  text-decoration: none;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.marca:hover { color: var(--texto) }
.marca__logo { height: 1.5rem; width: auto; flex: none }
.marca__wordmark { height: 1.25rem; width: auto; flex: none; color: var(--cor-marca) }
.marca__sufixo { color: var(--texto-tenue); font-weight: var(--peso-normal) }

.cabecalho__acoes { display: flex; align-items: center; gap: var(--esp-2); flex: none }

/* ═══ NAVEGAÇÃO DO ALUNO — barra inferior no celular ══════════════════════ */

.navegacao--aluno {
  position: fixed;
  max-width: 100%;
  z-index: var(--z-grudado);
  inset: auto 0 0;
  display: grid;
  grid-auto-flow: column;
  grid-auto-columns: 1fr;
  gap: var(--esp-1);
  padding: var(--esp-1) var(--esp-1) calc(var(--esp-1) + env(safe-area-inset-bottom));
  /* Mesma dobradinha do cabeçalho, e aqui o estrago seria maior: a barra é
     `fixed` no rodapé do celular do aluno. Sem fundo, o menu principal do
     motorista vira vidro liso sobre o conteúdo. */
  background: var(--fundo-cartao);
  background: color-mix(in srgb, var(--fundo-cartao) 96%, transparent);
  backdrop-filter: blur(12px);
  border-top: 1px solid var(--borda);
}
@supports not (backdrop-filter: blur(1px)) {
  .navegacao--aluno { background: var(--fundo-cartao) }
}

.navegacao--aluno > a {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: var(--esp-1);
  min-height: var(--alvo);
  padding: var(--esp-2) var(--esp-1);
  border-radius: var(--raio-2);
  color: var(--texto-tenue);
  font-size: var(--texto-xs);
  font-weight: var(--peso-medio);
  line-height: 1.1;
  text-align: center;
  text-decoration: none;
  transition: color var(--transicao-rapida), background-color var(--transicao-rapida);
}
.navegacao--aluno > a:hover { color: var(--texto-suave) }
.navegacao--aluno > a[aria-current] {
  color: var(--cor-marca);
  background: var(--cor-marca-suave);
}

/* A barra inferior tapa o fim da página: o conteúdo precisa da folga. */
.conteudo--aluno { padding-bottom: calc(var(--alvo) + var(--esp-8) + env(safe-area-inset-bottom)) }

/* No desktop a barra inferior não faz sentido: volta para o topo, ao lado da
   marca, como uma fita de links. */
@media (min-width: 48rem) {
  /* No desktop a barra sobe e vira uma fita de links logo abaixo do
     cabeçalho. Continua `fixed`, e não `sticky`, por uma razão de DOM que não
     dá para contornar daqui: em `layouts/aluno.html.erb` (do integrador) o
     <nav> vem DEPOIS do <main>, então grudá-lo prenderia a fita no fim do
     documento, não sob o cabeçalho. `fixed` ignora a ordem do documento — e a
     ordem de LEITURA continua certa para o leitor de tela, que segue o DOM. */
  .navegacao--aluno {
    position: fixed;
    inset: 3.5rem 0 auto;
    z-index: calc(var(--z-grudado) - 1);
    grid-auto-flow: column;
    grid-auto-columns: max-content;
    justify-content: center;
    gap: var(--esp-2);
    padding: var(--esp-2) var(--gutter);
    border-top: 0;
    border-bottom: 1px solid var(--borda);
  }
  .navegacao--aluno > a {
    flex-direction: row;
    min-height: 2.5rem;
    padding: 0 var(--esp-4);
    font-size: var(--texto-sm);
  }
  /* A fita tapa o topo do conteúdo; a folga vem daqui e não de `margin` no
     <main>, que colapsaria com a margem do primeiro título. */
  .conteudo--aluno { padding-top: calc(var(--esp-5) + 3.25rem); padding-bottom: var(--esp-12) }
}

/* ═══ ADMIN — lista no celular, barra lateral no desktop ══════════════════ */

.painel-admin, .painel-console {
  flex: 1;
  width: 100%;
  max-width: calc(var(--largura-conteudo) + 16rem);
  margin: 0 auto;
  display: flex;
  flex-direction: column;
}

.navegacao--admin, .navegacao--console {
  display: flex;
  gap: var(--esp-1);
  padding: var(--esp-2) var(--gutter);
  overflow-x: auto;
  min-width: 0;        /* senão a fita empurra a página em vez de rolar */
  max-width: 100%;
  scrollbar-width: none;
  border-bottom: 1px solid var(--borda);
  background: var(--fundo);
  position: sticky;
  top: 3.5rem;
  z-index: calc(var(--z-grudado) - 1);
}
.navegacao--admin::-webkit-scrollbar,
.navegacao--console::-webkit-scrollbar { display: none }

.navegacao--admin > a, .navegacao--console > a {
  flex: none;
  display: inline-flex;
  align-items: center;
  min-height: var(--alvo);  /* 44 px: a fita no celular tinha 40 (rodada R) */
  padding: 0 var(--esp-4);
  border-radius: var(--raio-2);
  color: var(--texto-tenue);
  font-size: var(--texto-sm);
  font-weight: var(--peso-medio);
  white-space: nowrap;
  text-decoration: none;
  transition: color var(--transicao-rapida), background-color var(--transicao-rapida);
}
.navegacao--admin > a:hover, .navegacao--console > a:hover {
  color: var(--texto);
  background: var(--fundo-cartao);
}
.navegacao--admin > a[aria-current], .navegacao--console > a[aria-current] {
  color: var(--cor-marca);
  background: var(--cor-marca-suave);
}

.conteudo--admin, .conteudo--console { max-width: none }

@media (min-width: 64rem) {
  .painel-admin, .painel-console {
    display: grid;
    grid-template-columns: 15rem minmax(0, 1fr);
    gap: var(--esp-6);
    padding: 0 var(--gutter);
  }
  .navegacao--admin, .navegacao--console {
    position: sticky;
    top: 4.5rem;
    align-self: start;
    display: flex;
    flex-direction: column;
    gap: var(--esp-1);
    overflow: visible;
    padding: var(--esp-5) 0;
    border-bottom: 0;
    background: transparent;
  }
  .navegacao--admin > a, .navegacao--console > a {
    min-height: var(--alvo);
    width: 100%;
    justify-content: flex-start;
  }
  .conteudo--admin, .conteudo--console { padding: var(--esp-6) 0 var(--esp-16) }
}

/* O console é deliberadamente SEM white label (layout console.html.erb): aqui
   não se está dentro de conta nenhuma, e parecer que se está é o erro que a
   faixa de "entrar como" existe para evitar. Então a cor viva do console é a
   da Ellévu, não a do tenant. */
.cabecalho--console .marca { color: var(--elevo-indigo-claro) }
.navegacao--console > a[aria-current] {
  color: var(--elevo-indigo-claro);
  /* O fallback é NEUTRO, não a suave do tenant: o console é de propósito sem
     white label (§12.5) e herdar a cor da conta aqui é exatamente o engano que
     a faixa de "entrar como" existe para evitar. */
  background: var(--fundo-elevado);
  background: color-mix(in srgb, var(--elevo-indigo) 16%, transparent);
}

/* ─── O console no CELULAR: nada estoura a página (rodada 2, medido) ───────
   Duas fontes de rolagem horizontal na ficha da conta a 390 px:
   · o item da `.grade` nasce com `min-width: auto` e cresce até o
     `min-content` do filho mais largo — um `submit_tag` "Suspender a <nome
     da conta>" de 328 px, ou um `.lista__item` com título + selo de 354 px —
     e o cartão passa da borda (scrollWidth 400–414). O admin já tem a regra
     equivalente em 70_admin.css; aqui é a do console.
   · o `.botao` é `white-space: nowrap` por desenho (10_componentes). Dentro
     dos formulários do console o rótulo pode quebrar linha: é melhor um
     botão de duas linhas do que um cartão cortado.
   E a `.lista` do console: `.lista__fim` (selo + Suspender + Remover, em
   Publicações) comia os 390 px e o título saía uma letra por linha. Aqui o
   item QUEBRA: o texto pede 12rem de base e, quando o fim não cabe ao lado,
   desce para a linha de baixo, alinhado à direita. Em telas largas nada muda
   (o fim cabe ao lado e a linha continua uma só). */
.conteudo--console .grade > * { min-width: 0 }
.conteudo--console .formulario .botao,
.conteudo--console .botoes .botao { white-space: normal }
.conteudo--console .lista__item { flex-wrap: wrap }
.conteudo--console .lista__texto { flex: 1 1 12rem }
.conteudo--console .lista__fim { flex-wrap: wrap; justify-content: flex-end; margin-left: auto; max-width: 100% }
/* Os botões de linha (Suspender, Remover) são menores na horizontal — não na
   altura, que continua o alvo de 44 px — para caberem os dois ao lado do
   selo numa linha de 390 px. */
.conteudo--console .lista__fim .botao { padding-inline: var(--esp-3) }

/* ═══ PÚBLICO — landing, entrar, criar acesso, validar ════════════════════ */

/* O CABEÇALHO PÚBLICO ERA TRANSPARENTE E `sticky` AO MESMO TEMPO, e isso é
   texto ilegível, não estilo: medido a 390×844 na landing, 31 de 39 posições de
   rolagem tinham texto do corpo cruzando a faixa de 64 px do cabeçalho — a
   primeira página que alguém vê da Ellévu.

   O visual que se queria (cabeçalho invisível no topo, sólido depois) existe em
   CSS puro com rolagem como linha do tempo. Onde isso não é suportado, o
   cabeçalho é SÓLIDO: o degradê certo é para o lado da legibilidade. */
.cabecalho--publico { border-bottom: 0 }

@supports (animation-timeline: scroll()) {
  @media (prefers-reduced-motion: no-preference) {
    @keyframes cabecalho-materializa {
      from { background: transparent; backdrop-filter: none; border-bottom-color: transparent }
      to   { background: color-mix(in srgb, var(--fundo) 88%, transparent);
             backdrop-filter: blur(12px);
             border-bottom-color: var(--borda) }
    }
    .cabecalho--publico {
      border-bottom: 1px solid transparent;
      animation: cabecalho-materializa linear both;
      animation-timeline: scroll();
      animation-range: 0 5rem;
    }
  }
}

/* A coluna do público é mais estreita que a do app; o cabeçalho a acompanha. */
/* Medido a 1440 na rodada de refino: marca x=201, conteúdo x=233, rodapé
   x=169 — três eixos verticais numa página só. O cabeçalho ganha o gutter DENTRO
   da coluna (é o que o conteúdo faz), e o rodapé fecha na mesma coluna. */
.cabecalho--publico { padding-inline: max(var(--gutter), calc((100% - 64rem) / 2 + var(--gutter))) }
.conteudo--publico { max-width: 64rem; padding-top: var(--esp-8); padding-bottom: var(--esp-12) }
.conteudo--publico--estreito { max-width: 30rem }

.rodape--publico {
  padding: var(--esp-6) var(--gutter) calc(var(--esp-8) + env(safe-area-inset-bottom));
  border-top: 1px solid var(--borda);
  color: var(--texto-tenue);
  font-size: var(--texto-sm);
}
.rodape__linhas {
  width: 100%;
  max-width: calc(64rem - 2 * var(--gutter));
  margin: 0 auto;
  display: flex;
  flex-direction: column;
  gap: var(--esp-3);
}
.rodape__links { display: flex; flex-wrap: wrap; gap: var(--esp-2) var(--esp-5) }
/* O alvo de toque dos links do rodapé cresce por padding NEGATIVO de margem:
   44 px de altura clicável (2.5.8) sem esticar o rodapé — eram 15 px. */
.rodape__links a {
  display: inline-flex;
  align-items: center;
  min-height: var(--alvo);
  margin-block: calc((var(--alvo) - 1.5em) / -2);
  color: var(--texto-suave);
  text-decoration: none;
  line-height: inherit;
}
.rodape--publico p { margin: 0 }
.rodape__links a:hover { color: var(--texto); text-decoration: underline }
@media (min-width: 48rem) {
  .rodape__linhas { flex-direction: row; align-items: center; justify-content: space-between }
}

/* Herói da landing e das telas de porta de entrada. */
.heroi { padding: var(--esp-10) 0 var(--esp-8); text-align: center }
.heroi__marca { margin: 0 auto var(--esp-6); color: var(--cor-marca); height: 2.5rem; width: auto }
.heroi__titulo { font-size: var(--texto-3xl); margin-bottom: var(--esp-4) }
.heroi__texto { max-width: var(--largura-leitura); margin: 0 auto var(--esp-6); color: var(--texto-suave); font-size: var(--texto-lg) }
@media (min-width: 48rem) {
  .heroi { padding: var(--esp-16) 0 var(--esp-12) }
  .heroi__titulo { font-size: var(--texto-4xl) }
  .heroi__marca { height: 3rem }
}

/* Caixa central de formulário: entrar, criar acesso, aguardando, bloqueado. */
.porta {
  width: 100%;
  max-width: 26rem;
  margin: 0 auto;
  padding: var(--esp-6);
  background: var(--fundo-cartao);
  border: 1px solid var(--borda);
  border-radius: var(--raio-4);
  box-shadow: var(--sombra-2);
}
.porta__marca { display: block; margin: 0 auto var(--esp-5); height: 1.75rem; width: auto; color: var(--cor-marca) }
.porta__titulo { text-align: center; margin-bottom: var(--esp-2) }
.porta__texto { text-align: center; color: var(--texto-tenue); font-size: var(--texto-sm); margin-bottom: var(--esp-6) }
.porta__rodape { margin-top: var(--esp-5); text-align: center; font-size: var(--texto-sm); color: var(--texto-tenue) }

/* ═══ CABEÇALHO DE TELA (título + ações), usado por admin e aluno ═════════ */

.tela-cabecalho {
  display: flex;
  flex-direction: column;
  gap: var(--esp-3);
  margin-bottom: var(--esp-6);
}
.tela-cabecalho__titulo { margin: 0 }
.tela-cabecalho__texto { margin: var(--esp-1) 0 0; color: var(--texto-tenue); font-size: var(--texto-sm) }
.tela-cabecalho__acoes { display: flex; flex-wrap: wrap; gap: var(--esp-2) }
@media (min-width: 48rem) {
  .tela-cabecalho { flex-direction: row; align-items: flex-start; justify-content: space-between }
}

/* Trilha de volta — no celular é o único "voltar" confiável dentro do app. */
.voltar {
  display: inline-flex;
  align-items: center;
  gap: var(--esp-2);
  min-height: var(--alvo);
  color: var(--texto-tenue);
  font-size: var(--texto-sm);
  text-decoration: none;
}
.voltar:hover { color: var(--texto) }

/* ═══ CONSOLE — o que é só dele (rodada Q/R, 14/09/2026) ═════════════════
   O console não tem folha própria (70_admin.css é do bloco ADMIN), e estas
   três regras são de CHROME/estrutura, que é o assunto desta folha. */

/* Um destino por linha: o nome na tabela é o link, e o alvo dele é a altura
   da célula (44 px), não a caixa do texto (21 px) — o "Abrir" que dobrava o
   destino saiu. */
.tabela__elo {
  display: inline-flex;
  align-items: center;
  min-height: var(--alvo);
  margin-block: calc((var(--alvo) - 1.5em) / -2);
  color: inherit;
  font-weight: var(--peso-medio);
  text-decoration: none;
}
.tabela__elo:hover { color: var(--cor-marca); text-decoration: underline }
.tabela--cartao .tabela__elo { color: var(--cor-marca) }

/* A ação de duas etapas sem `confirm()` nativo: um `<details>` cujo
   `<summary>` É o botão. Aberto, mostra o motivo obrigatório e o botão de
   verdade. `display: inline-flex` do `.botao` já tira o marcador de lista;
   a linha de baixo cobre o WebKit antigo. */
.dobra { margin-top: var(--esp-5) }
.dobra > summary { list-style: none; cursor: pointer }
.dobra > summary::-webkit-details-marker { display: none }
.dobra__corpo {
  margin-top: var(--esp-4);
  padding: var(--esp-4);
  border: 1px solid var(--borda);
  border-radius: var(--raio-3);
  background: var(--fundo-cartao);
}
.dobra--perigo .dobra__corpo { border-color: var(--cor-reprovado) }
.dobra[open] > summary { opacity: 0.6 }

/* A seta ao fim de uma linha de lista que é um link inteiro. */
.lista__seta { color: var(--texto-tenue); flex: none }

/* Título de seção que é link (a conta em /console/publicacoes): herda a cor
   e ganha o sublinhado só no hover — um h2 azul sublinhado é 1999. */
.secao__titulo h2 a { color: inherit; text-decoration: none }
.secao__titulo h2 a:hover { color: var(--cor-marca); text-decoration: underline }
