summaryrefslogtreecommitdiffstatshomepage
path: root/frontend/src/lib/tabs/Tabs.svelte
diff options
context:
space:
mode:
authorWolfgang Müller2025-02-13 17:52:16 +0100
committerWolfgang Müller2025-02-13 17:52:16 +0100
commitdc4db405d2991d3ec6a114f3b08d3fccd057d3ee (patch)
tree2c620c9af2062ba09fa591f8b3ed961664adab58 /frontend/src/lib/tabs/Tabs.svelte
parent4df870d793123be95c8af031a340a39b5b8402ac (diff)
downloadhircine-dc4db405d2991d3ec6a114f3b08d3fccd057d3ee.tar.gz
frontend: Migrate to Svelte 5
Diffstat (limited to 'frontend/src/lib/tabs/Tabs.svelte')
-rw-r--r--frontend/src/lib/tabs/Tabs.svelte38
1 files changed, 30 insertions, 8 deletions
diff --git a/frontend/src/lib/tabs/Tabs.svelte b/frontend/src/lib/tabs/Tabs.svelte
index fd5d08e..1ae7c32 100644
--- a/frontend/src/lib/tabs/Tabs.svelte
+++ b/frontend/src/lib/tabs/Tabs.svelte
@@ -1,28 +1,50 @@
+<script lang="ts" module>
+ import { getContext, setContext } from 'svelte';
+
+ type Tab = string;
+ type Tabs = Record<Tab, { title: string }>;
+
+ class TabContext {
+ tabs: Tabs = $state({});
+ current: Tab = $state('');
+ }
+
+ export function getTabContext() {
+ return getContext<TabContext>('tabs');
+ }
+
+ function initTabContext() {
+ return setContext('tabs', new TabContext());
+ }
+</script>
+
<script lang="ts">
- import { getTabContext } from '$lib/Tabs';
import { fadeFast } from '$lib/Transitions';
+ import type { Snippet } from 'svelte';
import { fade } from 'svelte/transition';
- const context = getTabContext();
+ let { badges = {}, children }: { badges?: Record<Tab, boolean>; children?: Snippet } = $props();
+
+ const context = initTabContext();
</script>
<div class="flex h-full max-h-full flex-col">
<nav>
<ul class="me-3 ms-1 flex border-b-2 border-slate-700 text-sm">
- {#each Object.entries($context.tabs) as [id, { title, badge }]}
+ {#each Object.entries(context.tabs) as [id, { title }]}
<li class="-mb-0.5">
<button
type="button"
- class:active={$context.current === id}
+ class:active={context.current === id}
class="focus-background relative flex gap-1 p-1 px-3 hover:border-b-2 hover:border-slate-200"
- on:click={() => ($context.current = id)}
+ onclick={() => (context.current = id)}
>
- {#if badge}
+ {#if badges[id]}
<div
class="absolute right-0 top-1 h-2 w-2 rounded-full bg-emerald-400"
title="There are pending changes"
transition:fade={fadeFast}
- />
+ ></div>
{/if}
<span>{title}</span>
</button>
@@ -30,7 +52,7 @@
{/each}
</ul>
</nav>
- <slot />
+ {@render children?.()}
</div>
<style lang="postcss">