~james/core

core/web/src/lib/components/ui/Section.svelte -rw-r--r-- 974 bytes
452f17b7 — james chore(import): snapshot james.dad.town/core at f70c71c7696a 15 hours ago
                                                                                
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
<script lang="ts">
	import type { Snippet } from "svelte";
	import EmptyState from "#lib/components/ui/EmptyState.svelte";

	interface Props {
		title?: string;
		empty: boolean;
		emptyMessage: string;
		listClass?: string;
		actions?: Snippet;
		header?: Snippet;
		footer?: Snippet;
		children: Snippet;
	}

	let {
		title,
		empty,
		emptyMessage,
		listClass = "flex flex-col gap-md",
		actions,
		header,
		footer,
		children
	}: Props = $props();
</script>

<section>
	{#if actions}
		<div class="flex items-center justify-end gap-sm px-xs pb-md">
			{#if title}
				<h2 class="mr-auto typography-paragraph-large font-medium">{title}</h2>
			{/if}
			{@render actions()}
		</div>
	{:else if title}
		<h2 class="px-xs pb-md typography-paragraph-large font-medium">{title}</h2>
	{/if}
	{@render header?.()}
	{#if empty}
		<EmptyState message={emptyMessage} />
	{:else}
		<div class={listClass}>
			{@render children()}
		</div>
		{@render footer?.()}
	{/if}
</section>