Pierre Wessman a1c3c2f43c dashboard v1
2025-12-12 10:46:15 +01:00

167 lines
4.4 KiB
TypeScript

"use client"
import * as React from "react"
import {
LayoutDashboard,
CheckSquare,
Users,
Lock,
AlertTriangle,
Settings,
Code,
ChevronRight,
} from "lucide-react"
import {
Sidebar,
SidebarContent,
SidebarFooter,
SidebarGroup,
SidebarGroupContent,
SidebarGroupLabel,
SidebarMenu,
SidebarMenuButton,
SidebarMenuItem,
SidebarMenuSub,
SidebarMenuSubButton,
SidebarMenuSubItem,
} from "@/components/ui/sidebar"
import {
Collapsible,
CollapsibleContent,
CollapsibleTrigger,
} from "@/components/ui/collapsible"
import { UserNav } from "./user-nav"
const navigation = [
{
title: "General",
items: [
{
title: "Dashboard",
icon: LayoutDashboard,
url: "/",
subItems: [
{ title: "Overview", url: "/" },
{ title: "Analytics", url: "/analytics" },
{ title: "Reports", url: "/reports" },
],
},
{
title: "Tasks",
icon: CheckSquare,
url: "/tasks",
},
{
title: "Users",
icon: Users,
url: "/users",
},
],
},
{
title: "Pages",
items: [
{
title: "Auth",
icon: Lock,
url: "/auth",
},
{
title: "Errors",
icon: AlertTriangle,
url: "/errors",
},
],
},
{
title: "Other",
items: [
{
title: "Settings",
icon: Settings,
url: "/settings",
},
{
title: "Developers",
icon: Code,
url: "/developers",
},
],
},
]
export function AppSidebar() {
return (
<Sidebar>
<SidebarContent>
<div className="px-3 py-2">
<h2 className="mb-2 px-4 text-lg font-semibold tracking-tight">
Dashboard
</h2>
</div>
{navigation.map((section) => (
<SidebarGroup key={section.title}>
<SidebarGroupLabel>{section.title}</SidebarGroupLabel>
<SidebarGroupContent>
<SidebarMenu>
{section.items.map((item) =>
item.subItems ? (
<Collapsible
key={item.title}
asChild
defaultOpen
className="group/collapsible"
>
<SidebarMenuItem>
<CollapsibleTrigger asChild>
<SidebarMenuButton tooltip={item.title}>
{item.icon && <item.icon />}
<span>{item.title}</span>
<ChevronRight className="ml-auto transition-transform duration-200 group-data-[state=open]/collapsible:rotate-90" />
</SidebarMenuButton>
</CollapsibleTrigger>
<CollapsibleContent>
<SidebarMenuSub>
{item.subItems.map((subItem) => (
<SidebarMenuSubItem key={subItem.title}>
<SidebarMenuSubButton asChild>
<a href={subItem.url}>
<span>{subItem.title}</span>
</a>
</SidebarMenuSubButton>
</SidebarMenuSubItem>
))}
</SidebarMenuSub>
</CollapsibleContent>
</SidebarMenuItem>
</Collapsible>
) : (
<SidebarMenuItem key={item.title}>
<SidebarMenuButton asChild tooltip={item.title}>
<a href={item.url}>
{item.icon && <item.icon />}
<span>{item.title}</span>
</a>
</SidebarMenuButton>
</SidebarMenuItem>
)
)}
</SidebarMenu>
</SidebarGroupContent>
</SidebarGroup>
))}
</SidebarContent>
<SidebarFooter>
<div className="flex items-center gap-2 px-4 py-2">
<UserNav />
<div className="flex flex-col">
<p className="text-sm font-medium">shadcn</p>
<p className="text-xs text-muted-foreground">m@example.com</p>
</div>
</div>
</SidebarFooter>
</Sidebar>
)
}