TTMT.ManageWebGUI/src/components/app-sidebar.tsx

75 lines
2.2 KiB
TypeScript
Raw Normal View History

2025-08-11 23:21:36 +07:00
// app-sidebar.tsx - Đã hỗ trợ onPointerEnter
import { Link } from "@tanstack/react-router";
import { Building } from "lucide-react";
import {
Sidebar,
SidebarContent,
SidebarFooter,
SidebarGroup,
SidebarGroupContent,
SidebarGroupLabel,
SidebarHeader,
SidebarMenu,
SidebarMenuButton,
SidebarMenuItem,
} from "@/components/ui/sidebar";
type MenuItem = {
title: string;
to: string;
icon: React.ElementType;
onPointerEnter?: () => void;
};
type AppSidebarProps = {
items: MenuItem[];
};
export function AppSidebar({ items }: AppSidebarProps) {
return (
<Sidebar collapsible="icon" className="border-r">
<SidebarHeader className="border-b">
<div className="flex items-center gap-2 px-2 py-2">
<div className="flex aspect-square size-8 items-center justify-center rounded-lg bg-primary text-primary-foreground">
<Building className="size-4" />
</div>
<div className="flex flex-col gap-0.5 leading-none">
<span className="font-semibold">TTMT Computer Management</span>
<span className="text-xs text-muted-foreground">v1.0.0</span>
</div>
</div>
</SidebarHeader>
<SidebarContent>
<SidebarGroup>
<SidebarGroupLabel>Navigation</SidebarGroupLabel>
<SidebarGroupContent>
<SidebarMenu>
{items.map((item) => (
<SidebarMenuItem key={item.title}>
<SidebarMenuButton
asChild
tooltip={item.title}
onPointerEnter={item.onPointerEnter}
>
<Link href={item.to} to={"."}>
<item.icon className="size-4" />
<span>{item.title}</span>
</Link>
</SidebarMenuButton>
</SidebarMenuItem>
))}
</SidebarMenu>
</SidebarGroupContent>
</SidebarGroup>
</SidebarContent>
<SidebarFooter className="border-t">
<div className="p-2 text-xs text-muted-foreground">
© 2025 NAVIS Centre
</div>
</SidebarFooter>
</Sidebar>
);
}