Seção de conversão em duas colunas sobre foto esmaecida. À esquerda, o argumento: olho, título, apoio e lista de benefícios — e ele acompanha a rolagem, para não sair de vista enquanto a pessoa preenche. À direita, um card de vidro com o formulário: três campos de texto, um select customizado, botão e nota de consentimento.
O envio vai para o
actiondo formulárioO script valida, envia por
fetchpara oactiondo<form>e só mostra "Recebemos seus dados" com resposta de sucesso. Qualquer outra coisa mostra a mensagem de erro. Semaction— como no exemplo — ele não finge: diz na tela que é demonstração e que nada foi enviado. Antes de publicar, ponhaactionemethod="post"com o endereço do CRM ou do backend.
Quando usar
- Fecho de landing ou de home de serviço de alto ticket, onde a conversão é uma conversa, não uma compra.
- Quando existe uma oferta concreta de entrada: diagnóstico, auditoria, análise, proposta.
Quando não usar
- Como formulário de contato genérico. Aqui a promessa é específica; "fale conosco" não justifica 4 campos.
- Quando a conversão é WhatsApp. Aí o
navegacao/botao-flutuantee um botão grande convertem mais. - Mais de 5 campos. Cada campo a mais derruba a taxa; se o time comercial pede 8, a resposta é qualificar na ligação.
Padrão editorial
| Slot | Regra |
|---|---|
| Olho | "Comece por aqui", "Próximo passo". Sinaliza que a página acabou. |
| Título | A oferta, com o benefício em <em>: "Agende um diagnóstico gratuito da sua carteira". |
| Apoio | 1 frase, 25 a 40 palavras. O que a pessoa recebe e quanto custa (mesmo que seja nada). |
.lead-list |
4 a 6 itens, 4 a 8 palavras cada. O que está incluso — não o que a empresa é. |
.lead-title |
3 a 5 palavras. Repete a ação: "Fale com um especialista". |
.lead-req |
O filtro de qualificação, se houver. Dito na cara: "Requisito: carteira superior a R$ 3 milhões". |
.lead-note |
Consentimento, 10 a 16 palavras. Obrigatório se há tratamento de dados. |
O requisito de qualificação em cima do formulário economiza o tempo dos dois lados. Parece que afasta lead; na prática afasta lead errado.
Especificação da imagem
- Paisagem, mínimo 2000×1400, até 400 KB.
- Entra em
opacity:.2com gradiente por cima: é textura, não assunto. Escolha por atmosfera, não por detalhe.
Como usar
<link rel="stylesheet" href="componentes/conversao/select-custom/estilo.css">
<link rel="stylesheet" href="componentes/conversao/cta-formulario-lead/estilo.css">
<script src="componentes/conversao/select-custom/script.js"></script>
<script src="componentes/conversao/cta-formulario-lead/script.js"></script>
Este componente compõe o conversao/select-custom — carregue os dois. Os dois leem a mesma primitiva .field do core, e é ela que dá a régua e o rótulo: o <div class="field lead-field is-full"> do capital serve de wrapper ao widget sem que o select precise trazer wrapper nenhum.
Ligando o envio
Não há bloco para editar no script. O destino é o próprio formulário:
<form class="glass lead-form" data-lead-form action="https://seu-crm.exemplo/lead" method="post" novalidate>
O corpo vai como FormData (o mesmo que o navegador mandaria sem script), com Accept: application/json. Se o CRM pede JSON, é ali, no fetch do script.js, que se troca o body — e só ali.
Os três desfechos têm mensagem própria no markup, e o script mostra só a que aconteceu:
| Mensagem | Quando |
|---|---|
.lead-ok |
resposta com status de sucesso (r.ok). O foco vai para ela, porque os campos acabaram de ser desligados |
.lead-erro |
4xx, 5xx ou rede fora. O formulário continua preenchido e ativo |
.lead-demo |
o <form> não tem action. Nada é enviado |
Variações
- Sem foto de fundo — apague
.lead-media. - Formulário sozinho — apague
.lead-introe centralize o card emmax-width:560px. Para página de obrigado ou landing curta.
Gotchas
.lead-introésticky. Em tela baixa o formulário é mais alto que a viewport; sem isso o argumento sai de vista enquanto a pessoa preenche. No mobile volta astatic, senão o texto gruda por cima do formulário.gap:0 26pxnos campos — zero na vertical. O respiro entre linhas vem dopaddingdo próprio campo; com gap vertical, a régua de um campo fica longe demais do seguinte.- Campo com régua embaixo, não caixa. Menos peso visual dentro de um card que já é de vidro.
novalidateno<form>é proposital. A validação nativa mostraria um balão do sistema, que destoa de tudo — a validação aqui é manual e o foco vai para o campo vazio.- O select obrigatório valida separado. Ele não tem
:invalidnativo: a checagem é peloinput[type=hidden]dentro de[data-csel-required], e o retorno é o tremor. role="status"no sucesso e na demonstração,role="alert"no erro. O script reescreve o texto ao mostrar a mensagem, porque a região viva anuncia mudança de conteúdo — tirar o[hidden]sozinho nem sempre conta.- O botão fica
aria-disableddurante o envio, nãodisabled. Desabilitar o botão que tem o foco joga o foco para o<body>, e quem enviou pelo teclado se perde justo quando o erro aparece. Medido naconversao/faixa-newsletter, que nasceu com o problema. - Sem
action, a tela diz que é demonstração. Até 2026-09-29 o formulário confirmava sem enviar, e o aviso morava num comentário do script. Quem publicar esquecendo oactionagora descobre na primeira tentativa, e não quando o comercial perguntar por que ninguém preenche. - O
.graindentro do card precisa dos filhos emz-index:1. Ele éposition:absolutee cobriria os campos.
Histórico
| Projeto | Onde | Data | Diferenças |
|---|---|---|---|
| Liberta Wealth | index.html e quem-somos.html, #diagnostico |
2026-08 | Origem. Prefixos .cta- e .cform- misturados, .cfield/.req/.full sem prefixo, ids #leadForm e #formOk no script, vidro escrito inline, cores #f8f6f2/#9b988f/#66645e/#6f6d66 cruas, rgba(198,206,170,.1) no aviso de sucesso, sem role="status". |
Normalizações aplicadas na extração: prefixo único lead-; .cfield → .lead-field, .full → .is-full, .on → .is-on; ids → [data-lead-form] / [data-lead-ok], permitindo mais de um formulário na página; o vidro virou a primitiva .glass; cores cruas → tokens, com color-mix no fundo do aviso; adicionado role="status"; o bloco de envio virou um ponto de extensão marcado, em vez de um comentário solto no fim.
Divergências e pendências: nenhuma aberta. As duas que o mantinham em revisar desde a extração — o sucesso sem envio e a falta de estado de erro — foram fechadas em 2026-09-29, com o envio honesto que a conversao/faixa-newsletter estreou: sucesso só com resposta, erro visível, demonstração dita como demonstração. O status passou a estavel.