/* ==========================================================================
   DIAGNÓSTICO DE PERFIL — prefixo perf-
   Cinco perguntas, uma por vez, em corpo de manifesto. O enunciado é a peça
   gráfica; as respostas são linhas grandes com número, texto e um filete que
   acende. Sem cartão, sem caixa, sem imagem.

   Tokens usados:
     --accent           filete aceso, resposta marcada, número da marcada
     --display          face do enunciado (via .display-xl) e dos valores
     --sans             face das respostas e do texto de apoio
     --ease --dur       curva e tempo do projeto
     --fg --fg-2        tinta do enunciado e das respostas
     --fg-muted         números, contador, ressalva
     --rule --rule-2    filete em repouso e divisória do resultado
     --sec-gap          respiro derivado, nunca clamp solto
     --radius-pill      só via .btn do core

   A REGRA QUE ORGANIZA O ARQUIVO: nada aqui esconde passo nenhum. Quem
   esconde é o script, com [hidden]. Sem JavaScript o CSS entrega as cinco
   perguntas empilhadas, e é isso que se quer.
   ========================================================================== */

.perf{
  /* Corpo do enunciado. Como no manifesto, o que se persegue é a FRAÇÃO da
     coluna que a pergunta ocupa (~3 linhas de 15ch), não o número: trocar a
     --display do tema por uma condensada pede corpo maior. */
  --perf-perg:clamp(30px,4.4vw,58px);
  --display-xl:var(--perf-perg);
  /* .95 é o padrão da primitiva, para título de uma ou duas palavras. Aqui
     são frases de três linhas com descendente ("q" de "quanto", "g" de
     "algo"): abaixo de 1.02 elas encostam na linha seguinte. */
  --display-xl-lh:1.02;

  /* Corpo da resposta. Grande de propósito — a lista é o desenho, não um
     formulário. Fica em --sans (peso leve) contra a display peso 700 do
     enunciado: é esse contraste que separa pergunta de resposta sem
     precisar de caixa, régua ou cartão. */
  --perf-op-fs:clamp(17px,1.9vw,25px);

  /* Coluna do número da resposta. Em em para acompanhar o corpo. */
  --perf-op-num-col:3.2em;

  /* Altura mínima do palco. As perguntas têm 3 ou 4 respostas e enunciados de
     1 a 4 linhas: sem piso, a dobra encolhe e cresce a cada troca e a página
     inteira dança sob quem está lendo. Medido a 1440x900 no tema
     liberta-wealth: o passo mais baixo dá 330px e o mais alto 479px — 149px
     de solavanco a cada avanço.

     Quem preenche --perf-palco-medido é o SCRIPT, que mede os cinco passos e
     escreve o maior. Um clamp fixo aqui erraria em metade das larguras: a
     altura do passo depende de quantas linhas a pergunta quebra, e isso muda
     com o corpo da letra, com a face do tema e com a tradução do texto. O
     clamp abaixo é só o piso de partida, válido no quadro entre a carga e a
     primeira medida. */
  --perf-palco-medido:clamp(300px,46vh,470px);
  --perf-palco-min:var(--perf-palco-medido);

  /* Saída do passo que sai. O script lê o MESMO número (SAIDA em script.js):
     mudar aqui pede mudar lá, senão o passo some antes ou depois da hora. */
  --perf-saida:.26s;

  /* Atraso entre palavras do enunciado que entra. 42ms x ~9 palavras = ~.38s
     de escalonamento, que é quanto dura a leitura da primeira palavra. */
  --perf-w-passo:42ms;

  /* Respiro entre a barra de passos e o enunciado. Mora no PASSO, e não no
     palco, porque é a altura do passo que o script mede para calcular o
     piso — padding no palco ficaria de fora da conta e o piso sairia curto
     pela exata medida deste respiro. */
  --perf-topo:clamp(28px,4vh,52px);

  /* Largura de leitura do parágrafo do resultado. */
  --perf-leitura-max:56ch;
}

/* ==========================================================================
   CABEÇALHO
   ========================================================================== */

.perf-convite{margin-top:16px}
.perf-apoio{max-width:52ch}

/* O painel inteiro é um bloco de reveal do core. O respiro que o separa do
   cabeçalho sai de --sec-gap, como o resto do ritmo vertical. */
.perf-painel{margin-top:calc(var(--sec-gap) * .34)}

/* ==========================================================================
   BARRA DE PASSOS
   Decorativa: [aria-hidden] no contador e a informação de verdade na região
   aria-live. Nasce [hidden] no markup e é o script que a mostra.
   ========================================================================== */

/* [hidden] vem da folha do navegador com especificidade (0,1,0). Toda regra
   de display por classe abaixo o venceria e mostraria o que devia sumir —
   a mesma pegadinha que o .hgal-nav[hidden] da galeria em scroll horizontal
   documenta. Uma regra só, no topo, cobre o componente inteiro. */
.perf [hidden]{display:none}

.perf-barra{
  display:flex;align-items:center;justify-content:space-between;gap:16px;
  padding-bottom:18px;
  border-bottom:1px solid var(--rule);
}

.perf-contador{
  font-family:var(--sans);font-size:11.5px;letter-spacing:.18em;
  text-transform:uppercase;color:var(--fg-muted);
}
/* O número corrente acende; o total fica apagado. É o único lugar da peça
   com progresso, e ele é texto — barra que enche viraria gamificação, que é
   o registro errado para uma assessoria. */
.perf-atual{color:var(--accent)}

/* "Voltar" nunca é disabled: no primeiro passo ele simplesmente não existe.
   Botão apagado que não faz nada é pior que botão ausente. */
.perf-voltar{
  font-family:var(--sans);font-size:11.5px;letter-spacing:.18em;
  text-transform:uppercase;color:var(--fg-muted);
  background:none;border:0;padding:0;
  transition:color .3s var(--ease);
}
.perf-voltar:hover{color:var(--accent)}

/* A região aria-live (.perf-anuncio) não tem regra própria: ela leva a
   primitiva .visually-hidden do core, que existe exatamente para isto —
   texto que o leitor de tela recebe e o olho não vê, com clip-path em vez de
   display:none, porque display:none e visibility:hidden tiram o elemento da
   árvore de acessibilidade e o anúncio nunca sairia. Recopiar as seis linhas
   aqui seria a cópia que o §6 do contrato manda promover. */

/* ==========================================================================
   PALCO
   ========================================================================== */

.perf-palco{
  position:relative;
  min-height:var(--perf-palco-min);
}

/* fieldset traz border, padding e margin da folha do navegador, e um
   min-inline-size:min-content que estoura a coluna em tela estreita quando
   uma resposta longa não quebra. Os quatro zeros são obrigatórios. */
.perf-passo{border:0;margin:0;padding:var(--perf-topo) 0 0;min-inline-size:0}

/* legend é o enunciado, e recebe o foco na troca de passo (tabindex="-1" no
   markup). Sem display:block ela é tratada como caixa especial da borda do
   fieldset e se recusa a virar bloco de largura cheia.

   width:fit-content não é capricho: é o que faz o anel de foco do core
   abraçar a PERGUNTA. Em largura cheia o anel saía com os 1096px da coluna
   em volta de um texto de 660px — quem chega de teclado via um retângulo
   solto, não o enunciado marcado. */
.perf-legenda{display:block;float:none;width:fit-content;max-width:100%;padding:0;margin:0}

/* A medida da pergunta em em, e não em ch nem px: presa ao corpo da letra,
   ela desenha SEMPRE as mesmas ~3 linhas, com qualquer display do tema e em
   qualquer largura de tela. Em ch a conta sairia errada — ch lê o corpo do
   elemento, e a medida que importa é a da mancha. */
.perf-pergunta{display:block;max-width:11.5em}

/* -------------------------------------------------------------- respostas */

/* font-size aqui, e não só nas respostas: é ele que faz o max-width em em
   valer o corpo da RESPOSTA. Sem isso a medida sairia calculada no corpo do
   texto herdado (17px) e a lista ficaria com pouco mais da metade da
   largura pretendida — medido: 385px onde se queria 625px. */
.perf-ops{
  margin-top:clamp(26px,4vh,46px);
  font-size:var(--perf-op-fs);
  max-width:25em;
}

/* A resposta inteira é o <label>. O <input> real está por baixo, esticado
   sobre a linha toda — ver .perf-radio. */
.perf-op{
  position:relative;display:grid;
  grid-template-columns:var(--perf-op-num-col) 1fr;
  align-items:baseline;
  padding-block:clamp(13px,1.5vh,19px);
}

/* O RADIO É DE VERDADE, e cobre a linha inteira em vez de ficar escondido
   num canto de 1px. Duas coisas dependem disso:
     1. o :focus-visible que o core desenha cai exatamente em volta da
        resposta — não num quadradinho perdido no canto;
     2. o clique em qualquer ponto da linha chega ao input, sem depender do
        for/id (que se repetiria se o componente aparecesse duas vezes).
   appearance:none, e não opacity:0: com opacity:0 o outline do foco some
   junto com o widget, e quem navega por teclado fica sem indicador. */
.perf-radio{
  -webkit-appearance:none;appearance:none;
  position:absolute;inset:0;width:100%;height:100%;
  margin:0;padding:0;border:0;background:none;
  cursor:pointer;
}

.perf-op-num{
  font-family:var(--sans);font-size:11.5px;letter-spacing:.18em;
  color:var(--fg-muted);
  transition:color .3s var(--ease);
}

.perf-op-txt{
  font-family:var(--sans);
  font-size:1em;line-height:1.26;letter-spacing:.005em;
  color:var(--fg-2);
  transition:color .3s var(--ease);
}

/* O filete. Fica numa caixa própria, esticada sobre a linha, porque o efeito
   precisa de dois traços sobrepostos: o de repouso em --rule e o aceso em
   --accent, que cresce da esquerda. pointer-events:none para não roubar o
   clique do input que está por baixo. */
.perf-op-marca{
  position:absolute;inset:0;pointer-events:none;
  border-bottom:1px solid var(--rule);
}
.perf-op-marca::after{
  content:"";position:absolute;left:0;right:0;bottom:-1px;height:1px;
  background:var(--accent);
  transform:scaleX(0);transform-origin:left;
  transition:transform .42s var(--ease);
}

.perf-op:hover .perf-op-marca::after{transform:scaleX(1)}
.perf-op:hover .perf-op-txt{color:var(--fg)}
.perf-op:hover .perf-op-num{color:var(--fg-2)}

/* Marcada. É o único estado com cor de marca no texto, e ele dura pouco: o
   avanço automático leva embora a pergunta 380ms depois. Esses 380ms existem
   justamente para esta linha aparecer. */
.perf-radio:checked ~ .perf-op-marca::after{transform:scaleX(1)}
.perf-radio:checked ~ .perf-op-txt{color:var(--accent)}
.perf-radio:checked ~ .perf-op-num{color:var(--accent)}

/* O filete cresce; em movimento reduzido ele acende. Colado à regra que
   desliga, como manda o §6.5 do contrato. */
@media(prefers-reduced-motion:reduce){
  .perf-op-marca::after{transition-duration:0s}
}

/* ==========================================================================
   A TROCA DE PERGUNTA — o movimento da peça
   Só existe com script: as regras estão todas sob .perf.is-live, classe que
   o script põe na seção ao iniciar. Sem ela o CSS não esconde nada e as
   cinco perguntas ficam empilhadas.
   ========================================================================== */

/* Sai com blur e subida. */
.perf.is-live .perf-passo.is-out,
.perf.is-live .perf-resultado.is-out{
  opacity:0;filter:blur(12px);transform:translateY(-22px);
  transition:opacity var(--perf-saida) var(--ease),
             filter var(--perf-saida) var(--ease),
             transform var(--perf-saida) var(--ease);
}

/* Entra palavra a palavra. O script fatia o enunciado em .perf-w e escreve
   --perf-i (o índice) no style de cada palavra — é o mesmo recurso do
   --frase-cor do conteudo/manifesto-com-imagens: o que varia por item mora
   no item, não numa cadeia de :nth-child que se desalinha quando o texto
   muda. */
.perf.is-live .perf-w{
  display:inline-block;
  opacity:0;filter:blur(12px);transform:translateY(.34em);
  transition:opacity .62s var(--ease),
             filter .62s var(--ease),
             transform .62s var(--ease);
  transition-delay:calc(var(--perf-i,0) * var(--perf-w-passo));
}
.perf.is-live .perf-passo.is-in .perf-w{opacity:1;filter:blur(0);transform:none}

/* As respostas entram como bloco, logo atrás da última palavra. */
.perf.is-live .perf-ops{
  opacity:0;filter:blur(10px);transform:translateY(16px);
  transition:opacity .7s var(--ease),
             filter .7s var(--ease),
             transform .7s var(--ease);
  transition-delay:.16s;
}
.perf.is-live .perf-passo.is-in .perf-ops{opacity:1;filter:blur(0);transform:none}

/* Movimento reduzido: a pergunta troca, mas não anda. O script já pula a
   saída animada; o que sobra é o estado inicial das palavras e da lista, que
   sem esta regra deixaria a pergunta invisível para sempre. */
@media(prefers-reduced-motion:reduce){
  .perf.is-live .perf-w,
  .perf.is-live .perf-ops{
    opacity:1;filter:none;transform:none;transition:none;
  }
}

/* ==========================================================================
   AÇÕES
   O botão nasce disabled e só libera quando o passo está respondido. Ele
   existe SEMPRE, e não só em movimento reduzido: o avanço automático é
   cortesia para quem clica, nunca a única saída. Ver o gotcha da ficha.
   ========================================================================== */

.perf-acoes{margin-top:clamp(30px,4.5vh,52px)}

.perf .btn:disabled{
  opacity:.34;cursor:default;
  background:none;color:var(--fg-muted);border-color:var(--rule);
}
.perf .btn:disabled:hover{
  background:none;color:var(--fg-muted);border-color:var(--rule);
  backdrop-filter:none;-webkit-backdrop-filter:none;
}

/* ==========================================================================
   RESULTADO
   ========================================================================== */

.perf-resultado{padding-top:var(--perf-topo)}

.perf-rotulo{
  font-family:var(--sans);font-size:11.5px;letter-spacing:.18em;
  text-transform:uppercase;color:var(--fg-muted);
}

/* Mesma conta do .perf-legenda: sem fit-content o anel de foco do resultado
   sai com a largura da coluna em volta de uma palavra só. */
.perf-nome{margin-top:10px;width:fit-content;max-width:100%}

.perf-leitura{
  margin-top:clamp(20px,2.6vh,30px);
  max-width:var(--perf-leitura-max);
  font-size:var(--fs-body);line-height:1.62;color:var(--fg-2);
}

.perf-tracos{
  margin-top:clamp(22px,3vh,34px);
  max-width:var(--perf-leitura-max);
}
.perf-traco{
  padding-block:11px;
  border-top:1px solid var(--rule);
  font-size:var(--fs-body);color:var(--fg-2);
}

/* A faixa de alocação. FAIXA, e não número cravado: um "62%" leria como
   recomendação de carteira, que é exatamente o que esta peça não pode ser.
   O desenho ecoa a lista de respostas — mesma régua, mesmo filete — para o
   resultado parecer a continuação da conversa, e não outra seção. */
.perf-faixa{
  margin-top:clamp(28px,3.6vh,42px);
  max-width:var(--perf-leitura-max);
  padding-top:20px;
  border-top:1px solid var(--rule-2);
}
.perf-faixa-tit{
  font-family:var(--sans);font-size:11.5px;letter-spacing:.18em;
  text-transform:uppercase;color:var(--fg-muted);
}
.perf-faixa-lista{margin-top:12px}
.perf-faixa-item{
  display:flex;align-items:baseline;justify-content:space-between;gap:20px;
  padding-block:12px;
  border-bottom:1px solid var(--rule);
}
.perf-faixa-classe{font-size:var(--fs-body);color:var(--fg-2)}
.perf-faixa-valor{
  font-family:var(--display);font-weight:700;
  font-size:clamp(17px,1.6vw,21px);letter-spacing:-.01em;
  color:var(--accent);
  white-space:nowrap;
}

/* A ressalva de compliance. Fica no passo do resultado, onde a pessoa lê o
   número — não em letra miúda no rodapé da página. */
/* Tipografia pela primitiva .nota do core; aqui só a posição e a medida — 64ch
   alinha a ressalva com a coluna de leitura do resultado. */
.perf-nota{
  margin-top:clamp(24px,3vh,34px);
  --nota-max:64ch;
}

.perf-fim{
  margin-top:clamp(26px,3.4vh,38px);
  display:flex;flex-wrap:wrap;gap:14px;
}

/* ==========================================================================
   SEM JAVASCRIPT
   Bloco visível por padrão; o script o esconde na inicialização. Nada aqui
   depende de @media nem de :has — o estado honesto é o estado de partida.
   ========================================================================== */

.perf-sem-js{
  margin-top:clamp(30px,4.5vh,52px);
  display:flex;flex-direction:column;align-items:flex-start;gap:20px;
}

/* ==========================================================================
   MOBILE
   ========================================================================== */

@media(max-width:900px){
  /* A pergunta abre a medida porque o corpo encolheu: 11.5em de um clamp que
     já bateu no piso desenhariam sete linhas curtas em vez de três largas. */
  .perf-pergunta{max-width:13em}
  /* Medido a 820px: sem este teto a lista ia aos 723px da coluna cheia contra
     uma pergunta de 469px, e a resposta ficava mais larga que o enunciado —
     o desenho da peça se inverte. */
  .perf-ops{max-width:31em}
}

@media(max-width:560px){
  .perf{
    --perf-op-num-col:2.6em;
    /* Em coluna estreita a resposta longa ocupa duas ou três linhas, e o
       escalonamento de 42ms por palavra vira espera visível numa pergunta de
       nove palavras. */
    --perf-w-passo:32ms;
    /* Sem piso no celular, e de propósito. O piso existe para a página não
       dançar sob quem lê quando a dobra ocupa meia tela; aqui a pergunta já
       ocupa a tela inteira e o piso só abriria um vão morto embaixo da
       resposta mais curta. Escrever --perf-palco-min (e não
       --perf-palco-medido) é o que faz esta regra vencer a medida que o
       script põe no style da seção. */
    --perf-palco-min:auto;
  }
  .perf-pergunta{max-width:none}
  .perf-fim .btn,
  .perf-sem-js .btn{width:100%}
}
