Files
MikrotikManager/components/nav-main.tsx
T
DenozordecandCursor 5f31bb47fb chore: synchronize pending app/backend updates and repository hygiene
Includes current frontend and backend work in progress and removes generated artifacts from tracking to keep the repository clean for дальнейшая разработка.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-07 12:29:04 +07:00

58 lines
1.6 KiB
TypeScript

"use client"
import Link from "next/link"
import { usePathname } from "next/navigation"
import {
SidebarGroup,
SidebarGroupLabel,
SidebarMenu,
SidebarMenuButton,
SidebarMenuItem,
} from "@/components/ui/sidebar"
export interface NavItem {
title: string
url: string
icon?: React.ReactNode
/** Если `undefined` — счётчик не показываем (нет данных или раздел без live-источника). */
badge?: string
}
export interface NavGroup {
label: string
items: NavItem[]
}
export function NavMain({ groups }: { groups: NavGroup[] }) {
const pathname = usePathname()
return (
<>
{groups.map((group) => (
<SidebarGroup key={group.label}>
<SidebarGroupLabel>{group.label}</SidebarGroupLabel>
<SidebarMenu>
{group.items.map((item) => (
<SidebarMenuItem key={item.title}>
<SidebarMenuButton
isActive={pathname === item.url}
tooltip={item.title}
render={<Link href={item.url} />}
>
{item.icon}
<span>{item.title}</span>
{item.badge != null && item.badge !== "" && (
<span className="ml-auto text-[10.5px] font-mono tabular-nums text-sidebar-foreground/50 group-data-[collapsible=icon]:hidden">
{item.badge}
</span>
)}
</SidebarMenuButton>
</SidebarMenuItem>
))}
</SidebarMenu>
</SidebarGroup>
))}
</>
)
}