/*
 * 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 Elevô. 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: 2.5rem;
  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 Elevô, 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);
}

/* ═══ 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 Elevô.

   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. */
.cabecalho--publico { padding-inline: max(var(--gutter), calc((100% - 64rem) / 2)) }
.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: var(--largura-conteudo);
  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) }
.rodape__links a { color: var(--texto-suave); text-decoration: none }
.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) }
