upend/webui/src/lib/components/DropPasteHandler.svelte

89 lines
1.6 KiB
Svelte

<script lang="ts">
import { addEmitter } from './AddModal.svelte';
import Icon from './utils/Icon.svelte';
let dragging = false;
function onDrop(ev: DragEvent) {
if (ev.dataTransfer?.files.length) {
addEmitter.emit('files', Array.from(ev.dataTransfer?.files || []));
} // TODO: else check for URLs
dragging = false;
}
function onDragEnter() {
// noop
}
function onDragOver(ev: DragEvent) {
if (Array.from(ev.dataTransfer?.items || []).some((it) => it.kind === 'file')) {
dragging = true;
}
}
function onDragLeave() {
dragging = false;
}
function onPaste(ev: ClipboardEvent) {
if (ev.clipboardData?.files.length) {
addEmitter.emit('files', Array.from(ev.clipboardData?.files || []));
} // TODO: else check for URLs
}
</script>
<svelte:body
on:dragenter|preventDefault={onDragEnter}
on:dragover|preventDefault={onDragOver}
on:dragleave|preventDefault={onDragLeave}
on:drop|preventDefault={onDrop}
on:paste={onPaste}
/>
<div class="dropindicator" class:dragging>
<div class="content">
<div class="icon">
<Icon name="current-location" />
</div>
<p>Drop an URL, an image or a file here!</p>
</div>
</div>
<style>
.dropindicator {
position: absolute;
left: 0;
top: 0;
width: 100vw;
height: 100vh;
background: rgba(0, 0, 0, 0.75);
display: none;
}
.dragging {
display: unset;
}
.content {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
background: rgba(0, 0, 0, 0.9);
color: var(--foreground);
border: solid 0.25em var(--foreground);
border-radius: 0.5em;
padding: 1.5em;
text-align: center;
font-size: 32px;
}
.icon {
font-size: 128px;
}
</style>