aboutsummaryrefslogtreecommitdiff
path: root/src/routes/index.svelte
blob: 7d5a3ff48c6f98a73abeb074cb28dc007fa876c4 (plain)
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
71
72
73
74
75
76
77
78
79
80
81
82
<script>

  import { browser } from '$app/env';
  import Background from '$lib/components/background.svelte';
  import Palette from '$lib/components/palette.svelte';
  import Hud from '$lib/components/hud.svelte';

  const kCoordinateLength = 6;
  const kMaxSize = Math.pow(16, kCoordinateLength);

  $: x = 0;
  $: y = 0;
  $: shouldShowPalette = false;

  let dragging = false;

  const modulo = function modulo (number, base) {
    return ((number % base) + base) % base
  };

  const moveCanvas = function moveCanvas(event) {

    if (dragging) {
      let deltaX = event.x - dragging.x;
      let deltaY = event.y - dragging.y;
      x = modulo(x - deltaX, kMaxSize);
      y = modulo(y - deltaY, kMaxSize);
      dragging.x = event.x;
      dragging.y = event.y;
    }
  }

  const startDragging = function startDragging(event) {
    dragging = {
      x: event.x,
      y: event.y
    };
  }

  const stopDragging = function startDragging() {
    dragging = null;
  }

  const showPalette = function showPalette(event) {
    event.preventDefault();
    dragging = null;
    document.documentElement.style.setProperty('--palette-x', event.clientX + 'px');
    document.documentElement.style.setProperty('--palette-y', event.clientY + 'px');
    shouldShowPalette = true;
  }

  const hidePalette = function hidePalette() {
    event.preventDefault();
    shouldShowPalette = false;
  }
</script>

<div
  class="canvas"
  on:click={hidePalette}
  on:contextmenu={showPalette}
  on:mousedown={startDragging}
  on:mouseup={stopDragging}
  on:mousemove={moveCanvas}>
>
  <Background x={x} y={y}/>
  <Hud x={x} y={y} />

  {#if shouldShowPalette }
    <Palette/>
  {/if}
</div>

<style>
  .canvas {
    user-select: none;
    padding: 0;
    margin: 0;
    width: 100vw;
    height: 100vh;
  }
</style>