vaiperui

componentes / upload

Upload

Área para escolher arquivos clicando ou arrastando, com filtro de tipos aceitos.

Como usar

O Upload só **captura** os arquivos: listar, validar o tamanho e enviar para um servidor ficam com você. `onFilesChange` recebe `File[]` puro com os arquivos recém-escolhidos, não a soma com os anteriores, então junte-os no seu próprio estado para acumular. É um `<input type="file">` de verdade escondido só visualmente (Tab para focar, Enter ou Espaço para abrir), e o `accept` também filtra arquivos arrastados, o que o navegador não faz sozinho. Sem `multiple`, só o primeiro arquivo da seleção é mantido. Valide sempre de novo no servidor.

preview
  • Nenhum arquivo ainda
Upload.tsx
import { Upload } from "vaiperui";
const [files, setFiles] = useState<File[]>([]);
<Upload
multiple
accept=".pdf,image/*"
label="Anexos"
description="PDF ou imagem, até 5 MB"
onFilesChange={(chosen) => setFiles((current) => [...current, ...chosen])}
/>

Tamanhos

preview
sm
md
lg
tamanhos.tsx
<Upload size="sm" onFilesChange={...} />
<Upload size="md" onFilesChange={...} />
<Upload size="lg" onFilesChange={...} />

Cores

A cor aparece ao passar o mouse, ao arrastar e no foco do teclado.

preview
primary
success
warning
danger
cores.tsx
<Upload variantColor="primary" onFilesChange={...} />
<Upload variantColor="success" onFilesChange={...} />
<Upload variantColor="warning" onFilesChange={...} />
<Upload variantColor="danger" onFilesChange={...} />

Tipos aceitos

preview
.pdf
image/* + multiple
aceitos.tsx
<Upload accept=".pdf" description="PDF" />
<Upload accept="image/*" multiple description="Images" />

Estados

preview
Detalhe extra
ajuda
O arquivo precisa ser um PDF
erro
desabilitado
estados.tsx
<Upload label="..." helperText="..." />
<Upload label="..." errorMessage="..." />
<Upload label="..." disabled />

Cor personalizada

preview
Laranja
cor-personalizada.tsx
<Upload customColor="#ff6600" onFilesChange={...} />

Props

PropValoresPadrãoDescrição
onFilesChange(files: File[]) => voidobrigatórioChamado com os arquivos recém-escolhidos (não a soma com os anteriores)
titleReactNode"Drag files here or click to choose"Texto principal da área
descriptionReactNodenenhumTexto de apoio, ex.: formatos aceitos e tamanho
acceptstringnenhumTipos aceitos: .pdf, image/*, image/png, separados por vírgula. Também filtra arquivos arrastados
multiplebooleanfalseAceita vários arquivos. Sem ele, só o primeiro da seleção é mantido
label / helperTextstringnenhumRótulo acima da área e texto de ajuda abaixo
errorMessagestringnenhumTexto de erro; só a presença dele já força o estado de erro (borda vermelha, aria-invalid)
disabledbooleanfalseBloqueia clique e arraste
namestringnenhumNome do campo para um <form> nativo (arquivos soltos são copiados para o input)
variantColorprimary | success | warning | dangerprimaryCor do estado marcado e do anel de foco
customColorstring | { light, dark }nenhumQualquer cor CSS (ou um par por tema). Substitui o variantColor
sizesm | md | lgmdTamanho do controle e do texto
animationnone | smooth | fast | bouncesmoothTransição ao alternar
radiusnone | sm | md | lg | fulllgArredondamento dos cantos da área
(nativas)InputHTMLAttributes<HTMLInputElement>nenhumchecked, defaultChecked, onChange, name, value, disabled, required, aria-*, className, ref etc.

Acessibilidade

  • Um `<input type="file">` nativo (oculto visualmente) é o controle real; a área tracejada é um `<label htmlFor>` dele.
  • O input recebe foco e o anel de foco aparece na área de soltar (`peer-focus-visible`), então o foco por teclado fica visível.
  • O nome acessível é o texto de `title` dentro da área, mais o `label` quando você passa um (o input tem os dois rótulos).
  • `errorMessage` define `aria-invalid="true"`; `aria-describedby` aponta para o erro, ou para o `helperText` quando não há erro.
  • Arrastar e soltar é um caminho extra: usuários de teclado e leitor de tela abrem o seletor do sistema pelo input nativo. O ícone de upload é `aria-hidden`.

Teclado

TeclaAção
TabFoca o input de arquivo.
Enter / SpaceAbre o seletor de arquivos do sistema (comportamento nativo do input).

Tenha em mente

  • Arquivos recusados por `accept` são descartados em silêncio, sem mensagem nem live region; valide e avise o usuário via `errorMessage`.
  • Os arquivos escolhidos não são listados pelo componente; renderize a lista você mesmo e deixe-a acessível a tecnologias assistivas.