mirror of
https://github.com/maxdorninger/MediaManager.git
synced 2026-04-21 00:05:36 +02:00
69 lines
1.9 KiB
Svelte
69 lines
1.9 KiB
Svelte
<script lang="ts">
|
|
import * as Collapsible from '$lib/components/ui/collapsible/index.js';
|
|
import * as Sidebar from '$lib/components/ui/sidebar/index.js';
|
|
import ChevronRight from '@lucide/svelte/icons/chevron-right';
|
|
|
|
let {
|
|
items
|
|
}: {
|
|
items: {
|
|
title: string;
|
|
url: string;
|
|
// This should be `Component` after @lucide/svelte updates types
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
icon: any;
|
|
isActive?: boolean;
|
|
items?: {
|
|
title: string;
|
|
url: string;
|
|
}[];
|
|
}[];
|
|
} = $props();
|
|
</script>
|
|
|
|
<Sidebar.Group>
|
|
<Sidebar.GroupLabel></Sidebar.GroupLabel>
|
|
<Sidebar.Menu>
|
|
{#each items as mainItem (mainItem.title)}
|
|
<Collapsible.Root open={mainItem.isActive}>
|
|
{#snippet child({ props })}
|
|
<Sidebar.MenuItem {...props}>
|
|
<Sidebar.MenuButton>
|
|
{#snippet tooltipContent()}
|
|
{mainItem.title}
|
|
{/snippet}
|
|
{#snippet child({ props })}
|
|
<a href={mainItem.url} {...props}>
|
|
<mainItem.icon />
|
|
<span>{mainItem.title}</span>
|
|
</a>
|
|
{/snippet}
|
|
</Sidebar.MenuButton>
|
|
{#if mainItem.items?.length}
|
|
<Collapsible.Trigger>
|
|
{#snippet child({ props })}
|
|
<Sidebar.MenuAction {...props} class="data-[state=open]:rotate-90">
|
|
<ChevronRight />
|
|
<span class="sr-only">Toggle</span>
|
|
</Sidebar.MenuAction>
|
|
{/snippet}
|
|
</Collapsible.Trigger>
|
|
<Collapsible.Content>
|
|
<Sidebar.MenuSub>
|
|
{#each mainItem.items as subItem (subItem.title)}
|
|
<Sidebar.MenuSubItem>
|
|
<Sidebar.MenuSubButton href={subItem.url}>
|
|
<span>{subItem.title}</span>
|
|
</Sidebar.MenuSubButton>
|
|
</Sidebar.MenuSubItem>
|
|
{/each}
|
|
</Sidebar.MenuSub>
|
|
</Collapsible.Content>
|
|
{/if}
|
|
</Sidebar.MenuItem>
|
|
{/snippet}
|
|
</Collapsible.Root>
|
|
{/each}
|
|
</Sidebar.Menu>
|
|
</Sidebar.Group>
|