From 08461215b0dc169cfafa7837f6b5fab168022113 Mon Sep 17 00:00:00 2001 From: wangwei Date: Wed, 3 Jun 2026 17:05:05 +0800 Subject: [PATCH] feat: add Sidebar component with nav groups, badges, and theme toggle Co-Authored-By: Claude Sonnet 4.6 --- frontend/src/components/layout/Sidebar.tsx | 84 ++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 frontend/src/components/layout/Sidebar.tsx diff --git a/frontend/src/components/layout/Sidebar.tsx b/frontend/src/components/layout/Sidebar.tsx new file mode 100644 index 0000000..38b5fca --- /dev/null +++ b/frontend/src/components/layout/Sidebar.tsx @@ -0,0 +1,84 @@ +import { NavLink } from 'react-router-dom'; +import { + LayoutDashboard, Radio, Monitor, FileText, + Shield, MessageSquare, Sun, Moon +} from 'lucide-react'; +import { useTheme } from '../../contexts/ThemeContext'; + +interface NavItem { + to: string; + icon: React.ReactNode; + label: string; + badge?: number; +} + +const mainNav: NavItem[] = [ + { to: '/', icon: , label: 'Overview' }, + { to: '/signals', icon: , label: 'Regulatory Signals' }, + { to: '/status', icon: , label: 'System Status' }, +]; + +const workbenchNav: NavItem[] = [ + { to: '/documents', icon: , label: 'Documents' }, + { to: '/compliance', icon: , label: 'Compliance Analysis' }, +]; + +const chatNav: NavItem[] = [ + { to: '/chat', icon: , label: 'Regulation Q&A' }, +]; + +function NavGroup({ title, items }: { title: string; items: NavItem[] }) { + return ( +
+
{title}
+ {items.map(item => ( + `nav-item${isActive ? ' active' : ''}`} + > + {item.icon} + {item.label} + {item.badge !== undefined && item.badge > 0 && ( + {item.badge} + )} + + ))} +
+ ); +} + +export function Sidebar() { + const { theme, toggleTheme } = useTheme(); + return ( + + ); +}