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.