File Drop Zone

A drag-and-drop area for uploading files, with size and type validation.

<script lang="ts">
  import { FileDropZone } from "$lib/components/ui/file-drop-zone";
 
  let files = $state<string[]>([]);
</script>
 
<div class="flex w-full max-w-md flex-col gap-3">
  <FileDropZone
    accept="image/*"
    maxFiles={5}
    fileCount={files.length}
    maxFileSize={5 * 1024 * 1024}
    onUpload={(uploaded) => {
      files = [...files, ...uploaded.map((f) => f.name)];
    }}
  />
  {#if files.length}
    <ul class="flex flex-col gap-1 text-sm tracking-[-0.39px] text-(--text)/72">
      {#each files as name (name)}
        <li>{name}</li>
      {/each}
    </ul>
  {/if}
</div>

Installation

npx lily-svelte@latest add file-drop-zone

Usage

<script lang="ts">
	import { FileDropZone } from '$lib/components/ui/file-drop-zone';
 
	let files = $state<string[]>([]);
</script>
 
<FileDropZone
	accept="image/*"
	maxFiles={5}
	fileCount={files.length}
	maxFileSize={5 * 1024 * 1024}
	onUpload={(uploaded) => (files = [...files, ...uploaded.map((f) => f.name)])}
	onFileRejected={({ file, reason }) => console.warn(reason, file.name)}
/>

Props

  • accept — comma-separated list, e.g. "image/*,.pdf".
  • maxFiles / fileCount — limit the total number of files (pass the current count).
  • maxFileSize — maximum bytes per file.
  • onUpload(files) — receives the accepted files.
  • onFileRejected({ file, reason }) — called per rejected file.

Built by levish. The source code is available on GitHub.

Quiet by design.