import { useState } from "react"; import { NavLink } from "react-router"; import { Box, Drawer } from "@mui/material"; import { BrandLockup, BrandMark } from "@/components/common/brand-lockup"; import { getSidebarWidth, navGroups, type NavItemDef } from "@/config/menu"; function getNavItemAppearance(isActive: boolean, isHover: boolean) { if (isActive) { return { itemColor: "var(--primary)", iconColor: "var(--primary)", itemBg: "var(--color-sidebar-item-active-bg)", }; } if (isHover) { return { itemColor: "var(--primary-hover)", iconColor: "var(--primary-hover)", itemBg: "var(--sidebar-accent)", }; } return { itemColor: "var(--foreground)", iconColor: "var(--muted-foreground)", itemBg: "transparent", }; } type NavItemProps = NavItemDef & { collapsed: boolean; end?: boolean; }; function NavItem({ label, icon: Icon, path, collapsed, end, badge }: NavItemProps) { const [hovered, setHovered] = useState(false); return ( {({ isActive }) => { const isHover = hovered && !isActive; const { itemColor, iconColor, itemBg } = getNavItemAppearance(isActive, isHover); return ( setHovered(true)} onMouseLeave={() => setHovered(false)} sx={{ position: "relative", display: "flex", alignItems: "center", width: "100%", height: 40, gap: "12px", px: collapsed ? 0 : "12px", justifyContent: collapsed ? "center" : "flex-start", borderRadius: "6px", cursor: "pointer", fontFamily: "var(--font-sans)", fontSize: 14, fontWeight: isActive ? 600 : 500, color: itemColor, backgroundColor: itemBg, boxShadow: isActive ? "var(--color-sidebar-item-active-shadow)" : "none", transition: "all var(--duration-fast, 150ms) var(--ease-default, ease)", mb: "4px", textAlign: "left", }} > {isActive && ( )} {!collapsed && ( <> {label} {badge != null && ( {badge} )} )} ); }} ); } type AppSidebarProps = { collapsed: boolean; }; export function AppSidebar({ collapsed }: AppSidebarProps) { const width = getSidebarWidth(collapsed); return ( {collapsed ? : } {navGroups.map((group, groupIndex) => ( {collapsed ? ( groupIndex > 0 && ( ) ) : group.title ? ( {group.title} ) : ( )} {group.items.map(({ label, icon, path, badge }) => ( ))} ))} ); }