Installation
Complete project setup first. Your configuration
must select react/base and include your Design System ID.
pnpm exec frontfriend download file-upload -f react --primitive baseReview dependencies reported by the downloader and keep your source changes in version control.
Usage
import { FileItem, FileUpload } from "@/components/ui/file-upload";
import * as React from "react";
export default function FileUploadExample() {
const [files, setFiles] = React.useState<FileItem[]>([]);
return (
<FileUpload
title="Upload a document" description=".pdf or .png" button
value={files}
onChange={setFiles}
/>
);
} Props API
| Prop | Type | Required | Description |
|---|---|---|---|
uploadSuccessMessage | string | No | |
formatErrorMessage | string | No | |
uploadButtonText | string | No | |
resetText | string | No | |
itemsName | string | No | |
value | FileItem[] | No | |
onChange | (files: FileItem[]) => void | No | |
button | boolean | No | |
multiple | boolean | No | |
onUpdated | (files: FileItem[]) => void | No | |
title | string | No | |
description | string | No | |
icon | IconName | No | |
accept | string | No | |
inputId | string | No | |
postAction | string | No |
Examples
Default
import { FileItem, FileUpload } from "@/components/ui/file-upload";
import * as React from "react";
export default function FileUploadExample() {
const [files, setFiles] = React.useState<FileItem[]>([]);
return (
<FileUpload
title="Upload a document" description=".pdf or .png" button
value={files}
onChange={setFiles}
/>
);
} Multiple
import { FileItem, FileUpload } from "@/components/ui/file-upload";
import * as React from "react";
export default function FileUploadExample() {
const [files, setFiles] = React.useState<FileItem[]>([]);
return (
<FileUpload
multiple
title="Upload documents"
description="Add one or more files"
value={files}
onChange={setFiles}
/>
);
} With File List
import { FileItem, FileUpload } from "@/components/ui/file-upload";
import * as React from "react";
export default function FileUploadExample() {
const [files, setFiles] = React.useState<FileItem[]>([
{ name: "report.pdf", size: 1240000, success: true },
{ name: "invoice.pdf", size: 320000, success: true },
]);
return (
<FileUpload
multiple
title="Upload documents"
description=".pdf only"
accept="pdf"
value={files}
onChange={setFiles}
/>
);
} Accept Types
import { FileItem, FileUpload } from "@/components/ui/file-upload";
import * as React from "react";
export default function FileUploadExample() {
const [files, setFiles] = React.useState<FileItem[]>([]);
return (
<FileUpload
title="Upload an image"
description="jpg, png or pdf"
accept="jpg,png,pdf"
value={files}
onChange={setFiles}
/>
);
} No Button
import { FileItem, FileUpload } from "@/components/ui/file-upload";
import * as React from "react";
export default function FileUploadExample() {
const [files, setFiles] = React.useState<FileItem[]>([]);
return (
<FileUpload
button={false}
title="Drag & drop a file"
description="or click to browse"
value={files}
onChange={setFiles}
/>
);
} API reference
Frontfriend-owned props. Native HTML and inherited primitive props remain documented by Base UI.
| Prop | Type | Default | Description |
|---|---|---|---|
accept | string | "" | Optional string |
button | boolean | true | Optional boolean |
description | string | — | Optional string |
formatErrorMessage | string | — | Optional string |
icon | IconName | — | Optional IconName |
inputId | string | — | Optional string |
itemsName | string | — | Optional string |
multiple | boolean | false | Optional boolean |
onChange | (files: FileItem[]) => void | — | Optional (files: FileItem[]) => void |
onUpdated | (files: FileItem[]) => void | — | Optional (files: FileItem[]) => void |
postAction | string | — | Optional string |
resetText | string | — | Optional string |
title | string | — | Optional string |
uploadButtonText | string | — | Optional string |
uploadSuccessMessage | string | — | Optional string |
value | FileItem[] | [] | Optional FileItem[] |
Configuration determines the actual classes and available styling hooks. See Theming & component configuration before introducing a repeated local override.