File Upload
A dropzone over a real file input, plus the upload queue nobody ships.
- Forms
- 2 files
- No extra npm packages
- Accessibility notes
pnpm dlx @dowel-ui/cli add file-uploadNo npm packages are needed beyond what Dowel already requires.
import { FileUpload } from "@/components/ui/file-upload";Default
With Queue
Retries And Failures
Rejected Files Stay Visible
Single File
Disabled
Animated
<FileUpload>
| Prop | Type | Default |
|---|---|---|
label (required)Names the control. | string | — |
onFiles (required) | (files: File[]) => void | — |
accept | string | — |
disabled | boolean | false |
hintShown under the prompt: accepted types, size limit. | ReactNode | — |
iconA decorative icon above the prompt, hidden from assistive technology. It lifts while a drag is over the dropzone. | ReactNode | — |
multiple | boolean | true |
children | ReactNode | — |
Plus every attribute of <div> except onDrop.
<FileUploadList>
| Prop | Type | Default |
|---|---|---|
files (required) | QueuedFile[] | — |
animateExitLets a removed file slide out before it leaves the DOM. The departing row is | boolean | false |
onCancel | (id: string) => void | — |
onRemove | (id: string) => void | — |
onRetry | (id: string) => void | — |
Plus every attribute of <ul>.
<FileUploadItem>
| Prop | Type | Default |
|---|---|---|
entry (required) | QueuedFile | — |
onCancel | (id: string) => void | — |
onRemove | (id: string) => void | — |
onRetry | (id: string) => void | — |
Plus every attribute of <li> except children.
<FileUploadStatus>
| Prop | Type | Default |
|---|---|---|
stats (required) | { total: number; active: number; done: number; failed: number } | — |
Plus every attribute of <p>.
9/10
checks passed
- Tested — passes
- axe assertion — passes
- Keyboard tested — fails
- Storybook examples — passes
- Accessibility documented — passes
- Semantic tokens only — passes
- Motion from tokens — passes
- className merged — passes
- Visible focus — passes
- No fixed widths — passes