/* ===================================================================
   AURA THEME — Tokens e estilos globais
   Versão 2.0 — Design System 2026

   Este arquivo define a base visual de todas as páginas da Aura.
   Ele NÃO modifica JavaScript, Supabase, rotas, textos ou regras
   de acesso. Apenas substitui valores repetidos por variáveis CSS
   e aplica a identidade oficial da marca.

   Princípio desta rodada: TROCAR A PELE, NÃO O SISTEMA NERVOSO.

   Os NOMES de token continuam os mesmos — centenas de usos nas páginas
   dependem deles. O que muda são os VALORES. Reapontar --aura-white
   para Lavender Mist e --aura-black para Evergreen aplica a direção de
   arte inteira sem tocar em uma linha de marcação.

   Distribuição alvo (AURA_DESIGN_SYSTEM_2026 §4):
   40–55% Lavender Mist · 25–35% Evergreen · 10–18% Dark Green ·
   até 10% Deep Purple · até 8% Amber Earth.
   =================================================================== */

/* -------------------------------------------------------------------
   FONTES DA MARCA

   Os arquivos ficam hospedados no próprio projeto, em midia/fontes/.

   local() vem primeiro: se a pessoa já tem a fonte no sistema, nada é
   baixado. O arquivo é o segundo recurso.

   Ambas são variáveis (um arquivo cobre toda a faixa de peso), o que
   atende os pesos usados no projeto sem baixar um arquivo por peso.
   Subconjunto latino apenas: 47 KB + 19 KB.

   Servidas de 'self', o que o CSP da Aura já permite (font-src 'self').
   Nenhuma requisição a servidor externo, nenhum dado de quem usa o
   aplicativo enviado ao Google.

   Licença: SIL Open Font License 1.1 (ambas). Uso e redistribuição
   permitidos, inclusive comercial.

   A FRAUNCES SAIU DA LINGUAGEM PRINCIPAL
   -------------------------------------------------------------------
   O DS 2026 tem uma fonte de texto — Inter — e uma de microtipografia
   — Fira Code. Não há serifada na direção nova: o efeito editorial vem
   de peso, tamanho, tracking e composição, não de um desenho de letra
   que faz o trabalho sozinho.

   A declaração da Fraunces fica, sem ser referenciada por --font-display,
   porque o arquivo continua publicado e removê-la não traria ganho
   nenhum a quem já a tem em cache.
   ------------------------------------------------------------------- */
@font-face {
  font-family: "Fraunces";
  src:
    local("Fraunces"),
    url("/midia/fontes/fraunces-latin.woff2") format("woff2");
  font-weight: 300 900;
  font-style: normal;
  font-display: swap;
}

@font-face {
  font-family: "Inter";
  src:
    local("Inter"),
    url("/midia/fontes/inter-latin.woff2") format("woff2");
  font-weight: 100 900;
  font-style: normal;
  font-display: swap;
}

/* A técnica. Entra em doses pequenas: eyebrow, metadata, data,
   categoria, numeração, rótulo, microação. Nunca em parágrafo. */
@font-face {
  font-family: "Fira Code";
  src:
    local("Fira Code"),
    url("/midia/fontes/fira-code-latin.woff2") format("woff2");
  font-weight: 300 700;
  font-style: normal;
  font-display: swap;
}

/* -------------------------------------------------------------------
   TOKENS DE DESIGN (variáveis CSS)
   ------------------------------------------------------------------- */
:root {
  /* === PALETA OFICIAL 2026 ===
   * Cinco nomes próprios, e nada além deles. Tudo o mais nesta folha
   * aponta para cá — inclusive os tokens antigos, logo abaixo.
   *
   *   Evergreen     a cor âncora. Estrutura, hierarquia, o que chama
   *                 atenção. É ela que segura a interface.
   *   Dark Green    a segunda superfície escura.
   *   Lavender Mist a superfície clara, e o respiro.
   *   Amber Earth   o acento vivo.
   *   Deep Purple   o contraste forte, e pontual. */
  --aura-evergreen: #012622;
  --aura-dark-green: #003836;
  --aura-lavender: #ECE5F0;
  --aura-amber: #E98A15;
  --aura-purple: #59114D;

  /* Tinta de texto: o próprio Evergreen. A direção pede contraste
     forte, e rebaixar a tinta para um tom intermediário seria andar na
     direção contrária — além de introduzir o cinza que o sistema não
     tem. Sobre Lavender Mist dá 13.1:1. */
  --aura-ink: var(--aura-evergreen);

  /* Tinta sobre as superfícies escuras e sobre o âmbar. Lavender Mist
     em vez de branco puro: mantém a interface dentro da paleta e não
     abre um buraco branco no meio de um cartão.
     Sobre Evergreen 13.1:1, sobre Dark Green 10.5:1, sobre Roxo 10.6:1. */
  --aura-sobre-escuro: var(--aura-lavender);
  /* Nome antigo, mantido porque as páginas ainda o citam. */
  --aura-sobre-navy: var(--aura-sobre-escuro);

  /* === Cores base (papéis, não cores) ===
   * Os NOMES continuam --aura-black e --aura-white porque centenas de
   * usos dependem deles nas páginas. Trocar os nomes seria reescrever
   * tudo; trocar os VALORES aplica a direção de arte inteira sem tocar
   * em marcação nenhuma.
   *
   * --aura-white é SUPERFÍCIE, --aura-black é TINTA. É o que permite a
   * troca de tema, mais abaixo, trocar os dois de lado. */
  --aura-black: var(--aura-evergreen);
  --aura-white: var(--aura-lavender);

  /* === Pontes da paleta anterior ===
   * Estes nomes continuam vivos nas páginas. Reapontá-los é o que faz a
   * identidade nova chegar a todas elas sem tocar em marcação.
   *
   * Sapphire virou Deep Purple de propósito: ele aparece em poucos
   * lugares — o avatar do Perfil, os símbolos dos cartões de conta — e é
   * exatamente ali que um contraste forte e pontual funciona. */
  --aura-navy: var(--aura-evergreen);
  --aura-sapphire: var(--aura-purple);
  --aura-champagne: var(--aura-lavender);
  --aura-taupe: var(--aura-lavender-fundo);
  --aura-ivory: var(--aura-lavender);
  --aura-gold: var(--aura-amber);
  --aura-summer-green: var(--aura-dark-green);
  --aura-soft-lavender: var(--aura-purple);
  --aura-limoncelo: var(--aura-amber);

  /* Tinta que NÃO inverte. Para uso sobre cores de marca (que também
     não invertem) e para superfícies que devem permanecer escuras nos
     dois temas. Se você precisar de tinta que acompanhe o tema, o token
     é --aura-black. */
  --aura-tinta-fixa: var(--aura-evergreen);

  /* === Alias semânticos === */
  --aura-success: var(--aura-dark-green);
  --aura-accent-cosmos: var(--aura-purple);
  --aura-accent-romance: var(--aura-purple);
  --aura-cta: var(--aura-amber);

  /* === O âmbar, e a regra de uso ===
   * Até 8% da tela. Ação relevante, estado especial, informação rara,
   * detalhe de destaque, um cartão estratégico. O acento deve parecer
   * INTENCIONAL, não decorativo.
   *
   * O #E98A15 é cor de SUPERFÍCIE: tinta Evergreen sobre ele dá 6.2:1,
   * e ele sobre Evergreen também. O que ele não é, é texto sobre claro —
   * sobre Lavender Mist fica em 2.1:1. Daí a variante funda, para quando
   * o âmbar precisa ser LIDO num fundo claro: 4.6:1. */
  --aura-ouro: var(--aura-amber);
  --aura-ouro-fundo: #9C5400;
  --aura-ouro-tenue: rgba(233, 138, 21, 0.14);

  /* === Superfícies claras ===
   * Três níveis, todos da família da lavanda. Não há cinza aqui: o que
   * separa um nível do outro é quanto de luz o tom tem, não quanto de
   * saturação ele perdeu.
   *
   *   --aura-elevado  o que está por cima     #F7F4F9
   *   --aura-white    a página                #ECE5F0
   *   --aura-soft     o que está encaixado    #DCD1E4  (campos, blocos) */
  --aura-lavender-alto: #F7F4F9;
  --aura-lavender-fundo: #DCD1E4;

  --aura-muted: rgba(1, 38, 34, 0.62);
  --aura-soft: var(--aura-lavender-fundo);
  --aura-elevado: var(--aura-lavender-alto);

  /* === Bordas ===
   * Discretas. Quando a cor de fundo já cria separação suficiente, a
   * borda pode simplesmente desaparecer. */
  --aura-linha: rgba(1, 38, 34, 0.14);
  --aura-linha-forte: rgba(1, 38, 34, 0.24);
  --aura-border: 1px solid var(--aura-linha);
  --aura-border-forte: 1px solid var(--aura-linha-forte);
  --aura-border-light: 1px solid rgba(236, 229, 240, 0.22);

  /* === Raios ===
   * ~90% dos elementos quadrados ou quase. 4px no geral, 2px no que é
   * pequeno. A pílula é exceção, e só onde a forma circular tem função:
   * seletor de estado, toggle, chip que precisa parecer cápsula.
   *
   * Os cinco nomes antigos convergem porque a direção nova não tem mais
   * cinco geometrias diferentes — tem uma. Continuam existindo para não
   * quebrar as páginas que os citam. */
  --aura-raio-controle: 4px;
  --aura-raio-pilula: 999px;
  --aura-raio-cartao: 4px;
  --aura-raio-campo: 4px;
  --aura-raio-mini: 2px;
  --aura-raio-folha: 4px;

  /* === Profundidade ===
   * Os cartões parecem levemente descolados do fundo. A interface não é
   * chapada e também não tem glow: a sombra é Evergreen diluído, na
   * direção da luz, e some quando não há o que elevar. */
  --aura-shadow:
    0 14px 34px rgba(1, 38, 34, 0.13),
    0 3px 8px rgba(1, 38, 34, 0.08);

  --aura-shadow-raised:
    0 18px 42px rgba(1, 38, 34, 0.18),
    0 5px 12px rgba(1, 38, 34, 0.10);

  /* === Espaçamento === */
  --space-1: 4px;
  --space-2: 8px;
  --space-3: 10px;
  --space-4: 14px;
  --space-5: 18px;
  --space-6: 24px;
  --space-7: 32px;
  --space-8: 44px;

  --aura-page-x: 14px;
  --aura-card-gap: 10px;

  /* === Sombras internas ===
   *
   * A gramática é simples e vale para o aplicativo inteiro:
   *
   *   sombra EXTERNA  o elemento está elevado, acima da página;
   *   sombra INTERNA  a área é de interação, seleção ou conteúdo
   *                   encaixado — está abaixo da superfície.
   *
   * A Aura não usa sombra externa em lugar nenhum: a elevação aqui é
   * feita com traço preto de 1px. Então a sombra interna não disputa
   * com nada — ela só marca "aqui se digita, aqui se escolhe".
   *
   * A cor é preto puro, na intensidade de cada nível. A paleta da Aura
   * é preto, branco e três acentos: uma sombra preta é a única que não
   * introduz matiz nenhuma. A versão anterior usava azul-marinho a 10%
   * e escurecia a primeira linha em 12,7 níveis de 255 — 5%, dissolvido
   * em 8px de desfoque. Existia no computado e não se via.
   *
   *   soft     campos: onde se digita. Fundo pousado.
   *   surface  faixas e painéis encaixados, que são áreas maiores e
   *            precisam de mais profundidade para ler como recuo.
   *   active   campo em uso. Só para os estados de foco, que combinam
   *            este valor com o indicador de foco da própria página.
   */
  --aura-inset-soft: inset 0 2px 6px rgba(1, 38, 34, 0.12);
  --aura-inset-surface: inset 0 3px 9px rgba(1, 38, 34, 0.16);
  --aura-inset-active: inset 0 3px 9px rgba(1, 38, 34, 0.17);

  /* A pastilha ativa das abas. Estava repetida em quatro páginas com o
     mesmo valor e numa quinta com 0.12 — divergência sem intenção. */
  --aura-sombra-pilula: 0 1px 3px rgba(1, 38, 34, 0.14);

  /* === Contrato do menu universal ===
   *
   * O menu vive em Shadow DOM e não enxerga as regras da página — só
   * herda propriedades personalizadas. Estas quatro são o contrato: o
   * Light DOM as define, o componente as consome, e nenhuma lógica de
   * tema entra dentro dele.
   *
   * Existem como nomes próprios, e não como --aura-white direto, por um
   * motivo prático: o menu precisa da SUPERFÍCIE, e ler --aura-white lá
   * dentro esconderia essa intenção. Quem mexer no componente amanhã lê
   * "fundo do menu" e não precisa saber que branco virou papel.
   *
   * Não precisam de bloco no tema escuro: apontam para tokens que já
   * trocam de lado sozinhos. */
  --aura-menu-fundo: var(--aura-white);
  --aura-menu-tinta: var(--aura-muted);
  --aura-menu-ativo: var(--aura-ouro-fundo);
  --aura-menu-linha: var(--aura-linha);

  /* === Tipografia ===
   *
   * Uma família para tudo o que se lê, outra para o que se etiqueta.
   *
   * --font-display continua existindo e continua sendo usado em dezenas
   * de títulos pelas páginas — só que agora aponta para a MESMA Inter.
   * O caráter editorial passa a vir do peso e do tracking negativo que
   * cada título já declara, não de uma serifada.
   *
   * Pesos preferenciais: 430–450 texto · 520–560 título grande ·
   * 580–620 título de cartão · 700–750 marca. Nunca 900. */
  --font-body: "Inter", ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
  --font-display: var(--font-body);
  --font-mono: "Fira Code", ui-monospace, SFMono-Regular, Consolas, monospace;

  /* === Layout === */
  --app-max-width: 440px;
  --app-wide-max-width: 520px;
  --bottom-menu-height: 104px;
  --topbar-height: 64px;

  /* === Transições === */
  --transition-fast: 160ms ease;
  --transition-base: 260ms cubic-bezier(.22, 1, .36, 1);

  /* === Safe areas === */
  --safe-top: env(safe-area-inset-top, 0px);
  --safe-bottom: env(safe-area-inset-bottom, 0px);
  --safe-left: env(safe-area-inset-left, 0px);
  --safe-right: env(safe-area-inset-right, 0px);

  /* Pisos de respiro: o DS pede 12px no topo e 20px embaixo mesmo em
     aparelho sem recorte. */
  --aura-safe-top: max(12px, env(safe-area-inset-top, 0px));
  --aura-safe-bottom: max(20px, env(safe-area-inset-bottom, 0px));
}

/* -------------------------------------------------------------------
   NOITE — a mesma Aura, do outro lado

   Dois casos caem aqui: a pessoa escolheu o tema escuro, OU o tema é
   claro mas ESTA página é escura por direção de arte. O segundo dá o
   ritmo de revista: a alternância é a assinatura, não um bug.

   No tema escuro a distinção some — tudo é noite, porque duas
   profundidades de escuro na mesma sessão pareceriam descuido.

   Não é inversão automática, e o DS é explícito quanto a isso: não
   basta trocar preto por branco.

   - a identidade permanece verde. O fundo é o próprio Evergreen — a cor
     âncora do sistema, e não um preto genérico;
   - a segunda superfície escura é o Dark Green, exatamente como a
     direção define. Nada vira cinza no caminho;
   - o âmbar volta a ser o tom puro, porque sobre Evergreen ele
     finalmente tem contraste para ser lido (6.2:1);
   - o roxo continua sendo o contraste pontual, e não inverte;
   - a profundidade continua existindo: sobre fundo escuro a sombra
     difusa some, então ela escurece.
   ------------------------------------------------------------------- */

:root[data-tema="escuro"],
:root[data-tema="claro"][data-superficie="escura"],
:root:not([data-tema])[data-superficie="escura"] {
  --aura-black: var(--aura-lavender);
  --aura-white: var(--aura-evergreen);

  --aura-ink: var(--aura-lavender);

  --aura-muted: rgba(236, 229, 240, 0.62);

  /* Dark Green é a segunda superfície escura — é o papel que a direção
     dá a ele. O nível elevado ganha um passo a mais de luz, na mesma
     matiz: verde mais claro, nunca cinza. */
  --aura-soft: var(--aura-dark-green);
  --aura-elevado: #013F3B;

  /* --aura-evergreen, --aura-dark-green, --aura-lavender, --aura-amber
     e --aura-purple NÃO aparecem aqui, e é de propósito.
     -------------------------------------------------------------------
     A paleta se divide em duas famílias, e a divisão é o que faz o tema
     escuro funcionar:

       PAPÉIS, que trocam de lado com o tema
         --aura-white     superfície da página
         --aura-black     tinta
         --aura-soft      superfície secundária
         --aura-elevado   superfície elevada
         --aura-ink, --aura-muted, --aura-linha

       CORES DE MARCA, que nunca invertem
         --aura-evergreen, --aura-dark-green, --aura-lavender,
         --aura-amber, --aura-purple e todas as pontes que apontam
         para elas (--aura-navy, --aura-sapphire, --aura-gold…)

     Uma tela que precisa de "superfície secundária" quer --aura-soft,
     não --aura-lavender: o primeiro vira Dark Green no escuro, o
     segundo continua lavanda. Inverter as cores de marca produziria o
     pior dos dois mundos — metade da tela acompanhando o tema e a outra
     metade não. */

  --aura-linha: rgba(236, 229, 240, 0.14);
  --aura-linha-forte: rgba(236, 229, 240, 0.26);
  --aura-border: 1px solid var(--aura-linha);
  --aura-border-forte: 1px solid var(--aura-linha-forte);
  --aura-border-light: 1px solid rgba(1, 38, 34, 0.24);

  --aura-ouro-fundo: var(--aura-amber);
  --aura-ouro-tenue: rgba(233, 138, 21, 0.18);

  --aura-shadow:
    0 16px 36px rgba(0, 0, 0, 0.34),
    0 4px 12px rgba(0, 0, 0, 0.20);

  --aura-shadow-raised:
    0 22px 48px rgba(0, 0, 0, 0.40),
    0 6px 16px rgba(0, 0, 0, 0.24);

  --aura-inset-soft: inset 0 2px 7px rgba(0, 0, 0, 0.38);
  --aura-inset-surface: inset 0 3px 10px rgba(0, 0, 0, 0.46);
  --aura-inset-active: inset 0 3px 10px rgba(0, 0, 0, 0.46);
}

/* -------------------------------------------------------------------
   RESET GLOBAL
   ------------------------------------------------------------------- */
*,
*::before,
*::after {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}

/* MOBILE-FIRST, NA BASE
   -------------------------------------------------------------------
   O piso é 320px. Nenhuma página da Aura pode nascer para o desktop e
   ser espremida depois: a composição começa no celular e o tablet
   REORGANIZA, o desktop EXPANDE — nunca é o mesmo desenho ampliado.

   min-width no html além do body porque um filho teimoso empurra o
   documento inteiro e cria rolagem horizontal; o piso declarado nos
   dois evita que o estouro se propague. */
html {
  min-width: 320px;
  -webkit-text-size-adjust: 100%;
  -webkit-tap-highlight-color: transparent;
  scroll-behavior: smooth;
  background: var(--aura-white);
}

body {
  min-width: 320px;
  min-height: 100vh;
  min-height: 100dvh;
  background: var(--aura-white);
  color: var(--aura-ink);
  font-family: var(--font-body);
  font-weight: 430;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;
}

/* === Elementos de formulário === */
button,
input,
select,
textarea {
  font: inherit;
  color: inherit;
}

button {
  border: 0;
  background: transparent;
  cursor: pointer;
}

/* === Onde se digita, afunda ===
 *
 * Um lugar só, para todo o aplicativo: a alternativa seria repetir a
 * mesma linha em nove páginas e ver as nove saírem de sincronia.
 *
 * A lista de :not() existe porque `input` é um elemento com muitas
 * vidas. Só entram os que recebem texto:
 *
 *   checkbox e radio  ficam escondidos e desenhados por um <span>
 *                     irmão — a sombra iria no elemento invisível;
 *   file              o de cosmos tem 1px e opacidade zero;
 *   button, submit,
 *   reset, image      são botões, e botão é elevado, não encaixado;
 *   range, color      têm desenho próprio do navegador, que a sombra
 *                     atravessaria de forma imprevisível;
 *   hidden            não desenha nada.
 *
 * Nada de dimensão muda: box-shadow não ocupa espaço no layout e não
 * participa do cálculo de largura, altura ou posição.
 *
 * Quem tem regra de foco própria combina o inset com ela na própria
 * página — box-shadow não soma entre regras, a de maior especificidade
 * substitui a outra por inteiro.
 */
/* O :where() em volta dos :not() é o detalhe que faz isto funcionar.
 *
 * Escrita solta, a cadeia `input:not([type=a]):not([type=b])…` soma a
 * especificidade de CADA :not(): dez deles dão (0,10,1) — mais forte
 * que `.field input:focus`, que é (0,2,1). A regra global passaria por
 * cima dos anéis de foco das páginas e apagaria o indicador de
 * acessibilidade, silenciosamente.
 *
 * :where() vale zero. Assim a lista continua selecionando o que deve, e
 * a regra inteira pesa (0,0,1) — qualquer regra de página vence dela,
 * que é exatamente o que se quer de um padrão: valer por omissão, nunca
 * por imposição.
 */
input:where(
  :not([type="checkbox"]):not([type="radio"]):not([type="file"]):not([type="button"]):not([type="submit"]):not([type="reset"]):not([type="image"]):not([type="range"]):not([type="color"]):not([type="hidden"])
),
select,
textarea {
  box-shadow: var(--aura-inset-soft);
}

/* Campo desabilitado não é área de interação: sem convite, sem sombra.
 * Também em :where(), para não voltar a competir com as páginas. */
input:where(:disabled),
select:where(:disabled),
textarea:where(:disabled) {
  box-shadow: none;
}

a {
  color: inherit;
  text-decoration: none;
}

img {
  display: block;
  max-width: 100%;
}

/* === O atributo hidden precisa vencer os resets acima ===
 *
 * A regra `img { display: block }` logo acima é de AUTOR; o
 * `[hidden] { display: none }` que esconde o atributo vem da folha do
 * NAVEGADOR. Autor vence navegador — então toda <img hidden> do projeto
 * estava sendo exibida, com o atributo hidden ali, escrito, sem efeito
 * nenhum.
 *
 * Quando a imagem ainda não tem src — foto de perfil de quem nunca
 * enviou uma, avatar antes de os dados chegarem — o que aparece é o
 * ícone de imagem ausente com o texto alternativo ao lado, cortado pelo
 * tamanho do contêiner. Num círculo de 42px, "Sua foto de perfil" vira
 * um rabisco; num de 34px, "Logo Aura" vira "Logo".
 *
 * !important aqui não é atalho: é a única forma de um seletor de
 * atributo, com especificidade menor, vencer resets de elemento que já
 * existem e que outras telas dependem. Vale para qualquer elemento, não
 * só imagem — o mesmo problema atinge <div hidden> sob um reset de
 * display.
 */
[hidden] {
  display: none !important;
}

/* Mesma ideia, para quem esconde por classe em vez de atributo. As duas
 * formas convivem no projeto e precisam ter o mesmo efeito. */
.hidden {
  display: none !important;
}

/* =====================================================================
 * A FLOR, DOS DOIS LADOS
 *
 * O logo é um SVG de cor cravada carregado por <img>: currentColor não
 * o alcança, e nenhum filtro chega ao Navy exato sem chutar valores. No
 * tema escuro a versão Navy praticamente sumia sobre o fundo de noite —
 * dá para ver na captura: a flor virava um contorno fantasma.
 *
 * A troca é feita aqui, por CSS, e não na marcação: `content` em
 * elemento substituído troca a imagem exibida sem mexer no src, no alt
 * nem em qualquer script que leia o atributo. Onde a propriedade não for
 * aplicada, continua valendo o arquivo Navy — visível, só com menos
 * contraste. Nada quebra.
 *
 * Os dois arquivos são o mesmo desenho, com a cor trocada:
 * logoflor_evergreen.svg (#012622) e logoflor_lavanda.svg (#ECE5F0).
 * =================================================================== */
:root[data-tema="escuro"] img[src*="logoflor_evergreen"],
:root[data-superficie="escura"] img[src*="logoflor_evergreen"] {
  content: url("/midia/logo/logoflor_lavanda.svg");
}

/* =====================================================================
 * PORTÃO ESTRUTURAL
 *
 * Antes, a página inteira ficava com visibility:hidden até o servidor
 * confirmar a sessão. Era simples e era seguro, mas custava uma ida à
 * rede antes do primeiro pixel: em navegação quente, ~400ms olhando
 * para o nada, com a página já pronta atrás do véu.
 *
 * Agora só o CONTEÚDO espera. A casca — barra de topo, título, abas e
 * o menu de baixo — pinta no primeiro quadro, porque nada nela depende
 * de quem está logado.
 *
 * ---------------------------------------------------------------------
 * POR QUE A REGRA É POR EXCLUSÃO, E NÃO POR MARCAÇÃO
 *
 * A primeira regra esconde tudo que NÃO foi declarado casca. É de
 * propósito: se amanhã alguém acrescentar uma seção nova e esquecer de
 * classificá-la, ela nasce escondida. O esquecimento vira atraso de um
 * quadro, não vazamento de dado alheio. O contrário — marcar o que é
 * privado — falha para o lado errado.
 *
 * ---------------------------------------------------------------------
 * VISIBILITY, NÃO DISPLAY
 *
 * O elemento continua ocupando o lugar dele. A estrutura aparece já com
 * a geometria final, e quando o conteúdo é liberado nada salta: sem
 * reflow, sem deslocamento de layout. Com display:none a página pularia
 * na frente da pessoa toda vez que os dados chegassem.
 * =================================================================== */
html.aura-aguardando main.app > :not([data-aura-casca]),
html.aura-aguardando main.hub-shell > :not([data-aura-casca]),
html.aura-aguardando main.shell > :not([data-aura-casca]),
html.aura-aguardando [data-aura-privado],
html.aura-indisponivel main.app > :not([data-aura-casca]),
html.aura-indisponivel main.hub-shell > :not([data-aura-casca]),
html.aura-indisponivel main.shell > :not([data-aura-casca]),
html.aura-indisponivel [data-aura-privado] {
  visibility: hidden;
}

/* =====================================================================
 * BOTÃO RÁPIDO DE TEMA
 *
 * Onze topbars, todas com três colunas e os dois lados já ocupados por
 * voltar, perfil, busca, notificações ou salvar. Não havia vaga.
 *
 * A saída não é mexer nas colunas de cada página — é criar uma coluna
 * IMPLÍCITA. Com grid-auto-flow: column, os três itens declarados
 * continuam nas três colunas declaradas, exatamente como cada página as
 * definiu, e o quarto item cria uma coluna nova de 40px no fim.
 *
 * Por isso nenhuma página precisou ter o grid-template-columns tocado:
 * cadastro_login continua 38px, Perfil continua com os 76px do botão de
 * salvar. A especificidade (0,2,0) vence o .topbar das páginas sem
 * precisar de !important.
 * =================================================================== */
.aura-tema-hospeda {
  grid-auto-flow: column;
  grid-auto-columns: 40px;
}


/* =====================================================================
 * CÁPSULA DE TEMA
 *
 * Onde a página declara um lugar (data-aura-tema-lugar), o controle é
 * uma cápsula com disco deslizante. Na barra do topo continua sendo o
 * ícone solto: 52px não cabem numa coluna de 40 sem empurrar o título.
 * ================================================================= */
.aura-tema-capsula {
  position: relative;
  width: 52px;
  height: 28px;
  padding: 0;
  border: 0;
  border-radius: var(--aura-raio-controle);
  background: var(--aura-soft);
  box-shadow: var(--aura-inset-soft);
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}

/* Os dois símbolos ficam no trilho, muito apagados: são referência, não
   informação. Quem lê o estado é o disco. */
.aura-tema-capsula svg {
  position: absolute;
  top: 50%;
  width: 12px;
  height: 12px;
  transform: translateY(-50%);
  color: var(--aura-muted);
  opacity: 0.5;
  pointer-events: none;
}

.aura-tema-capsula .aura-tema-sol { left: 6px; }
.aura-tema-capsula .aura-tema-lua { right: 6px; }

.aura-tema-capsula__disco {
  position: absolute;
  top: 3px;
  left: 3px;
  width: 22px;
  height: 22px;
  border-radius: 50%;
  background: var(--aura-white);
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.28);
  transition: transform 220ms cubic-bezier(0.2, 0, 0.2, 1);
}

.aura-tema-capsula[aria-checked="true"] .aura-tema-capsula__disco {
  transform: translateX(24px);
}

/* O ouro aparece só no estado ativo, do tamanho de um ponto. */
.aura-tema-capsula[aria-checked="true"] .aura-tema-capsula__disco::after {
  content: "";
  position: absolute;
  top: 50%;
  left: 50%;
  width: 5px;
  height: 5px;
  margin: -2.5px 0 0 -2.5px;
  border-radius: 50%;
  background: var(--aura-limoncelo);
}

.aura-tema-capsula:focus-visible {
  outline: 2px solid var(--aura-ouro-fundo);
  outline-offset: 3px;
}

@media (prefers-reduced-motion: reduce) {
  .aura-tema-capsula__disco { transition: none; }
}

.aura-tema-botao {
  /* 44x44 é o mínimo confortável de alvo de toque. O botão flutua sobre
     conteúdo e é acionado com o polegar em movimento — 40px já obrigava
     mira, e 36px no recorte estreito obrigava duas tentativas. O ícone
     continua com 19px: o que cresce é a área, não o desenho. */
  width: 44px;
  height: 44px;
  display: grid;
  place-items: center;
  padding: 0;
  border: 0;
  border-radius: 50%;
  background: none;
  color: var(--aura-muted);
  cursor: pointer;
  transition: color 180ms ease, background-color 180ms ease;
}

.aura-tema-botao svg {
  width: 19px;
  height: 19px;
}

.aura-tema-botao:hover {
  color: var(--aura-black);
  background: var(--aura-soft);
}

.aura-tema-botao:focus-visible {
  outline: 2px solid var(--aura-ouro-fundo);
  outline-offset: 2px;
}

/* TELAS ESTREITAS
   -------------------------------------------------------------------
   Até 360px o botão cai para 36px e o título afrouxa o espacejamento.
   Sem isso, "ASSINATURA" precisa de 157px e só há 144 — e cortar texto
   ou pôr reticências num título de topo não é opção.

   O espacejamento cede antes do corpo da letra: 0.42em é generoso e
   sobrevive bem a 0.24em, que ainda lê como caixa alta editorial. O
   tamanho só encolhe meio ponto, o suficiente para folgar.

   O botão fica 36px limpo: o truque de caixa que eu tinha usado para
   manter 44px de alvo dava 44px de largura real e reintroduzia 2px de
   desvio no título. 36px é o piso que você autorizou. */
@media (max-width: 360px) {
  .aura-tema-hospeda {
    grid-auto-columns: 36px;
  }

  .aura-tema-botao {
    width: 44px;
    height: 44px;
  }

  .aura-tema-hospeda .topbar__title,
  .aura-tema-hospeda .brand,
  .aura-tema-hospeda .marca {
    font-size: 12.5px;
    letter-spacing: 0.24em;
    text-indent: 0.24em;
  }
}

/* =====================================================================
 * SCROLLBARS INVISÍVEIS — em todo lugar, de uma vez
 *
 * Cada página repetia o próprio ::-webkit-scrollbar, e mesmo assim
 * sobravam regiões com barra à mostra: listas horizontais, filtros,
 * folhas de modal, painéis com overflow.
 *
 * O seletor universal cobre a página e qualquer elemento rolável, atual
 * ou futuro, sem que ninguém precise lembrar de repetir a regra.
 *
 * Some a BARRA, não o scroll: roda, trackpad, toque, teclado, âncora e
 * scrollIntoView continuam funcionando igual. Nada aqui usa
 * overflow:hidden.
 * =================================================================== */
/* Barra de rolagem invisível em todas as superfícies; a rolagem por
   toque, mouse e trackpad é preservada. Cross-browser: Firefox,
   IE/Edge legado e WebKit. */
html,
body {
  scrollbar-width: none;
  -ms-overflow-style: none;
}

html::-webkit-scrollbar,
body::-webkit-scrollbar,
*::-webkit-scrollbar {
  width: 0;
  height: 0;
  display: none;
}

*,
*::before,
*::after {
  scrollbar-width: none;
  -ms-overflow-style: none;
}

/* -------------------------------------------------------------------
   FAIXAS ROLÁVEIS NA HORIZONTAL

   A barra de rolagem é escondida no aplicativo inteiro, por estilo. Numa
   faixa horizontal isso custa caro: sem barra, sem sombra e sem corte
   evidente, não há como saber que existem mais filtros ou mais cartões à
   direita. O conteúdo continua lá, e ninguém chega nele.

   Aqui ela volta — fina, discreta e só nessas faixas. O seletor de
   classe vence a regra global acima por especificidade.
   ------------------------------------------------------------------- */
.filters,
.horizontal-scroll {
  overscroll-behavior-x: contain;
  /* O item que a rolagem encosta não gruda na borda. */
  scroll-padding-inline: 18px;
}

/* === Foco visível para acessibilidade ===
 * O DS é categórico: o foco não pode ser removido. Aqui ele é o Navy
 * da marca, com folga de 2px para não encostar na borda do controle. */
:focus-visible {
  outline: 2px solid var(--aura-black);
  outline-offset: 2px;
}

/* -------------------------------------------------------------------
   ALVOS DE TOQUE

   Interface bonita que não se acerta com o polegar não é sofisticada,
   é decorativa. 44px é o piso do dedo — em toque grosso, e só nele,
   para não inflar botões que já convivem bem com o ponteiro.
   ------------------------------------------------------------------- */
@media (pointer: coarse) {
  button,
  [role="button"],
  a[class*="btn"],
  a[class*="button"],
  input[type="button"],
  input[type="submit"],
  input[type="reset"] {
    min-height: 44px;
  }
}

/* -------------------------------------------------------------------
   UTILITÁRIOS
   ------------------------------------------------------------------- */

/* Leitor de tela apenas */
.sr-only,
.visually-hidden {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  border: 0;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  clip-path: inset(50%);
  white-space: nowrap;
}

/* Toast / snackbar base */
.aura-toast {
  position: fixed;
  left: 50%;
  bottom: calc(var(--bottom-menu-height) + 16px + var(--safe-bottom));
  z-index: 120;
  width: calc(min(100%, var(--app-max-width)) - 36px);
  max-width: 404px;
  padding: 14px 16px;
  transform: translate(-50%, 16px);
  background: var(--aura-evergreen);
  color: var(--aura-sobre-escuro);
  border: 0;
  border-radius: var(--aura-raio-cartao);
  box-shadow: var(--aura-shadow-raised);
  font-family: var(--font-body);
  font-size: 12px;
  line-height: 1.5;
  opacity: 0;
  pointer-events: none;
  transition: opacity 180ms ease, transform 180ms ease;
}

.aura-toast.is-visible {
  opacity: 1;
  transform: translate(-50%, 0);
}

/* Badge de notificação */
.aura-badge {
  position: absolute;
  top: 9px;
  right: 9px;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--aura-cta);
}

/* Estados de acento sutil — fundos coloridos em ~10% de opacidade */
.aura-bg-success {
  background: color-mix(in srgb, var(--aura-summer-green) 12%, transparent);
}

.aura-bg-cosmos {
  background: color-mix(in srgb, var(--aura-soft-lavender) 15%, transparent);
}

.aura-bg-romance {
  background: color-mix(in srgb, var(--aura-soft-lavender) 15%, transparent);
}

.aura-bg-cta {
  background: color-mix(in srgb, var(--aura-limoncelo) 20%, transparent);
}

/* Bordas coloridas sutis */
.aura-border-success {
  border-color: var(--aura-summer-green);
}

.aura-border-cosmos {
  border-color: var(--aura-soft-lavender);
}

.aura-border-cta {
  border-color: var(--aura-limoncelo);
}

/* Texto colorido para highlights */
.aura-text-success {
  color: var(--aura-success);
}

.aura-text-cosmos {
  color: var(--aura-accent-cosmos);
}

.aura-text-cta {
  color: var(--aura-cta);
}

/* -------------------------------------------------------------------
   PREFERS-REDUCED-MOTION
   ------------------------------------------------------------------- */
@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;
  }
}
/* -------------------------------------------------------------------
   FORMAS DA AURA — esfera, órbita, faísca

   A assinatura visual da referência é sempre a mesma família: um corpo
   esférico com luz rasante, anéis finos em volta, pontos dourados
   parados na órbita, e faíscas de quatro pontas.

   Ficam aqui, e não em cada página, porque são três páginas usando o
   mesmo desenho. Repetir o CSS em cada uma garantiria que elas saíssem
   de sincronia na primeira alteração.

   Tudo é CSS: nenhum arquivo de imagem, nada a baixar, e o desenho
   acompanha o tema sozinho porque usa os mesmos tokens.
   ------------------------------------------------------------------- */

/* O corpo. `--tamanho` controla tudo; o resto é proporção.
   Passou de carvão a Navy: a esfera é o objeto de marca, e ela não pode
   ser a única coisa da tela que ficou de fora da paleta. */
.aura-esfera {
  position: relative;
  width: var(--tamanho, 160px);
  height: var(--tamanho, 160px);
  border-radius: 50%;
  /* Luz rasante vinda de cima à esquerda, como na referência: o corpo
     não é um disco chapado, tem volume. */
  background:
    radial-gradient(circle at 32% 28%,
      rgba(236, 229, 240, 0.22) 0%,
      rgba(236, 229, 240, 0.06) 26%,
      transparent 52%),
    radial-gradient(circle at 50% 50%, var(--aura-dark-green) 0%, var(--aura-evergreen) 76%);
  box-shadow:
    inset -8px -10px 26px rgba(0, 12, 10, 0.55),
    inset 6px 8px 22px rgba(236, 229, 240, 0.06);
}

/* Sobre superfície escura o corpo precisa de um fio para se destacar
   do fundo, senão some. */
[data-superficie="escura"] .aura-esfera,
[data-tema="escuro"] .aura-esfera {
  box-shadow:
    inset -8px -10px 26px rgba(0, 0, 0, 0.6),
    inset 6px 8px 22px rgba(236, 229, 240, 0.07),
    0 0 0 1px rgba(236, 229, 240, 0.10);
}

/* O anel. Vem elíptico e inclinado — círculo perfeito lê como alvo,
   elipse lê como órbita. */
.aura-orbita {
  position: absolute;
  top: 50%;
  left: 50%;
  width: var(--orbita, 240px);
  height: calc(var(--orbita, 240px) * 0.38);
  border: 1px solid var(--aura-linha);
  border-radius: 50%;
  transform: translate(-50%, -50%) rotate(var(--inclinacao, -18deg));
  pointer-events: none;
}

/* O ponto dourado parado na órbita. É aqui que o amarelo aparece —
   pequeno, um por composição. */
.aura-orbita::after {
  content: "";
  position: absolute;
  top: 50%;
  right: -3px;
  width: 6px;
  height: 6px;
  margin-top: -3px;
  border-radius: 50%;
  background: var(--aura-ouro);
  box-shadow: 0 0 10px rgba(233, 138, 21, 0.5);
}

/* Órbita sem ponto, para quando há duas e só uma deve marcar. */
.aura-orbita--limpa::after { content: none; }

/* A faísca de quatro pontas. Desenhada com gradientes cruzados: sem
   SVG, sem arquivo. */
.aura-faisca {
  position: relative;
  width: var(--faisca, 14px);
  height: var(--faisca, 14px);
  background:
    linear-gradient(to bottom, transparent 46%, var(--aura-ouro) 50%, transparent 54%),
    linear-gradient(to right, transparent 46%, var(--aura-ouro) 50%, transparent 54%);
  opacity: 0.9;
  pointer-events: none;
}

/* Rótulo editorial: o "EM DESTAQUE" da referência. Agora em Fira Code,
   que é onde a técnica pertence. */
.aura-sobrescrito {
  display: block;
  color: var(--aura-muted);
  font-family: var(--font-mono);
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
}

/* Título de revista: grande, entrelinha curta, tracking negativo. O
   contraste de escala é o que separa editorial de painel de controle —
   e é ele, não a serifa, que carrega o efeito daqui em diante. */
.aura-display {
  font-family: var(--font-display);
  font-weight: 540;
  line-height: 0.98;
  letter-spacing: -0.045em;
}

@media (prefers-reduced-motion: reduce) {
  .aura-esfera,
  .aura-orbita,
  .aura-faisca {
    animation: none !important;
  }
}

/* =====================================================================
 * MICROTIPOGRAFIA E COMPOSIÇÃO — o vocabulário do DS 2026
 *
 * Cinco classes, e nenhuma delas é obrigatória: as páginas continuam
 * podendo declarar o que precisam localmente. Elas existem para que
 * "metadata" signifique a mesma coisa em nove telas diferentes, em vez
 * de nove aproximações de 8px que divergem na primeira alteração.
 * =================================================================== */

/* Eyebrow, data, categoria, numeração, microação. Nunca parágrafo. */
.aura-meta {
  font-family: var(--font-mono);
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.08em;
  line-height: 1.35;
  text-transform: uppercase;
}

/* O cartão como objeto: levemente descolado do fundo, canto quase reto,
   fio discreto. Sem ícone, sem gradiente, sem glow. */
.aura-card {
  position: relative;
  min-width: 0;
  border: 1px solid rgba(1, 38, 34, 0.10);
  border-radius: var(--aura-raio-cartao);
  background: var(--aura-elevado);
  box-shadow: var(--aura-shadow);
  transition:
    transform 180ms ease,
    box-shadow 180ms ease;
}

/* Movimento discreto, e só onde existe ponteiro: no celular ninguém
   passa o mouse, e um :hover que gruda depois do toque parece defeito. */
@media (hover: hover) and (pointer: fine) {
  .aura-card--interativo:hover {
    transform: translateY(-3px);
    box-shadow: var(--aura-shadow-raised);
  }
}

.aura-card--destaque {
  background: var(--aura-evergreen);
  color: var(--aura-sobre-escuro);
  border-color: transparent;
}

/* A largura de leitura da página, com a margem lateral do DS e as
   safe areas do aparelho. */
.aura-page {
  width: 100%;
  margin: 0 auto;
  padding-inline: var(--aura-page-x);
  padding-left: max(var(--aura-page-x), var(--safe-left));
  padding-right: max(var(--aura-page-x), var(--safe-right));
}

@media (min-width: 520px) {
  .aura-page {
    --aura-page-x: 22px;
  }
}

@media (min-width: 760px) {
  .aura-page {
    --aura-page-x: 30px;
  }
}
