Input Group
Molecule
Input Group adiciona contexto ou ação secundária a um input sem tirar o foco do preenchimento.
Use Input Group para busca, URL, prefixos fixos, sufixos de unidade ou ações auxiliares como testar webhook. O elemento anexado não deve competir com a ação primária do formulário.
Exemplos copiáveis
React
React
import * as React from "react"
type PulsoInputGroupProps = {
id?: string
label: string
prefix?: React.ReactNode
suffix?: React.ReactNode
action?: React.ReactNode
} & React.InputHTMLAttributes<HTMLInputElement>
export function PulsoInputGroup({
id,
label,
prefix,
suffix,
action,
className,
...props
}: PulsoInputGroupProps) {
const reactId = React.useId()
const inputId = id ?? reactId
return (
<div className="grid gap-1.5">
<label
htmlFor={inputId}
className="font-mono text-xs font-semibold uppercase tracking-[var(--tracking-kicker)] text-[var(--fg-muted)]"
>
{label}
</label>
<div className="flex min-h-10 items-center rounded-[var(--radius-md)] border border-[var(--border)] bg-[var(--card)] focus-within:outline focus-within:outline-[var(--ring-width)] focus-within:outline-offset-2 focus-within:outline-[var(--ring)]">
{prefix ? (
<span className="flex items-center border-r border-[var(--border)] px-3 text-sm text-[var(--fg-muted)]">
{prefix}
</span>
) : null}
<input
id={inputId}
className={[
"min-w-0 flex-1 bg-transparent px-3 py-2 text-sm text-[var(--fg)] outline-none placeholder:text-[var(--fg-subtle)]",
className,
].filter(Boolean).join(" ")}
{...props}
/>
{suffix ? (
<span className="flex items-center border-l border-[var(--border)] px-3 text-sm text-[var(--fg-muted)]">
{suffix}
</span>
) : null}
{action ? (
<div className="border-l border-[var(--border)] px-1">{action}</div>
) : null}
</div>
</div>
)
}<PulsoInputGroup
label="Webhook"
prefix="https://"
placeholder="example.com/pulso/webhook"
action={
<button className="rounded-[var(--radius-sm)] px-3 py-1.5 text-sm font-medium text-[var(--primary)] hover:bg-[var(--muted)]">
Testar
</button>
}
/>Quando usar
- Busca com ícone ou prefixo visual.
- URLs com protocolo ou domínio fixo.
- Valores com unidade (
min,%,kg,menções/h). - Ação secundária acoplada ao campo, como testar, copiar ou revelar.
Quando não usar
- Para esconder ação primária dentro do campo.
- Quando o prefixo altera o significado de forma ambígua.
- Em campos onde a ação secundária pode disparar efeito destrutivo.
- Para filtros complexos; use
Filter Bar.
Regras
- O label continua fora do grupo.
- Prefixo/sufixo devem ser texto real quando fazem parte do valor esperado.
- Ícone sozinho precisa de nome acessível quando for acionável.
- Ação secundária não deve enviar formulário inteiro.
- Erro pertence ao Form Field que envolve o grupo.
Last updated on