Caixa de seleção
Um botão binário para caixas de consentimento, filtros de seleção múltipla e seleção em massa de linhas — com aquele estilo neobrutalista de bordas e sombras.
"use client"
import { Checkbox } from "@/components/ui/checkbox"O checkbox é o controle padrão para escolhas binárias — marcado, desmarcado ou indeterminado para seleções parciais. Construído sobre o primitivo Base UI Checkbox e estilizado seguindo a receita neobrutalista: bordas grossas, sombras duras e tipografia em negrito.
Use quando:
- Termos e consentimento — a caixa “Eu concordo” em fluxos de cadastro e checkout, enviada junto com o formulário.
- Filtros de seleção múltipla — categorias, tags ou faixas de preço em uma barra lateral onde qualquer combinação é válida.
- Seleção em massa em tabelas — checkboxes por linha mais um “selecionar tudo” indeterminado no cabeçalho.
Instalação#
pnpm dlx shadcn@latest add https://neobrutalism.com/r/base/checkbox.jsonnpx shadcn@latest add https://neobrutalism.com/r/base/checkbox.jsonyarn dlx shadcn@latest add https://neobrutalism.com/r/base/checkbox.jsonbunx --bun shadcn@latest add https://neobrutalism.com/r/base/checkbox.json
Instale as seguintes dependências:
pnpm add @base-ui/reactnpm install @base-ui/reactyarn add @base-ui/reactbun add @base-ui/react
Copie e cole o código a seguir no seu projeto.
"use client"
import * as React from "react"
import { CheckIcon } from "lucide-react"
import { Checkbox as CheckboxPrimitive } from "radix-ui"
import { cn } from "@/lib/utils"
function Checkbox({
className,
...props
}: React.ComponentProps<typeof CheckboxPrimitive.Root>) {
return (
<CheckboxPrimitive.Root
data-slot="checkbox"
className={cn(
"peer relative flex size-5 shrink-0 items-center justify-center rounded border-2 bg-input shadow-sm transition-colors outline-none group-has-disabled/field:opacity-50 after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive data-checked:border-border data-checked:bg-primary data-checked:text-primary-foreground",
className
)}
{...props}
>
<CheckboxPrimitive.Indicator
data-slot="checkbox-indicator"
className="grid place-content-center text-current transition-none [&>svg]:size-3.5"
>
<CheckIcon />
</CheckboxPrimitive.Indicator>
</CheckboxPrimitive.Root>
)
}
export { Checkbox }
Atualize os caminhos de importação de acordo com a configuração do seu projeto.
Uso#
import { Checkbox } from "@/components/ui/checkbox"<Checkbox />Estado marcado#
Use defaultChecked para checkboxes não controlados, ou checked e
onCheckedChange para controlar o estado.
import * as React from "react"
export function Example() {
const [checked, setChecked] = React.useState(false)
return <Checkbox checked={checked} onCheckedChange={setChecked} />
}Estado inválido#
Defina aria-invalid no checkbox e data-invalid no contêiner do campo para
exibir os estilos de erro.
import { Checkbox } from "@/components/ui/checkbox"
import { Field, FieldGroup, FieldLabel } from "@/components/ui/field"
Exemplos#
Básico#
Combine o checkbox com Field e FieldLabel para um layout e rotulagem corretos.
import { Checkbox } from "@/components/ui/checkbox"
import { Field, FieldGroup, FieldLabel } from "@/components/ui/field"
Descrição#
Use FieldContent e FieldDescription para o texto de ajuda.
import { Checkbox } from "@/components/ui/checkbox"
import {
Field,Desabilitado#
Use a prop disabled para impedir a interação e adicione o atributo data-disabled ao componente <Field> para aplicar os estilos desabilitados.
import { Checkbox } from "@/components/ui/checkbox"
import { Field, FieldGroup, FieldLabel } from "@/components/ui/field"
Grupo#
Use vários campos para criar uma lista de checkboxes.
import { Checkbox } from "@/components/ui/checkbox"
import {
Field,Tabela#
"use client"
import * as React from "react"RTL#
Para ativar o suporte a RTL no Neobrutalism, consulte o guia de configuração de RTL.
"use client"
import * as React from "react"Acessibilidade#
O checkbox segue o padrão Checkbox do WAI-ARIA: o primitivo renderiza um elemento role="checkbox" com aria-checked (incluindo "mixed" para o estado indeterminado) e sincroniza um input nativo oculto para que o valor seja enviado junto com o formulário.
Interações de teclado:
| Tecla | Ação |
|---|---|
Tab / Shift + Tab | Move o foco para o checkbox ou para fora dele |
Space | Alterna o estado marcado (indeterminado → marcado) |
Enter não alterna um checkbox — isso segue o padrão ARIA, não é um bug.
Referência da API#
Consulte a documentação do Base UI para obter mais informações.