Skip to content

← All components

Actions and forms

FileUpload

Native file picker with drag-and-drop selection and limits.

Live example

Usage

Each example includes the complete adapter-specific parameter reference. Copy it as a starting point, then remove options your use case does not need.

React

tsx
import { FileUpload } from "@cofob/design-system-react";

/**
 * Complete FileUpload parameter reference.
 * @param files/defaultFiles
 *   type: readonly File[]; controlled or initial selection
 *   default: []
 *   example: {filesOrdefaultFiles}
 * @param label
 *   type: string | renderable content
 *   required
 *   example: "Accessible label"
 * @param name
 *   type: string
 *   default: —
 *   example: "Ada Lovelace"
 * @param accept
 *   type: native file accept string
 *   default: —
 *   example: {accept}
 * @param multiple
 *   type: boolean
 *   default: false
 *   example: true
 * @param disabled
 *   type: boolean
 *   default: false
 *   example: {disabled}
 * @param required
 *   type: boolean
 *   default: false
 *   example: true
 * @param maxFiles
 *   type: number
 *   default: —
 *   example: {maxFiles}
 * @param maxSize
 *   type: number (bytes)
 *   default: —
 *   example: {maxSize}
 * @param prompt
 *   type: string
 *   default: "Choose files or drag them here"
 *   example: "$"
 * @param hint
 *   type: adapter-specific
 *   default: —
 *   example: {hint}
 * @param removeLabel
 *   type: (file: File) => string
 *   default: —
 *   example: "Accessible label"
 * @param onFilesChange
 *   type: (files: readonly File[]) => void
 *   default: —
 *   example: {handleFilesChange}
 * @param root/input attributes
 *   type: native element attributes
 *   default: —
 *   example: class / style / aria-* / data-*
 */
export function FileUploadExample() {
  return (
    <FileUpload label="Attachments" multiple />
  );
}

Svelte

svelte
<script lang="ts">
  import { FileUpload } from "@cofob/design-system-svelte";

  // Complete FileUpload parameter reference.
  // files/defaultFiles
  //   type: readonly File[]; controlled or initial selection
  //   default: []
  //   example: {filesOrdefaultFiles}
  // label
  //   type: string | renderable content
  //   required
  //   example: "Accessible label"
  // name
  //   type: string
  //   default: —
  //   example: "Ada Lovelace"
  // accept
  //   type: native file accept string
  //   default: —
  //   example: {accept}
  // multiple
  //   type: boolean
  //   default: false
  //   example: true
  // disabled
  //   type: boolean
  //   default: false
  //   example: {disabled}
  // required
  //   type: boolean
  //   default: false
  //   example: true
  // maxFiles
  //   type: number
  //   default: —
  //   example: {maxFiles}
  // maxSize
  //   type: number (bytes)
  //   default: —
  //   example: {maxSize}
  // prompt
  //   type: string
  //   default: "Choose files or drag them here"
  //   example: "$"
  // hint
  //   type: adapter-specific
  //   default: —
  //   example: {hint}
  // removeLabel
  //   type: (file: File) => string
  //   default: —
  //   example: "Accessible label"
  // onFilesChange
  //   type: (files: readonly File[]) => void
  //   default: —
  //   example: {handleFilesChange}
  // root/input attributes
  //   type: native element attributes
  //   default: —
  //   example: class / style / aria-* / data-*
</script>

<FileUpload label="Attachments" multiple bind:files />

HTML

html
<!--
  Complete FileUpload parameter reference.
  files/defaultFiles
    type: readonly File[]; controlled or initial selection
    default: []
    example: {filesOrdefaultFiles}
  label
    type: string | renderable content
    required
    example: "Accessible label"
  name
    type: string
    default: —
    example: "Ada Lovelace"
  accept
    type: native file accept string
    default: —
    example: {accept}
  multiple
    type: boolean
    default: false
    example: true
  disabled
    type: boolean
    default: false
    example: {disabled}
  required
    type: boolean
    default: false
    example: true
  maxFiles
    type: number
    default: —
    example: {maxFiles}
  maxSize
    type: number (bytes)
    default: —
    example: {maxSize}
  prompt
    type: string
    default: "Choose files or drag them here"
    example: "$"
  hint
    type: adapter-specific
    default: —
    example: {hint}
  removeLabel
    type: (file: File) => string
    default: —
    example: "Accessible label"
  onFilesChange
    type: (files: readonly File[]) => void
    default: —
    example: {handleFilesChange}
  root/input attributes
    type: native element attributes
    default: —
    example: class / style / aria-* / data-*
-->
<label class="cf-file-upload__dropzone"><input type="file" multiple />Choose files</label>

<script type="module">
  import { initDesignSystem } from "@cofob/design-system-css";

  const designSystem = initDesignSystem(document);
  window.addEventListener("pagehide", () => designSystem.destroy(), { once: true });
</script>

Parameters

Adapter differences are explicit. Native element attributes are forwarded in React and Svelte and can be written directly in HTML.

ParameterTypeDefaultAdaptersExampleDescription
files/defaultFilesreadonly File[]; controlled or initial selection[]React · Svelte · HTML{filesOrdefaultFiles}Controls or initializes the selected File records.
labelrequiredstring | renderable contentrequiredReact · Svelte · HTML"Accessible label"Visible or accessible name, depending on the component.
namestringReact · Svelte · HTML"Ada Lovelace"Identifies a native form field or named entity, depending on the component.
acceptnative file accept stringReact · Svelte · HTML{accept}Filters selectable files using native MIME types or file extensions.
multiplebooleanfalseReact · Svelte · HTMLtrueAllows more than one accordion item to stay open.
disabledbooleanfalseReact · Svelte · HTML{disabled}Prevents user interaction while preserving visible context.
requiredbooleanfalseReact · Svelte · HTMLtrueMarks the label and control as required.
maxFilesnumberReact · Svelte · HTML{maxFiles}Maximum number of files retained in the selection.
maxSizenumber (bytes)React · Svelte · HTML{maxSize}Rejects individual files larger than this byte count.
promptstring"Choose files or drag them here"React · Svelte · HTML"$"Primary instruction content; terminal prompts are visual and excluded from copied command text.
hintadapter-specificReact · Svelte · HTML{hint}Configures hint.
removeLabel(file: File) => stringReact · Svelte · HTML"Accessible label"Accessible name for a remove action; FileUpload can derive it from each file.
onFilesChange(files: readonly File[]) => voidReact · Svelte · HTML{handleFilesChange}Reports the complete accepted file selection after add or remove.
root/input attributesnative element attributesReact · Svelte · HTMLclass / style / aria-* / data-*Forwards native class/style, accessibility, event, and data attributes to the root element.