# File Field
A file input to upload multiple files, with ability to drag and drop files.
## Import
```
Copyts
import { FileField } from "@kobalte/core/file-field";
// or
import { Root } from "@kobalte/core/file-field";
```
```
Copyts
import { FileField } from "@kobalte/core/file-field";
// or
import { Root } from "@kobalte/core/file-field";
```
## Features
- Supports uploading multiple files at once.
- Supports drag and drop functionality for uploading files.
- Supports maximum file limits to restrict the number of files that can be uploaded.
- Supports file size validation to ensure that files are within the specified size limits.
- Supports custom validation rules for uploaded files.
- Supports restricting the types of files that can be uploaded (e.g., images, documents).
- Displays a list of files that have been selected for upload.
- Allows users to remove files from the upload list before uploading.
- Provides a preview of image files before they are uploaded.
- Displays the size of each file in the upload list.
- Supports customizing the components with custom styles and classes.
## Anatomy
The File Field consists of:
- **FileField**: The root container for the File Field component.
- **FileField.Dropzone**: The dropzone area where files can be dragged and dropped.
- **FileField.Trigger**: The trigger element that opens the file selection dialog.
- **FileField.Label**: The label for the File Field component to toggle the file selection dialog.
- **FileField.HiddenInput**: The hidden input element that triggers the file selection dialog.
- **FileField.ItemList**: The container for the list of files that have been selected for upload.
- **FileField.Item**: The individual file item in the list of files that have been selected for upload.
- **FileField.ItemPreview**: The preview for matching file types that have been selected for upload.
- **FileField.ItemPreviewImage**: The preview image for image files that have been selected for upload.
- **FileField.ItemName**: The name of the file that has been selected for upload.
- **FileField.ItemSize**: The size of the file that has been selected for upload.
- **FileField.ItemDeleteTrigger**: The trigger element to remove a file from the list of files that have been selected for upload.
- **FileField.Description**: The description that gives the user more information on the file field.
- **FileField.ErrorMessage**: The error message that gives the user information about how to fix a validation error on the file field.
```
Copytsx
```
```
Copytsx
```
## Example
File Upload
Drop your files here...Choose files!
index.tsxstyle.css
```
Copytsx
import { FileField } from "@kobalte/core/file-field";
import "./style.css";
function App() {
return (
console.log("data", data)}
onFileReject={(data) => console.log("data", data)}
onFileChange={(data) => console.log("data", data)}
>
File Field
Drop your files here...
Choose files!
{(file) => (
Delete
)}
);
}
```
```
Copytsx
import { FileField } from "@kobalte/core/file-field";
import "./style.css";
function App() {
return (
console.log("data", data)}
onFileReject={(data) => console.log("data", data)}
onFileChange={(data) => console.log("data", data)}
>
File Field
Drop your files here...
Choose files!
{(file) => (
Delete
)}
);
}
```
## Usage
### HTML forms
By passing name prop to FileField.HiddenInput, you can use FileField in HTML forms.
File Upload
Drop your files here...Choose files!
Submit Files
```
Copytsx
function HTMLFormExample() {
let formRef: HTMLFormElement | undefined;
const onSubmit = (e: SubmitEvent) => {
// handle form submission.
const formData = new FormData(formRef);
const uploadedFiles = formData.getAll("uploaded-files");
};
return (
);
}
```
```
Copytsx
function HTMLFormExample() {
let formRef: HTMLFormElement | undefined;
const onSubmit = (e: SubmitEvent) => {
// handle form submission.
const formData = new FormData(formRef);
const uploadedFiles = formData.getAll("uploaded-files");
};
return (
);
}
```
## API Reference
### FileField
`FileField` is equivalent to the `Root` import from `@kobalte/core/file-field`.
| Prop | Description |
| --- | --- |
| `multiple` | `boolean`
Allows multiple files to be uploaded |
| `maxFiles` | `number`
The maximum number of files that can be uploaded |
| `disabled` | `boolean`
Disables the file upload component |
| `accept` | `string | string[] | undefined`
The types of files that can be uploaded. |
| `allowDragAndDrop` | `boolean`
Allows files to be dragged and dropped into the component. |
| `maxFileSize` | `number`
The maximum size of the file that can be uploaded in bytes. |
| `minFileSize` | `number`
The minimum size of the file that can be uploaded in bytes. |
| `onFileAccept` | `(files: File[]) => void`
Callback function that is called when file(s) is(are) accepted. |
| `onFileReject` | `(files: FileRejection[]) => void`
Callback function that is called when a file(s) is(are) rejected. |
| `onFileChange` | `(details: Details) => void`
Callback function that is called when the list of files changes. |
| `validateFile` | `(file: File) => FileError[] | null`
Custom validation function for files. |
| Data attribute | Description |
| --- | --- |
| data-valid | Present when the slider is valid according to the validation rules. |
| data-invalid | Present when the slider is invalid according to the validation rules. |
| data-required | Present when the user must slider an item before the owning form can be submitted. |
| data-disabled | Present when the slider is disabled. |
| data-readonly | Present when the slider is read only. |
`Slider.Trigger` shares the same data-attributes.
### FileField.Item
| Prop | Description |
| --- | --- |
| `file` | `File`
Selected file object |
### FileField.ItemSize
| Prop | Description |
| --- | --- |
| `precision` | `number`
The number of decimal places to round the file size to. |
### FileField.ItemPreview
| Prop | Description |
| --- | --- |
| `type` | `string`
The type of file to preview, only applicable for Images. |
## Rendered elements
| Component | Default rendered element |
| --- | --- |
| `FileField` | `div` |
| `FileField.Dropzone` | `div` |
| `FileField.Trigger` | `button` |
| `FileField.Label` | `label` |
| `FileField.HiddenInput` | `input` |
| `FileField.ItemList` | `ul` |
| `FileField.Item` | `li` |
| `FileField.ItemPreview` | `div` |
| `FileField.ItemPreviewImage` | `img` |
| `FileField.ItemName` | `span` |
| `FileField.ItemSize` | `span` |
| `FileField.ItemDeleteTrigger` | `button` |
| `FileField.Description` | `div` |
| `FileField.ErrorMessage` | `div` |
## Accessibility
### Keyboard Interactions
| Key | Description |
| --- | --- |
| `Space` | When focus is on dropzone, opens the file dialog.
When focus is on trigger, opens the file dialog. |
| `Enter` | When focus is on dropzone, opens the file dialog.
When focus is on trigger, opens the file dialog. |
Previous[←Dropdown Menu](https://kobalte.dev/docs/core/components/dropdown-menu)Next[Hover Card→](https://kobalte.dev/docs/core/components/hover-card)