File size: 1,712 Bytes
ce29375 a92c5da ce29375 21805fd ce29375 cf7c859 ce29375 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
<script lang="ts">
import type { PicletInstance } from '$lib/db/schema';
import PicletCard from './PicletCard.svelte';
interface Props {
instance: PicletInstance;
size?: number;
onDragStart?: (instance: PicletInstance) => void;
onDragEnd?: () => void;
onClick?: () => void;
}
let { instance, size = 100, onDragStart, onDragEnd, onClick }: Props = $props();
let isDragging = $state(false);
function handleDragStart(e: DragEvent) {
isDragging = true;
// Set drag data
e.dataTransfer!.effectAllowed = 'move';
e.dataTransfer!.setData('application/json', JSON.stringify({
instanceId: instance.id,
fromRoster: instance.isInRoster,
fromPosition: instance.rosterPosition
}));
// Create a custom drag image
const dragImage = e.currentTarget as HTMLElement;
const clone = dragImage.cloneNode(true) as HTMLElement;
clone.style.transform = 'scale(1.1)';
clone.style.opacity = '0.8';
document.body.appendChild(clone);
e.dataTransfer!.setDragImage(clone, size / 2, size / 2);
setTimeout(() => document.body.removeChild(clone), 0);
onDragStart?.(instance);
}
function handleDragEnd() {
isDragging = false;
onDragEnd?.();
}
</script>
<div
draggable="true"
ondragstart={handleDragStart}
ondragend={handleDragEnd}
class="draggable-wrapper"
class:dragging={isDragging}
role="button"
tabindex="0"
>
<PicletCard piclet={instance} {size} {onClick} />
</div>
<style>
.draggable-wrapper {
cursor: move;
}
.draggable-wrapper.dragging {
opacity: 0.5;
}
.draggable-wrapper.dragging :global(.piclet-card) {
transform: scale(0.9);
}
</style> |