diff --git a/src/App.tsx b/src/App.tsx index 4c08c6f..b139f1e 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -6,7 +6,9 @@ import { RouteDetail } from './pages/RouteDetail/RouteDetail' import { ExchangeDetail } from './pages/ExchangeDetail/ExchangeDetail' import { AgentHealth } from './pages/AgentHealth/AgentHealth' import { Inventory } from './pages/Inventory/Inventory' -import { Admin } from './pages/Admin/Admin' +import { AuditLog } from './pages/Admin/AuditLog/AuditLog' +import { OidcConfig } from './pages/Admin/OidcConfig/OidcConfig' +import { UserManagement } from './pages/Admin/UserManagement/UserManagement' import { ApiDocs } from './pages/ApiDocs/ApiDocs' import { CommandPalette } from './design-system/composites/CommandPalette/CommandPalette' @@ -84,7 +86,10 @@ export default function App() { } /> } /> } /> - } /> + } /> + } /> + } /> + } /> } /> } /> diff --git a/src/design-system/layout/Sidebar/Sidebar.tsx b/src/design-system/layout/Sidebar/Sidebar.tsx index 59590ed..59547fc 100644 --- a/src/design-system/layout/Sidebar/Sidebar.tsx +++ b/src/design-system/layout/Sidebar/Sidebar.tsx @@ -439,7 +439,7 @@ export function Sidebar({ apps, className }: SidebarProps) {
navigate('/admin')} role="button" diff --git a/src/main.tsx b/src/main.tsx index 2c7c021..bf22675 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -4,6 +4,7 @@ import { BrowserRouter } from 'react-router-dom' import { ThemeProvider } from './design-system/providers/ThemeProvider' import { GlobalFilterProvider } from './design-system/providers/GlobalFilterProvider' import { CommandPaletteProvider } from './design-system/providers/CommandPaletteProvider' +import { ToastProvider } from './design-system/composites/Toast/Toast' import App from './App' import './index.css' @@ -13,7 +14,9 @@ createRoot(document.getElementById('root')!).render( - + + + diff --git a/src/pages/Admin/Admin.module.css b/src/pages/Admin/Admin.module.css new file mode 100644 index 0000000..440dff1 --- /dev/null +++ b/src/pages/Admin/Admin.module.css @@ -0,0 +1,36 @@ +.adminNav { + display: flex; + gap: 0; + border-bottom: 1px solid var(--border-subtle); + padding: 0 20px; + background: var(--bg-base); +} + +.adminTab { + padding: 10px 16px; + border: none; + background: none; + color: var(--text-secondary); + font-family: var(--font-body); + font-size: 13px; + font-weight: 500; + cursor: pointer; + border-bottom: 2px solid transparent; + margin-bottom: -1px; + transition: color 0.15s, border-color 0.15s; +} + +.adminTab:hover { + color: var(--text-primary); +} + +.adminTabActive { + color: var(--amber); + border-bottom-color: var(--amber); +} + +.adminContent { + flex: 1; + overflow-y: auto; + padding: 20px; +} diff --git a/src/pages/Admin/Admin.tsx b/src/pages/Admin/Admin.tsx index e74e809..ff5e9e3 100644 --- a/src/pages/Admin/Admin.tsx +++ b/src/pages/Admin/Admin.tsx @@ -1,22 +1,51 @@ +import { useNavigate, useLocation } from 'react-router-dom' import { AppShell } from '../../design-system/layout/AppShell/AppShell' import { Sidebar } from '../../design-system/layout/Sidebar/Sidebar' import { TopBar } from '../../design-system/layout/TopBar/TopBar' -import { EmptyState } from '../../design-system/primitives/EmptyState/EmptyState' import { SIDEBAR_APPS } from '../../mocks/sidebar' +import styles from './Admin.module.css' +import type { ReactNode } from 'react' + +const ADMIN_TABS = [ + { label: 'User Management', path: '/admin/rbac' }, + { label: 'Audit Log', path: '/admin/audit' }, + { label: 'OIDC', path: '/admin/oidc' }, +] + +interface AdminLayoutProps { + title: string + children: ReactNode +} + +export function AdminLayout({ title, children }: AdminLayoutProps) { + const navigate = useNavigate() + const location = useLocation() -export function Admin() { return ( }> - + +
+ {children} +
) }