  /* LIXEIRA DE PROJETOS: idade e peso — item 88.
   *
   * Decorre do item 49, "guarda sempre; só avisa": nenhum prazo deste app apaga nada, e uma
   * politica assim so e honesta se o app MOSTRAR o que esta guardando. Senao o disco enche
   * em silencio e o assinante descobre no dia em que nao consegue importar.
   *
   * `lixo-velho` marca acima de 90 dias. AMBAR, nao vermelho, e o motivo e a decisao dele:
   * nada vai ser apagado, entao vermelho prometeria uma consequencia que nao existe. Ambar
   * e "olha isso quando puder", que e exatamente o que o aviso e. */
  .pj-datas .d2.lixo-velho { color: var(--warn, #ba7517); font-weight: 600; }
  .lixo-idade { color: inherit; opacity: .85; }
  /* O peso fica sob a contagem de fotos, na mesma coluna: as duas respondem "o tamanho
   * disto", e separa-las em duas colunas faria a linha da lixeira ficar diferente da linha
   * de Projetos, que e a mesma tabela. */
  .pj-peso { display: block; margin-top: 1px; font-size: 11px; font-weight: 600;
             color: var(--ink-3); font-variant-numeric: tabular-nums; }

  /* AVISO DO BACKUP SEM SENHA — item 85.
   *
   * Ocupa a linha inteira da barra de ações, abaixo dos dois botões: é informação sobre o
   * arquivo que vai sair, então precisa ser lida ANTES do clique.
   *
   * Neutro, como o aviso de desfoque e pelo mesmo motivo: o backup não levar senha é o app
   * fazendo o certo. O que é digno de alerta é o contrário, e o contrário deixou de existir. */
  /* `margin-top: 8px`: a barra de acoes tem `gap: 8px`, entao 8 fecha os 16px do padrao.
   * Medido no DOM — com 4px a folga saia 12. O aviso de desfoque usa 4px porque a barra DELE
   * tem gap 12; o numero nao e o mesmo nos dois lugares, e por isso vale medir cada um. */
  .aviso-backup { flex-basis: 100%; margin-top: 8px; padding: 9px 12px;
                  border-radius: 9px; background: var(--surface-2);
                  border: 1px solid var(--border);
                  font-size: 12px; line-height: 1.45; color: var(--ink-2); }
  .aviso-backup b { color: var(--ink); }

  /* AVISO DE DESFOQUE no botão de baixar — item 84.
   *
   * Ocupa a largura inteira da barra de seleção (`flex-basis: 100%`), abaixo dos botões:
   * é informação sobre o que vai sair, então tem de ser lida ANTES do clique, e não competir
   * por espaço com o botão.
   *
   * **Não é um aviso de erro, e por isso não é âmbar nem vermelho.** O desfoque funcionando é
   * o app fazendo o certo — pintar de vermelho ensinaria a pessoa a temer o recurso que a
   * protege. Fundo neutro, e o número em negrito, que é a única parte que se lê rápido. */
  /*  e nao 2px: a barra tem , entao 4 fecha os 16px do padrao.
   * Medido no DOM: com 2px a folga saia 14. */
  .aviso-desfoque { flex-basis: 100%; margin-top: 4px; padding: 9px 12px;
                    border-radius: 9px; background: var(--surface-2);
                    border: 1px solid var(--border);
                    font-size: 12px; line-height: 1.45; color: var(--ink-2); }
  .aviso-desfoque b { color: var(--ink); font-variant-numeric: tabular-nums; }

  /* LIXEIRA DE FOTOS — item 81, aprovado pelo print `docs/propostas/81-lixeira-de-fotos.png`.
   *
   * A anatomia é a da lixeira de PROJETOS de propósito: banner navy com o peso à direita,
   * uma linha por exclusão, ação primária em laranja no rodapé. Ele já conhece aquela tela,
   * e um conceito só se aprende uma vez.
   *
   * Antes de 19/08/2026 isto era uma sala de espera de 15 minutos que apagava sozinha — e um
   * dos gatilhos dela ficava no `GET /imagens`, ou seja **abrir esta tela apagava fotografia**.
   * Hoje nada sai daqui sem alguém clicar. */
  .foto-lixeira { border: 1px solid var(--border); border-radius: 12px; overflow: hidden;
                  background: var(--surface); }
  .foto-lixeira > header { display: flex; align-items: center; gap: 12px;
                           padding: 14px 16px; background: var(--navy); color: #fff; }
  .foto-lixeira > header .fl-ico { width: 34px; height: 34px; border-radius: 50%; flex: 0 0 34px;
                                   background: rgba(255,255,255,.10); display: grid;
                                   place-items: center; }
  .foto-lixeira > header .fl-ico svg { width: 18px; height: 18px; }
  /* `var(--brand)`, nao "Montserrat, ..." escrito a mao: a variavel da casa ja traz o
   * fallback certo. A primeira versao usava `var(--fonte)`, que NAO EXISTE nesta folha —
   * e variavel inexistente invalida a declaracao INTEIRA, entao o Montserrat caia junto e
   * o titulo saia em system-ui. Medido no DOM, nao lido no codigo. */
  .foto-lixeira > header h3 { font-family: var(--brand); font-size: 15px;
                              font-weight: 600; margin: 0; line-height: 1.2; }
  .foto-lixeira > header p { font-size: 12px; margin: 2px 0 0; color: #aeb8c9; line-height: 1.3; }
  .foto-lixeira > header .fl-peso { margin-left: auto; text-align: right; }
  .foto-lixeira > header .fl-peso b { display: block; font-family: var(--brand);
                                      font-size: 17px; font-weight: 700;
                                      font-variant-numeric: tabular-nums; }
  .foto-lixeira > header .fl-peso span { font-size: 11px; color: #aeb8c9; }

  .fl-lin { display: flex; align-items: center; gap: 12px; padding: 12px 16px;
            border-top: 1px solid var(--border); }
  .fl-lin .fl-qt { font-size: 13px; font-weight: 600; color: var(--ink); }
  .fl-lin .fl-qd { font-size: 12px; color: var(--ink-3); }
  /* Coluna de número com largura FIXA e alinhada à direita. Só `margin-left:auto` fazia o x
   * de cada tamanho depender da largura do próprio texto — medi 2,0px de desvio entre
   * "6,12 GB" e "21,3 MB" no primeiro print. Número em coluna alinha pela direita. */
  .fl-lin .fl-tam { margin-left: auto; min-width: 86px; text-align: right;
                    font-family: var(--brand); font-size: 13px; font-weight: 600;
                    color: var(--ink); font-variant-numeric: tabular-nums; }
  .fl-lin .fl-acoes { display: flex; gap: 8px; flex: 0 0 auto; }
  .fl-lin .fl-acoes button { height: 38px; }

  .fl-pe { display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
           padding: 12px 16px; border-top: 1px solid var(--border);
           background: var(--surface-2); }
  .fl-pe .fl-nota { font-size: 12px; color: var(--ink-3); line-height: 1.4; max-width: 60ch; }
  .fl-pe .fl-dir { margin-left: auto; }

  #mensagem:not(:empty) { margin-bottom: var(--s4); }
  /* A barra de mensagem PERSISTENTE — item 110. Ela existia e estava sem uso: só era limpa,
   * nunca preenchida. Serve para recusa que pede providencia, que o toast de 3 segundos nao
   * comporta. Vermelho de erro, com o titulo em negrito e o X para fechar. */
  #mensagem .aviso.erro { display: flex; align-items: flex-start; gap: 10px;
                          padding: 12px 14px; border-radius: 10px; }
  #mensagem .aviso.erro b { flex: none; }
  #mensagem .aviso.erro span { flex: 1; }
  #mensagem .x-faixa { flex: none; width: 26px; height: 26px; padding: 0; border: 0;
                       background: rgba(0,0,0,.06); border-radius: 7px; font-size: 17px;
                       line-height: 1; color: inherit; cursor: pointer; }

  /* cabeçalho da inspeção aberta — resumo antes do detalhe */
  section.bloco { background: var(--surface); border: 1px solid var(--border);
                  border-radius: 12px; padding: var(--s5); margin-bottom: var(--s4);
                  box-shadow: var(--sh-1); }
  /* Título de seção com um traço laranja à esquerda: dá hierarquia e quebra o
     branco sem pesar. */
  section.bloco > h2 {
    font-family: var(--brand); font-weight: 700; font-size: 12px;
    letter-spacing: .08em; text-transform: uppercase; color: var(--navy-2);
    margin: 0 0 var(--s4); display: flex; align-items: center; gap: var(--s2);
    padding-left: 11px; position: relative;
  }
  section.bloco > h2::before {
    content: ""; position: absolute; left: 0; top: 50%; transform: translateY(-50%);
    width: 3px; height: 13px; border-radius: 2px; background: var(--orange);
  }
  /* O `<br>` do titulo NASCE DESLIGADO. Ele existe para a coluna estreita da Ajuda, onde
     "Travou? Fale com a gente" nao cabe numa linha; na largura inteira o titulo e um so.
     Um markup, dois comportamentos — duplicar o bloco criaria duas versoes para
     divergirem, que e a armadilha que este repositorio registra em cinco lugares. */
  section.bloco > h2 br { display: none; }
  /* Subtítulos dentro do mesmo bloco (Visão geral usa vários) recebem um
     filete acima, para separar os grupos sem inventar outro cartão. */
  section.bloco > h2 ~ h2 { margin-top: var(--s5); padding-top: var(--s4);
                            border-top: 1px solid var(--hair); }
  section.bloco > h2 ~ h2::before { top: calc(50% + 8px); }
  section.bloco.risco { border-color: var(--bad-bd); background: var(--bad-bg2); }
  section.bloco.risco > h2 { color: var(--bad); }
  /* Complementos do título de bloco. `.mini` já empurrava UM botão para a
     direita; quando são dois ou mais, eles vão dentro de `.h2-acoes` para
     manterem o espaçamento entre si. `.h2-nota` é o contador ao lado do título
     — ele desliga o caixa-alta e o espaçamento de letra do h2, senão "3 alunos
     ativos · 1 vencida" vira um letreiro tão forte quanto o próprio título. */
  section.bloco > h2 .h2-acoes { margin-left: auto; display: flex; gap: var(--s2);
                                 flex: none; align-self: center; }
  section.bloco > h2 .h2-nota { font-family: var(--ui); font-weight: 600; font-size: 11.5px;
                                letter-spacing: 0; text-transform: none; color: var(--ink-3); }

  /* ---------------------------------------------------------- formulário */
  .campos { display: grid; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
            gap: var(--s4) var(--s5); }
  .campo-full { grid-column: 1 / -1; }
  label { display: block; font-size: 11px; font-weight: 600; letter-spacing: .04em;
          text-transform: uppercase; color: var(--ink-3); margin-bottom: 6px; }
  /* Campo em cinza-claro, não branco: dentro de um bloco branco, campo branco
     não tem contorno — a tela ficava um "brancão" sem profundidade. O campo
     recuado lê como sulco; ao focar ele acende em branco com anel laranja,
     e a diferença diz onde você está digitando. */
  input, select, textarea {
    width: 100%; font: inherit; font-size: 14px; color: var(--ink);
    background: var(--surface-2); border: 1px solid var(--border);
    border-radius: 9px; padding: 9px 12px;
    transition: background var(--t), border-color var(--t), box-shadow var(--t);
    box-shadow: inset 0 1px 2px rgba(19,31,51,.04);
  }
  /* O telefone com DDI (02/10/2026): o país à esquerda, do tamanho do nome dele, e o
     número com o resto. Sem o min-width o número empurraria a linha para fora. */
  .tel-ddi { display: flex; gap: 6px; position: relative; }
  .tel-ddi input { flex: 1; min-width: 0; }
  /* O país é um botão com a bandeira e o código, e a lista abre embaixo dele. O tamanho
     da bandeira cita o botão para vencer o tamanho genérico de svg dentro de botão. */
  .tel-ddi-btn { flex: none; padding: 0 10px; font-weight: 500; font-size: 14px;
    background: var(--surface-2); }
  .tel-ddi-btn[aria-expanded="true"] { border-color: var(--orange); }
  .tel-ddi-btn .tel-bandeira, .tel-ddi-lista .tel-bandeira { width: 20px; height: 14px; flex: none;
    border-radius: 2px; box-shadow: 0 0 0 1px rgba(0,0,0,.18); display: block; }
  .tel-ddi-btn .tel-ddi-seta { width: 10px; height: 10px; opacity: .7; }
  .tel-ddi-lista { position: absolute; top: calc(100% + 4px); left: 0; z-index: 60;
    min-width: 230px; max-height: 264px; overflow-y: auto; margin: 0; padding: 6px;
    list-style: none; background: var(--surface); border: 1px solid var(--border);
    border-radius: 12px; box-shadow: 0 10px 28px rgba(19,31,51,.18); }
  .tel-ddi-lista li { display: flex; align-items: center; gap: 10px; padding: 7px 10px;
    border-radius: 8px; font-size: 13px; cursor: pointer; white-space: nowrap; }
  .tel-ddi-lista li:hover, .tel-ddi-lista li:focus { background: #eef3f9; outline: none; }
  .tel-ddi-lista li[aria-selected="true"] { background: #fff4ec; color: var(--orange-dk); }
  .tel-ddi-lista li small { margin-left: auto; padding-left: 12px; color: var(--ink-2);
    font-size: 12px; }
  input:hover, select:hover, textarea:hover { border-color: var(--border-hover); background: var(--surface-3); }
  input:focus, select:focus, textarea:focus {
    outline: none; border-color: var(--orange); background: var(--surface);
    box-shadow: var(--anel-foco);
  }
  /* Caixa e rádio não são campo de texto: sem este reset eles herdam o padding
     de 9×12px, a borda e o fundo da regra acima e viram bolas enormes. */
  input[type="checkbox"], input[type="radio"] {
    width: auto; height: auto; padding: 0; border: 0; background: none;
    box-shadow: none; border-radius: 0; }
  input::placeholder, textarea::placeholder { color: #a8b2c1; }
  input:disabled, select:disabled, textarea:disabled {
    background: var(--inerte-bg); color: var(--ink-3); box-shadow: none; cursor: not-allowed; }
  textarea { resize: vertical; min-height: 64px; line-height: 1.5; }
  /* O navegador dá ao <select> uma caixa de linha maior que a do <input> com o
     mesmo padding — 41,7px contra 38px. Toda linha de formulário que misturava
     os dois saía 3,7px mais alta que as vizinhas. A altura explícita iguala os
     dois; quem precisa de outra medida (.pj-ord) já tem regra mais específica. */
  select { height: 38px; appearance: none; background-image:
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath d='M2 4l4 4 4-4' stroke='%237c879a' stroke-width='1.5' fill='none' stroke-linecap='round'/%3E%3C/svg%3E");
    background-repeat: no-repeat; background-position: right 12px center; padding-right: 30px; }

  /* ---------------------------------------------------------- botões */
  .acoes { display: flex; flex-wrap: wrap; gap: var(--s2); }
  /* ============================ BOTÕES: TRÊS TAMANHOS ======================
     Antes desta seção havia 13 formatos diferentes no app — 25, 32, 34, 36,
     38, 40, 52 e 66px de altura, cinco tamanhos de fonte e cinco raios. Cada
     tela inventava o seu. Agora são três, e só três:

       .btn-g  48px · 14px   ação de destaque, uma por tela no máximo
       (base)  38px · 13px   o botão normal — use este quando na dúvida
       .btn-p  32px · 12.5px dentro de lista, título de bloco ou barra densa

     Raio é sempre 9px. Ícone dentro do botão: 15px no .btn-p, 16px nos outros.
     Botão só de ícone: .btn-ico (quadrado, do tamanho da sua classe).

     PESO, combinável com o tamanho:
       .principal  laranja cheio — a ação que a tela existe para fazer
       (nenhum)    branco com borda — ações comuns
       .btn-sutil  sem borda até o hover — ações de apoio, em lista
       .btn-navy   translúcido — ações dentro de BANNER NAVY
       .perigo     vermelho — destrói algo

     🔴 O `.btn-navy` NASCEU NO ITEM 361, e nasceu de dois números medidos no banner
     da Conta. Ele já existia sem nome: era o `.pj-recentes`, batizado pela função de
     UM botão ("Recentes vive aqui") e não pelo que desenha.

       Trocar minha senha   fundo BRANCO puro sobre navy, contraste 16,37
                            — o elemento mais forte da tela inteira
       Sair                 `.btn-sutil` sobre navy, contraste 2,13
                            — o mínimo legível é 4,5. Estava quase invisível.

     ⚠️ **O `.btn-sutil` foi desenhado para FUNDO CLARO** (`color: var(--ink-2)`, um
     cinza escuro). Sobre navy ele some. Peso não é universal: ele pressupõe o fundo,
     e essa é a parte que o catálogo não dizia.

     Lastro: 4 usos (os dois do banner da Conta e os dois de Projetos), acima da
     régua de 3 da casa.

     Ao criar tela nova, ESCOLHA entre estes. Não declare height/font-size de
     botão fora daqui: foi assim que nasceram os 13 formatos. */
  /* `a.btn` entra junto de `button` porque link que leva para fora (checkout,
     página do plano) PRECISA ser <a> — abre em aba nova, o meio do usuário
     copia o endereço, o teclado alcança. Sem isto o <a> não herdava nada e cada
     tela redesenhava o botão à mão: foi o que aconteceu no modal de Planos, em
     que os três "Assinar agora" saíram com altura e raio certos e SEM
     preenchimento nenhum — a ação de comprar virou um link de texto. */
  button, a.btn {
    font: inherit; font-weight: 600; font-size: 13px; cursor: pointer;
    height: 38px; padding: 0 16px; border-radius: 9px;
    border: 1px solid var(--border); background: var(--surface); color: var(--ink);
    display: inline-flex; align-items: center; gap: 7px; transition: var(--t);
  }
  a.btn { text-decoration: none; justify-content: center; }
  button svg, a.btn svg { width: 16px; height: 16px; flex: none; }
  .btn-g { height: 48px; padding: 0 22px; font-size: 14px; }
  .btn-p { height: 32px; padding: 0 12px; font-size: 12.5px; gap: 6px; }
  .btn-p svg { width: 15px; height: 15px; }
  .btn-ico { width: 38px; padding: 0; justify-content: center; }
  .btn-p.btn-ico { width: 32px; }
  .btn-sutil { border-color: transparent; background: none; color: var(--ink-2); }
  .btn-sutil:hover:not(:disabled) { border-color: var(--border); background: var(--surface-2); }
  /* O hover genérico NÃO pisa em quem está selecionado. Sem os `:not`, esta
     regra vale (0,3,1) e vence qualquer `.classe.ativo` (0,2,0) — o botão
     selecionado ficava branco ao passar o mouse. O empate já tinha aparecido
     no menu lateral e no filtro de Laudos; resolvê-lo aqui encerra a
     categoria, em vez de blindar dez regras uma a uma. */
  /* Os `:not` ficam dentro de `:where()` porque `:where()` NÃO conta
     especificidade. Sem ele, esta regra somava sete pseudo-classes e virava
     (0,7,1) — passando a ganhar até do menu lateral (0,3,1), que voltou a
     branquear no hover. Com `:where()` a regra continua valendo (0,2,1), que
     é o que ela sempre foi, e ainda assim não encosta em quem está
     selecionado. */
  button:hover:not(:disabled):where(:not(.ativo):not(.sel):not(.on):not(.atual):not(.principal):not(.perigo)),
  a.btn:hover:where(:not(.principal):not(.perigo))
    { border-color: var(--border-hover); background: var(--surface-2); }
  /* Sobrou um dos "cinco alfas" que esta folha diz ter encerrado: aqui era .20
     cravado, enquanto --anel-foco vale .16. O visualizador já usava o token. */
  button:focus-visible, a.btn:focus-visible { outline: none; box-shadow: var(--anel-foco); }
  button:disabled { opacity: .5; cursor: not-allowed; }
  button.principal, a.btn.principal { background: var(--orange); border-color: var(--orange); color: #fff; }
  button.principal:hover:not(:disabled), a.btn.principal:hover { background: var(--orange-dk); border-color: var(--orange-dk); }
  button.perigo, a.btn.perigo { border-color: #e6c1b9; color: var(--bad); background: var(--surface); }
  button.perigo:hover:not(:disabled), a.btn.perigo:hover { background: var(--bad-bg); border-color: var(--bad); }
  button.link { border: none; background: none; height: auto; padding: 4px 0; color: var(--orange-dk); }
  #nova { width: 100%; height: 42px; font-size: 14px; }

  /* ---------------------------------------------------------- upload */
  #solta {
    border: 2px dashed var(--border-hover); border-radius: 12px; padding: var(--s6) var(--s4);
    text-align: center; color: var(--ink-3); cursor: pointer; background: var(--surface-2);
    transition: var(--t); font-size: 13px;
  }
  #solta:hover { border-color: var(--navy-2); color: var(--ink-2); }
  #solta.sobre { border-color: var(--orange); background: var(--sel-bg); color: var(--ink); }
  /* O VÉU DE SOLTAR — 24/10/2026, print aprovado. A Importar inteira aceita o soltar, e o véu
     cobre a área da tela enquanto se arrasta. pointer-events: none de propósito: ele não pode
     virar o alvo do arrastar, senão cada entrada e saída dele mexeria no contador. O display
     do hidden é dito aqui porque o display: grid passaria por cima do atributo. */
  #impVeu { position: fixed; z-index: 70; pointer-events: none; display: grid; place-items: center;
            background: rgba(255,101,1,.08); border: 3px dashed var(--orange); border-radius: 14px; }
  #impVeu[hidden] { display: none; }
  #impVeu > div { background: var(--surface); border-radius: 14px; padding: 18px 26px; text-align: center;
                  box-shadow: 0 10px 30px rgba(19,31,51,.18); }
  #impVeu b { display: block; font: 800 18px var(--brand), sans-serif; color: var(--ink); }
  #impVeu small { color: var(--ink-3); font-size: 12.5px; }
  /* A linha do que foi lido: verde quando entrou foto, neutra lendo a pasta ou sem foto. */
  #impLidas { margin-top: var(--s3); border: 2px solid #cfe9db; background: #f3fbf6; border-radius: 12px;
              padding: 12px 16px; color: var(--good); font-weight: 600; font-size: 13px; }
  #impLidas small { display: block; color: var(--ink-3); font-weight: 500; font-size: 12px; margin-top: 2px; }
  #impLidas.neutra { border-color: var(--border-hover); background: var(--surface-2); color: var(--ink-2); }
  /* O diálogo da pasta com subpastas: a tabela rola sozinha quando são muitas. */
  .sep-dlg .sep-rolo { max-height: 46vh; overflow-y: auto; margin-top: var(--s2); }
  .sep-dlg .sep-tabela { font-size: 12.5px; }
  .sep-dlg .sep-tabela th { text-align: left; color: var(--ink-3); font-weight: 600; font-size: 11.5px;
                            padding: 4px 8px; border-bottom: 1px solid var(--hair); }
  .sep-dlg .sep-tabela td { padding: 7px 8px; border-bottom: 1px dashed var(--hair); }
  .sep-dlg .sep-tabela .n { text-align: right; font-variant-numeric: tabular-nums; }
  .sep-dlg .sep-ico { display: inline-block; width: 20px; }
  .sep-chip { display: inline-block; border-radius: 999px; padding: 1px 8px; font-size: 11px; font-weight: 600; }
  .sep-chip.novo { background: #e9f6ef; color: var(--good); }
  .sep-chip.existe { background: #e8eef9; color: var(--info); }
  .sep-chip.semvoo { background: #f1f3f6; color: var(--ink-3); }
  .sep-dlg p.sep-fora { margin-top: var(--s3); color: var(--ink-3); font-size: 12px; }
  .barra { height: 8px; background: var(--hair); border-radius: 20px; overflow: hidden; margin-top: var(--s3); }
  .barra > i { display: block; height: 100%; width: 0; border-radius: 20px;
               background: var(--orange); transition: width .4s ease; }

  /* ---------------------------------------------------------- tabela */
  table { width: 100%; border-collapse: collapse; font-size: 13px; }
  th { text-align: left; padding: 8px 10px; border-bottom: 1px solid var(--border);
       font-size: 11px; font-weight: 700; letter-spacing: .05em; text-transform: uppercase;
       color: var(--ink-3); }
  td { padding: 10px; border-bottom: 1px solid var(--hair); }
  tr:last-child td { border-bottom: none; }
  .num { font-variant-numeric: tabular-nums; }

  /* ---------------------------------------------------------- avisos */
  .aviso { border-radius: 9px; padding: 11px 14px; font-size: 13px; font-weight: 500;
           display: flex; gap: 9px; align-items: flex-start; }
  .aviso::before { font-weight: 700; }
  .aviso.erro { background: var(--bad-bg);  color: var(--bad); }
  .aviso.erro::before { content: "!"; }
  .aviso.ok   { background: var(--good-bg); color: var(--good); }
  .aviso.ok::before { content: "✓"; }
  .aviso.info { background: #e9f0fb; color: #244a76; }
  .aviso.info::before { content: "i"; font-style: italic; }
  .aviso.atencao { background: var(--warn-bg); color: #6b4708; border: 1px solid var(--warn-bd); }
  .aviso.atencao::before { content: "!"; color: var(--warn); }
  .aviso code { background: #fff; border: 1px solid var(--warn-bd2); border-radius: 7px;
                padding: 3px 8px; font: 12.5px/1.5 ui-monospace, Consolas, monospace;
                color: #4b3406; display: inline-block; margin-top: 6px; }

