Skip to content

FileUpload

Dropzone with drag-and-drop file upload and file list with progress indicators.

Also known as: file input, dropzone, file picker, upload area

View in Storybook

When to use

  • Uploading files with drag-and-drop support.
  • Showing upload progress for each file.
  • Restricting file types or sizes.

Import

tsx
import { FileUpload, FileUploadItem } from '@vacano/ui'

Usage

tsx
<FileUpload onChange={(files) => console.log(files)}>
  {/* File list rendered here */}
</FileUpload>

Accept file types

tsx
<FileUpload accept="image/*" onChange={handleChange} />
<FileUpload accept=".pdf,.doc,.docx" onChange={handleChange} />

Max file size

Limit in bytes. Rejected files trigger onReject with reason: 'size'.

tsx
<FileUpload maxSize={5 * 1024 * 1024} onReject={handleReject}>
  ...
</FileUpload>

Multiple files

tsx
<FileUpload multiple onChange={handleChange} />

File list with progress

Use FileUploadItem to display individual files with upload status.

tsx
<FileUpload onChange={handleChange}>
  <FileUploadItem
    name="document.pdf"
    size={1024000}
    status="uploading"
    progress={45}
    onRemove={() => {}}
  />
  <FileUploadItem
    name="photo.jpg"
    size={2048000}
    status="complete"
    onRemove={() => {}}
  />
  <FileUploadItem
    name="broken.txt"
    size={512}
    status="failed"
    onRemove={() => {}}
    onRetry={() => {}}
  />
</FileUpload>

Custom description

tsx
<FileUpload
  description="Drop your SVG icons here"
  hint="SVG only, max 1MB"
  onChange={handleChange}
/>

FileUpload Props

PropTypeDefaultDescription
acceptstring-Accepted file types (MIME types or extensions)
childrenReactNode-File list content below the dropzone
descriptionReactNode-Custom dropzone description text
disabledbooleanfalseDisable the dropzone
hintReactNode-Hint text below description
iconReactNode-Custom dropzone icon
maxSizenumber-Max file size in bytes
multiplebooleantrueAllow multiple files
onChange(files: File[]) => void-Callback with accepted files
onReject(files: File[], reason: 'type' | 'size') => void-Callback for rejected files
classNamestring-CSS class for root element
classnamesFileUploadClassNames-Custom class names for inner elements
refRef<HTMLDivElement>-Ref to the root container element
data-test-idstring-Test identifier for automated testing

FileUploadItem Props

PropTypeDefaultDescription
namestringrequiredFile name
sizenumberrequiredFile size in bytes
status'uploading' | 'complete' | 'failed''uploading'Upload status
progressnumber-Upload progress (0-100)
iconReactNode-Custom file icon
onRemove() => void-Remove file callback
onRetry() => void-Retry upload callback (shown when failed)
classNamestring-CSS class for root element
classnamesFileUploadItemClassNames-Custom class names for inner elements
refRef<HTMLDivElement>-Ref to the root container element
data-test-idstring-Test identifier for automated testing

FileUploadFile Type

The FileUploadFile type can be used to manage file state in your application:

tsx
type FileUploadFile = {
  id: string
  name: string
  size: number
  progress?: number
  status: 'uploading' | 'complete' | 'failed'
  file?: File
}

ClassNames (FileUpload)

KeyDescription
dropzoneThe drop area container
iconDropzone icon
textDropzone text content
hintHint text below description
listFile list container

ClassNames (FileUploadItem)

KeyDescription
iconFile type icon
infoFile info container
nameFile name text
sizeFile size text
progressProgress bar
actionAction buttons (remove, retry)

Released under the MIT License.