Formulários com Tailwind
Formulários são os elementos centrais de interação em qualquer aplicação digital de alto padrão. No ecossistema atual do Tailwind CSS, a estilização de campos não se resume apenas a aplicar bordas e espaçamentos, mas a construir uma experiência de uso refinada, fluida e com feedbacks visuais claros.
Utilizando a abordagem CSS-first e os recursos mais modernos de transições, estados e aninhamento nativo, veja como transformar formulários comuns em interfaces premium, altamente amigáveis e acessíveis.
1. Campo de Texto Minimalista (Input)
A estética de interfaces premium evita contrastes agressivos e cantos excessivamente retos. O uso de bordas suaves (slate-200) combinado com sombras sutis de elevação gera profundidade sem poluir o visual.
HTML
<div class="w-full max-w-sm">
<input
type="text"
placeholder="Seu nome completo"
class="w-full rounded-xl border border-slate-200 bg-white px-4 py-3 text-sm text-slate-900 placeholder-slate-400 shadow-sm transition-all duration-200 focus:border-indigo-500 focus:outline-none focus:ring-4 focus:ring-indigo-500/10"
/>
</div>
2. Par Estrutural: Label + Input
O rótulo (label) deve guiar o olhar do usuário. Reduzir levemente seu tamanho (text-xs ou text-sm) e aumentar seu peso tipográfico (font-semibold) cria uma hierarquia de leitura limpa.
HTML
<div class="w-full max-w-sm space-y-1.5">
<label for="email" class="block text-xs font-semibold uppercase tracking-wider text-slate-500">
Endereço de E-mail
</label>
<input
type="email"
id="email"
placeholder="nome@empresa.com"
class="w-full rounded-xl border border-slate-200 bg-white px-4 py-3 text-sm text-slate-900 placeholder-slate-400 shadow-sm transition-all duration-200 focus:border-indigo-500 focus:outline-none focus:ring-4 focus:ring-indigo-500/10"
/>
</div>
3. Feedback Crítico: Estado de Erro de Validação
Campos com erro não precisam de cores berrantes. Tons de vermelho sofisticados (rose-500) emparelhados com ícones de alerta ou pequenas animações de transição mantêm o usuário calmo enquanto corrige a informação.
HTML
<div class="w-full max-w-sm space-y-1.5">
<div class="flex items-center justify-between">
<label for="password" class="block text-xs font-semibold uppercase tracking-wider text-rose-600">
Senha de Acesso
</label>
<span class="text-xs font-medium text-rose-500">Obrigatório</span>
</div>
<input
type="password"
id="password"
value="123"
class="w-full rounded-xl border border-rose-300 bg-rose-50/30 px-4 py-3 text-sm text-rose-900 placeholder-rose-300 shadow-sm transition-all duration-200 focus:border-rose-500 focus:outline-none focus:ring-4 focus:ring-rose-500/10"
/>
<p class="text-xs font-medium text-rose-600 mt-1 flex items-center gap-1">
A senha inserida precisa conter pelo menos 8 caracteres.
</p>
</div>
4. Caixa de Seleção Customizada (Select)
Estilizar o elemento <select> de forma nativa e elegante requer a remoção da seta padrão do sistema operacional (appearance-none) para que possamos desenhar um indicador elegante em SVG ou via folha de estilo.
HTML
<div class="w-full max-w-sm space-y-1.5 relative">
<label for="category" class="block text-xs font-semibold uppercase tracking-wider text-slate-500">
Plano de Assinatura
</label>
<div class="relative">
<select
id="category"
class="w-full appearance-none rounded-xl border border-slate-200 bg-white px-4 py-3 pr-10 text-sm text-slate-900 shadow-sm transition-all duration-200 focus:border-indigo-500 focus:outline-none focus:ring-4 focus:ring-indigo-500/10"
>
<option value="" disabled selected>Escolha o seu plano</option>
<option value="starter">Enterprise Starter</option>
<option value="pro">Professional Advanced</option>
</select>
<div class="pointer-events-none absolute inset-y-0 right-0 flex items-center pr-4 text-slate-400">
<svg class="h-4 w-4 fill-none stroke-current stroke-2" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" d="M19 9l-7 7-7-7" />
</svg>
</div>
</div>
</div>
5. Checkbox de Alta Precisão Visual
Elementos pequenos como checkboxes ganham usabilidade ao receberem uma área de clique confortável, cantos levemente suavizados (rounded) e transições rápidas de cor no preenchimento do foco.
HTML
<label class="group inline-flex items-start gap-3 cursor-pointer select-none max-w-sm">
<input
type="checkbox"
class="peer mt-0.5 h-4 w-4 shrink-0 rounded border-slate-300 bg-white text-indigo-600 transition-all duration-150 focus:outline-none focus:ring-2 focus:ring-indigo-500/20 focus:ring-offset-0 checked:bg-indigo-600 checked:border-indigo-600"
/>
<div class="flex flex-col">
<span class="text-sm font-semibold text-slate-800 group-hover:text-slate-900 transition-colors">
Aceito as políticas de privacidade
</span>
<span class="text-xs text-slate-400 leading-normal">
Você concorda com o processamento dos seus dados para a ativação do perfil.
</span>
</div>
</label>
6. Caixa de Texto Expandida (Textarea)
O segredo para um bom campo de mensagens é desabilitar o redimensionamento horizontal livre, que costuma quebrar layouts, permitindo apenas a expansão vertical, além de garantir bom espaçamento interno.
HTML
<div class="w-full max-w-sm space-y-1.5">
<label for="message" class="block text-xs font-semibold uppercase tracking-wider text-slate-500">
Notas Adicionais
</label>
<textarea
id="message"
rows="4"
placeholder="Descreva brevemente os detalhes do seu projeto..."
class="w-full rounded-xl border border-slate-200 bg-white px-4 py-3 text-sm text-slate-900 placeholder-slate-400 shadow-sm resize-y min-h-[100px] transition-all duration-200 focus:border-indigo-500 focus:outline-none focus:ring-4 focus:ring-indigo-500/10"
></textarea>
</div>
7. Painel de Formulário Completo (Card de Interface)
Ao agrupar todos os campos, envolva-os em um container estruturado que utilize espaçamentos consistentes (space-y-5), uma tipografia elegante para o título e botões com feedback de estado ao passar o mouse e ao clicar (hover e active).
HTML
<form class="w-full max-w-md border border-slate-100 bg-white p-8 rounded-2xl shadow-xl shadow-slate-200/50 space-y-5">
<div class="space-y-1">
<h2 class="text-xl font-black tracking-tight text-slate-900">Configuração de Perfil</h2>
<p class="text-xs text-slate-400">Atualize suas credenciais de acesso corporativo.</p>
</div>
<div class="space-y-1.5">
<label class="block text-xs font-semibold uppercase tracking-wider text-slate-500">Nome do Usuário</label>
<input type="text" placeholder="Ex: Alex Silva" class="w-full rounded-xl border border-slate-200 bg-white px-4 py-3 text-sm text-slate-900 placeholder-slate-400 shadow-sm transition-all focus:border-indigo-500 focus:outline-none focus:ring-4 focus:ring-indigo-500/10" />
</div>
<div class="space-y-1.5">
<label class="block text-xs font-semibold uppercase tracking-wider text-slate-500">E-mail de Trabalho</label>
<input type="email" placeholder="alex@empresa.com" class="w-full rounded-xl border border-slate-200 bg-white px-4 py-3 text-sm text-slate-900 placeholder-slate-400 shadow-sm transition-all focus:border-indigo-500 focus:outline-none focus:ring-4 focus:ring-indigo-500/10" />
</div>
<div class="space-y-1.5">
<label class="block text-xs font-semibold uppercase tracking-wider text-slate-500">Mensagem</label>
<textarea rows="3" placeholder="Informações de contexto..." class="w-full rounded-xl border border-slate-200 bg-white px-4 py-3 text-sm text-slate-900 placeholder-slate-400 shadow-sm resize-none transition-all focus:border-indigo-500 focus:outline-none focus:ring-4 focus:ring-indigo-500/10"></textarea>
</div>
<div class="pt-2">
<button type="submit" class="w-full inline-flex items-center justify-center rounded-xl bg-indigo-600 px-4 py-3 text-sm font-semibold text-white shadow-md shadow-indigo-200 transition-all hover:bg-indigo-700 active:scale-[0.98] focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2">
Confirmar Alterações
</button>
</div>
</form>
Diretrizes de UX e Acessibilidade Prática
-
Substitutos Modernos ao
focus:outline-none: Nunca remova a linha de foco do navegador sem injetar um comportamento substituto visível. A combinação defocus:ring-4 focus:ring-indigo-500/10cria uma aura suave ao redor do campo, mantendo o indicador perfeitamente legível para navegação via teclado. -
Espaçamentos Previsíveis e Semânticos: Em vez de espalhar margens inferiores aleatórias em cada input, use contêineres pais estruturados com as classes utilitárias de distribuição vertical, como
space-y-5. Isso centraliza o controle do ritmo visual do layout. -
Uso Inteligente de Placeholders: O texto interno temporário (
placeholder) deve servir apenas como exemplo de preenchimento (ex: nome@empresa.com). Nunca o utilize para substituir o elemento<label>, pois leitores de tela dependem das labels explícitas para garantir a acessibilidade de usuários PCD. -
Adoção do Plugin Oficial de Formulários: Para projetos complexos ou portabilidade de temas, adicione o pacote oficial
@tailwindcss/formsao seu ambiente. Ele atua reiniciando e normalizando a aparência básica de inputs, selects e botões de rádio em todos os navegadores, permitindo que você construa sua camada de estilo premium sobre uma base totalmente previsível.