/* ============================================================
   TRIVIX — landing "Funcionários Virtuais" (A Forja)
   Em cima do design system Prisma 120 (site.css). Aqui a marca
   sai da prancheta e vira FÁBRICA. Regra desta página: o
   movimento só existe quando ele EXPLICA alguma coisa (a ficha
   que enche, o trilho da estação que acende). Espectro só em
   evento. Nada pisca sozinho a não ser o sinal de "online".
   ============================================================ */

/* ------------------------------------------- a fonte do LCP
   A manchete é o elemento que o navegador mede como LCP e ela sozinha
   segurava a pintura: a Archivo variável tem 90KB e, no preload,
   roubava a banda do CSS que bloqueia a renderização. Aqui vai a MESMA
   Archivo instanciada em wght 730 / wdth 125 e recortada nas letras
   desta manchete: 1,8KB. Se o texto do H1 mudar, o caractere que faltar
   cai sozinho na Archivo completa (mesma instância, mesmas métricas) —
   não quebra, só volta a esperar o arquivo grande. Mudou a manchete?
   rode de novo o recorte antes de subir. */
@font-face {
  font-family: "Archivo Hero";
  src: url("/fonts/archivo-hero.woff2?v=1") format("woff2");
  font-weight: 730;
  font-stretch: 125%;
  font-style: normal;
  font-display: swap;
}
/* mesma ideia para a subcopy: no celular é ELA o maior bloco pintado (e
   portanto o LCP), e esperava os 57KB da Instrument inteira. 3,5KB. */
@font-face {
  font-family: "Instrument Hero";
  src: url("/fonts/instrument-hero.woff2?v=1") format("woff2");
  font-weight: 400;
  font-style: normal;
  font-display: swap;
}

/* ---------------------------------- as três fontes, sem o que sobra
   As webfonts do site vêm com os EIXOS INTEIROS: Archivo wght 100–900 +
   wdth 62–125 (90KB), Instrument wght 400–700 + wdth 75–100 (57KB),
   Spline wght 300–700 (36KB). 184KB no caminho crítico da primeira
   pintura para desenhar uma fatia estreita disso — auditado no DOM
   (tools/fontuse.mjs): esta página só pede Archivo em wght 650/700/730
   com wdth SEMPRE em 125, Instrument em 400–700 com wdth SEMPRE 100, e
   Spline em 400/500. O resto é delta de variação que nunca é lido.

   `tools/fv-fonts.py` re-instancia as três travadas nessas faixas (o
   eixo wdth some, virou constante) e tira hinting e nomes de glifo:
   184KB -> 67KB, com a MESMA cobertura de caracteres — o chat da ÍRIS
   renderiza texto livre, recortar por glifo da página o quebraria.

   O troca-troca é feito nos tokens de família, não redeclarando
   @font-face com o mesmo nome: assim as três faces gordas do site.css
   deixam de ser REFERENCIADAS nesta página e o navegador nem chega a
   pedi-las — sem depender de ordem de casamento de @font-face. */
@font-face {
  font-family: "Archivo FV";
  src: url("/fonts/archivo-fv.woff2?v=1") format("woff2");
  font-weight: 650 730;
  font-stretch: 125%;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: "Instrument FV";
  src: url("/fonts/instrument-fv.woff2?v=1") format("woff2");
  font-weight: 400 700;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: "Spline FV";
  src: url("/fonts/spline-fv.woff2?v=1") format("woff2");
  font-weight: 400 500;
  font-style: normal;
  font-display: swap;
}

/* --------------------------------------------- escala do técnico
   DUAS medidas de mono maiúsculo espaçado na página inteira, e só duas.
   Antes eram seis (9 / 10 / 10,5 / 11 / 11,5 / 12) fazendo o mesmo
   trabalho em tamanhos que ninguém distingue — ruído com cara de
   sistema. `a` é rótulo de seção, `b` é micro-etiqueta de peça. */
:root {
  --font-display: "Archivo FV", "Segoe UI", system-ui, sans-serif;
  --font-body: "Instrument FV", "Segoe UI", system-ui, sans-serif;
  --font-mono: "Spline FV", ui-monospace, "Cascadia Mono", monospace;

  --mono-a: 11.5px;
  --mono-b: 10px;
  --track-a: 0.26em;
  --track-b: 0.18em;
}

/* --------------------------------- caminhos com / sem JavaScript
   O <html class="js"> é ligado por um script inline no <head>.
   Sem ele, a entrevista some e o caminho por e-mail aparece — a
   página segue contatável com o JS desligado. */
html.js .so-sem-js { display: none !important; }
html:not(.js) .so-com-js { display: none !important; }

/* ------------------------------------------------------ hero
   A primeira dobra é DA primeira dobra: promessa, ação, o produto
   (a ÍRIS abrindo a entrevista de verdade) e UMA régua de fatos
   fechando embaixo. Nada mais entra aqui — o que era esteira e
   faixa de prova desceu para onde tem contexto. */
.fv-hero {
  position: relative;
  display: grid;
  align-content: center;
  min-height: min(100svh, 960px);
  padding: clamp(104px, 12.5vh, 144px) 0 clamp(60px, 8vh, 92px);
  overflow: clip;
  border-bottom: 1px solid var(--line);
}
#forge-gl {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  z-index: 0;
  background:
    radial-gradient(60% 50% at 50% 100%, rgba(46, 92, 255, 0.16), transparent 70%),
    radial-gradient(40% 45% at 80% 10%, rgba(124, 92, 255, 0.12), transparent 70%);
}
/* ---------------------------------------- a forja sem WebGL
   No celular, no tablet e em quem pediu menos movimento o shader não roda
   (ver forge.js: compilá-lo custava ~300ms de thread principal para um
   único quadro parado). A cena é a mesma, pintada com gradiente: colunas de
   luz frias, brasa no rodapé da fundição e o halo UV no alto. Custo de
   layout: zero — é só pintura, e ela já vale na PRIMEIRA tela, sem esperar
   JavaScript nenhum. */
@media (pointer: coarse), (max-width: 899px), (prefers-reduced-motion: reduce) {
  #forge-gl { background: var(--forja-css); }
}
.sem-forja #forge-gl { background: var(--forja-css); }
:root {
  --forja-css:
    radial-gradient(46% 30% at 50% 103%, rgba(47, 230, 200, 0.11), transparent 66%),
    radial-gradient(62% 52% at 50% 100%, rgba(46, 92, 255, 0.2), transparent 72%),
    radial-gradient(42% 46% at 82% 6%, rgba(124, 92, 255, 0.16), transparent 70%),
    repeating-linear-gradient(
      90deg,
      rgba(46, 92, 255, 0) 0px,
      rgba(90, 130, 255, 0.05) 38px,
      rgba(46, 92, 255, 0) 76px
    ),
    linear-gradient(180deg, rgba(124, 92, 255, 0.07), transparent 38%);
}
/* Placa de leitura: o terço de baixo do herói vira fundo chapado.
   Sem ela o texto técnico flutua sobre a parte mais clara do shader e
   o contraste vira sorteio por quadro da animação. */
.fv-hero::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  background: linear-gradient(
    to top,
    var(--bg) 0%,
    rgba(5, 8, 15, 0.94) 15%,
    rgba(5, 8, 15, 0.66) 33%,
    rgba(5, 8, 15, 0.24) 57%,
    transparent 78%
  );
}
.fv-hero-inner {
  position: relative;
  z-index: 1;
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 420px);
  column-gap: clamp(34px, 4.6vw, 68px);
  row-gap: 0;
  align-items: center;
}
/* A manchete era a peça mais tímida da página no celular: 32,8px contra
   uma subcopy de 16,2px — dois passos de escala onde a referência usa
   três. O piso sobe para 37px (cabe "funcionário", a palavra mais
   longa, até em 340px de tela) e a rampa vira vw+rem, senão em 768px o
   título ficava do mesmo tamanho que no celular. */
.fv-title {
  font-family: "Archivo Hero", var(--font-display);
  font-size: clamp(2.32rem, 4.6vw + 0.5rem, 3.6rem);
  font-weight: 730;
  line-height: 1.03;
  letter-spacing: -0.03em;
  margin: 0 0 20px;
  max-width: 19ch;
}
/* O --grad do sistema (UV -> #2e5cff -> menta) tem o cobalto puro no
   meio, e é justamente ali que ele vira TEXTO em cima do herói, onde o
   shader clareia o fundo: o miolo de "nunca dorme" cai para pouco mais
   de 3:1 no celular. Aqui — e só aqui, num texto de 33px+ — o stop do
   meio sobe para #4a72ff. Mesmo trajeto de matiz, mesma leitura de
   marca, ~1 ponto a mais de contraste no pior pixel. O token do sistema
   fica intacto: o degradê de superfície continua sendo o --grad. */
.fv-title .nunca {
  background: linear-gradient(135deg, #8f74ff, #4a72ff 48%, #46eed3);
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
}
.fv-sub {
  font-family: "Instrument Hero", var(--font-body);
  font-size: clamp(1.01rem, 1.28vw, 1.13rem);
  line-height: 1.6;
  color: var(--muted);
  max-width: 54ch;
  margin: 0 0 32px;
}
.fv-cta-row {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 14px;
}
/* o eyebrow entra na escala do técnico (era 12px/0.32em, o sexto tamanho) */
.fv-hero .eyebrow,
.sec-head .eyebrow,
.fecho .eyebrow {
  font-size: var(--mono-a);
  letter-spacing: var(--track-a);
  margin-bottom: 16px;
}

/* específicos do CTA principal: o anel usinado só no hover/foco */
.btn-forge {
  position: relative;
  font-size: 16px;
  padding: 17px 34px;
}
.btn-forge::after {
  content: "";
  position: absolute;
  inset: -6px;
  border: 1px solid rgba(47, 230, 200, 0.4);
  clip-path: polygon(0 0, calc(100% - 16px) 0, 100% 16px, 100% 100%, 0 100%);
  opacity: 0;
  transition: opacity 0.25s var(--ease-out);
  pointer-events: none;
}
.btn-forge:hover::after,
.btn-forge:focus-visible::after { opacity: 1; }

/* Régua de fatos: a ÚNICA faixa depois do CTA, com ar de sobra em cima
   (a folga é o segundo tempo da dobra) e marcas de medida na régua —
   o mesmo traço espectral que abre as etapas do processo. */
.fv-specs {
  grid-column: 1 / -1;
  list-style: none;
  /* 104px separavam a régua do resto do herói e ela lia como uma sexta
     seção solta no rodapé da dobra. Ela é o RODAPÉ DESTA dobra: encosta. */
  margin: clamp(58px, 5vw, 74px) 0 0;
  padding: 0;
  border-top: 1px solid var(--line);
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 22px 30px;
}
.fv-specs li {
  position: relative;
  display: grid;
  gap: 6px;
  padding-top: 20px;
}
.fv-specs li::before {
  content: "";
  position: absolute;
  top: -1px;
  left: 0;
  width: 24px;
  height: 2px;
  background: var(--mint);
  opacity: 0.6;
}
.fv-specs b {
  font-family: var(--font-display);
  font-stretch: 125%;
  font-variation-settings: "wdth" 125;
  font-weight: 700;
  font-size: 19px;
  line-height: 1.1;
  letter-spacing: -0.005em;
  color: var(--text);
}
.fv-specs span {
  font-family: var(--font-mono);
  font-size: var(--mono-b);
  letter-spacing: 0.16em;
  line-height: 1.5;
  text-transform: uppercase;
  color: var(--muted);
}

/* ------------------------------------- console da ÍRIS (o produto)
   O painel do herói NÃO é uma maquete: a frase é a abertura real da
   entrevista e o campo inicia a conversa de verdade. */
.console {
  position: relative;
  background: linear-gradient(178deg, rgba(17, 27, 49, 0.92) 0%, rgba(9, 15, 30, 0.94) 100%);
  border: 1px solid var(--line-strong);
  border-radius: 18px;
  box-shadow: 0 30px 72px rgba(2, 6, 18, 0.55);
  -webkit-backdrop-filter: blur(10px);
  backdrop-filter: blur(10px);
  overflow: hidden;
}
.console-top {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 14px 16px;
  border-bottom: 1px solid var(--line);
  background: rgba(5, 8, 15, 0.45);
}
.console-av {
  width: 36px;
  height: 36px;
  border-radius: 10px;
  display: grid;
  place-items: center;
  flex: none;
  background: radial-gradient(62% 62% at 50% 40%, rgba(46, 92, 255, 0.3), rgba(10, 16, 34, 0.9) 76%);
  border: 1px solid rgba(46, 92, 255, 0.38);
}
.console-av img { width: 22px; height: auto; }
.console-quem { flex: 1; min-width: 0; }
.console-quem b {
  display: block;
  font-family: var(--font-display);
  font-stretch: 125%;
  font-variation-settings: "wdth" 125;
  font-weight: 700;
  font-size: 14px;
  letter-spacing: 0.24em;
}
.console-quem small {
  display: block;
  font-family: var(--font-mono);
  font-size: var(--mono-b);
  letter-spacing: var(--track-b);
  text-transform: uppercase;
  color: var(--faint);
  margin-top: 3px;
}
.console-live {
  flex: none;
  font-family: var(--font-mono);
  font-size: var(--mono-b);
  letter-spacing: var(--track-b);
  text-transform: uppercase;
  color: var(--mint);
}
.console-live::before {
  content: "● ";
  animation: status-blink 2s ease infinite;
}
@keyframes status-blink { 50% { opacity: 0.2; } }

/* o crachá vira ficha de identificação — a metáfora fica, o espaço não */
.console-id {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 14px;
  margin: 0;
  padding: 12px 16px;
  border-bottom: 1px dashed var(--line-strong);
}
.console-id dt {
  font-family: var(--font-mono);
  font-size: var(--mono-b);
  letter-spacing: var(--track-b);
  text-transform: uppercase;
  color: var(--faint);
}
.console-id dd {
  margin: 3px 0 0;
  font-family: var(--font-mono);
  font-size: var(--mono-a);
  color: var(--text);
  white-space: nowrap;
}
.console-body {
  padding: 18px 16px 4px;
  min-height: 132px;
}
.console-bolha {
  margin: 0;
  background: rgba(46, 92, 255, 0.1);
  border: 1px solid rgba(46, 92, 255, 0.24);
  border-radius: 4px 14px 14px 14px;
  padding: 12px 15px;
  font-size: 14.4px;
  line-height: 1.58;
  min-height: 1.58em;
}
.console-bolha { position: relative; }
.console-bolha::after {
  content: "▌";
  color: var(--mint);
  opacity: 0;
}

/* ------------------------------ o texto que ainda não foi digitado
   Ele está no DOM desde o primeiro quadro para segurar a quebra de
   linha (ver o comentário da máquina de escrever em fv.js) — só não
   tem tinta. Continua no leitor de tela: a bolha é anunciada uma vez,
   inteira, em vez de uma vez por caractere. */
.por-vir { color: transparent; }
/* o cursor mora no COMEÇO do que falta, que é exatamente onde a pessoa
   está lendo. Absoluto de propósito: um cursor que ocupasse espaço
   empurraria o resto da frase a cada piscada. */
.escrevendo .por-vir::before {
  content: "▌";
  position: absolute;
  color: var(--mint);
  animation: status-blink 1s steps(1) infinite;
}
.console-form {
  display: flex;
  gap: 8px;
  padding: 14px 16px 8px;
}
.console-form input {
  flex: 1;
  min-width: 0;
  background: var(--bg);
  border: 1px solid var(--line-strong);
  border-radius: 10px;
  color: var(--text);
  font-family: var(--font-body);
  font-size: 14.5px;
  padding: 12px 14px;
  transition: border-color 0.2s ease, box-shadow 0.2s ease;
}
.console-form input::placeholder { color: var(--faint); }
.console-form input:focus {
  outline: none;
  border-color: var(--mint);
  box-shadow: 0 0 0 3px rgba(47, 230, 200, 0.12);
}
.console-pe {
  margin: 0;
  padding: 0 16px 15px;
  font-family: var(--font-mono);
  font-size: var(--mono-b);
  letter-spacing: 0.08em;
  color: var(--muted);
}

/* fallback sem JS (mesma casca do console) */
.fallback { padding: 26px 24px 28px; }
/* `.fallback p` mais abaixo tem a mesma especificidade e vinha depois:
   a etiqueta voltava a 14,6px e furava a escala de dois tamanhos */
.fallback .fallback-tag {
  font-family: var(--font-mono);
  font-size: var(--mono-a);
  letter-spacing: var(--track-a);
  text-transform: uppercase;
  color: var(--mint);
  margin: 0 0 12px;
}
.fallback-h {
  font-size: 1.16rem;
  font-weight: 650;
  margin-bottom: 10px;
}
.fallback p { color: var(--muted); font-size: 14.6px; margin: 0 0 16px; }
.fallback p:last-child { margin: 0; }

/* ------------------------------------------ banda de credencial
   (a esteira de cargos saiu: repetia o que a seção de encomendas já
   diz, com palavra cortada nas duas bordas e animação eterna) */
/* A banda não é uma folha, mas mora ENTRE duas — e as bordas chapadas
   dela liam como um corpo estranho no meio da página: em cima, uma régua
   reta onde toda outra emenda é costura usinada (a que apaga nas pontas);
   embaixo, a borda encostava a 0px da costura da folha seguinte e as duas
   viravam UM traço de 2px, o único da página. Agora a banda usa a mesma
   costura em cima e deixa a folha de baixo fechar com a dela. */
.banda-prova {
  position: relative;
  border-block: 0;
  background: rgba(13, 20, 36, 0.42);
  padding: 20px 0;
}
.banda-prova::before {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 1px;
  background: linear-gradient(90deg, transparent, var(--line-strong) 10%, var(--line-strong) 90%, transparent);
}
.banda-inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 14px 32px;
}
.banda-inner p {
  flex: 1 1 340px;
  min-width: 0;
  margin: 0;
  color: var(--muted);
  font-size: 14.8px;
}
.banda-inner b { color: var(--text); font-weight: 600; }
.banda-inner .mono { color: var(--text); font-size: 13.5px; }
.banda-link {
  font-family: var(--font-mono);
  font-size: var(--mono-b);
  letter-spacing: var(--track-b);
  text-transform: uppercase;
  color: var(--mint);
  white-space: nowrap;
}

/* ------------------------------- o pulso da costura, sem custo de layout
   O pulso espectral que percorre a emenda entre folhas anima `left` — que é
   propriedade de LAYOUT. São cinco folhas repetindo isso para sempre, a cada
   quadro, numa página de 10.000px: aparecia como Style & Layout eterno no
   perfil, mesmo com a pessoa parada. Aqui ele viaja em `transform`, que o
   compositor resolve sozinho (zero layout, zero repintura). Mesmo trajeto,
   mesma duração, mesmos atrasos escalonados — só o motor mudou.
   Escopo: esta página. O site.css é compartilhado e não foi tocado. */
.sheet::after {
  left: 0;
  animation-name: costura-gpu;
}
/* Os atrasos escalonados do site.css são a ORDEM DA HOME (caps -> prod ->
   proc -> contact, de 2,4s em 2,4s). Aqui a quarta folha é a `sheet-sobre`,
   que na home é a PRIMEIRA e por isso não tem atraso: o pulso da seção de
   perguntas disparava fora de fila (2,4 · 4,8 · 7,2 · 0 · 9,6) e duas
   costuras acendiam quase juntas. Reordena para a ordem DESTA página. */
.sheet-sobre::after { animation-delay: 9.6s; }
.sheet-contact::after { animation-delay: 0s; }
@keyframes costura-gpu {
  0% { transform: translateX(-14vw); opacity: 0; }
  5% { opacity: 1; }
  34% { transform: translateX(104vw); opacity: 1; }
  36% { transform: translateX(104vw); opacity: 0; }
  100% { transform: translateX(104vw); opacity: 0; }
}

/* o carimbo da folha também entra na escala (era o 10,5px solto) */
.sheet-tag {
  font-size: var(--mono-b);
  letter-spacing: var(--track-a);
}

/* ------------------------------------------- ritmo entre dobras
   O `.section` do site nasceu para a home, que tem quatro seções
   compridas: clamp(84px, 11vw, 140px) em cima E embaixo dá 280px de
   nada entre uma dobra e outra. Aqui são SEIS dobras e várias delas
   terminam curtas (o processo tem quatro colunas de três linhas) — o
   mesmo espaçamento vira buraco: o último parágrafo do processo e o
   próximo olho ficavam a 285px um do outro, sem nada no meio além do
   fundo. 96px de cada lado (192px de vão) mantêm a costura usinada
   entre folhas legível como respiro, não como falta de conteúdo.
   Escopo: esta página — fv.css só é carregado em /sobmedida. */
.section {
  padding: clamp(66px, 6.6vw, 96px) 0;
}
/* a primeira dobra depois do herói é a que mais precisa de fôlego:
   é onde a página muda de registro (promessa -> engenharia). */
#montagem {
  padding-top: clamp(78px, 7.6vw, 110px);
}

/* --------------------------------------- cabeçalho de seção
   Um padrão só, em todas as folhas: bloco de texto à esquerda,
   ficha técnica da seção à direita, régua de 1px fechando. */
.sec-head {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  gap: 40px;
  align-items: end;
  padding-bottom: 28px;
  border-bottom: 1px solid var(--line);
  margin-bottom: clamp(40px, 4.6vw, 62px);
}
.sec-head .lead { margin-top: 14px; }
.sec-meta {
  margin: 0;
  text-align: right;
  font-family: var(--font-mono);
  font-size: var(--mono-a);
  letter-spacing: var(--track-a);
  text-transform: uppercase;
  color: var(--faint);
  line-height: 1.7;
}
.sec-meta b {
  display: block;
  font-family: var(--font-display);
  font-stretch: 125%;
  font-variation-settings: "wdth" 125;
  font-weight: 700;
  font-size: 30px;
  line-height: 1;
  letter-spacing: 0.02em;
  color: var(--text);
  margin-bottom: 8px;
}
.sec-meta span { display: block; opacity: 0.65; }

/* -------------------------------------------- linha de montagem */
.linha {
  display: grid;
  grid-template-columns: minmax(0, 330px) minmax(0, 1fr);
  gap: clamp(30px, 5vw, 72px);
  align-items: start;
}
.ficha {
  position: sticky;
  top: 96px;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 18px;
  padding: 22px 22px 20px;
}
.ficha h3 {
  font-family: var(--font-mono);
  font-size: var(--mono-a);
  font-weight: 500;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--mint);
  margin-bottom: 16px;
  font-stretch: normal;
  font-variation-settings: normal;
  letter-spacing: 0.2em;
}
.ficha ul {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  gap: 8px;
}
.ficha li {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: center;
  gap: 2px 12px;
  padding: 10px 13px;
  background: rgba(5, 8, 15, 0.55);
  border: 1px solid var(--line);
  border-radius: 11px;
  transition: border-color 0.45s var(--ease-out), box-shadow 0.45s var(--ease-out);
}
.ficha li i {
  font-style: normal;
  font-size: 14px;
  font-weight: 600;
}
.ficha li em {
  grid-column: 1;
  font-style: normal;
  font-family: var(--font-mono);
  font-size: var(--mono-b);
  letter-spacing: 0.1em;
  color: var(--faint);
}
.ficha li .st {
  grid-column: 2;
  grid-row: 1 / span 2;
  font-family: var(--font-mono);
  font-size: var(--mono-b);
  letter-spacing: 0.12em;
  color: var(--faint);
  white-space: nowrap;
}
.ficha li.on {
  border-color: rgba(47, 230, 200, 0.4);
  box-shadow: 0 0 16px rgba(47, 230, 200, 0.07), inset 0 0 12px rgba(47, 230, 200, 0.04);
}
.ficha li.on .st { color: var(--mint); }
.ficha-progresso {
  margin-top: 18px;
  height: 4px;
  border-radius: 3px;
  background: rgba(234, 240, 255, 0.08);
  overflow: hidden;
}
.ficha-progresso i {
  display: block;
  height: 100%;
  width: 0%;
  background: var(--grad);
  transition: width 0.6s var(--ease-cnc);
}
.ficha-rodape {
  margin-top: 9px;
  display: flex;
  justify-content: space-between;
  font-family: var(--font-mono);
  font-size: var(--mono-b);
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--faint);
}

.estacoes {
  display: grid;
  gap: clamp(38px, 4.4vw, 72px);
}
.estacao {
  border-left: 1px solid var(--line-strong);
  padding: 2px 0 2px clamp(20px, 2.6vw, 32px);
  position: relative;
}
.estacao::before {
  content: "";
  position: absolute;
  left: -1px;
  top: 0;
  height: 0;
  width: 2px;
  background: var(--grad);
  transition: height 0.7s var(--ease-cnc);
}
.estacao.on::before { height: 100%; }
.estacao-num {
  display: block;
  font-family: var(--font-mono);
  font-size: var(--mono-a);
  letter-spacing: var(--track-a);
  text-transform: uppercase;
  color: var(--faint);
  margin-bottom: 12px;
}
.estacao-num i {
  font-style: normal;
  color: var(--mint);
}
.estacao-num i::before {
  content: "//";
  margin: 0 9px 0 7px;
  color: var(--faint);
  opacity: 0.6;
}
.estacao h3 {
  font-size: clamp(1.24rem, 2vw, 1.62rem);
  margin-bottom: 11px;
}
.estacao > p {
  color: var(--muted);
  max-width: 56ch;
  margin: 0;
  font-size: 15.4px;
}
.est-itens {
  list-style: none;
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin: 18px 0 0;
  padding: 0;
}
.est-itens li {
  font-family: var(--font-mono);
  font-size: var(--mono-b);
  letter-spacing: var(--track-b);
  text-transform: uppercase;
  color: var(--faint);
  border: 1px solid var(--line);
  border-radius: 999px;
  padding: 5px 12px;
  /* mesma curva e mesma duração do módulo da ficha: os dois acendem no
     MESMO instante (a estação entrou) e falavam com sotaques diferentes */
  transition: border-color 0.45s var(--ease-out), color 0.45s var(--ease-out);
}
.estacao.on .est-itens li {
  border-color: var(--line-strong);
  color: var(--muted);
}

/* --------------------------------------- ordens de serviço */
.grid-os {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 18px;
}
.os {
  position: relative;
  display: flex;
  flex-direction: column;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 16px;
  padding: 22px 22px 20px;
  overflow: hidden;
  /* o mesmo hover acendia a barra do topo em CNC (0,35s) e a moldura em
     `ease` (0,3s): duas curvas no mesmo gesto. Agora é um gesto só. */
  transition: border-color 0.35s var(--ease-cnc), background 0.35s var(--ease-cnc);
}
.os::after {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 2px;
  background: var(--grad);
  transform: scaleX(0);
  transform-origin: left;
  transition: transform 0.35s var(--ease-cnc);
}
.os:hover::after { transform: scaleX(1); }
.os:hover { border-color: var(--line-strong); background: var(--surface-2); }
/* ...e a regra acima nunca chegava a valer no cartão revelado. O
   `.js [data-reveal].is-settled` do site.css (0,3,0) devolve uma transição
   GENÉRICA depois do reveal — transform + border-color — e nela não existe
   `background`: no hover a barra do topo deslizava em 0,35s de CNC enquanto
   o fundo do cartão trocava de estalo, no mesmo gesto. Aqui a transição do
   hover é reafirmada com peso suficiente (0,4,0) e SÓ no estado assentado:
   durante o reveal quem manda continua sendo o site.css. */
.grid-os .os[data-reveal].is-settled {
  transition: border-color 0.35s var(--ease-cnc), background 0.35s var(--ease-cnc);
}
.os-head {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 12px;
  font-family: var(--font-mono);
  font-size: var(--mono-b);
  letter-spacing: var(--track-b);
  color: var(--faint);
  text-transform: uppercase;
  margin-bottom: 14px;
}
.os-head .ok { color: var(--mint); }
.os-head .pend { color: #a793ff; }
.os h3 { font-size: 1.14rem; margin-bottom: 9px; }
.os > p { color: var(--muted); font-size: 14.5px; margin: 0 0 16px; }
.os-dia {
  margin: 0 0 16px;
  padding-top: 13px;
  border-top: 1px dashed var(--line-strong);
}
.os-dia dt {
  font-family: var(--font-mono);
  font-size: var(--mono-b);
  letter-spacing: var(--track-b);
  text-transform: uppercase;
  color: var(--faint);
  margin-bottom: 6px;
}
.os-dia dd {
  margin: 0;
  font-family: var(--font-mono);
  font-size: var(--mono-a);
  line-height: 1.8;
  color: var(--muted);
}
.os .chips { margin: auto 0 0; }
.os .chips span { font-size: 11.5px; padding: 5px 11px; }
.os.os-cta {
  border-style: dashed;
  border-color: rgba(47, 230, 200, 0.34);
  background: rgba(47, 230, 200, 0.035);
}
.os.os-cta:hover { background: rgba(47, 230, 200, 0.06); border-color: rgba(47, 230, 200, 0.5); }
.os.os-cta .os-dia { border-top-color: rgba(47, 230, 200, 0.28); }
.os.os-cta .btn { align-self: flex-start; margin-top: auto; }

/* ------------------------------------------------- processo */
/* Quatro etapas em quatro colunas com 20px de gap: cada uma tinha o seu
   próprio traço de 1px em cima, e os quatro traços com furos no meio
   liam como quatro cartões avulsos, não como uma linha do tempo. Com o
   gap zerado (a calha virou padding-right) os traços se ENCOSTAM e
   viram UM trilho atravessando a dobra; o tique espectral de 46px marca
   onde cada etapa começa. Mesma informação, uma leitura só. */
.etapas {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  column-gap: 0;
  row-gap: 34px;
}
.etapa {
  position: relative;
  border-top: 1px solid var(--line-strong);
  padding: 24px 32px 0 0;
}
.etapa:last-child { padding-right: 0; }
.etapa::before {
  content: "";
  position: absolute;
  top: -1px;
  left: 0;
  width: 46px;
  height: 2px;
  background: var(--grad);
}
/* A quarta etapa é "contínuo" — o trilho não bate numa parede, ele some.
   O traço vira imagem de fundo em vez de borda para poder desbotar sem
   depender da cor exata do fundo da folha. */
.etapa:last-child {
  border-top-color: transparent;
  background-image: linear-gradient(to right, var(--line-strong) 58%, transparent);
  background-repeat: no-repeat;
  background-size: 100% 1px;
  background-position: 0 0;
  background-origin: border-box;
  background-clip: border-box;
}
.etapa-num {
  display: block;
  font-family: var(--font-mono);
  font-size: var(--mono-a);
  letter-spacing: var(--track-a);
  color: var(--faint);
}
.etapa-quando {
  font-family: var(--font-mono);
  font-size: var(--mono-b);
  letter-spacing: var(--track-b);
  text-transform: uppercase;
  color: var(--mint);
  margin: 6px 0 14px;
}
.etapa h3 { font-size: 1.06rem; margin-bottom: 10px; }
.etapa > p:last-child {
  color: var(--muted);
  font-size: 14.6px;
  margin: 0;
}

/* ------------------------------------------------- perguntas */
.faq-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 1px;
  background: var(--line-strong);
  border: 1px solid var(--line-strong);
  border-radius: 18px;
  overflow: hidden;
}
.faq {
  background: #0a1020;
  padding: 28px 26px 30px;
  transition: background 0.35s var(--ease-cnc); /* mesmo hover de cartão da .os */
}
.faq:hover { background: var(--surface-2); }
.faq h3 { font-size: 1.04rem; margin-bottom: 10px; }
.faq p { color: var(--muted); font-size: 14.5px; margin: 0; }

/* ---------------------------------------------------- fecho */
.fecho {
  max-width: 940px;
  margin-inline: auto;
  text-align: center;
}
.fecho .eyebrow { justify-content: center; }
.fecho-h {
  font-size: clamp(1.85rem, 3.8vw, 2.8rem);
  max-width: 780px;
  margin-inline: auto;
}
.fecho-lead { margin: 0 auto clamp(36px, 4vw, 52px); }
.vias {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 18px;
  text-align: left;
}
html:not(.js) .vias {
  grid-template-columns: minmax(0, 520px);
  justify-content: center;
}
.via {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 13px;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 18px;
  padding: 30px 28px 28px;
}
.via-a {
  border-color: rgba(47, 230, 200, 0.28);
  background: linear-gradient(180deg, rgba(47, 230, 200, 0.055), rgba(13, 20, 36, 0.92) 62%);
}
.via-tag {
  font-family: var(--font-mono);
  font-size: var(--mono-a);
  letter-spacing: var(--track-a);
  text-transform: uppercase;
  color: var(--faint);
  margin: 0;
}
.via-a .via-tag { color: var(--mint); }
.via h3 { font-size: 1.26rem; margin: 0; }
.via > p { color: var(--muted); font-size: 14.8px; margin: 0; }
.via .btn { margin-top: 5px; }
.via-pe {
  font-family: var(--font-mono);
  font-size: var(--mono-b);
  letter-spacing: 0.1em;
  color: var(--faint);
  margin: 0;
}

/* --------------------------------------- entrevista (overlay) */
.iris-overlay {
  position: fixed;
  inset: 0;
  z-index: 90;
  background: rgba(3, 5, 11, 0.92);
  -webkit-backdrop-filter: blur(10px);
  backdrop-filter: blur(10px);
  display: grid;
  place-items: center;
  padding: 18px;
  opacity: 0;
  pointer-events: none;
  /* o véu apaga na mesma curva com que a página revela conteúdo
     (opacidade = ease-out em todo o sistema); a caixa é que entra em CNC */
  transition: opacity 0.3s var(--ease-out);
}
.iris-overlay.aberta {
  opacity: 1;
  pointer-events: auto;
}
/* displays explícitos abaixo venceriam o [hidden] — reafirma */
.iris-caixa [hidden],
.iris-overlay[hidden] {
  display: none !important;
}
.iris-caixa {
  width: min(720px, 100%);
  height: min(84svh, 780px);
  display: flex;
  flex-direction: column;
  background: linear-gradient(175deg, #0b1224 0%, #070d1c 100%);
  border: 1px solid rgba(46, 92, 255, 0.25);
  border-radius: 22px;
  box-shadow: 0 40px 120px rgba(2, 5, 14, 0.8), 0 0 60px rgba(46, 92, 255, 0.08);
  overflow: hidden;
  transform: translateY(18px) scale(0.98);
  transition: transform 0.35s var(--ease-cnc);
}
.iris-overlay.aberta .iris-caixa { transform: none; }
.iris-topo {
  display: flex;
  align-items: center;
  gap: 14px;
  padding: 16px 20px;
  border-bottom: 1px solid var(--line);
  background: rgba(5, 8, 15, 0.5);
}
.iris-avatar {
  width: 42px;
  height: 42px;
  border-radius: 12px;
  display: grid;
  place-items: center;
  background: radial-gradient(60% 60% at 50% 40%, rgba(46, 92, 255, 0.3), rgba(10, 16, 34, 0.9) 75%);
  border: 1px solid rgba(46, 92, 255, 0.4);
}
.iris-avatar img { width: 26px; height: auto; }
.iris-quem { flex: 1; min-width: 0; }
.iris-quem b {
  font-family: var(--font-display);
  font-stretch: 125%;
  font-variation-settings: "wdth" 125;
  letter-spacing: 0.24em;
  font-size: 15px;
}
.iris-cargo {
  font-family: var(--font-mono);
  font-size: var(--mono-b);
  letter-spacing: var(--track-b);
  text-transform: uppercase;
  color: var(--faint);
  white-space: nowrap;
}
.iris-quem small {
  display: block;
  font-family: var(--font-mono);
  font-size: var(--mono-b);
  letter-spacing: var(--track-b);
  color: var(--mint);
  text-transform: uppercase;
  margin-top: 3px;
}
.iris-quem small::before {
  content: "● ";
  animation: status-blink 2s ease infinite;
}
.iris-fechar {
  background: none;
  border: 1px solid var(--line-strong);
  color: var(--muted);
  border-radius: 9px;
  width: 34px;
  height: 34px;
  /* <button> não herda fonte: o × saía em Arial, o único glifo da
     página fora das três famílias da casa. */
  font-family: var(--font-mono);
  font-size: 17px;
  line-height: 1;
  cursor: pointer;
  transition: color 0.2s ease, border-color 0.2s ease;
}
.iris-fechar:hover { color: var(--text); border-color: var(--mint); }

.iris-boot {
  flex: 1;
  display: grid;
  place-content: center;
  gap: 8px;
  font-family: var(--font-mono);
  font-size: 13px;
  color: var(--mint);
  padding: 30px;
}
.iris-boot div { opacity: 0; animation: boot-line 0.3s ease forwards; }
@keyframes boot-line { to { opacity: 1; } }

.iris-chat {
  flex: 1;
  overflow-y: auto;
  padding: 24px 22px 12px;
  display: flex;
  flex-direction: column;
  gap: 14px;
  scroll-behavior: smooth;
}
/* Conversa ancorada embaixo, como em qualquer aplicativo de mensagem:
   nas primeiras trocas a caixa tem 700px de altura e duas bolhas, e
   elas ficavam grudadas no teto com um vazio enorme até o campo de
   digitar. A margem automática empurra a pilha para baixo sem quebrar
   a rolagem quando a conversa cresce (o `justify-content: flex-end`
   quebra — o começo da conversa fica inalcançável). */
.iris-chat::before {
  content: "";
  margin-top: auto;
}
.msg {
  max-width: 86%;
  padding: 12px 16px;
  font-size: 15px;
  line-height: 1.6;
  white-space: pre-wrap;
  overflow-wrap: break-word;
}
.msg.iris {
  align-self: flex-start;
  background: rgba(46, 92, 255, 0.1);
  border: 1px solid rgba(46, 92, 255, 0.22);
  border-radius: 4px 16px 16px 16px;
}
.msg.lead {
  align-self: flex-end;
  background: var(--primary);
  color: #fff;
  border-radius: 16px 4px 16px 16px;
  clip-path: polygon(0 0, calc(100% - 12px) 0, 100% 12px, 100% 100%, 0 100%);
}
.msg.digitando {
  align-self: flex-start;
  color: var(--faint);
  font-family: var(--font-mono);
  font-size: var(--mono-a);
  background: none;
  border: none;
  padding: 4px 2px;
}
.msg.digitando i {
  display: inline-block;
  animation: status-blink 1.2s ease infinite;
  font-style: normal;
}
.msg.digitando i:nth-child(2) { animation-delay: 0.2s; }
.msg.digitando i:nth-child(3) { animation-delay: 0.4s; }

.iris-input {
  display: flex;
  gap: 10px;
  padding: 14px 16px 16px;
  border-top: 1px solid var(--line);
  background: rgba(5, 8, 15, 0.5);
}
.iris-input textarea {
  flex: 1;
  resize: none;
  background: var(--bg);
  border: 1px solid var(--line-strong);
  border-radius: 12px;
  color: var(--text);
  font-family: var(--font-body);
  font-size: 15px;
  padding: 12px 14px;
  max-height: 120px;
}
.iris-input textarea:focus {
  outline: none;
  border-color: var(--mint);
  box-shadow: 0 0 0 3px rgba(47, 230, 200, 0.12);
}
.iris-input button { align-self: flex-end; }

.iris-fim {
  flex: 1;
  display: grid;
  place-content: center;
  text-align: center;
  gap: 14px;
  padding: 30px;
}
.iris-fim .proto {
  font-family: var(--font-mono);
  font-size: clamp(1.8rem, 5vw, 2.6rem);
  letter-spacing: 0.14em;
  background: var(--grad);
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
}
.iris-fim h3 { font-size: 1.4rem; }
.iris-fim p { color: var(--muted); max-width: 40ch; margin: 0 auto; }

/* --------------------------------------------------- responsivo */
@media (max-width: 1160px) {
  .grid-os { grid-template-columns: repeat(2, 1fr); }
  .faq-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 1020px) {
  .fv-hero { min-height: 0; padding: clamp(96px, 12vh, 126px) 0 clamp(56px, 7vh, 76px); }
  .fv-hero-inner { grid-template-columns: 1fr; row-gap: 38px; }
  .fv-title { max-width: 26ch; }
  .console { max-width: 560px; }
  .fv-specs { grid-template-columns: repeat(2, minmax(0, 1fr)); margin-top: clamp(48px, 6vw, 64px); }
  .linha { grid-template-columns: 1fr; gap: 34px; }
  .ficha { position: static; }
  /* com 2 (ou 1) colunas o trilho contínuo perde o sentido — quebraria
     no fim de cada linha. Volta o traço por etapa, com calha de verdade. */
  .etapas { grid-template-columns: repeat(2, 1fr); column-gap: 26px; row-gap: 34px; }
  .etapa { padding-right: 0; }
  .etapa:last-child {
    border-top-color: var(--line-strong);
    background-image: none;
  }
}
@media (max-width: 860px) {
  .sec-head { grid-template-columns: 1fr; gap: 0; }
  .sec-meta { display: none; }
}
@media (max-width: 680px) {
  .grid-os,
  .faq-grid,
  .etapas,
  .vias { grid-template-columns: 1fr; }
  .console { max-width: none; }
  /* três campos em duas colunas deixavam a "Unidade" sozinha numa
     segunda linha com uma célula vazia do lado — buraco no crachá.
     Em linha flexível eles se dimensionam pelo conteúdo e cabem os
     três; se a tela for estreita demais, quebra sem vão morto. */
  .console-id { display: flex; flex-wrap: wrap; gap: 10px 20px; }
  .console-id > div { flex: 0 1 auto; }
  .fv-cta-row { gap: 12px; }
  .fv-cta-row .btn { width: 100%; }
  /* sem trava de medida no celular: a coluna já é estreita e o 17ch
     quebrava a manchete em cinco linhas com "um" sozinho numa delas */
  .fv-title { max-width: none; }
  .fv-specs { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 18px 20px; }
  .fv-specs b { font-size: 17px; }
  /* Em duas colunas, duas das quatro legendas quebram em 2 linhas e as
     outras duas não — e QUAIS quebram depende da métrica da fonte. Com
     font-display:swap isso vira reflow: medido, a régua crescia 15px na
     troca e empurrava a página inteira (era o grosso do CLS da dobra).
     Reservando as 2 linhas, a troca de fonte não move mais nada. */
  .fv-specs span { min-height: 3em; }
  .banda-inner { gap: 10px; }
  .msg { max-width: 94%; }
  .iris-caixa { height: 100svh; border-radius: 0; }
  .iris-cargo { display: none; }
  .iris-overlay { padding: 0; }
  .faq-grid { border-radius: 14px; }
  .faq { padding: 24px 20px 26px; }
}

@media (prefers-reduced-motion: reduce) {
  .btn-forge::after { transition: none; }
  .escrevendo .por-vir::before { animation: none; }
}

/* modo captura (?shot) — o harness rola rápido demais para o
   scroll-behavior:smooth do site.css, então os reveals nunca disparavam
   e a página saía "vazia" nas provas. Aqui tudo já nasce revelado. */
.shotmode [data-reveal] { opacity: 1 !important; transform: none !important; }
.shotmode .estacao::before { height: 100%; }

/* Captura de página inteira: o navegador estica a janela para a altura toda do
   documento e os reveals presos ao IntersectionObserver não disparam — metade
   da página saía EM BRANCO nas provas, sem que a página tivesse defeito.
   Nenhuma janela de gente tem 2000px de altura; a captura tem. */
@media (min-height: 2000px) {
  [data-reveal] { opacity: 1 !important; transform: none !important; }
  .estacao::before { height: 100%; }
}
