From d1d654ebac2d51e3841675faeb56480e440f622f Mon Sep 17 00:00:00 2001
From: Wolfgang Müller
Date: Tue, 5 Mar 2024 18:08:09 +0100
Subject: Initial commit

---
 frontend/src/lib/selection/Selectable.svelte       | 24 +++++++++++++++
 frontend/src/lib/selection/SelectionOverlay.svelte | 34 ++++++++++++++++++++++
 2 files changed, 58 insertions(+)
 create mode 100644 frontend/src/lib/selection/Selectable.svelte
 create mode 100644 frontend/src/lib/selection/SelectionOverlay.svelte

(limited to 'frontend/src/lib/selection')

diff --git a/frontend/src/lib/selection/Selectable.svelte b/frontend/src/lib/selection/Selectable.svelte
new file mode 100644
index 0000000..48b6ac7
--- /dev/null
+++ b/frontend/src/lib/selection/Selectable.svelte
@@ -0,0 +1,24 @@
+<script lang="ts">
+	import { getSelectionContext } from '$lib/Selection';
+
+	export let id: number;
+	export let index: number;
+
+	export let edit: ((id: number) => void) | undefined = undefined;
+
+	const selection = getSelectionContext();
+
+	$: selected = $selection.contains(id);
+
+	const handle = (event: MouseEvent) => {
+		if ($selection.active) {
+			$selection = $selection.update(index, event.shiftKey);
+			event.preventDefault();
+		} else if (edit) {
+			edit(id);
+			event.preventDefault();
+		}
+	};
+</script>
+
+<slot {handle} {selected} />
diff --git a/frontend/src/lib/selection/SelectionOverlay.svelte b/frontend/src/lib/selection/SelectionOverlay.svelte
new file mode 100644
index 0000000..04ff382
--- /dev/null
+++ b/frontend/src/lib/selection/SelectionOverlay.svelte
@@ -0,0 +1,34 @@
+<script lang="ts">
+	export let selected: boolean;
+	export let position: 'top' | 'right' | 'left' | 'bottom';
+	export let centered = false;
+</script>
+
+{#if selected}
+	<div
+		class:items-center={centered}
+		class="{position} pointer-events-none absolute z-[1] flex bg-emerald-700/95"
+	>
+		<span class="icon-base icon-[material-symbols--check] text-[2rem]" />
+	</div>
+{/if}
+
+<style lang="postcss">
+	.top,
+	.bottom {
+		width: 100%;
+	}
+
+	.left,
+	.right {
+		height: 100%;
+	}
+
+	.bottom {
+		bottom: 0;
+	}
+
+	.right {
+		right: 0;
+	}
+</style>
-- 
cgit v1.2.3-2-gb3c3