File size: 1,282 Bytes
336b102
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
<script lang="ts" module>
	import type { Snippet } from 'svelte';

	export type TabOption = {
		value: string;
		label: string | (() => string);
		content: Snippet;
	};

	export type TabsProps = {
		value?: string;
		tabs: TabOption[];
		rootClass?: string;
		listClass?: string;
		triggerClass?: string;
		contentWrapperClass?: string;
		contentClass?: string;
	};
</script>

<script lang="ts">
	import * as Tabs from '$lib/components/ui/tabs';

	let {
		value = $bindable(),
		tabs,
		rootClass = 'gap-0',
		listClass = 'mx-4 mt-3 flex-wrap justify-start sm:mx-5',
		triggerClass = 'flex-none text-xs font-semibold data-active:text-foreground',
		contentWrapperClass = 'p-4 sm:p-5',
		contentClass
	}: TabsProps = $props();

	function tabLabel(label: TabOption['label']) {
		return typeof label === 'function' ? label() : label;
	}
</script>

<Tabs.Root bind:value class={rootClass}>
	<Tabs.List class={listClass}>
		{#each tabs as tab (tab.value)}
			<Tabs.Trigger value={tab.value} class={triggerClass}>
				{tabLabel(tab.label)}
			</Tabs.Trigger>
		{/each}
	</Tabs.List>

	<div class={contentWrapperClass}>
		{#each tabs as tab (tab.value)}
			<Tabs.Content value={tab.value} class={contentClass}>
				{@render tab.content()}
			</Tabs.Content>
		{/each}
	</div>
</Tabs.Root>