File size: 1,506 Bytes
66ed450
304976c
 
66ed450
 
 
 
32561d8
423b87b
d11af81
7d4e291
dc37474
8239db2
7cb7420
e5b9b7e
 
7cb7420
66ed450
 
 
8239db2
dc37474
 
d11af81
304976c
d11af81
8239db2
 
 
d11af81
d2b90f4
8239db2
 
 
 
 
 
304976c
 
8239db2
304976c
66ed450
 
 
7d4e291
66ed450
 
d2b90f4
d11af81
d2b90f4
 
66ed450
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
<script lang="ts">
	import LoadingIcon from '$lib/LoadingIcon.svelte';

	import type { ZoomTransform } from 'd3-zoom';

	export let transform: ZoomTransform;
	export let color = '';
	export let position = { x: 0, y: 0 };
	export let prompt = '';
	export let loadingState = '';
	export let interactive = false;
	export let isDragging = false;
	export let isLoading = false;
	$: coord = {
		x: transform.applyX(position.x),
		y: transform.applyY(position.y)
	};
</script>

<div
	class="frame z-0 relative grid grid-cols-3 grid-rows-3
	{!interactive ? 'pointer-events-none touch-none' : ''}
	{isDragging ? 'cursor-grabbing' : 'cursor-grab'}"
	style={`transform: translateX(${coord.x}px) translateY(${coord.y}px) scale(${transform.k}); border-color: ${color};`}
>
	{#if loadingState}
		<div class="col-span-2 row-start-1">
			<span class="text-white drop-shadow-lg">{loadingState}</span>
		</div>
	{/if}
	<div class="small-frame z-0 flex relative" />
	{#if isLoading}
		<div class="col-start-2 row-start-2">
			<LoadingIcon />
		</div>
	{/if}

	<h2 class="text-lg">Click to paint</h2>

	<div class="absolute bottom-0 font-bold text-lg">{prompt}</div>
</div>

<style lang="postcss" scoped>
	.frame {
		@apply absolute top-0 left-0 border-2 border-spacing-3 border-sky-500 w-[512px] h-[512px];
		transform-origin: 0 0;
	}
	.small-frame {
		@apply pointer-events-none touch-none absolute top-1/2 left-1/2 border-2 border-spacing-3  w-[256px] h-[256px];
		transform: translateX(-50%) translateY(-50%);
	}
</style>