2023-09-25 02:13:24 +02:00
|
|
|
<script lang="ts">
|
2023-09-28 23:50:27 +02:00
|
|
|
import { createEventDispatcher } from "svelte"
|
|
|
|
import { twMerge } from "tailwind-merge"
|
2023-09-25 02:13:24 +02:00
|
|
|
|
2023-09-28 23:50:27 +02:00
|
|
|
export let accept: string
|
|
|
|
export let multiple: boolean = true
|
2023-09-25 02:13:24 +02:00
|
|
|
|
2023-09-28 23:50:27 +02:00
|
|
|
const dispatcher = createEventDispatcher<{ submit: FileList }>()
|
|
|
|
export let cls: string = ""
|
|
|
|
let drawAttention = false
|
|
|
|
let inputElement: HTMLInputElement
|
|
|
|
let id = Math.random() * 1000000000 + ""
|
2023-09-25 02:13:24 +02:00
|
|
|
</script>
|
|
|
|
|
2023-10-16 14:27:05 +02:00
|
|
|
<form
|
|
|
|
on:change|preventDefault={() => {
|
|
|
|
drawAttention = false
|
|
|
|
dispatcher("submit", inputElement.files)
|
|
|
|
}}
|
|
|
|
on:dragend={() => {
|
|
|
|
console.log("Drag end")
|
|
|
|
drawAttention = false
|
|
|
|
}}
|
|
|
|
on:dragenter|preventDefault|stopPropagation={(e) => {
|
|
|
|
console.log("Dragging enter")
|
|
|
|
drawAttention = true
|
|
|
|
e.dataTransfer.drop = "copy"
|
|
|
|
}}
|
|
|
|
on:dragstart={() => {
|
|
|
|
console.log("DragStart")
|
|
|
|
drawAttention = false
|
|
|
|
}}
|
|
|
|
on:drop|preventDefault|stopPropagation={(e) => {
|
|
|
|
console.log("Got a 'drop'")
|
|
|
|
drawAttention = false
|
|
|
|
dispatcher("submit", e.dataTransfer.files)
|
|
|
|
}}
|
|
|
|
>
|
2023-12-19 22:08:00 +01:00
|
|
|
<label
|
|
|
|
class={twMerge(cls, drawAttention ? "glowing-shadow" : "")}
|
|
|
|
tabindex="0"
|
|
|
|
for={"fileinput" + id}
|
|
|
|
on:click={() => {
|
|
|
|
console.log("Clicked", inputElement)
|
|
|
|
inputElement.click()
|
|
|
|
}}
|
|
|
|
>
|
2023-10-09 01:53:27 +02:00
|
|
|
<slot />
|
|
|
|
</label>
|
|
|
|
<input
|
|
|
|
{accept}
|
|
|
|
bind:this={inputElement}
|
|
|
|
class="hidden"
|
|
|
|
id={"fileinput" + id}
|
|
|
|
{multiple}
|
|
|
|
name="file-input"
|
2023-09-28 23:50:27 +02:00
|
|
|
type="file"
|
|
|
|
/>
|
2023-09-25 02:13:24 +02:00
|
|
|
</form>
|