/* ============================================================
   bloom — tokens da identidade

   ONDE ESTA FOLHA MORA: bloom-site/tokens-bloom.css.
   Se você está lendo este arquivo em QUALQUER outro caminho, está
   lendo um ESPELHO. Edite lá, copie para cá — editar o espelho faz
   a mudança viver até a próxima cópia passar por cima dela, sem
   erro e sem aviso. Esta linha viaja junto com o arquivo justamente
   para chegar a quem abriu a cópia achando que era a fonte
   (aconteceu em 02/09/2026: o CLAUDE.md de outro produto apontava
   o próprio espelho como canônico).
   `bloom-site/conferir-tokens.py` compara todas as cópias conhecidas.
   A PALETA vale para todas as aplicações (decisão de Marianna,
   31/08/2026). Nenhum produto tem paleta própria: a cor do ecossistema
   é distinção do SITE, onde os quatro aparecem lado a lado. Dentro do
   produto, quem distingue é o conteúdo.

   Mas o ALCANCE desta FOLHA não é o mesmo da paleta, e confundir os
   dois já produziu decisão errada (02/09/2026). Quem consome o quê:

     Orçamento OBZ   tem um ESPELHO desta folha inteira e usa as
                     CLASSES (.casca, .botao, .pilula). É o único
                     consumidor real delas. (Dizia "importa esta
                     folha" até 02/09/2026 — errado, e a sessão do
                     OBZ corrigiu. O erro tinha efeito próprio: o
                     produto que o texto dava como o mais seguro era
                     o único que não estava em lista de conferência
                     nenhuma, porque a garantia escrita aqui era o
                     motivo de ninguém ir procurar.)
     Manutenção      dois arquivos. Frontend/src/estilo-bloom.css é
                     uma CÓPIA só dos tokens, adaptada para Tailwind;
                     docs/design/tokens-bloom.css é ESPELHO desta
                     folha inteira. Os dois recebem valor novo só
                     quando alguém copia de novo.
     Educacional     não usa esta folha nem cópia dela: é Tailwind
                     utilitário, e os valores escuros foram
                     interpolados a partir dos três níveis de tinta.
     site e app      têm folha própria; aqui só o espécime a carrega.

   ⇒ Mexer numa CLASSE alcança o OBZ e mais ninguém. Mexer num TOKEN
     alcança o OBZ na hora, a Manutenção na próxima cópia, e o
     Educacional nunca. Ao mudar valor, avise as três sessões.
   ============================================================ */
:root{
  /* marca */
  --primaria:#2E3A6B; --primaria-escura:#1F2850; --primaria-clara:#8E9CD8;
  --coral:#E8607A;  --ambar:#E8A33C;  --turquesa:#2E9BA8;
  --linha:#AEB6D8;  --halo:#DDE3F5;
  /* Borda de CONTROLE, separada de --linha. A linha da marca é enfeite
     (traço, tracejado, régua lateral) e pode ser discreta; a borda que
     DESENHA um botão ou um campo é o que diz onde ele começa, e a WCAG
     1.4.11 pede 3:1 contra o fundo para isso. Medido: --linha dava 1,92 no
     claro e 2,43 no escuro -- o botão "Entrar" ficava com a borda quase
     invisível nos dois temas. Não é para "unificar" com --linha de novo. */
  --borda-controle:#7A80A0;

  /* superfícies e tinta */
  --branco:#FFFFFF; --creme:#FCFAF8; --borda:#EAE6DF; --superficie-2:#F7F4EF;
  /* Texto que fica SOBRE a primária preenchida. Era `#fff` fixo no botão,
     e no escuro a primária clareia: branco sobre ela dava 2.66:1 no
     elemento mais clicado da interface. Como token, ele inverte junto. */
  --tinta-sobre-primaria:#FFFFFF;
  --tinta:#1B1F2E;  --tinta-2:#4A5066; --tinta-3:#5E6478;   /* 5.65:1 sobre --creme */

  /* estado (nunca use cor de marca para estado) */
  --ok:#1F6B45;        --ok-fundo:#E8F3EE;
  --atencao:#92400E;   --atencao-fundo:#FEF3C7;
  --erro:#DC2626;      --erro-texto:#991B1B; --erro-fundo:#FEE2E2;
  --neutro:#5B5A78;    --neutro-fundo:#F0EFF6;

  /* Rampa sequencial: ÁREA, nunca TIPO. Ela é calibrada para preenchimento de
     gráfico e mapa de calor, onde 3:1 basta e o tom vira superfície. Como cor
     de texto reprova nas duas pontas: --rampa-3 sobre cartão claro dá 2.66:1.
     O nome não avisa, e quem usa como cor de número tropeça. Para numeral em
     escala, declare tokens próprios e meça nos dois temas. */
  --rampa-1:#2E3A6B; --rampa-2:#5A66A0; --rampa-3:#8E9CD8; --rampa-4:#DDE3F5;

  /* Elevação. Era literal (rgba da tinta clara), e no escuro #1B1F2E a 45%
     sobre um fundo #16181C some: o diálogo perdia a elevação sem ninguém
     ver erro. Sombra é tinta, e tinta tem tema. */
  --sombra-dialogo:0 24px 60px -24px rgba(27,31,46,.45);


  /* ---- categoria de quadro (Kanban do Plano de Ação) ----------------
     Decisão de Marianna, 02/09/2026, entre três paletas medidas.

     Não é escala nem estado: são posições de um fluxo, e duas delas JÁ
     são estado com nome de coluna. Por isso `atrasada` e `concluída` NÃO
     têm token próprio -- elas usam --erro e --ok, os mesmos das pílulas.
     A alternativa (paleta própria para as seis) media melhor em cinza,
     1.26 contra 1.19, mas punha dois vermelhos a 1.21 um do outro na
     mesma tela, dizendo coisas diferentes. Isso não lê como distinção.

     Os dois estados são --ok e --erro-TEXTO, não --erro. A folha tem os
     dois vermelhos, e o que a pessoa lê como "o vermelho de erro" é o do
     TEXTO da pílula, não o de fundo. Trocar um pelo outro quebra a
     escada: --erro no claro dá 4.83 e colide com cancelada (1.11).

     As quatro abaixo foram RESOLVIDAS nas folgas que os dois estados
     deixam, não escolhidas: cada uma cai numa faixa de luminância que
     nenhuma outra ocupa. É o que faz as seis continuarem distintas para
     quem não separa matiz -- hoje o par mais parecido é 1.00, ou seja,
     seis cores que viram três faixas. */
  --cat-backlog:#8693A8; --cat-nao-iniciada:#2F73E1;
  --cat-em-andamento:#B6770A; --cat-cancelada:#9B3CCB;

  --raio:14px; --raio-botao:10px;
}
/* O tema escuro existe em DOIS blocos com o mesmo conteúdo, e isso é
   necessário, não descuido: o @media atende quem deixou o sistema decidir
   (a maioria, que não estampa nada na raiz), e o [data-theme="dark"] atende
   quem escolheu dentro do aplicativo. Sem o segundo, um seletor de tema não
   tem como funcionar. Ao mexer em um, mexa no outro. */
@media(prefers-color-scheme:dark){
  :root:not([data-theme="light"]){
    /* superfícies e tinta */
    --branco:#1E2128; --creme:#16181C; --borda:#2C2F36; --superficie-2:#23262E;
    --tinta:#ECEAE5; --tinta-2:#C8C7BF; --tinta-3:#A3A199;   /* 6.87:1 sobre --creme */

    /* marca. Coral, âmbar e turquesa NÃO mudam: medidos sobre o fundo escuro
       dão 5.40, 8.24 e 5.39 e passam como texto. Só a família da primária
       inverte, porque no escuro "mais forte" quer dizer mais claro. */
    --primaria:#8E9CD8; --primaria-escura:#A9B5E4; --primaria-clara:#B4BFE9;
    --linha:#4A5480; --halo:#2A3355;
    --borda-controle:#7C87B8;
    --tinta-sobre-primaria:#16181C;   /* 6.68:1 sobre a primária clara */

    /* Estado: a cor clareia e o fundo dela escurece, mantendo o par.
       A alternativa era deixar as pílulas claras como no tema claro, o que
       as transformaria em blocos berrantes numa página escura. Escolhida a
       inversão completa: meia inversão é o único caminho indefensável. */
    --ok:#6EE7A8;        --ok-fundo:#123122;    /* 9.18:1 dentro da pílula */
    --atencao:#F5C86B;   --atencao-fundo:#332512;
    --erro:#F87171;      --erro-texto:#FCA5A5; --erro-fundo:#3A1717;
    --neutro:#B9B7D6;    --neutro-fundo:#26253A;

    /* Rampa espelhada: no escuro o degrau FORTE é o mais claro, como a
       primária. Os quatro passos guardam a mesma cadência do tema claro,
       fator 2.00 de contraste entre vizinhos -- foi assim que foram
       resolvidos, não escolhidos a olho. Cada tema tem uma ponta que quase
       se funde com a superfície: no claro é a rampa-4 sobre o branco (1.28),
       no escuro é a rampa-4 sobre o fundo (1.73). É a ponta "quase nada" de
       um mapa de calor, e é assim nos dois. */
    --rampa-1:#DDE3F5; --rampa-2:#98A1BF; --rampa-3:#626C94; --rampa-4:#323E6E;


    /* categoria de quadro: as folgas mudam de lugar no escuro, porque os
       dois estados mudam de contraste. Resolvidas de novo, não invertidas. */
    --cat-backlog:#5C6C89; --cat-nao-iniciada:#7EAAF1;
    --cat-em-andamento:#BD7D0F; --cat-cancelada:#A85ACF;

    --primaria-10:rgba(142,156,216,.14);
    --scrim:rgba(0,0,0,.62);
    --sombra-dialogo:0 24px 60px -24px rgba(0,0,0,.72);
  }
}
:root[data-theme="dark"]{
/* superfícies e tinta */
  --branco:#1E2128; --creme:#16181C; --borda:#2C2F36; --superficie-2:#23262E;
  --tinta:#ECEAE5; --tinta-2:#C8C7BF; --tinta-3:#A3A199;   /* 6.87:1 sobre --creme */

  /* marca. Coral, âmbar e turquesa NÃO mudam: medidos sobre o fundo escuro
     dão 5.40, 8.24 e 5.39 e passam como texto. Só a família da primária
     inverte, porque no escuro "mais forte" quer dizer mais claro. */
  --primaria:#8E9CD8; --primaria-escura:#A9B5E4; --primaria-clara:#B4BFE9;
  --linha:#4A5480; --halo:#2A3355;
  --borda-controle:#7C87B8;
  --tinta-sobre-primaria:#16181C;   /* 6.68:1 sobre a primária clara */

  /* Estado: a cor clareia e o fundo dela escurece, mantendo o par.
     A alternativa era deixar as pílulas claras como no tema claro, o que
     as transformaria em blocos berrantes numa página escura. Escolhida a
     inversão completa: meia inversão é o único caminho indefensável. */
  --ok:#6EE7A8;        --ok-fundo:#123122;  /* 9.18:1 dentro da pílula */
  --atencao:#F5C86B;   --atencao-fundo:#332512;
  --erro:#F87171;      --erro-texto:#FCA5A5; --erro-fundo:#3A1717;
  --neutro:#B9B7D6;    --neutro-fundo:#26253A;

  /* Rampa espelhada: no escuro o degrau FORTE é o mais claro, como a
     primária. Os quatro passos guardam a mesma cadência do tema claro,
     fator 2.00 de contraste entre vizinhos -- foi assim que foram
     resolvidos, não escolhidos a olho. Cada tema tem uma ponta que quase
     se funde com a superfície: no claro é a rampa-4 sobre o branco (1.28),
     no escuro é a rampa-4 sobre o fundo (1.73). É a ponta "quase nada" de
     um mapa de calor, e é assim nos dois. */
  --rampa-1:#DDE3F5; --rampa-2:#98A1BF; --rampa-3:#626C94; --rampa-4:#323E6E;

/* categoria de quadro: as folgas mudam de lugar no escuro, porque os
     dois estados mudam de contraste. Resolvidas de novo, não invertidas. */
  --cat-backlog:#5C6C89; --cat-nao-iniciada:#7EAAF1;
  --cat-em-andamento:#BD7D0F; --cat-cancelada:#A85ACF;

  --primaria-10:rgba(142,156,216,.14);
  --scrim:rgba(0,0,0,.62);
  --sombra-dialogo:0 24px 60px -24px rgba(0,0,0,.72);
}

/* ============================================================
   A MARCA NOS DOIS TEMAS
   ============================================================
   O símbolo não precisa de versão escura: ele já é expressável nos
   tokens acima, e aí inverte sozinho.

     linha da rede   var(--linha)
     halo            var(--halo)
     núcleo          var(--primaria)
     letra b         var(--tinta-sobre-primaria)
     seis nós        --coral, --ambar, --turquesa e --primaria

   O nó que usa a primária é o único que muda, e precisa mudar: em
   #2E3A6B ele dá 1.64:1 sobre o fundo escuro e some. Como token, vira
   #8E9CD8 e passa com 6.68.

   As relações internas se mantêm nos dois temas, que é o que faz a
   marca continuar sendo a mesma marca:

     halo sobre a página      claro 1.28   escuro 1.44   (anel discreto)
     núcleo sobre o halo      claro 8.47   escuro 4.64
     b sobre o núcleo         claro 10.86  escuro 6.68   (sempre invertido)

   O que NÃO fazer: pintar o símbolo com hexadecimal fixo. Foi assim que
   ele nasceu, e é por isso que num fundo escuro o núcleo sumia enquanto
   o halo virava um disco brilhante.
   ============================================================ */

/* tipografia: Quicksand (marca e títulos), DM Sans (texto; rótulo em peso
   600 e versalete; número em tabular-nums). A mono saiu em 13/09/2026:
   ficava leve em corpo pequeno, dava cara de produto técnico, e o que
   distingue rótulo de texto passou a ser peso mais versalete.

   A ÚNICA exceção, decidida em 14/09/2026: CÓDIGO e COMANDO COPIÁVEL
   continuam em mono. Não é escolha de marca, é legibilidade -- num
   comando de terminal a diferença entre l, 1 e I muda o que a pessoa
   cola. Vale para `code`, `pre` e caixa de prompt, e para mais nada:
   rótulo, número em coluna e etiqueta usam DM Sans com versalete e
   tabular-nums, como o resto. O Bloom Vault, que é ferramenta interna
   cheia de comando copiável, é hoje o único consumidor da exceção.
   Quem vier propor tirar a mono de lá está olhando para a regra certa
   e a exceção é esta linha.

   ⚠️ MEXEU EM `font-family` AQUI? ENTÃO TEM `<link>` DE FONTE PARA TROCAR
   JUNTO, EM CADA PRODUTO. Esta folha pede a família PELO NOME; quem carrega o
   arquivo da fonte é o HTML de cada consumidor. Copiar a folha sem trocar o
   `<link>` do Google Fonts faz a família cair no `sans-serif` genérico do
   sistema: sem erro, sem aviso no console, e com a folha "em dia" segundo
   qualquer conferência de TOKEN, porque família tipográfica não é token, é
   regra de componente.
   Aconteceu de verdade em 14/09/2026, com o OBZ: o `index.html` dele carregava
   Quicksand, Source Sans 3 e IBM Plex Mono, nenhum deles DM Sans. A sessão de
   lá percebeu antes de copiar e migrou o `<link>`, o espécime e dois estilos
   INLINE num SVG, que varredura de CSS não alcança.
   Conferir no navegador, não no arquivo: `document.fonts.check('600 11px "DM
   Sans"')`. Ver `<link>` trocado não prova que a fonte carregou. */
p{margin:0}   /* o espaçamento vem do layout, não da margem do parágrafo */
h1,h2,h3,.marca{font-family:"Quicksand","DM Sans",ui-rounded,sans-serif;
  letter-spacing:-.02em;text-wrap:balance;margin:0}
body{font-family:"DM Sans",-apple-system,BlinkMacSystemFont,sans-serif;
  font-size:17px;line-height:1.6;color:var(--tinta);background:var(--branco)}
/* Controle de formulário NÃO herda font-family -- é regra do agente de usuário,
   não descuido de folha. Sem isto, todo <button> sai em Arial enquanto o resto
   da página está na fonte da marca, e ninguém repara até pôr um ao lado do
   outro. Só `font-family`: `font: inherit` levaria junto tamanho, peso e altura
   de linha, e cada classe de botão teria de recuperá-los. */
button,input,select,textarea,optgroup{font-family:inherit}
/* O botão interno do <input type="file"> é pseudo-elemento, e a regra de
   elemento acima NÃO o alcança -- ele continua em Arial. Precisa de regra
   própria, e enquanto estiver aqui vale para todo campo de arquivo. */
input[type="file"]::file-selector-button{
  font-family:inherit;font-size:14px;font-weight:600;margin-right:12px;
  padding:6px 14px;border-radius:var(--raio-botao);border:1px solid var(--linha);
  background:var(--branco);color:var(--primaria);cursor:pointer}
/* .olho carrega .12em enquanto .pilula, thead th e os outros rótulos em
   versalete usam .09em. É deliberado, não descuido: o .olho é o ÚNICO rótulo
   que aparece sozinho, abrindo uma seção, e a respiração maior é o que o
   separa do título logo abaixo. Os outros vivem dentro de tabela e de pílula,
   onde .12em rouba largura de coluna. Se um dia unificar, unifique para .09em
   e aceite que o olho perde presença -- não é conserto, é troca.
   O TAMANHO não faz parte dessa decisão: o que separa o olho é o tracking,
   não meio pixel. Por isso 10.5 e 11 foram colapsados em 11 (01/09/2026) --
   quem propuser colapsar de novo está olhando para a coisa certa e já foi
   feito. */
.olho{font-family:"DM Sans",sans-serif;font-weight:600;font-size:11px;
  text-transform:uppercase;letter-spacing:.12em;color:var(--tinta-3)}

/* componentes */
.botao{display:inline-flex;align-items:center;justify-content:center;gap:8px;
  height:48px;padding:0 22px;border-radius:var(--raio-botao);font-weight:600;
  font-size:16px;text-decoration:none;border:1.5px solid transparent;cursor:pointer;
  transition:background-color .15s,border-color .15s,color .15s}
.botao-cheio{background:var(--primaria);color:var(--tinta-sobre-primaria)}
.botao-cheio:hover{background:var(--primaria-escura)}
.botao-vazado{background:transparent;color:var(--primaria);border-color:var(--borda-controle)}
.botao-peq{height:40px;padding:0 16px;font-size:15px}
/* Tela de acesso e ação principal de formulário: alvo de toque maior.
   O raio continua 10 -- é o mesmo botão, em outro tamanho. */
.botao-g{height:56px;padding:0 26px;font-size:17px}
/* --borda-controle, e não --borda, pelo mesmo motivo do .botao-vazado: o
   fundo do campo é --creme, que é o fundo da PÁGINA. Sobre a página não
   sobra distinção de preenchimento nenhuma, então a borda é o único sinal de
   que existe um campo ali -- e a folga da 1.4.11 (que dispensa contraste de
   contorno quando outra pista identifica o controle) não se aplica.
   Com --borda dava 1,24:1. Vale para todo input e todo select do sistema,
   que é o controle mais frequente da tela. */
.campo{height:56px;border-radius:var(--raio-botao);border:1px solid var(--borda-controle);
  background:var(--creme);padding:0 16px;font-size:16px;width:100%}
.campo:focus{outline:none;border-color:var(--primaria);box-shadow:0 0 0 1px var(--primaria)}
a:focus-visible,button:focus-visible{outline:3px solid var(--turquesa);outline-offset:3px}

.cartao{background:var(--branco);border:1px solid var(--borda);
  border-radius:var(--raio);padding:24px}

.pilula{font-family:"DM Sans",sans-serif;font-weight:600;font-size:11px;text-transform:uppercase;
  letter-spacing:.1em;padding:4px 9px;border-radius:999px;white-space:nowrap}
.p-ok{background:var(--ok-fundo);color:var(--ok)}
.p-dev{background:var(--neutro-fundo);color:var(--neutro)}
.p-atencao{background:var(--atencao-fundo);color:var(--atencao)}
.p-erro{background:var(--erro-fundo);color:var(--erro-texto)}

.filtros{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
/* Mesma correção do .campo: o fundo é --branco, que é o fundo do CARTÃO --
   dentro de um cartão o preenchimento não distingue nada e a borda fica
   sozinha. Com --borda dava 1,24:1. */
.filtro{display:inline-flex;align-items:center;gap:7px;height:34px;padding:0 14px;
  border-radius:999px;border:1.5px solid var(--borda-controle);background:var(--branco);
  font-size:14px;color:var(--tinta-2);cursor:pointer}
.filtro[aria-pressed="true"]{border-color:var(--primaria);background:var(--primaria);color:var(--tinta-sobre-primaria)}

.tabela-envolve{overflow:auto;max-height:70vh}   /* max-height é o que faz o thead grudar */
table{width:100%;border-collapse:collapse;font-size:14px;min-width:640px}
thead th{position:sticky;top:0;background:var(--branco);text-align:left;
  font-family:"DM Sans",sans-serif;font-weight:600;font-size:11px;
  text-transform:uppercase;letter-spacing:.09em;color:var(--tinta-3);
  padding:0 12px 8px 0;border-bottom:1px solid var(--borda)}
tbody td{padding:10px 12px 10px 0;border-bottom:1px solid var(--borda);vertical-align:top}
.num{font-family:"DM Sans",sans-serif;font-variant-numeric:tabular-nums;text-align:right}

/* Tabela cruzada (matriz): a linha também precisa de cabeçalho grudado. O
   thead resolve rolar para BAIXO; rolar para a DIREITA esconde o nome da
   linha, e some justo quando a tabela é grande o bastante para exigir rolagem.
   O z-index maior no canto superior esquerdo não é enfeite: aquela célula é
   grudada nos dois eixos e, herdando só o z-index do thead, passa por baixo
   dele ao rolar. */
.matriz th[scope="row"]{position:sticky;left:0;background:var(--branco);
  text-align:left;font-weight:600;font-size:13px;white-space:nowrap;z-index:1}
.matriz thead th:first-child{left:0;z-index:2}

.vazio-resultado{border:1.5px dashed var(--borda);border-radius:var(--raio);
  background:var(--creme);padding:32px 24px;text-align:center;color:var(--tinta-2)}

/* ============================================================
   ESTRUTURA DE APLICAÇÃO
   Fixado em 31/08/2026 a partir do que já roda no Educacional.
   Vale para os três produtos: quem divergir, converge para cá.
   ============================================================ */
:root{ --primaria-10:rgba(46,58,107,.10); --scrim:rgba(27,31,46,.45); }
/* os dois acima são redefinidos no bloco escuro, lá em cima */

/* 1. casca com barra lateral --------------------------------- */
.casca{display:flex;min-height:100vh;background:var(--creme)}
.lateral{width:256px;flex:none;display:flex;flex-direction:column;
  background:var(--branco);border-right:1px solid var(--borda)}
.lateral-marca{display:flex;align-items:center;gap:10px;padding:16px;
  border-bottom:1px solid var(--borda)}
.lateral nav{flex:1;padding:12px;display:flex;flex-direction:column;gap:2px}
.item-nav{display:flex;align-items:center;gap:10px;padding:8px 12px;border-radius:8px;
  font-size:14px;color:var(--tinta-2);text-decoration:none;
  /* `background:none` e `border:0` no ESTADO BASE, e não só no hover: quem
     usar .item-nav ou .aba num <button> herda o cinza `buttonface` do
     navegador, que não segue tema nenhum e que token algum alcança. Mesma
     família do <button> que renderiza em Arial. */
  background:none;border:0;font-family:inherit}
.item-nav:hover{background:var(--creme)}
/* ativo: tinta da marca, não bloco cheio. Oito itens em bloco cheio viram parede. */
.item-nav[aria-current="page"]{background:var(--primaria-10);color:var(--primaria);font-weight:600}
/* No rodapé da lateral fica SÓ "Sair". Nome, papel e menu de conta ficam na
   barra do topo, à direita, que é onde o Educacional os coloca e onde as
   pessoas já procuram. Corrigido em 31/08/2026. */
.lateral-rodape{padding:12px;border-top:1px solid var(--borda)}

.barra-topo{position:sticky;top:0;z-index:10;display:flex;align-items:center;gap:12px;
  height:56px;padding:0 24px;background:var(--branco);border-bottom:1px solid var(--borda)}
.barra-topo .titulo{font-size:15px;font-weight:600}
.barra-topo .conta{margin-left:auto;display:flex;align-items:center;gap:10px}
.barra-topo .nome{font-size:14px;font-weight:600}
.barra-topo .papel{font-size:12px;color:var(--tinta-3)}
/* ⚠ Se puser blur nesta barra (o Educacional usa bg-white/80 + backdrop-blur),
   saiba que backdrop-filter cria bloco de contenção: qualquer position:fixed
   descendente passa a se ancorar nela, não na janela. Diálogo e menu suspenso
   têm de sair por portal. Não é bug do componente, é a regra do CSS. */
@media(max-width:899px){
  .casca{flex-direction:column}
  .lateral{width:auto;border-right:none;border-bottom:1px solid var(--borda)}
  .lateral nav{flex-direction:row;overflow-x:auto;gap:4px}
}

/* 2. abas que são rota --------------------------------------- */
/* São links, não widget de aba: o estado vai em aria-current="page",
   nunca em aria-selected, que pertence a role="tab". */
.abas{display:flex;gap:4px;border-bottom:1px solid var(--borda);margin-bottom:24px}
.aba{padding:10px 14px;font-size:14px;color:var(--tinta-2);text-decoration:none;
  background:none;border:0;font-family:inherit;
  border-bottom:2px solid transparent;margin-bottom:-1px}
.aba:hover{color:var(--primaria)}
.aba[aria-current="page"]{color:var(--primaria);font-weight:600;border-bottom-color:var(--primaria)}
/* 3. UMA barra de abas por tela. Se aparecer uma segunda, o nível de
   dentro é view (sobe para a lateral) ou é ação (vira botão). */

/* 4. logotipo composto --------------------------------------- */
.marca-lockup{display:flex;align-items:center;gap:10px}
.marca-lockup .nome,.marca-lockup .produto{margin:0}
.marca-lockup .simbolo{height:40px;width:auto;flex:none}   /* 40px ao lado de nome em 27px */
.marca-lockup .nome{font-family:"Quicksand",sans-serif;font-weight:700;font-size:27px;
  line-height:1;letter-spacing:-.03em;color:var(--primaria)}
.marca-lockup .produto{font-family:"Quicksand",sans-serif;font-weight:500;font-size:11px;
  letter-spacing:.06em;text-transform:uppercase;color:var(--tinta-3);margin-top:3px}
/* o nome do produto fica SOB o nome da marca, nunca ao lado e nunca dentro do símbolo */

/* 5. diálogo ------------------------------------------------- */
.scrim{position:fixed;inset:0;background:var(--scrim);display:grid;place-items:center;padding:24px;z-index:50}
.dialogo{background:var(--branco);border-radius:18px;padding:28px;width:min(520px,100%);
  box-shadow:var(--sombra-dialogo)}
.dialogo h2{font-size:21px}
/* O corpo entre o título e as ações: a folha definia as duas pontas e pulava o
   meio, então formulário dentro de diálogo nascia sem espaçamento nenhum e
   ninguém reparava, porque cada tela inventava o seu. */
.dialogo-form{display:flex;flex-direction:column;gap:16px;margin-top:20px}
.dialogo-acoes{display:flex;justify-content:flex-end;gap:10px;margin-top:24px}

/* 6. trilha de etapas ---------------------------------------- */
.trilha{display:flex;flex-direction:column;gap:2px}
.trilha-etapa{border-left:3px solid var(--borda);padding:10px 0 10px 16px}
.trilha-etapa[data-estado="feita"]{border-left-color:var(--primaria-clara)}
.trilha-etapa[data-estado="atual"]{border-left-color:var(--primaria);background:var(--halo)}
.trilha-etapa .estado{font-family:"DM Sans",sans-serif;font-weight:600;font-size:11px;
  text-transform:uppercase;letter-spacing:.1em;color:var(--tinta-3)}
/* o estado também vai escrito, nunca só na cor da borda */

/* 7. pilha com linha de corte (específico do orçamento) ------- */
.pilha-item{border-left:3px solid var(--primaria);padding:12px 0 12px 16px}
.pilha-item[data-fora="true"]{border-left-color:var(--atencao);opacity:.7}
.linha-corte{border-top:2px dashed var(--primaria);margin:14px 0;position:relative}
.linha-corte span{position:absolute;top:-10px;left:0;background:var(--branco);padding-right:8px;
  font-family:"DM Sans",sans-serif;font-weight:600;font-size:11px;text-transform:uppercase;
  letter-spacing:.09em;color:var(--primaria)}

/* ============================================================
   ALVO DE TOQUE
   ============================================================
   As alturas abaixo (34 a 42px) cumprem a WCAG 2.2 SC 2.5.8, que pede
   24px no nível AA. Os 44px que se costuma citar são diretriz da Apple
   e nível AAA -- conforto de polegar, não conformidade.

   Sobem só onde o ponteiro é GROSSO (dedo), e não no mouse: as telas
   de controladoria vivem em monitor, e engordar tudo lá custa densidade
   sem devolver nada. `pointer:coarse` é a pergunta certa -- ela é sobre
   o dispositivo apontador, não sobre a largura da janela, então um
   tablet de 1024px também ganha o alvo maior.
   ============================================================ */
@media(pointer:coarse){
  .filtro{height:44px}
  .botao-peq{height:44px}
  .item-nav{padding:12px}
  .aba{padding:13px 14px}
  .menu-usuario-gatilho{min-height:44px}
}
