FilePicker
FilePicker is a an input field for uploading files.
Basic
	
	
	Upload a profile picture
Drag & Drop your file
<script lang="ts">
   import { FilePicker } from 'stwui';
</script>
<FilePicker onDrop={(files) => console.log(files)}>
	<FilePicker.Icon slot="icon" data={cloud_upload} />
	<FilePicker.Title slot="title">Upload a profile picture</FilePicker.Title>
	<FilePicker.Description slot="description">Drag & Drop your file</FilePicker.Description>
</FilePicker>Complete
	
	
	Upload a profile picture
Drag & Drop your file
or
<script lang="ts">
	import { FilePicker } from 'stwui';
	function handleButtonClick(event: Event) {
		event.stopPropagation();
		console.log('Inner button clicked');
	}
</script>
<FilePicker onDrop={(files) => console.log(files)}>
	<FilePicker.Icon slot="icon" data={cloud_upload} />
	<FilePicker.Title slot="title">Upload a profile picture</FilePicker.Title>
	<FilePicker.Description slot="description">Drag & Drop your file</FilePicker.Description>
	<FilePicker.Divider slot="divider" class="mx-[20%]">
		<FilePicker.Divider.Label slot="label"><h4>or</h4></FilePicker.Divider.Label>
	</FilePicker.Divider>
	<FilePicker.Action slot="action">
		<Button type="primary" on:click={handleButtonClick}>Select from vault</Button>
	</FilePicker.Action>
</FilePicker>Multiple
	
	
	Upload multiple files
<script lang="ts">
   import { FilePicker } from 'stwui';
</script>
<FilePicker onDrop={(files) => console.log(files)} multiple>
	<FilePicker.Icon slot="icon" data={cloud_upload} />
	<FilePicker.Title slot="title">Upload multiple files</FilePicker.Title>
</FilePicker>Disabled
	
	
	<script lang="ts">
   import { FilePicker } from 'stwui';
</script>
<FilePicker onDrop={(files) => console.log(files)} disabled>
	<FilePicker.Icon slot="icon" data={cloud_upload} class="filter-gray-500" />
	<FilePicker.Title slot="title">Cannot upload anything here</FilePicker.Title>
</FilePicker>With FilePreview
	
	
	Upload multiple images
Drag & Drop an image to preview it
<script lang="ts">
	import { FilePicker, List, Button, Progress } from 'stwui';
	import { formatFileSize } from 'stwui/utils';
	import type { DropResult } from 'stwui/types';
	import { slide } from 'svelte/transition';
	
	interface ImageFile {
		file: File;
		src: string;
		progress: number | undefined;
	}
	let myFiles: ImageFile[] = [];
	let errors: string[] = [];
	function handleButtonClick(event: Event) {
		event.stopPropagation();
		console.log('Inner button clicked');
	}
	/* Push the files to the array with a preview URL */
	function onDrop(files: DropResult) {
		let newFiles = files.accepted.map((file) => ({
			file,
			src: URL.createObjectURL(file),
			progress: undefined
		}));
		myFiles = [...myFiles, ...newFiles];
		errors = files.rejected.map((file) => file.name);
	}
	/* Remove the file from the array if it exists */
	function removeFile(file: ImageFile) {
		URL.revokeObjectURL(file.src);
		myFiles = [
			...myFiles.slice(0, myFiles.indexOf(file)),
			...myFiles.slice(myFiles.indexOf(file) + 1)
		];
	}
	async function uploadFile(myFile: ImageFile){
		/* Your upload implementation */
	}
</script>
<FilePicker
	{onDrop}
	multiple
	accept="image/*"
	allowedExtensions={['png', 'jpg', 'jpeg', 'gif']}
>
	<FilePicker.Icon slot="icon" data={cloud_upload} />
	<FilePicker.Title slot="title">Upload multiple images</FilePicker.Title>
	<FilePicker.Description slot="description">Drag & Drop an image to preview it</FilePicker.Description>
</FilePicker>
{#if errors.length > 0}
	<span class="text-md text-danger">
		Error uploading the following files: {errors.join(', ')}
	</span>
{/if}
<List>
	{#each myFiles as myFile, index}
		{@const { file, src, progress } = myFile}
		<div transition:slide>
			<List.Item>
				<List.Item.Leading slot="leading">
					{#if file.type.startsWith('image/')}
						<List.Item.Leading.Avatar slot="avatar" {src} alt={file.name} />
					{/if}
				</List.Item.Leading>
				<List.Item.Content slot="content">
					<List.Item.Content.Title slot="title">{file.name}</List.Item.Content.Title>
					<List.Item.Content.Description slot="description" class="w-full">
						{#if progress != null}
							<Progress value={parseFloat(progress.toFixed(0))} displayValue />
						{:else}
							{formatFileSize(file.size)}
						{/if}
					</List.Item.Content.Description>
				</List.Item.Content>
				<List.Item.Extra slot="extra" placement="start">
					{#if progress === 100}
						<Button>
							<Button.Icon slot="icon" class="text-primary" data={check} />
						</Button>
					{:else}
						{#if progress == null}
							<Button on:click={() => uploadFile(myFile)}>
								<Button.Icon slot="icon" data={play} />
							</Button>
						{/if}
						<Button on:click={() => removeFile(myFile)}>
							<Button.Icon slot="icon" data={close} />
						</Button>
					{/if}
				</List.Item.Extra>
			</List.Item>
		</div>
	{/each}
</List>
{#if myFiles.length > 0}
	<div class="flex justify-end">
		<Button
			type="primary"
			loading={uploading}
			disabled={uploading}
			on:click={uploadAllFiles}
		>
			{uploading ? 'uploading ...' : 'Begin upload'}
		</Button>
	</div>
{/if}Implementation with animation
	
	
	<script lang="ts">
   import { FilePicker, Progress, Button } from 'stwui';
	let minFile: File | undefined;
	let minUploading: boolean = false;
	let minProgress: number | undefined = undefined;
	async function minimalisticDrop(files: DropResult) {
		if (!files.accepted.length) return;
		minUploading = true;
		minFile = files.accepted[0];
		/* TODO: Upload the file to your server*/
		minUploading = false;
	}
</script>
<div class="flex flex-col w-full justify-center items-center">
	{#if minUploading && minProgress != null}
		<span in:fade class="w-full flex justify-center items-center">
			<Progress value={parseFloat(minProgress.toPrecision(2))} radial />
		</span>
	{:else if !minUploading && minFile}
		<div class="flex items-center space-x-2">
			<h4 transition:slide><b>{minFile.name}</b> was uploaded successfully!</h4>
			<Button on:click={resetMinimalistic}>
				<Button.Icon slot="icon" data={close} />
			</Button>
		</div>
	{:else}
		<FilePicker
			class="w-1/4 aspect-square flex flex-col justify-center"
			onDrop={(files) => minimalisticDrop(files)}
		>
			<FilePicker.Icon slot="icon" data={cloud_upload} class="filter-gray-500" />
		</FilePicker>
	{/if}
</div>FilePicker Props
| name | string | |
| onDrop | function(files: DropResult) | |
| onEnter | function | null | null | 
| onLeave | function | null | null | 
| accept | string | undefined | undefined | 
| allowedExtensions | string[] | undefined | undefined | 
| maxFileSize | number | undefined | undefined | 
| multiple | boolean | false | 
| strict | boolean | false | 
| border | boolean | true | 
FilePicker Slots
| icon | <FilePicker.Icon slot="icon" /> | 
| title | <FilePicker.Title slot="title" /> | 
| description | <FilePicker.Description slot="description" /> | 
| divider | <FilePicker.Divider slot="divider" /> | 
| action | <FilePicker.Action slot="action" /> | 
FilePicker.Icon Props
| data | string (IconData) | |
| viewBox | string | 0 0 24 24 | 
| size | string | 24px | 
| width | string | 24px | 
| height | string | 24px | 
| color | string | currentColor | 
| stroke | string | undefined | |
| fill | string | currentColor | 
FilePicker.Title Slots
| default | 
FilePicker.Description Slots
| default | 
FilePicker.Divider Slots
| label | <FilePicker.Divider.Label slot="label"/> | 
| default | 
FilePicker.Divider Props
| position | 'left' | 'center' | 'right' | center | 
FilePicker.Divider.Label Slots
| default | 
FilePicker.Action Slots
| default | 
