DropZone
Área para soltar ou escolher arquivos, com lista de envio e progresso.
O DropZone (do HeroUI Pro) recebe arquivos de duas formas: arrastar e soltar, ou o botão que abre o seletor do sistema. No Admin ele é o passo de arquivo da importação de Pedidos por CSV, e também serve para o logotipo da Loja. A lista de arquivos com progresso, tentar de novo e remover vive junto.
import { DropZone } from "@rastreio-x/ui";
Padrão
DropZone.Area com Icon, Label, Description e Trigger, mais um DropZone.Input oculto para o seletor. O texto do Trigger é o do botão visível.
CSV da importação
accept no Input filtra o seletor, e getDropOperation na Area recusa o que não for CSV ao arrastar. onSelect recebe a lista; no onDrop, busque o arquivo com getFile().
Só imagem
Troque o ícone, o tipo aceito e o texto, como para o logotipo da Loja.
Lista de arquivos
DropZone.FileList com FileItem por arquivo. O status (uploading, complete, failed) muda o visual; a barra de progresso só aparece quando faz sentido, e arquivos com falha ganham uma ação de tentar de novo.
Desabilitado
isDisabled na Area e no Trigger. Diga na descrição o que falta para habilitar.
Anatomia
DropZone.Area: a área que aceita soltar; recebeonDropegetDropOperation.Icon,Label,DescriptioneTrigger: o conteúdo da área.DropZone.Input: o<input type="file">oculto, comaccept,multipleeonSelect.FileList,FileItem,FileFormatIcon,FileInfo,FileName,FileMeta,FileProgresseFileRemoveTrigger: a lista de envio.
Propriedades
Raiz (DropZone):
Área (DropZone.Area):
Seletor (DropZone.Input):
| Prop | Tipo | Descrição |
|---|---|---|
accept | string | Tipos aceitos no seletor, como .csv,text/csv ou image/*. |
multiple | boolean | Permite escolher mais de um arquivo. |
onSelect | (files: FileList) => void | Chamado com os arquivos escolhidos pelo seletor. |
Item de arquivo (DropZone.FileItem):
| Prop | Tipo | Descrição |
|---|---|---|
status | "uploading" | "complete" | "failed" | Estado do envio; muda o visual do item. |
O FileItem também aceita as propriedades de um div animado do motion; a lista completa tem mais de 300 entradas e fica fora da tabela.
Animações
A lista de arquivos usa o motion do Pro: itens entram e saem com layout animado (AnimatePresence), e a barra de progresso avança com transição curta. A área muda de aparência ao receber um arquivo por cima. Com prefers-reduced-motion, o movimento de layout fica sem deslocamento e a folha global da fachada reduz as transições de CSS a 0,01 ms.
Acessibilidade
- A área solta é construída sobre o
DropZonedo React Aria, e oTriggeré um botão comum: quem não arrasta (teclado, leitor de tela) usa o botão e o seletor do sistema. - O
DropZone.Inputprecisa dearia-label, já que fica oculto. - Progresso por
DropZone.FileProgresscomaria-labelpróprio (Leitura de pedidos-outubro.csv); anuncie o resultado e as falhas em uma regiãoaria-live. - O botão de remover leva o nome do arquivo (
Remover pedidos-outubro.csv). - Estado nunca só em cor: o status vem em texto na linha de meta (pronto, lendo, falhou).
Boas práticas
Faça
Evite
- Valide o tipo e o tamanho antes de enviar, e no servidor também.
- Mostre o motivo da falha e a próxima ação (tentar de novo, escolher outro).
- Sempre ofereça o botão: arrastar não é acessível a todo mundo.
- Para ações sobre a lista de arquivos, mantenha o foco ao remover um item.
Relacionados
- EmptyState para o vazio antes do primeiro envio em telas maiores.
- Alert o aviso de erro de leitura do arquivo.
- Button a base do botão de tentar de novo.
- Toast para confirmar um envio concluído.