chore: initial project scaffold with admin web, backend, desktop client, and deployment setup
Add monorepo structure for NexaVPN WireGuard control plane including: - .gitignore for node_modules, build artifacts, and environment files - README with project overview, monorepo layout, and quick start guide - Admin web UI with React, Vite, TypeScript, and nginx reverse proxy - API client with type definitions for users, devices, policies, gateways, and audit logs - Admin pages for dashboard, users, devices, policies, g
This commit is contained in:
36
admin-web/src/features/dashboard/DashboardPage.tsx
Normal file
36
admin-web/src/features/dashboard/DashboardPage.tsx
Normal file
@@ -0,0 +1,36 @@
|
||||
import { Card } from "../../components/Card";
|
||||
import { Page } from "../../components/Page";
|
||||
|
||||
export function DashboardPage() {
|
||||
return (
|
||||
<Page title="Dashboard" subtitle="Operational visibility across users, devices, gateways, and policy activity.">
|
||||
<div className="grid three">
|
||||
<Card>
|
||||
<p className="metric-label">Active users</p>
|
||||
<strong className="metric-value">248</strong>
|
||||
<span>12 enrolled this week</span>
|
||||
</Card>
|
||||
<Card>
|
||||
<p className="metric-label">Connected devices</p>
|
||||
<strong className="metric-value">181</strong>
|
||||
<span>7 pending rotation</span>
|
||||
</Card>
|
||||
<Card>
|
||||
<p className="metric-label">Gateway health</p>
|
||||
<strong className="metric-value">Healthy</strong>
|
||||
<span>Last sync 36s ago</span>
|
||||
</Card>
|
||||
</div>
|
||||
<div className="grid two">
|
||||
<Card>
|
||||
<h4>Recent enrollments</h4>
|
||||
<p>New devices are issued profiles automatically after successful sign-in.</p>
|
||||
</Card>
|
||||
<Card>
|
||||
<h4>Policy posture</h4>
|
||||
<p>Gateway enforcement is generated from effective allow-lists backed by nftables.</p>
|
||||
</Card>
|
||||
</div>
|
||||
</Page>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user