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>