Kobalte.v0.13.9

File Field

A file input to upload multiple files, with ability to drag and drop files.

Import

ts
import { FileField } from "@kobalte/core/file-field";
// or
import { Root } from "@kobalte/core/file-field";
ts
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.Preview: 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.
tsx
<FileField>
<FileField.Label />
<FileField.Dropzone>
<FileField.Trigger />
</FileField.Dropzone>
<FileField.HiddenInput />
<FileField.ItemList>
<FileField.Item>
<FileField.ItemPreview />
<FileField.ItemPreviewImage />
<FileField.ItemSize />
<FileField.ItemName />
<FileField.ItemDeleteTrigger />
</FileField.Item>
</FileField.ItemList>
<FileField.Description />
<FileField.ErrorMessage />
</FileField>
tsx
<FileField>
<FileField.Label />
<FileField.Dropzone>
<FileField.Trigger />
</FileField.Dropzone>
<FileField.HiddenInput />
<FileField.ItemList>
<FileField.Item>
<FileField.ItemPreview />
<FileField.ItemPreviewImage />
<FileField.ItemSize />
<FileField.ItemName />
<FileField.ItemDeleteTrigger />
</FileField.Item>
</FileField.ItemList>
<FileField.Description />
<FileField.ErrorMessage />
</FileField>

Example

Drop your files here...

    Usage

    HTML forms

    By passing name prop to FileField.HiddenInput, you can use FileField in HTML forms.

    Drop your files here...
      tsx
      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 (
      <form ref={formRef} onSubmit={onSubmit}>
      <FileField
      multiple
      maxFiles={5}
      onFileAccept={data => console.log("data", data)}
      onFileReject={data => console.log("data", data)}
      onFileChange={data => console.log("data", data)}
      >
      <FileField.Label>File Field</FileField.Label>
      <FileField.Dropzone>
      Drop your files here...
      <FileField.Trigger>Choose files!</FileField.Trigger>
      </FileField.Dropzone>
      <FileField.HiddenInput name="uploaded-files" />
      <FileField.ItemList>
      {file => (
      <FileField.Item>
      <FileField.ItemPreviewImage class={"FileField__itemPreviewImage"} />
      <FileField.ItemName />
      <FileField.ItemSize />
      <FileField.ItemDeleteTrigger>Delete</FileField.ItemDeleteTrigger>
      </FileField.Item>
      )}
      </FileField.ItemList>
      </FileField>
      <div>
      <button type="reset">Reset</button>
      <button type="submit">Submit</button>
      </div>
      </form>
      );
      }
      tsx
      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 (
      <form ref={formRef} onSubmit={onSubmit}>
      <FileField
      multiple
      maxFiles={5}
      onFileAccept={data => console.log("data", data)}
      onFileReject={data => console.log("data", data)}
      onFileChange={data => console.log("data", data)}
      >
      <FileField.Label>File Field</FileField.Label>
      <FileField.Dropzone>
      Drop your files here...
      <FileField.Trigger>Choose files!</FileField.Trigger>
      </FileField.Dropzone>
      <FileField.HiddenInput name="uploaded-files" />
      <FileField.ItemList>
      {file => (
      <FileField.Item>
      <FileField.ItemPreviewImage class={"FileField__itemPreviewImage"} />
      <FileField.ItemName />
      <FileField.ItemSize />
      <FileField.ItemDeleteTrigger>Delete</FileField.ItemDeleteTrigger>
      </FileField.Item>
      )}
      </FileField.ItemList>
      </FileField>
      <div>
      <button type="reset">Reset</button>
      <button type="submit">Submit</button>
      </div>
      </form>
      );
      }

      API Reference

      FileField

      FileField is equivalent to the Root import from @kobalte/core/file-field.

      PropDescription
      multipleboolean
      Allows multiple files to be uploaded
      maxFilesnumber
      The maximum number of files that can be uploaded
      disabledboolean
      Disables the file upload component
      acceptstring | string[] | undefined
      The types of files that can be uploaded.
      allowDragAndDropboolean
      Allows files to be dragged and dropped into the component.
      maxFileSizenumber
      The maximum size of the file that can be uploaded in bytes.
      minFileSizenumber
      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 attributeDescription
      data-validPresent when the slider is valid according to the validation rules.
      data-invalidPresent when the slider is invalid according to the validation rules.
      data-requiredPresent when the user must slider an item before the owning form can be submitted.
      data-disabledPresent when the slider is disabled.
      data-readonlyPresent when the slider is read only.

      Slider.Trigger shares the same data-attributes.

      FileField.Item

      PropDescription
      fileFile
      Selected file object

      FileField.ItemSize

      PropDescription
      precisionnumber
      The number of decimal places to round the file size to.

      FileField.ItemPreview

      PropDescription
      typestring
      The type of file to preview, only applicable for Images.

      Rendered elements

      ComponentDefault rendered element
      FileFielddiv
      FileField.Dropzonediv
      FileField.Triggerbutton
      FileField.Labellabel
      FileField.HiddenInputinput
      FileField.ItemListul
      FileField.Itemli
      FileField.Previewdiv
      FileField.ItemPreviewImageimg
      FileField.ItemNamespan
      FileField.ItemSizespan
      FileField.ItemDeleteTriggerbutton
      FileField.Descriptiondiv
      FileField.ErrorMessagediv

      Accessibility

      Keyboard Interactions

      KeyDescription
      SpaceWhen focus is on dropzone, opens the file dialog.
      When focus is on trigger, opens the file dialog.
      EnterWhen focus is on dropzone, opens the file dialog.
      When focus is on trigger, opens the file dialog.