/* =============================================================================
   SYLISION · SITE INSTITUCIONAL — componentes
   =============================================================================
   Consome SO os tokens de base.css. Nenhum hex aqui, e nao por purismo: a paleta
   vai virar post e metade daquele feed e escuro, entao componente com hex fixo e
   componente que quebra na inversao.

   O QUE MORREU AQUI, EM UMA LINHA CADA (11 a 13/08)
     .pilar .tres .explore .demo .selo .vaga-fake .assinatura .pilula .texto-duplo
     .passos .passo-n   os quatro tells de site gerado por IA: cartao com raio,
                        BARRA DE ACENTO no topo do cartao, simbolo ◎ ▤ ➤ ⇄ ▦ como
                        icone e grade de tres cartoes iguais. O tell nao volta pela
                        classe, volta pela FORMA -- `.passos` era o mesmo desenho
                        com outro nome. Conferido: zero ocorrencia nas 5 paginas.
     .grifo             fundido no .preenche: mesmo desenho, mesmo proposito.
     22 regras de chao  cada chao repintando cada componente. Viraram 2 blocos de
                        token: --texto, --texto-fraco, --linha, --acento.
     10 regras da conta cinco pro chao verde, cinco pro preto. Zero agora.
     .conta-lin.piso    a tabela fecha no TOTAL; o piso e a REGUA, que e um <hr>.
     .conta (envolucro) apelido sem uso: o markup escreve .razao nas 5 paginas.
     .pe margin-top     7rem de margem que 3 das 5 paginas zeravam no proprio
                        <head>. Regra que a maioria anula nao e regra, e defeito.
     .refaz .ok         utilitarios de uma linha usados por ninguem.

   No lugar de tudo isso ficou UM componente, A CONTA, e e nela que a ousadia do
   site foi gasta inteira.
   ============================================================================= */

/* =============================================================================
   O CABECALHO CANONICO — este bloco e a fonte da verdade, nao o HTML
   =============================================================================
   Ordem da rodada 5: "Um header so, nas 5 paginas". Antes eram cinco CTAs
   diferentes na mesma barra ("Teste de 7 dias", "Testar 7 dias · 3 vagas",
   "Enviar meu CV", "Descrever minha vaga", "Uma vaga gratis") -- ou seja, cinco
   ofertas onde existe UMA. O markup abaixo e o unico permitido:

     <header class="topo">
       <a class="marca" href="index.html">
         <span class="marca-txt">SYLISION</span>
         <span class="marca-sub">IA Recruiter</span>
       </a>
       <nav class="menu" aria-label="Navegação principal">
         <a href="index.html">Início</a>
         <a href="plataforma.html">A Plataforma</a>
         <a href="empresas.html">Para Empresas</a>
         <a href="banco.html">De onde vêm os devs</a>
         <a href="candidatos.html">Sou dev</a>
       </nav>
       <div class="topo-dir">
         <a class="gota gota--tinta gota--pequena" href="empresas.html">Testar 7 dias</a>
         <button class="tema-btn" id="tema-btn" aria-label="Alternar tema">☾</button>
       </div>
       <button class="menu-btn" id="menu-btn" aria-expanded="false" aria-label="Abrir menu">≡</button>
     </header>

   DUAS diferencas sao permitidas, e nenhuma terceira:
     1. `aria-current="page"` na aba da propria pagina;
     2. em empresas.html o href do CTA pode ser `#c-planos`, porque a pagina do
        preco nao se linka; o TEXTO continua sendo "Testar 7 dias".

   ADOCAO, medida hoje (comentario removido, aria-current normalizado, espacos
   colapsados, md5 dos 699 caracteres): index, plataforma, candidatos e banco dao
   o MESMO hash. empresas.html diverge em um ponto -- a ordem das abas, com "Sou
   dev" em terceiro e "Para Empresas" em quarto. Nao vou cobrar isso em prosa:
   as cinco regras de `order` logo abaixo IMPOEM a ordem canonica na tela seja
   qual for a ordem no markup, entao a divergencia deixou de existir pro
   visitante e nao pode voltar pela mao de nenhum dos sete donos de pagina.
   ============================================================================= */
.topo {
  position: sticky; top: 0; z-index: 40;
  display: flex; align-items: center; gap: var(--e5);
  /* largura CHEIA com recuo calculado, e nao `width: var(--col)`: com largura de
     coluna o fundo vira faixa flutuante e o chao da secao aparece nas pontas. */
  width: 100%;
  padding-block: var(--e4);
  padding-inline: max(var(--e5), calc((100% - var(--col)) / 2));
  /* o blend `difference` saiu daqui: sobre a secao AMARELA ele dava AZUL
     (#fafaf7 x #9fb088 = #0526f7). Contraste bom nao salva cor errada. */
  background: var(--fundo);
  border-bottom: 1px solid var(--linha);
  color: var(--texto);
}

/* 44px de altura: e link, e no celular ele media 32px. O logo e o unico jeito
   de voltar pra home nas cinco paginas depois que o menu fecha, entao alvo curto
   aqui e navegacao que falha justo em quem se perdeu. A linha de base do texto
   nao muda -- o ganho vem de padding, nao de fonte maior. */
.marca {
  display: flex; align-items: baseline; gap: var(--e2); text-decoration: none;
  min-height: 44px; padding-block: 6px;
}
.marca-txt {
  font-family: var(--display); font-weight: 700; font-size: 1.25rem;
  letter-spacing: -.02em;
  /* "onde tiver Sylision escrito, ficar verde" (fundador, 18/08/2026) --
     e a marca no cabecalho e no rodape E "Sylision" escrito, nas cinco
     paginas, entao uma linha aqui cobre as duas ocorrencias mais repetidas
     do site inteiro sem tocar em HTML nenhum. --acento e nao --verde:
     token que sabe virar preto sozinho se um dia a marca aparecer sobre
     chao verde. */
  color: var(--acento);
}
.marca-sub { font-family: var(--dado); font-size: var(--t-rot); opacity: .7; }

.menu { display: flex; gap: var(--e5); margin-left: auto; }
.menu a {
  font-size: .9375rem; text-decoration: none; position: relative; padding-block: var(--e1);
}
/* A ORDEM DAS ABAS E DO SISTEMA, NAO DA PAGINA. Ela conta a jornada: quem chega,
   como funciona, quanto custa, de onde vem a gente, e por ultimo o lado do dev,
   que e o publico secundario. Uma pagina que se promove pra terceira posicao no
   proprio menu deixa a barra de navegacao diferente da que o visitante acabou de
   usar, e barra que se remonta a cada clique nao e navegacao. */
.menu a[href^="index"]      { order: 1; }
.menu a[href^="plataforma"] { order: 2; }
.menu a[href^="empresas"]   { order: 3; }
.menu a[href^="banco"]      { order: 4; }
.menu a[href^="candidatos"] { order: 5; }

/* o sublinhado cresce do centro: gesto pequeno, e o unico do menu */
.menu a::after {
  content: ""; position: absolute; left: 50%; right: 50%; bottom: 0; height: 2px;
  background: var(--verde); transition: left var(--transicao), right var(--transicao);
}
.menu a:hover::after, .menu a[aria-current]::after { left: 0; right: 0; }

/* o alternador de tema fica SEMPRE a direita do CTA, e quem garante isso e o
   `order` e nao a boa vontade de quem escrever o proximo <head> */
.topo-dir { display: flex; align-items: center; gap: var(--e4); }
.topo-dir .gota { order: 1; }
.topo-dir .tema-btn { order: 2; }

.tema-btn {
  width: 44px; height: 44px; display: grid; place-items: center;
  background: none; border: 1px solid currentColor; border-radius: 999px;
  color: inherit; font-size: 1rem; cursor: pointer; opacity: .75;
}
.tema-btn:hover { opacity: 1; }

.menu-btn {
  display: none; margin-left: auto; background: none; border: 0;
  color: inherit; font-size: 1.75rem; line-height: 1; cursor: pointer; padding: var(--e2);
}

/* ================================================================= HEROI
   88vh e nao 100vh: tela cheia empurra a proxima secao pra fora e o visitante nao
   descobre que ha pagina embaixo.
   O HEROI E ESCURO por roteiro do briefing ("massa preta com a escrita por
   cima"), e tambem porque em papel a captura de 390px mostrou o titulo preto
   sobre a massa preta -- a massa e IRMA do texto, entao z-index nao salva: estar
   na frente nao cria contraste. A secao commita um chao so, e a virada fica mais
   dramatica: sai do preto, passa pelo papel, chega no verde. */
.heroi {
  min-height: 88vh; display: flex; align-items: center;
  padding-block: var(--e7) var(--e8); overflow: hidden;
}
.heroi-col { position: relative; z-index: 2; }

/* O H1 E LIMITADO PELA ALTURA DA JANELA, e nao so pela largura. Medido em
   1366x768, que e o notebook do fundador: com --t-h1 escalando so por vw o h1
   dava 409px e empurrava o botao principal pra 128px ABAIXO da dobra.
       12vh  / 20ch -> 4 linhas, h1 350px, botao em 839px  (71px abaixo)
       10.5vh/ 26ch -> 4 linhas, h1 306px, botao em 796px  (28px abaixo)
       9.5vh / 26ch -> 2 LINHAS, h1 139px, botao em 628px  (140px de folga)
   Foi o salto de 4 pra 2 linhas que devolveu a dobra, e nao o corpo da fonte. */
.heroi h1 {
  font-size: min(var(--t-h1), 9.5vh);
  margin-bottom: var(--e5);
  max-width: 26ch;
}
/* em janela baixa o respiro do heroi encolhe: e o unico lugar da pagina onde
   padding disputa espaco com a acao principal */
@media (max-height: 820px) {
  .heroi { padding-block: var(--e5) var(--e6); min-height: auto; }
  .heroi-leads { gap: var(--e3); margin-bottom: var(--e5); }
  .dica-scroll { margin-top: var(--e4); }
}
.heroi-leads { display: grid; gap: var(--e4); margin-bottom: var(--e6); }
/* O ULTIMO LEAD VIRA REMATE EM TIPO DISPLAY, mas so se HOUVER MAIS DE UM: com
   `:last-child` sozinho, um heroi de paragrafo unico teria esse paragrafo
   promovido, e seis frases em 30px viram cartaz ilegivel. */
.heroi-leads .lead:last-child:not(:first-child) {
  font-family: var(--display); font-weight: 700; font-size: var(--t-h3);
  color: var(--texto); letter-spacing: -.02em;
}
.acoes { display: flex; flex-wrap: wrap; gap: var(--e4); align-items: center; }
.dica-scroll { margin-top: var(--e6); }

/* ================================================= OS TRES CHAOS
   Cada secao COMMITA um chao so. Papel com massa verde flutuando atras fazia o
   texto cair ora sobre papel ora sobre verde, e deu 8 trechos abaixo de 3:1 --
   o pior a 1,0:1, e era uma clausula de contrato.

   O CHAO NAO REPINTA COMPONENTE: ele TROCA OS TOKENS e cala a boca. O componente
   le --texto, --texto-fraco, --linha, --acento e --contraste; o chao diz quanto
   vale cada um. Componente novo ja nasce certo nos tres, e erro de contraste vira
   erro de token.

   O ACENTO E O CONTRASTE INVERTEM AQUI. Papel e preto ficam com o verde
   herdado da raiz; o verde vira PRETO, senao etiqueta, grifo, marcador e botao
   seriam verde sobre verde. Verde e preto sao chao commitado e nao mudam
   com o alternador de tema -- por isso fixam token em vez de herdar. */

/* ---------------------------------------------------------- chao escuro
   Heroi, manifesto e rodape sao o MESMO chao e dizem isso uma vez so.
   --texto-fraco em .72 e nao em .45: em .45 a etiqueta mono de 11px tinha
   luminancia de 6,8:1 mas peso de fantasma, e a linha que ela rotula e a conta.
   (Quatro paginas ainda repintam .micro pra 72% de papel no proprio <head>: sao
   quatro copias de uma regra que ja mora aqui, e podem sair.) */
.heroi, .sec-mani, .pe, .chao-tinta {
  background: var(--tinta);
  --texto:       var(--papel);
  --texto-fraco: rgba(250, 250, 247, .72);
  --linha:       rgba(250, 250, 247, .14);
  --linha-forte: rgba(250, 250, 247, .3);
  --contraste:       var(--papel);
  --sobre-contraste: var(--tinta);
  /* a mancha no chao escuro e AMARELA, e nao cinza. No heroi ela e --tinta-2
     (silhueta tom sobre tom, de proposito, pra nao competir com o titulo); numa
     secao de conteudo escura ela e o verde que o fundador pediu que
     predominasse. Quem escolhe continua sendo a variante --materia--*. */
  color: var(--texto);
}

/* ---------------------------------------------------------- chao verde
   Dentro do verde "texto fraco" nao pode ser cinza claro: vira preto com alfa,
   que escurece em vez de clarear e continua passando com folga (>= 8:1).
   Aqui acento e contraste coincidem em preto, e isso esta certo: sobre verde so
   existe UM campo cheio possivel, entao os dois botoes cheios sao o mesmo botao.
   Quem separa acao primaria de secundaria nesta secao e o .gota--vazia. */
.sec-virada, .chao-verde {
  overflow: hidden;
  background: var(--verde);
  --texto:        var(--sobre-verde);
  --texto-fraco:  rgba(11, 11, 12, .74);
  --linha:        rgba(11, 11, 12, .22);
  --linha-forte:  rgba(11, 11, 12, .34);
  --acento:          var(--tinta);
  --sobre-acento:    var(--papel);
  --contraste:       var(--tinta);
  --sobre-contraste: var(--papel);
  color: var(--texto);
}

/* ---------------------------------------------------------- chao claro elevado
   O unico que NAO fixa token: ele acompanha o tema de proposito, porque e o chao
   neutro onde a conta e a lista sao lidas. */
.sec-assinatura, .chao-neutro { background: var(--papel-2); }

/* =============================================================== O RITMO
   =============================================================================
   POR QUE ESTAS TRES CLASSES EXISTEM (13/08/2026)

   O fundador, olhando o site pronto: "de sessão pra sessão fica tudo uma sessão
   branca. Tenta ir revezando as cores. Uma sessão ou está branca, ou está preta,
   ou está verde. Trabalha com essas três cores."

   Ele estava certo, e dava pra contar: das 23 <section> das cinco paginas, 10
   nao declaravam chao nenhum e caiam no fundo da pagina. Na home eram TRES
   SEGUIDAS -- c-versus, c-72h e c-candidato --, e tres brancas em sequencia leem
   como uma pagina so, comprida, sem batida.

   O sistema de chao ja existia e era bom: `.heroi`, `.sec-virada` e
   `.sec-assinatura` ja trocavam o conjunto de tokens, e todo componente ja
   obedecia a --acento e --contraste em vez de escrever hex. O que faltava era
   NOME GENERICO: enquanto o chao se chamava pelo papel da secao ("a virada",
   "a assinatura"), pintar uma secao nova exigia inventar uma classe nova ou
   emprestar um nome que mente. `.chao-tinta`, `.chao-verde` e `.chao-neutro`
   sao os mesmos tres chaos com nome do que eles SAO.

   A REGRA DE LETRA, que e a segunda metade do pedido dele ("no verde pode
   colocar o preto; no preto, o branco e o verde"), nao precisou de codigo
   novo: ela ja e o par --texto/--sobre-acento de cada chao. Sobre verde o
   texto e preto (13,6:1) e o acento vira PRETO; sobre tinta o texto e papel e o
   acento continua verde. Nenhum componente sabe em que chao esta.

   E POR QUE O NEUTRO NAO FIXA TOKEN: ele acompanha o tema do visitante de
   proposito. No tema claro a sequencia le branco / preto / verde, que e
   exatamente o que ele pediu. No escuro le grafite / preto / verde, que
   continua alternando. Forcar branco no tema escuro entregaria um lampejo de
   papel no meio de uma pagina preta -- e o briefing manda o site inteiro
   obedecer ao tema, nao o contrario. */

.col--estreita { width: min(760px, calc(100% - 2 * var(--e5))); }

/* ============================================================== A CONTA
   =============================================================================
   ESTA E A PECA, e a ousadia do site foi gasta aqui e em nenhum outro lugar.
   Nenhum concorrente publica a aritmetica da nota. Por isso ela nao e "cartao de
   destaque": e um RAZAO CONTABIL -- rotulo, valor, detalhe, parcela, fio duplo,
   total -- que e a forma que a humanidade inventou pra dizer "confira em vez de
   acreditar".

   O MARKUP E O MESMO DA FERRAMENTA, byte a byte: parcelasHtml() em
   app/web/v2/v2.js emite exatamente isto, e nada alem disto:

     <div class="conta-tab">
       <div class="conta-lin">
         <span class="conta-rot">obrigatorios</span>
         <span class="conta-val"><b>6 de 6</b> · Java · Spring · SQL · REST · Git · SOLID</span>
         <span class="conta-pontos">+48</span>
       </div>
       ... tempo na tech +22 · senioridade +12 · local +10 ...
       <div class="conta-lin total">
         <span class="conta-rot">total</span>
         <span class="conta-val">soma das quatro parcelas acima</span>
         <span class="conta-pontos">92</span>
       </div>
     </div>

   ESTE ARQUIVO E A UNICA COPIA. Copia de componente nao diverge no dia em que e
   feita, diverge no dia em que alguem conserta UMA: quando plataforma ainda
   carregava as ~40 linhas no proprio <head>, duas medidas ja tinham divergido em
   silencio (min-width do <b> 7rem contra 6.5rem, peso da parcela 600 contra 700).

   O QUE MATA ESTE COMPONENTE: a conta nao fechar na tela. A soma das parcelas tem
   que dar o total impresso, e o total tem que vir de sum(parcelas) na origem,
   nunca digitado. Razao que nao soma e pior que razao nenhum, porque a pagina
   promete "confira" -- e por isso .conta-tab e proibido em lista que nao soma
   (um "01 / 02 / 03" na coluna de parcela e um convite a somar tres passos).
   Lista de passos e <ol> com fio.

   A LINHA DO PISO SAIU EM 12/08, aqui e no v2.js: ela era a unica linha que NAO
   era parcela e convidava o olho a somar o corte junto. A tabela fecha no TOTAL.

   E ELE NASCE VISIVEL, aqui e em pagina nenhuma: o scroll pode GRIFAR a parcela
   que esta sendo somada, nunca revelar a tabela.
   NOME: o envolucro e .razao (as 5 paginas escrevem assim); o apelido .conta era
   um segundo nome pra mesma coisa e nao existe mais. */
.razao { margin-top: var(--e6); max-width: 66ch; opacity: 1; }

/* o fio de cima e o do total sao FORTES, os de dentro sao fracos: e assim que uma
   tabela de conta se le, o bloco inteiro primeiro, a linha depois.
   AS LARGURAS FORAM MEDIDAS: 8.5rem cabe "obrigatorios" e "tempo na tech" sem
   quebrar, e 3.25rem cabe "+48" e "100" sem a coluna dançar. */
.conta-tab {
  border-top: 2px solid var(--texto);
  font-family: var(--dado); font-size: var(--t-dado);
  font-variant-numeric: tabular-nums;
}
.conta-lin {
  display: grid; grid-template-columns: 8.5rem minmax(0, 1fr) 3.25rem;
  gap: var(--e3); align-items: baseline;
  padding: var(--e3) 0;
  border-bottom: 1px solid var(--linha);
  line-height: 1.5;
}
.conta-rot {
  color: var(--texto-fraco);
  font-size: var(--t-rot); text-transform: uppercase; letter-spacing: .12em;
}
.conta-val { color: var(--texto-fraco); }
/* A QUARTA COLUNA MORA DENTRO DA TERCEIRA. O v2.js emite valor e detalhe no mesmo
   <span> ("<b>6 de 6</b> · Java · Spring · ..."), entao a coluna do VALOR e o <b>
   com largura minima fixa: sem isso "6 de 6", "16 anos", "senior" e "Porto
   Alegre" comecam alinhados e terminam cada um num lugar. 6.5rem cabe "Porto
   Alegre" em 13px de mono, que e o valor mais longo do v2.js. */
.conta-val b { display: inline-block; min-width: 6.5rem; color: var(--texto); font-weight: 700; }
.conta-pontos { text-align: right; color: var(--texto); font-weight: 700; }

/* FIO DUPLO ANTES DO TOTAL: e a convencao contabil, e ela existe pra dizer "daqui
   pra baixo e resultado, nao lancamento". E a unica linha que o olho procura. */
.conta-lin.total {
  border-top: 3px double var(--texto);
  border-bottom: 0;
  margin-top: var(--e2); padding-top: var(--e3);
}
.conta-lin.total .conta-rot { color: var(--texto); }
/* o total fica em MONO e nao no display: ele tem que cair na mesma coluna dos
   "+48 +22 +12 +10" logo acima, e fonte proporcional muda a largura do digito e
   desalinha a unica coluna que a pagina pede pra o visitante somar. */
.conta-lin.total .conta-pontos { font-size: 1.375rem; line-height: 1; }

/* EM 720px, E NAO EM 560: a tabela tem 8.5 + 6.5 + 3.25rem mais dois vaos, ou
   seja 19.5rem so de coluna fixa, e abaixo de 720 o detalhe cai pra menos de 20
   caracteres e quebra em tres linhas. O rotulo sobe pra cima do valor e a PARCELA
   CONTINUA na direita, porque e a unica coluna que a pessoa soma. */
@media (max-width: 720px) {
  .conta-lin { grid-template-columns: minmax(0, 1fr) 3.25rem; }
  .conta-rot { grid-column: 1 / -1; }
  .conta-val b { display: inline; min-width: 0; }
}

/* ================================================================ VERSUS
   O lado velho NAO ganha verde: pintar de verde o que a pagina esta
   criticando premiaria o concorrente com a cor da marca. Teto de 5 linhas por
   lado -- lista comparativa que passa de cinco deixa de ser comparacao e vira
   inventario.
   ESTA COMPARACAO E O ARGUMENTO DA HOME E NAO PODE NASCER EM opacity 0: `.sobe`
   nas duas colunas foi cobrado na rodada 5 e nao volta. */
.versus { display: grid; gap: var(--e5); margin-top: var(--e6); }
@media (min-width: 860px) { .versus { grid-template-columns: 1fr 1fr; gap: var(--e6); } }

.vs h3 { margin-bottom: var(--e4); }
.vs ul { list-style: none; padding: 0; margin: 0; display: grid; gap: var(--e3); }
.vs li { position: relative; padding-left: var(--e5); font-size: .9375rem; line-height: 1.5; }

/* UM MARCADOR SO, EM DOIS PESOS. Eram duas regras completas de ::before, iguais
   em tudo menos em tres valores. Nenhum dos dois e simbolo: ▪ e X vermelho sao o
   mesmo tell dos icones que morreram, e a diferenca entre os lados vem de PESO. */
.vs li::before {
  content: ""; position: absolute; left: 0; top: var(--mk-y, .62em);
  width: var(--mk-w, .625rem); height: var(--mk-h, 3px);
  background: var(--mk-cor, var(--acento));
}
.vs--velho {
  color: var(--texto-fraco);
  --mk-y: .7em; --mk-w: .75rem; --mk-h: 1px; --mk-cor: var(--cinza-2);
}
.vs--velho h3 { color: var(--texto-fraco); font-weight: 400; }

/* a ancora: a coluna da Sylision e a unica ancorada, e e do acento do chao */
.vs--novo { position: relative; padding-left: var(--e5); }
.vs--novo::before {
  content: ""; position: absolute; left: 0; top: .2em; bottom: .2em; width: 3px;
  background: var(--acento);
}

/* ============================================================== A PONTE
   O que sobrou de #explore: os quatro tiles com ◇ ◆ ✦ ◎ eram navegacao fantasiada
   de conteudo, e desceram pro rodape como links. Sobra UM link por pagina, o da
   proxima leitura, e ele nao e cartao: e uma linha com um fio em cima, do mesmo
   jeito que uma nota de rodape aponta pro capitulo seguinte. */
.ex {
  display: grid; gap: var(--e1); margin-top: var(--e6);
  padding-top: var(--e3); border-top: 2px solid var(--texto);
  text-decoration: none; max-width: 46ch;
  transition: border-top-color var(--transicao);
}
.ex b { font-family: var(--display); font-size: var(--t-h3); letter-spacing: -.02em; }
.ex span { font-size: .9375rem; color: var(--texto-fraco); }
.ex i { font-style: normal; color: var(--texto-fraco); }
/* o hover mexe no FIO e no sublinhado, e nao no fundo: campo verde atras de uma
   linha inteira faria do link de rodape de secao o elemento mais forte da tela,
   disputando com a conta */
.ex:hover { border-top-color: var(--acento); }
.ex:hover b {
  text-decoration: underline; text-decoration-thickness: 3px;
  text-decoration-color: var(--acento); text-underline-offset: .16em;
}

/* =============================================================================
   O RODAPE CANONICO — tambem fonte da verdade, e ele ja esta adotado
   =============================================================================
   Eram quatro variantes. Medido hoje, comentarios fora e espacos colapsados, as
   CINCO paginas dao o mesmo md5 nos mesmos 914 caracteres, com tres colunas:

     marca + endereco · Produto (4 links) · Privacidade & LGPD (3 links)
     e a linha final: © Sylision · A IA tria. Quem contrata é gente. · LGPD

   AS DUAS REGRAS QUE O MANTEM ASSIM:
     1. UM link por destino. banco.html aparecia DUAS vezes nas cinco paginas (o
        `.pe-dado` solto mais a coluna Produto) e ainda apontava pra tres
        destinos diferentes: banco.html, banco.html#c-medimos e #c-medimos. Fica
        o da coluna Produto, "De onde vêm os devs". O `.pe-dado` nao existe mais,
        e por isso nao ha regra pra ele aqui.
     2. Nenhum numero de estoque no rodape. O total do banco morava em cinco
        rodapes: cinco lugares pra o mesmo numero envelhecer, e o primeiro que
        envelhecesse desmentia os outros quatro. Ele mora em banco.html, que e a
        pagina que responde por ele.
   O chao escuro do rodape foi declarado la em cima, junto com heroi e manifesto.
   ============================================================================= */
/* SEM margin-top. A margem de 7rem que morava aqui somava com o padding-block de
   7rem da ultima secao e abria 14rem de vazio antes do rodape -- tanto que TRES
   das cinco paginas a zeravam no proprio <head>. Regra que a maioria das paginas
   anula nao e regra, e defeito com tres remendos. */
.pe { padding-block: var(--e7) var(--e5); }
.pe-grid { display: grid; gap: var(--e6); }
@media (min-width: 760px) { .pe-grid { grid-template-columns: 2fr 1fr 1fr; } }
.pe h4 {
  font-family: var(--dado); font-size: var(--t-rot); text-transform: uppercase;
  letter-spacing: .14em; margin: 0 0 var(--e3); color: var(--acento);
}
.pe-grid div > a {
  display: block; text-decoration: none; font-size: .9375rem;
  padding-block: var(--e1); color: var(--texto-fraco);
}
.pe-grid div > a:hover { color: var(--texto); }
.pe .marca-txt { display: block; margin-bottom: var(--e3); }
.pe-grid p { margin-bottom: var(--e3); }
.pe-fim { border-top: 1px solid var(--linha); margin-top: var(--e6); padding-top: var(--e4); }

/* ================================================================ CELULAR */
@media (max-width: 860px) {
  .menu, .topo-dir { display: none; }
  .menu-btn { display: block; }
  /* o menu aberto: lista simples e completa, sem gaveta animada. Gaveta que
     depende de JS e gaveta que trava a navegacao quando o JS falha. */
  .topo.aberto { flex-wrap: wrap; }
  .topo.aberto .menu {
    display: grid; width: 100%; gap: var(--e3); margin: var(--e4) 0 0;
    order: 3;
  }
  .topo.aberto .menu a { font-size: 1.125rem; font-family: var(--display); font-weight: 700; }
  .topo.aberto .topo-dir { display: flex; order: 4; width: 100%; margin-top: var(--e4); }

  .heroi { min-height: auto; padding-block: var(--e6) var(--e7); }
  .heroi h1 { max-width: none; }
  section { padding-block: var(--e7); }
}

/* ===================================== O ORÁCULO E O ENVIO DE CURRÍCULO
   =============================================================================
   ESTE BLOCO NASCEU DENTRO DO <style> DE index.html (13/08/2026) e mudou pra cá
   no mesmo dia, quando o formulário de currículo de candidatos.html passou a
   usar as mesmas classes. Estilo de componente que vive no <style> de UMA
   página é estilo que a segunda página não tem: o formulário foi escrito com
   .orac-entrada e .orac-campo e chegou na tela sem campo nenhum estilizado.

   São os MESMOS gestos, dos dois lados do balcão (a empresa manda a vaga, o dev
   manda o currículo), e dois sistemas de campo fariam a mesma tela parecer dois
   produtos.
   ============================================================================= */
/* ================================================== O ORÁCULO, A PARTE VIVA
   O herói tinha uma leitura de mentira: dicionário de tecnologias rodando no
   navegador, rotulado "zero rede". Bonito de ver e impossível de vender, porque
   a primeira vaga real colada por um cliente mostraria que nada saía da página.
   Desde 13/08 ele fala com POST /oraculo/vaga, e o que aparece aqui embaixo é o
   que o backend respondeu.

   NADA AQUI TEM COR PRÓPRIA. Todo valor sai de --acento, --texto e --linha, que
   é como o herói funciona no chão escuro e como esta mesma peça continuaria
   funcionando se um dia ela fosse parar no chão verde: sobre verde o acento
   vira preto sozinho. Componente que escreve hex é componente que só serve num
   chão. */
.vaga-arquivo {
  /* escondido do olho, VIVO pro teclado e pro leitor de tela: `display:none`
     tiraria o input da ordem de foco, e o <label class="gota"> viraria um botão
     que só o mouse alcança. */
  position: absolute; width: 1px; height: 1px;
  padding: 0; margin: -1px; overflow: hidden;
  clip-path: inset(50%); white-space: nowrap; border: 0;
}
.vaga-arquivo:focus-visible + #vaga-arquivo-nome,
.vaga-arquivo:focus-visible ~ .micro { outline: none; }
label.gota { cursor: pointer; }

.orac-perguntas {
  margin-top: var(--e4);
  display: grid; gap: var(--e4);
  padding-top: var(--e4);
  border-top: 1px solid var(--linha);
}
@media (min-width: 720px) { .orac-perguntas { grid-template-columns: 1fr 1fr; } }

.orac-campo { display: grid; gap: var(--e1); align-content: start; }
.orac-campo label { color: var(--texto-fraco); }

/* O CAMPO SEGUE O CAMPO DA VAGA: fio embaixo, sem caixa e sem raio. Caixa com
   borda arredondada em volta de cada input é o visual de formulário genérico, e
   o briefing chama isso pelo nome ("um dos tells de site gerado por IA"). */
.orac-entrada {
  font-family: var(--dado); font-size: var(--t-dado);
  color: var(--texto); background: transparent;
  border: 0; border-bottom: 2px solid var(--linha-forte);
  padding: .55rem .1rem; width: 100%;
  transition: border-color var(--transicao);
}
.orac-entrada:focus { border-bottom-color: var(--acento); outline-offset: 6px; }
/* O PLACEHOLDER TEM QUE PARECER PLACEHOLDER (13/08/2026).
   Ele estava em `--texto-fraco`, que no chao escuro e papel a 72%: na captura do
   formulario de curriculo o "SP" do estado e o "12.500" da pretensao liam como
   VALOR JA PREENCHIDO. Alguem passaria direto pelo campo achando que respondeu,
   e justo no campo que sustenta a promessa vendida do outro lado do balcao.
   Sugestao tem que ser visivelmente mais fraca que resposta. 38% ainda passa de
   4,5:1 sobre o chao escuro, entao continua legivel para quem precisa dela. */
.orac-entrada::placeholder {
  color: color-mix(in srgb, var(--texto) 38%, transparent);
  font-style: italic;
}
/* o <select> herda o fundo do chão, e no chão escuro a lista nativa vem branca
   com texto branco em alguns navegadores. Fixar o par resolve nos dois chãos. */
.orac-entrada option { background: var(--tinta); color: var(--papel); }

.orac-porque {
  color: var(--texto-fraco);
  max-width: 42ch; line-height: 1.5;
}

/* O RECADO. Um só, e ele fala o que vai acontecer, não "enviado com sucesso" --
   que informa o servidor e não a pessoa. */
.orac-recado {
  margin-top: var(--e3);
  font-family: var(--corpo); line-height: 1.6;
  max-width: var(--leitura);
  padding: var(--e3) var(--e4);
  border-left: 3px solid var(--acento);
  background: color-mix(in srgb, var(--texto) 7%, transparent);
}
.orac-recado--erro { border-left-color: var(--texto); }
.orac-recado--ok {
  border-left-color: var(--acento);
  background: color-mix(in srgb, var(--acento) 14%, transparent);
}

/* A TABELA DE PLANOS DENTRO DO RECADO (19/08/2026).
   Aparece quando a empresa bate no teto: ela acabou de escrever a segunda vaga,
   e e o instante em que ela mais quer a capacidade. Antes a resposta era
   "assine um plano" sem dizer quais -- mandar a pessoa procurar a tabela noutra
   pagina no meio disso e perder a venda por preguica de resposta. */
.orac-recado p { margin: 0; }
.orac-planos {
  width: 100%; border-collapse: collapse;
  margin: var(--e3) 0 var(--e2);
  font-size: 14px;
}
.orac-planos td { padding: 7px 0; border-bottom: 1px solid var(--linha); }
.orac-planos td:nth-child(2) { color: var(--texto-fraco); text-align: center; }
.orac-planos td:last-child { text-align: right; white-space: nowrap; }
.orac-plano--destaque td { font-weight: 600; }
.orac-assinar {
  display: inline-block; margin-top: var(--e2);
  font-size: 14px; color: var(--acento);
}

/* ------------------------------------------------------- 3. O RAZAO CONTABIL
   O componente e o canonico de secoes.css (.conta-tab / .conta-lin / .conta-rot /
   .conta-val / .conta-pontos / .total), o mesmo markup que parcelasHtml() escreve
   em app/web/v2/v2.js. Aqui nao ha copia: ha ESCALA.

   DESDE 14/08 ELE E A UNICA PECA GRANDE DA HOME. O grafico do ranking saiu daqui
   (a lista com regua mora em /empresas, e um dado tem um dono so), e o que ficou
   e a aritmetica: chao verde de largura total, parcela em 20px, parcela somada
   em 24px na direita, TOTAL em 64px de display, a soma escrita por extenso na
   propria linha do total, e a tese como TITULO da secao.

   REGRA Nº1 DA RODADA 4: aqui mora numero, entao NADA neste bloco nasce em
   opacity 0 e nada depende de scroll pra existir. As classes .sobe sairam da
   tabela e da linha do link. */
/* respiro: em secoes.css a tabela nao tem margem porque la ela vem dentro de
   .razao. Aqui ela e filha direta da secao. */
main .conta-tab { margin-top: var(--e5); }

/* A SECAO DA CONTA. Chao verde commitado por .sec-virada (secoes.css): --texto
   vira preto, --acento inverte pra tinta, e nenhuma letra verde encosta em
   claro. Este e o UNICO chao verde da pagina desde 13/08: #c-72h era o outro, e
   dois verdes de tela cheia dividiam a atencao que esta peca precisa inteira. */
.sec-razao h2 {
  /* ~40px no teto, contra os ate 60px de --t-h2: o titulo aqui e argumento, e o
     numero grande da secao tem que ser o TOTAL, nao a manchete. */
  font-size: clamp(1.625rem, 1.1rem + 2.1vw, 2.5rem);
  line-height: 1.12; max-width: 24ch;
}
.sec-razao .conta-tab {
  max-width: none;               /* largura total: e um extrato, nao um cartao */
  font-size: 1.25rem;            /* 20px: a parcela vira leitura, nao rodape */
  border-top-width: 3px;
}
.sec-razao .conta-lin { grid-template-columns: 11rem minmax(0, 1fr) 6rem; padding: var(--e4) 0; }
.sec-razao .conta-rot { font-size: .8125rem; }
.sec-razao .conta-val b { min-width: 9rem; }   /* "Porto Alegre" em 20px de mono */
/* OS SINAIS. 24px, alinhados a direita, um embaixo do outro: e a coluna que a
   pessoa soma, e tabular-nums (herdado de .conta-tab) mantem o digito na mesma
   casa. */
.sec-razao .conta-pontos { font-size: 1.5rem; }
/* O TOTAL. Display de 64px pra cima, e a terceira coluna vira `auto` porque 6rem
   nao cabem dois digitos de 64px -- coluna fixa aqui cortaria o numero. */
.sec-razao .conta-lin.total { grid-template-columns: 11rem minmax(0, 1fr) auto; align-items: center; }
.sec-razao .conta-lin.total .conta-pontos {
  font-family: var(--display); font-weight: 700;
  font-size: clamp(4rem, 8vw, 6rem); line-height: .9;
}
/* A SOMA POR EXTENSO, na linha do total. Ela nao e enfeite: e a unica linha que
   prova que o total nao foi digitado -- 48 + 22 + 12 + 10 = 92. */
.sec-razao .conta-lin.total .conta-val {
  color: var(--texto); font-size: 1.375rem; letter-spacing: .02em;
}
@media (max-width: 720px) {
  /* abaixo do ponto em que secoes.css empilha rotulo e valor, a escala volta pro
     tamanho do componente: 20px de mono em 342px de coluna quebra o detalhe em
     tres linhas, e conta que quebra em tres linhas deixa de ser conta. */
  .sec-razao .conta-tab { font-size: var(--t-corpo); }
  /* devolve o que secoes.css manda no celular: o <b> volta a correr com o
     detalhe. Sem esta linha o meu 9rem de escopo vencia o min-width: 0 dele. */
  .sec-razao .conta-val b { display: inline; min-width: 0; }
  .sec-razao .conta-lin,
  .sec-razao .conta-lin.total { grid-template-columns: minmax(0, 1fr) auto; }
  .sec-razao .conta-pontos { font-size: 1.25rem; }
  .sec-razao .conta-lin.total .conta-pontos { font-size: 3.5rem; }
  .sec-razao .conta-lin.total .conta-val { font-size: 1.125rem; }
}
/* A SAIDA PRA LISTA INTEIRA. Uma linha, e nao um cartao: o ranking com regua e de
   /empresas, e o que a home deve e o caminho ate ele. Fio em cima porque e nota
   de pe do razao, e nao um segundo bloco. */
.conta-saida {
  margin-top: var(--e5); padding-top: var(--e4);
  border-top: 1px solid var(--linha);
  font-family: var(--dado); font-size: var(--t-dado);
  color: var(--texto-fraco);
}
.conta-saida a { color: var(--texto); text-decoration: underline; text-underline-offset: .28em; }

/* ------------------------------------------------------------ 4. OS ITENS
   A LISTA QUE NAO SOMA NAO PODE PARECER O RAZAO. O que vem junto com a
   assinatura estava numa .conta-tab com "1", "2", "3" na coluna .conta-pontos, a
   mesma coluna que a secao de cima ensina a somar; secoes.css:209 proibe isso por
   escrito ("razao que nao soma e pior que razao nenhum").
   Entao aqui a coluna de numero simplesmente NAO EXISTE: rotulo na margem, texto
   ao lado, fio entre as linhas. Mesma gramatica de .conta-lin, sem a promessa de
   aritmetica. Nenhuma cor nova, nenhum raio, nenhum cartao com barra no topo. */
.itens {
  list-style: none; margin: var(--e5) 0 0; padding: 0;
  border-top: 2px solid var(--linha-forte);
}
.itens li {
  display: grid; gap: var(--e2);
  padding: var(--e4) 0; border-bottom: 1px solid var(--linha);
}
@media (min-width: 820px) {
  .itens li { grid-template-columns: 16ch minmax(0, 1fr); gap: var(--e5); align-items: baseline; }
}
.item-rot {
  font-family: var(--dado); font-size: var(--t-rot); letter-spacing: .08em;
  text-transform: uppercase; color: var(--texto-fraco);
}
.itens p { font-size: .9375rem; line-height: 1.6; color: var(--texto); }

/* ------------------------------------------------------------- 5. MIUDEZAS */
/* O CTA DO TOPO SOME NO TEMA ESCURO. .gota--tinta pinta o fundo com --tinta, e no
   escuro o cabecalho tambem e --tinta: o botao virava texto branco solto, sem
   gota nenhuma, no canto onde vive a unica acao paga da pagina. Vi na captura em
   prefers-color-scheme: dark.
   No escuro ele vira CAMPO verde com letra preta, que e a regra do briefing
   ("verde e campo, com o preto da marca em cima") e vence nos dois temas.
   ATUALIZADO EM 15/08/2026: o site passou a ser SEMPRE escuro (ordem do fundador,
   "deixe so preto"), e por isso a regra deixou de ser condicional. Ela vivia
   dentro de @media (prefers-color-scheme: dark) E de :root[data-theme="dark"];
   com o site fixo no escuro e o alternador removido, quem visitasse com o
   SISTEMA no claro nao casaria com nenhuma das duas e receberia de volta
   exatamente o defeito descrito acima -- botao preto sobre cabecalho preto, no
   canto da unica acao paga da pagina. */
.topo-dir .gota--tinta { --gota-fundo: var(--verde); --gota-texto: var(--sobre-verde); }
/* CONTRASTE DA LETRA MIUDA DO HEROI. secoes.css poe .heroi .micro em 50% de papel
   sobre a materia preta, o que da ~4,4:1 em 11px e reprova o AA de texto pequeno.
   Nesta dobra a letra miuda nao e enfeite: e o rotulo do campo, a oferta do teste
   (uma vaga gratis) e a linha que diz que nada sai do navegador.
   72% resolve (~8,6:1) sem mexer no CSS compartilhado, que e de outro agente. */
#c-hero .micro { color: color-mix(in srgb, var(--papel) 72%, transparent); }
/* SAIRAM DAQUI .pe-dado e .pe-tema, e as duas saidas sao da rodada 5:
   o rodape publicava banco.html DUAS vezes (a linha "Como medimos o banco" e o
   "De onde vem os devs" da coluna Produto, dois palmos a direita), e o alternador
   de tema virou parte do cabecalho canonico, a direita do CTA, igual nas cinco
   paginas. Nenhuma das duas classes tem mais um elemento nesta pagina. */
/* so respiro. NAO pode setar display: ela e usada junto de .acoes, que e flex, e
   um `display: block` aqui derrubaria o alinhamento do botao com a legenda. */
.rem { margin-top: var(--e4); }
/* a linha do botao na coluna do gesto: 4px a menos, pela mesma conta da dobra */
.dobra-faz .acoes.rem { margin-top: var(--e3); }


/* RITMO VERTICAL. base.css poe --e8 (112px) em cima e embaixo de cada <section>:
   entre dois blocos isso da 224px de nada, e a pagina lia como uma sequencia de
   telas vazias com texto no meio. --e7 nos dois lados fecha o vao em 128px, que e
   o teto de 160 que o gerente fixou. O heroi tem medida propria em secoes.css. */
main > section:not(.heroi) { padding-block: var(--e7); }
/* A FAIXA CREME DO FIM DA PAGINA. .pe traz margin-top: --e8 de secoes.css, e como
   a ultima secao E preta igual ao rodape, esses 112px apareciam como uma tira
   creme separando dois pretos. Zero aqui: o fim da pagina e continuo. */
.pe { margin-top: 0; }

/* RITMO ENTRE PARAGRAFOS. base.css zera a margem de <p>, e as secoes antigas
   empilhavam texto com um grid de gap (.heroi-leads). Como aqui os leads sao
   irmaos diretos, dois seguidos vinham COLADOS: no #c-72h os dois ultimos
   paragrafos e a tabela do razao liam como um bloco unico de sete linhas. Medido
   na captura de pagina inteira. */
main .lead + .lead { margin-top: var(--e4); }
main .conta-tab + .lead { margin-top: var(--e5); }
main .lead + .acoes { margin-top: var(--e5); }

/* ============================================== O MODAL DE ASSINATURA
   Criado por conta.js, no clique de "Assinar". Vive aqui e nao inline no JS
   porque cor de componente neste site sai de token: hex escrito na mao no
   script nao acompanha o sistema, e foi assim que um botao ficou preto sobre
   preto em duas telas publicadas.
   Sem `.plan-checkout` na pagina, nada disto e usado. */
#syl-checkout {
  position: fixed; inset: 0; z-index: 90;
  display: grid; place-items: center; padding: var(--e5);
}
#syl-checkout .ck-fundo {
  position: absolute; inset: 0;
  background: rgba(11, 11, 12, .78);
}
#syl-checkout .ck-caixa {
  position: relative;
  width: min(30rem, 100%);
  background: var(--papel-2);
  border: 1px solid var(--linha-forte);
  border-radius: var(--raio-g) var(--raio-p) var(--raio-g) var(--raio-g);
  padding: var(--e5);
  display: grid; gap: var(--e4);
}
#syl-checkout .ck-rot {
  margin: 0; font-family: var(--dado); font-size: var(--t-rot);
  letter-spacing: .08em; text-transform: uppercase; color: var(--texto-fraco);
}
#syl-checkout .ck-titulo { margin: 0; font-size: var(--t-h3); }
#syl-checkout .ck-preco {
  margin: 0; font-family: var(--dado); font-size: 1.25rem; color: var(--texto);
}
#syl-checkout .ck-aceite { display: flex; gap: .6rem; align-items: flex-start; }
/* 24px, e nao o ~13px nativo: e o alvo que decide se o botao habilita. Dedo que
   erra a caixa vira gente apertando "Pagar" desabilitado sem entender por que. */
#syl-checkout .ck-aceite input {
  margin-top: .15rem; flex: 0 0 auto;
  width: 24px; height: 24px; accent-color: var(--verde); cursor: pointer;
}
#syl-checkout .ck-aceite span { font-size: .9rem; color: var(--texto-fraco); line-height: 1.5; }
#syl-checkout .ck-acoes { display: flex; gap: var(--e3); justify-content: flex-end; flex-wrap: wrap; }
/* O AVISO DE ERRO E CLARO SOBRE ESCURO. Vermelho escuro aqui daria ~2,3:1 e a
   mensagem que explica por que o pagamento nao saiu seria a menos legivel da
   tela -- e o cliente concluiria que o site quebrou em vez de ler o motivo. */
#syl-checkout .aviso {
  margin: 0; padding: .7rem .85rem; border-radius: var(--raio-p);
  font-size: .9rem; line-height: 1.45;
  border: 1px solid #d9564a; color: #ffa79b; background: var(--fundo);
}

/* ==================================================== A VIRADA ENTRE SECOES
   POR QUE ISTO EXISTE (15/08/2026)

   Ordem do fundador, duas vezes: "faltou animacao ali nas paginas, saber essa
   mudanca de uma sessao pra outra que parece que uma sessao esta grudada na
   outra".

   Ele estava descrevendo um defeito de verdade, e a prova estava no markup:
   `<div class="divisor" aria-hidden="true"><i></i><i></i><i></i></div>` existe
   em plataforma.html e NAO TEM UMA LINHA DE CSS em lugar nenhum. A transicao
   foi desenhada, escrita no HTML de uma pagina, e nunca implementada -- tres
   elementos vazios, invisiveis, sem fazer nada.

   O QUE ESTA REGRA FAZ, e por que assim:

   A secao que chega entra com o CANTO DE CIMA CURVO e vai ASSENTANDO ate ficar
   reto conforme sobe na tela. O chao novo desliza por cima do anterior como
   massa, que e o mesmo idioma das manchas do heroi -- e nao um fio, um degrade
   ou um icone de seta, que sao os tres jeitos genericos de separar secao.

   NAO E ELEMENTO NOVO, e isso importa: a curva e do proprio <section>, entao
   nada e adicionado ao HTML de cinco paginas e nao ha o que ficar orfao no dia
   em que alguem reordenar as secoes. `+ section` garante que o heroi nunca
   recebe (ele nao tem antecessor pra cobrir).

   `overflow: hidden` ja existe nos chaos verdes; a curva clipa junto com ele.
   Por isso a curva e RASA (3rem) e so nos cantos de cima: curva funda comeria
   o canto do texto nas secoes que encostam o conteudo no topo.

   FORA DO @supports O SITE NAO PERDE NADA: sem animation-timeline a secao fica
   reta, que e exatamente o que ela era ontem. Movimento que so existe se o
   navegador aguenta -- nunca conteudo que so existe se o navegador aguenta. */
@supports (animation-timeline: view()) {
  @media (prefers-reduced-motion: no-preference) {
    main > section + section,
    body > section + section {
      /* ERA `linear`. Pedido do fundador (18/08/2026), duas vezes: "de sessao
         pra sessao fica tudo uma sessao", "da pra deixar um pouco divertido
         nessa parte de uma sessao pra outra". Linear fazia o ombro crescer no
         mesmo passo do scroll, sem sotaque nenhum -- a MESMA curva de ease-out
         que ja assina o resto do movimento do site (--transicao, o hover da
         gota) faz o ombro inchar rapido e assentar devagar, que e o "gesto de
         gota chegando" que a .gota ja usa no hover. So a curva mudou; range,
         propriedade e as duas paradas de seguranca abaixo continuam as mesmas. */
      animation: assenta cubic-bezier(.22, 1, .36, 1) both;
      animation-timeline: view();
      /* termina cedo (35%): a curva e um gesto de CHEGADA. Se ela durasse a
         secao inteira, viraria enfeite permanente em vez de transicao. */
      animation-range: entry 0% entry 35%;
    }
    @keyframes assenta {
      /* 18% e 22%, e NAO 44% e 56%. Na primeira versao os dois raios somavam
         100%: os arcos se encontravam no meio da largura e o topo da secao
         virava um BICO apontando pra baixo, com o chao anterior vazando por
         dentro dele. Fotografado em 390x844 antes de escrever esta linha.
         Somando menos de 100%, sobra topo reto no meio e o que se ve sao dois
         ombros -- uma placa deslizando por cima da anterior, que e o gesto. */
      from {
        border-start-start-radius: 18% 2.5rem;
        border-start-end-radius: 22% 2.5rem;
      }
      /* A PARADA NOVA (18/08/2026): o ombro incha um pouco ANTES de assentar,
         em vez de encolher direto -- o mesmo "a gota troca de canto, ela nao
         so encolhe" que ja regia o hover de .gota, agora na troca de secao.
         22+26=48% e 26+30=56%: as duas ainda longe dos 100% que fazem o bico
         de 15/08 (a soma tem que ficar sempre abaixo disso, em toda parada
         do keyframe, nao so na primeira e na ultima). */
      55% {
        border-start-start-radius: 22% 2.8rem;
        border-start-end-radius: 26% 2.8rem;
      }
      to {
        border-start-start-radius: 0 0;
        border-start-end-radius: 0 0;
      }
    }
  }
}

/* ===================================================== O SUBLINHADO QUE CRESCE
   Um dos "detalhes baratos" que o fundador pediu (18/08/2026). O menu ja tinha
   o dele (cresce do CENTRO, secoes.css:114) e o .ex ja tinha o dele (sublinhado
   grosso no hover); faltava o mesmo gesto nos links do rodape, que ate aqui so
   trocavam de cor. SO transform: a barra nasce com scaleX(0) e cresce da
   esquerda, sem mexer em left/right/width -- nada aqui pesa na maquina de 4GB
   e nada disto e scroll-driven, entao nem precisa do @supports de cima: se o
   navegador nao anima transition, o link continua um link, so sem o gesto. */
.pe-grid div > a { position: relative; }
.pe-grid div > a::after {
  content: "";
  position: absolute; left: 0; bottom: 0; width: 100%; height: 1px;
  background: currentColor;
  transform: scaleX(0); transform-origin: left;
  transition: transform var(--transicao);
}
.pe-grid div > a:hover::after { transform: scaleX(1); }
@media (prefers-reduced-motion: reduce) {
  .pe-grid div > a::after { transition: none; }
}

/* ============================================================ O CURSOR QUE PISCA
   O segundo detalhe barato (18/08/2026), no lugar de onde o oraculo do heroi
   morava ate 15/08 -- ideia dele foi "o cursor do oraculo piscando", e o
   oraculo saiu do heroi, mas o gesto cabe no fim da propria frase que vende:
   um traco fino, cor de marca, que pisca tres vezes depois que a ultima
   palavra assenta e some, como se a IA tivesse acabado de escrever a frase.
   Decorativo (aria-hidden) e FINITO: nao fica piscando pra sempre.
   FORA do @supports ele nasce SOLIDO (opacity herdada, sem regra nenhuma) --
   nunca opacity:0 fora do bloco, e por isso mesmo sem JS, sem scroll-timeline
   ou com reduced-motion o visitante ve so um tracinho parado ao lado do
   titulo, nunca nada faltando. */
.cursor-ia {
  display: inline-block;
  width: .07em; height: .72em;
  margin-left: .12em;
  background: var(--acento);
  vertical-align: -.05em;
}
@supports (animation-timeline: view()) {
  @media (prefers-reduced-motion: no-preference) {
    .cursor-ia {
      animation: cursor-pisca 2.4s ease-in-out both;
      /* liga so depois que a ultima palavra do h1 termina de entrar: dez
         palavras (--i:0 a --i:10) * 60ms de atraso + 640ms de entrada. */
      animation-delay: 1.28s;
    }
    @keyframes cursor-pisca {
      0%   { opacity: 0; }
      10%  { opacity: 1; }
      30%  { opacity: 0; }
      50%  { opacity: 1; }
      70%  { opacity: 0; }
      88%  { opacity: 1; }
      100% { opacity: 0; }
    }
  }
}
