ui · Primitive
FileUpload
@devalok/shilp-sutra/ui/file-uploadView in Storybook Hand-curated previews ship in rolling waves. See it live in Storybook →
Reference
Props
onFiles: (files: File[]) => void (REQUIRED)
accept: string (MIME or extension, e.g. "image/*", ".pdf,.doc")
maxSize: number (bytes, default: 10MB)
multiple: boolean
uploading: boolean
progress: number (0-100)
error: string
compact: boolean (inline button mode vs drop zone)
disabled: boolean
label: string
sublabel: string
Defaults
compact: false
maxSize: 10MB (10485760 bytes)
Example
<FileUpload
accept="image/*"
maxSize={2 * 1024 * 1024}
onFiles={(files) => uploadAvatar(files[0])}
label="Upload profile photo"
sublabel="PNG, JPG up to 2MB"
/>
Composability
- Two modes, one component:
compact={false}(default) = drag-and-drop zone with visible affordance;compact={true}= inline "Upload" button. Swap by prop, same callback. - Progress integration: Drive
uploading+progressfrom your upload logic. The component renders an embedded Progress bar when uploading=true. - Validation is built-in:
accept(MIME types / extensions) +maxSizeare enforced beforeonFilesfires. Invalid files produceerrorstate instead of calling through. Your onFiles never has to re-validate. - Multi-file:
multiple={true}accepts File[] (array always, even for single-file mode — usefiles[0]). - Composes with Toast for feedback: Pair with toast.success on upload complete, toast.error on failure.
Gotchas
- compact=true renders a small inline button; false (default) renders a large drag-and-drop zone
- Client-side validation: invalid files are rejected before onFiles is called
onFilesalways receives an array — usefiles[0]even whenmultiple={false}
Changes
v0.1.0
- Added Initial release