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 ( + + ); +}