Skip to content

File Upload

Drag-and-drop file upload. The accepted-file list is dynamic, so you provide an <template> for one item and stimulus-zag stamps one out per file.

Drag files here, or
    html
    <div
      data-controller="zag-file-upload"
      data-part="root"
      data-zag-file-upload-max-files-value="5"
      class="max-w-md space-y-3"
    >
      <div
        data-part="dropzone"
        class="border-input text-muted-foreground hover:border-primary data-[dragging]:border-primary data-[dragging]:bg-primary/10 cursor-pointer rounded-lg border-2 border-dashed p-6 text-center text-sm"
      >
        Drag files here, or
        <button data-part="trigger" class="text-primary font-medium hover:underline">browse</button>
      </div>
      <input data-part="hidden-input" class="sr-only" />
      <ul data-part="item-group" class="space-y-1"></ul>
      <template data-zag-file-upload-target="itemTemplate">
        <li
          data-part="item"
          class="border-border flex items-center justify-between rounded border px-3 py-2 text-sm"
        >
          <span data-part="item-name" class="font-medium"></span>
          <span class="flex items-center gap-2">
            <span data-part="item-size-text" class="text-muted-foreground text-xs"></span>
            <button
              data-part="item-delete-trigger"
              class="text-muted-foreground hover:text-destructive"
              aria-label="Remove"
            >
              ×
            </button>
          </span>
        </li>
      </template>
    </div>

    Parts

    root, label, dropzone, trigger, clear-trigger, hidden-input, item-group, item, item-name, item-size-text, item-preview, item-delete-trigger.

    Values

    AttributeTypeDefaultDescription
    data-zag-file-upload-accept-valueString""Accepted MIME types / extensions.
    data-zag-file-upload-max-files-valueNumber1Maximum number of files.
    data-zag-file-upload-max-file-size-valueNumber0Max file size in bytes (0 = none).
    data-zag-file-upload-directory-valueBooleanfalseAllow directory selection.
    data-zag-file-upload-name-valueString""name for form submission.
    data-zag-file-upload-disabled-valueBooleanfalseDisable uploads.
    data-zag-file-upload-required-valueBooleanfalseMark required.

    Events

    Emits zag-file-upload:change ({ acceptedFiles, rejectedFiles }) and :reject.

    Programmatic control

    files (getter), setFiles(File[]), clear(), open().