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