Sidebar

A vertical navigation panel typically displayed on the side of the page

Basic Example

Icon collapsible sidebar with navigation menu items.


Code Svelte
1
2<script lang="ts">
3	import { Card, Sidebar, SidebarPrimitives } from "@kareyes/aether";
4	import {
5		Home,
6		Inbox,
7		Calendar,
8		Search,
9		Settings,
10	} from "@kareyes/aether/icons";
11
12	const {
13		SidebarProvider,
14		SidebarContent,
15		SidebarGroup,
16		SidebarGroupContent,
17		SidebarGroupLabel,
18		SidebarInset,
19		SidebarMenu,
20		SidebarMenuBadge,
21		SidebarMenuButton,
22		SidebarMenuItem,
23		SidebarRail,
24		SidebarTrigger,
25	} = SidebarPrimitives;
26
27	let currentPage = $state("home");
28</script>
29
30<div class="h-[600px] overflow-hidden rounded-lg border">
31	<SidebarProvider>
32		<Sidebar collapsible="icon">
33			<SidebarContent>
34				<SidebarGroup>
35					<SidebarGroupLabel>Platform</SidebarGroupLabel>
36					<SidebarGroupContent>
37						<SidebarMenu>
38							<SidebarMenuItem>
39								<SidebarMenuButton
40									isActive={currentPage === "home"}
41									tooltipContent="Home"
42									onclick={() => (currentPage = "home")}
43								>
44									<Home class="size-4" />
45									<span>Home</span>
46								</SidebarMenuButton>
47							</SidebarMenuItem>
48							<SidebarMenuItem>
49								<SidebarMenuButton
50									isActive={currentPage === "inbox"}
51									tooltipContent="Inbox"
52									onclick={() => (currentPage = "inbox")}
53								>
54									<Inbox class="size-4" />
55									<span>Inbox</span>
56								</SidebarMenuButton>
57								<SidebarMenuBadge>24</SidebarMenuBadge>
58							</SidebarMenuItem>
59							<SidebarMenuItem>
60								<SidebarMenuButton
61									isActive={currentPage === "calendar"}
62									tooltipContent="Calendar"
63									onclick={() => (currentPage = "calendar")}
64								>
65									<Calendar class="size-4" />
66									<span>Calendar</span>
67								</SidebarMenuButton>
68							</SidebarMenuItem>
69							<SidebarMenuItem>
70								<SidebarMenuButton
71									isActive={currentPage === "search"}
72									tooltipContent="Search"
73									onclick={() => (currentPage = "search")}
74								>
75									<Search class="size-4" />
76									<span>Search</span>
77								</SidebarMenuButton>
78							</SidebarMenuItem>
79							<SidebarMenuItem>
80								<SidebarMenuButton
81									isActive={currentPage === "settings"}
82									tooltipContent="Settings"
83									onclick={() => (currentPage = "settings")}
84								>
85									<Settings class="size-4" />
86									<span>Settings</span>
87								</SidebarMenuButton>
88							</SidebarMenuItem>
89						</SidebarMenu>
90					</SidebarGroupContent>
91				</SidebarGroup>
92			</SidebarContent>
93			<SidebarRail />
94		</Sidebar>
95		<SidebarInset>
96			<header class="flex h-16 shrink-0 items-center gap-2 border-b px-4">
97				<SidebarTrigger />
98				<div class="flex flex-1 items-center justify-between">
99					<h1 class="text-lg font-semibold capitalize">
100						{currentPage}
101					</h1>
102					<span class="text-sm text-muted-foreground">
103						Click the menu icon to toggle
104					</span>
105				</div>
106			</header>
107			<div class="flex flex-1 flex-col gap-4 p-4">
108				<Card class="flex min-h-[400px] flex-1 items-center justify-center rounded-xl">
109					<p class="text-muted-foreground">
110						Main content area - {currentPage}
111					</p>
112				</Card>
113			</div>
114		</SidebarInset>
115	</SidebarProvider>
116</div>

With Header and Footer

Sidebar with organization branding in header and user info in footer.


Code Svelte
1
2<script lang="ts">
3	import { Card, Sidebar, SidebarPrimitives } from "@kareyes/aether";
4	import {
5		Home, TrendingUp, Users, FileText, Settings,
6		User, MoreHorizontal, LogOut,
7	} from "@kareyes/aether/icons";
8
9	const {
10		SidebarProvider, SidebarContent, SidebarFooter,
11		SidebarGroup, SidebarGroupContent, SidebarHeader,
12		SidebarInset, SidebarMenu, SidebarMenuAction,
13		SidebarMenuButton, SidebarMenuItem, SidebarTrigger,
14	} = SidebarPrimitives;
15</script>
16
17<SidebarProvider>
18	<Sidebar>
19		<SidebarHeader>
20			<SidebarMenu>
21				<SidebarMenuItem>
22					<SidebarMenuButton size="lg">
23						<div class="flex aspect-square size-8 items-center justify-center rounded-lg bg-primary text-primary-foreground">
24							<span class="text-lg font-bold">A</span>
25						</div>
26						<div class="flex flex-col gap-0.5 text-start">
27							<span class="font-semibold">Acme Inc</span>
28							<span class="text-xs text-muted-foreground">Enterprise</span>
29						</div>
30					</SidebarMenuButton>
31				</SidebarMenuItem>
32			</SidebarMenu>
33		</SidebarHeader>
34		<SidebarContent>
35			<SidebarGroup>
36				<SidebarGroupContent>
37					<SidebarMenu>
38						<SidebarMenuItem>
39							<SidebarMenuButton><Home class="size-4" /><span>Dashboard</span></SidebarMenuButton>
40						</SidebarMenuItem>
41						<!-- ...more items -->
42					</SidebarMenu>
43				</SidebarGroupContent>
44			</SidebarGroup>
45		</SidebarContent>
46		<SidebarFooter>
47			<SidebarMenu>
48				<SidebarMenuItem>
49					<SidebarMenuButton>
50						<User class="size-4" />
51						<div class="flex flex-col gap-0.5 text-start">
52							<span class="text-sm font-medium">John Doe</span>
53							<span class="text-xs text-muted-foreground">john@acme.com</span>
54						</div>
55					</SidebarMenuButton>
56					<SidebarMenuAction><LogOut class="size-4" /></SidebarMenuAction>
57				</SidebarMenuItem>
58			</SidebarMenu>
59		</SidebarFooter>
60	</Sidebar>
61	<SidebarInset>
62		<!-- Main content -->
63	</SidebarInset>
64</SidebarProvider>

With Nested Submenus

Organize navigation with collapsible submenus for better hierarchy.


Code Svelte
1
2<script lang="ts">
3	import { Sidebar, SidebarPrimitives } from "@kareyes/aether";
4	import { Folder, ChevronRight } from "@kareyes/aether/icons";
5
6	const {
7		SidebarProvider, SidebarContent, SidebarGroup,
8		SidebarGroupContent, SidebarGroupLabel, SidebarInset,
9		SidebarMenu, SidebarMenuButton, SidebarMenuItem,
10		SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem,
11		SidebarTrigger,
12	} = SidebarPrimitives;
13</script>
14
15<SidebarProvider>
16	<Sidebar>
17		<SidebarContent>
18			<SidebarGroup>
19				<SidebarGroupLabel>Projects</SidebarGroupLabel>
20				<SidebarGroupContent>
21					<SidebarMenu>
22						<SidebarMenuItem>
23							<SidebarMenuButton>
24								<Folder class="size-4" />
25								<span>Design System</span>
26								<ChevronRight class="ml-auto size-4 transition-transform group-data-[state=open]:rotate-90" />
27							</SidebarMenuButton>
28							<SidebarMenuSub>
29								<SidebarMenuSubItem>
30									<SidebarMenuSubButton><span>Components</span></SidebarMenuSubButton>
31								</SidebarMenuSubItem>
32								<SidebarMenuSubItem>
33									<SidebarMenuSubButton><span>Typography</span></SidebarMenuSubButton>
34								</SidebarMenuSubItem>
35							</SidebarMenuSub>
36						</SidebarMenuItem>
37					</SidebarMenu>
38				</SidebarGroupContent>
39			</SidebarGroup>
40		</SidebarContent>
41	</Sidebar>
42	<SidebarInset>
43		<!-- Main content -->
44	</SidebarInset>
45</SidebarProvider>

With Actions and Badges

Menu items with notification counts and quick actions.


Code Svelte
1
2<script lang="ts">
3	import { Sidebar, SidebarPrimitives } from "@kareyes/aether";
4	import { Mail, Bell, MessageSquare, Star, Plus, Settings, MoreHorizontal } from "@kareyes/aether/icons";
5
6	const {
7		SidebarProvider, SidebarContent, SidebarGroup,
8		SidebarGroupContent, SidebarGroupLabel, SidebarInset,
9		SidebarMenu, SidebarMenuAction, SidebarMenuBadge,
10		SidebarMenuButton, SidebarMenuItem, SidebarSeparator,
11		SidebarTrigger,
12	} = SidebarPrimitives;
13</script>
14
15<SidebarProvider>
16	<Sidebar>
17		<SidebarContent>
18			<SidebarGroup>
19				<SidebarGroupLabel>Communications</SidebarGroupLabel>
20				<SidebarGroupContent>
21					<SidebarMenu>
22						<SidebarMenuItem>
23							<SidebarMenuButton><Mail class="size-4" /><span>Messages</span></SidebarMenuButton>
24							<SidebarMenuBadge>12</SidebarMenuBadge>
25							<SidebarMenuAction title="Compose"><Plus class="size-4" /></SidebarMenuAction>
26						</SidebarMenuItem>
27						<SidebarMenuItem>
28							<SidebarMenuButton><Bell class="size-4" /><span>Notifications</span></SidebarMenuButton>
29							<SidebarMenuBadge>99+</SidebarMenuBadge>
30							<SidebarMenuAction title="Settings"><Settings class="size-4" /></SidebarMenuAction>
31						</SidebarMenuItem>
32					</SidebarMenu>
33				</SidebarGroupContent>
34			</SidebarGroup>
35			<SidebarSeparator />
36			<SidebarGroup>
37				<SidebarGroupLabel>Favorites</SidebarGroupLabel>
38				<SidebarGroupContent>
39					<SidebarMenu>
40						<SidebarMenuItem>
41							<SidebarMenuButton><Star class="size-4 fill-yellow-400 text-yellow-400" /><span>Starred Items</span></SidebarMenuButton>
42							<SidebarMenuBadge>5</SidebarMenuBadge>
43						</SidebarMenuItem>
44					</SidebarMenu>
45				</SidebarGroupContent>
46			</SidebarGroup>
47		</SidebarContent>
48	</Sidebar>
49	<SidebarInset>
50		<!-- Main content -->
51	</SidebarInset>
52</SidebarProvider>

With Search and Multiple Groups

Complex sidebar with search input and organized sections.


Code Svelte
1
2<script lang="ts">
3	import { Sidebar, SidebarPrimitives } from "@kareyes/aether";
4	import { Home, TrendingUp, FileText, Folder, Plus, BookOpen, HelpCircle } from "@kareyes/aether/icons";
5
6	const {
7		SidebarProvider, SidebarContent, SidebarGroup,
8		SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel,
9		SidebarInput, SidebarInset, SidebarMenu, SidebarMenuButton,
10		SidebarMenuItem, SidebarSeparator, SidebarTrigger,
11	} = SidebarPrimitives;
12</script>
13
14<SidebarProvider>
15	<Sidebar>
16		<SidebarContent>
17			<SidebarGroup>
18				<SidebarGroupContent>
19					<SidebarInput type="search" placeholder="Search..." />
20				</SidebarGroupContent>
21			</SidebarGroup>
22			<SidebarSeparator />
23			<SidebarGroup>
24				<SidebarGroupLabel>Platform</SidebarGroupLabel>
25				<SidebarGroupContent>
26					<SidebarMenu>
27						<SidebarMenuItem>
28							<SidebarMenuButton><Home class="size-4" /><span>Dashboard</span></SidebarMenuButton>
29						</SidebarMenuItem>
30						<!-- ...more items -->
31					</SidebarMenu>
32				</SidebarGroupContent>
33			</SidebarGroup>
34			<SidebarSeparator />
35			<SidebarGroup>
36				<SidebarGroupLabel>Projects</SidebarGroupLabel>
37				<SidebarGroupAction title="Add Project"><Plus class="size-4" /></SidebarGroupAction>
38				<SidebarGroupContent>
39					<SidebarMenu>
40						{#each projects as project}
41							<SidebarMenuItem>
42								<SidebarMenuButton><Folder class="size-4" /><span>{project.name}</span></SidebarMenuButton>
43							</SidebarMenuItem>
44						{/each}
45					</SidebarMenu>
46				</SidebarGroupContent>
47			</SidebarGroup>
48		</SidebarContent>
49	</Sidebar>
50	<SidebarInset>
51		<!-- Main content -->
52	</SidebarInset>
53</SidebarProvider>

Floating Variant

Sidebar floats over content with shadow effect.


Code Svelte
1
2<script lang="ts">
3	import { Sidebar, SidebarPrimitives } from "@kareyes/aether";
4	import { Home, Code, Database, Cloud, Shield } from "@kareyes/aether/icons";
5
6	const {
7		SidebarProvider, SidebarContent, SidebarGroup,
8		SidebarGroupContent, SidebarGroupLabel, SidebarInset,
9		SidebarMenu, SidebarMenuButton, SidebarMenuItem,
10		SidebarRail, SidebarTrigger,
11	} = SidebarPrimitives;
12</script>
13
14<SidebarProvider>
15	<Sidebar variant="floating" collapsible="icon">
16		<SidebarContent>
17			<SidebarGroup>
18				<SidebarGroupLabel>Menu</SidebarGroupLabel>
19				<SidebarGroupContent>
20					<SidebarMenu>
21						<SidebarMenuItem>
22							<SidebarMenuButton tooltipContent="Dashboard">
23								<Home class="size-4" /><span>Dashboard</span>
24							</SidebarMenuButton>
25						</SidebarMenuItem>
26						<!-- ...more items -->
27					</SidebarMenu>
28				</SidebarGroupContent>
29			</SidebarGroup>
30		</SidebarContent>
31		<SidebarRail />
32	</Sidebar>
33	<SidebarInset>
34		<!-- Main content -->
35	</SidebarInset>
36</SidebarProvider>

Loading State

Skeleton placeholders while content is loading.


Code Svelte
1
2<script lang="ts">
3	import { Sidebar, SidebarPrimitives } from "@kareyes/aether";
4
5	const {
6		SidebarProvider, SidebarContent, SidebarGroup,
7		SidebarGroupContent, SidebarGroupLabel, SidebarInset,
8		SidebarMenu, SidebarMenuSkeleton, SidebarTrigger,
9	} = SidebarPrimitives;
10</script>
11
12<SidebarProvider>
13	<Sidebar>
14		<SidebarContent>
15			<SidebarGroup>
16				<SidebarGroupLabel>Loading...</SidebarGroupLabel>
17				<SidebarGroupContent>
18					<SidebarMenu>
19						<SidebarMenuSkeleton />
20						<SidebarMenuSkeleton />
21						<SidebarMenuSkeleton />
22						<SidebarMenuSkeleton />
23					</SidebarMenu>
24				</SidebarGroupContent>
25			</SidebarGroup>
26		</SidebarContent>
27	</Sidebar>
28	<SidebarInset>
29		<!-- Main content -->
30	</SidebarInset>
31</SidebarProvider>

Button Size Variants

Small, default, and large button sizes for different use cases.


Code Svelte
1
2<script lang="ts">
3	import { Sidebar, SidebarPrimitives } from "@kareyes/aether";
4	import { Home, Settings, Inbox, Calendar, User, Zap } from "@kareyes/aether/icons";
5
6	const {
7		SidebarProvider, SidebarContent, SidebarGroup,
8		SidebarGroupContent, SidebarGroupLabel, SidebarInset,
9		SidebarMenu, SidebarMenuButton, SidebarMenuItem,
10		SidebarTrigger,
11	} = SidebarPrimitives;
12</script>
13
14<SidebarProvider>
15	<Sidebar>
16		<SidebarContent>
17			<SidebarGroup>
18				<SidebarGroupLabel>Small Buttons</SidebarGroupLabel>
19				<SidebarGroupContent>
20					<SidebarMenu>
21						<SidebarMenuItem>
22							<SidebarMenuButton size="sm"><Home class="size-4" /><span>Home</span></SidebarMenuButton>
23						</SidebarMenuItem>
24					</SidebarMenu>
25				</SidebarGroupContent>
26			</SidebarGroup>
27			<SidebarGroup>
28				<SidebarGroupLabel>Default Buttons</SidebarGroupLabel>
29				<SidebarGroupContent>
30					<SidebarMenu>
31						<SidebarMenuItem>
32							<SidebarMenuButton><Inbox class="size-4" /><span>Inbox</span></SidebarMenuButton>
33						</SidebarMenuItem>
34					</SidebarMenu>
35				</SidebarGroupContent>
36			</SidebarGroup>
37			<SidebarGroup>
38				<SidebarGroupLabel>Large Buttons</SidebarGroupLabel>
39				<SidebarGroupContent>
40					<SidebarMenu>
41						<SidebarMenuItem>
42							<SidebarMenuButton size="lg"><User class="size-4" /><span>Profile</span></SidebarMenuButton>
43						</SidebarMenuItem>
44					</SidebarMenu>
45				</SidebarGroupContent>
46			</SidebarGroup>
47		</SidebarContent>
48	</Sidebar>
49	<SidebarInset>
50		<!-- Main content -->
51	</SidebarInset>
52</SidebarProvider>

Link-Based Navigation

Using the child snippet pattern with anchor tags for proper navigation links.


Code Svelte
1
2<script lang="ts">
3	import { Sidebar, SidebarPrimitives } from "@kareyes/aether";
4	import { BookOpen, Code, FileText, Database, HelpCircle } from "@kareyes/aether/icons";
5
6	const {
7		SidebarProvider, SidebarContent, SidebarGroup,
8		SidebarGroupContent, SidebarGroupLabel, SidebarInset,
9		SidebarMenu, SidebarMenuButton, SidebarMenuItem,
10		SidebarTrigger,
11	} = SidebarPrimitives;
12</script>
13
14<SidebarProvider>
15	<Sidebar>
16		<SidebarContent>
17			<SidebarGroup>
18				<SidebarGroupLabel>Documentation</SidebarGroupLabel>
19				<SidebarGroupContent>
20					<SidebarMenu>
21						<SidebarMenuItem>
22							<SidebarMenuButton isActive>
23								{#snippet child({ props })}
24									<a href="/getting-started" {...props}>
25										<BookOpen class="size-4" />
26										<span>Getting Started</span>
27									</a>
28								{/snippet}
29							</SidebarMenuButton>
30						</SidebarMenuItem>
31						<SidebarMenuItem>
32							<SidebarMenuButton>
33								{#snippet child({ props })}
34									<a href="/components" {...props}>
35										<Code class="size-4" />
36										<span>Components</span>
37									</a>
38								{/snippet}
39							</SidebarMenuButton>
40						</SidebarMenuItem>
41					</SidebarMenu>
42				</SidebarGroupContent>
43			</SidebarGroup>
44		</SidebarContent>
45	</Sidebar>
46	<SidebarInset>
47		<!-- Main content -->
48	</SidebarInset>
49</SidebarProvider>