Skip to main content

Admin Dashboard

System-wide operations dashboard with KPI cards, recent activity, tenant table, and quick actions. Uses the full app shell (sidebar + header).

Components used​

Layout · Sidebar · Header · StatsCard · ActivityFeed · DataTable · Badge · Button · ExportMenu

Preview · Admin Dashboard

Code​

<div style="display:flex;height:540px;border:1px solid var(--border);border-radius:8px;overflow:hidden;font-size:0.875rem">

<!-- Sidebar -->
<aside style="width:200px;background:var(--card);border-right:1px solid var(--border);display:flex;flex-direction:column;flex-shrink:0">
<div style="padding:1rem 1rem 0.75rem;border-bottom:1px solid var(--border);font-weight:700;font-size:0.9rem;display:flex;align-items:center;gap:0.5rem">
<div style="width:24px;height:24px;background:var(--primary);border-radius:4px;display:flex;align-items:center;justify-content:center;color:white;font-size:0.7rem;font-weight:700">P</div>
Primus Admin
</div>
<nav style="padding:0.5rem;flex:1">
<div style="padding:0.375rem 0.625rem;border-radius:5px;background:color-mix(in srgb,var(--primary) 10%,transparent);color:var(--primary);font-weight:500;margin-bottom:2px">Dashboard</div>
<div style="padding:0.375rem 0.625rem;border-radius:5px;color:var(--muted-foreground);margin-bottom:2px">Tenants</div>
<div style="padding:0.375rem 0.625rem;border-radius:5px;color:var(--muted-foreground);margin-bottom:2px">Users</div>
<div style="padding:0.375rem 0.625rem;border-radius:5px;color:var(--muted-foreground);margin-bottom:2px">Billing</div>
<div style="padding:0.375rem 0.625rem;border-radius:5px;color:var(--muted-foreground);margin-bottom:2px">Logs</div>
<div style="padding:0.375rem 0.625rem;border-radius:5px;color:var(--muted-foreground)">Settings</div>
</nav>
<div style="padding:0.75rem 1rem;border-top:1px solid var(--border);display:flex;align-items:center;gap:0.5rem">
<div style="width:28px;height:28px;border-radius:50%;background:color-mix(in srgb,var(--primary) 15%,transparent);display:flex;align-items:center;justify-content:center;font-size:0.7rem;font-weight:600;color:var(--primary)">JD</div>
<div style="flex:1;min-width:0">
<div style="font-weight:500;font-size:0.8rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis">Jane Doe</div>
<div style="font-size:0.7rem;color:var(--muted-foreground)">Super Admin</div>
</div>
</div>
</aside>

<!-- Main -->
<div style="flex:1;display:flex;flex-direction:column;overflow:hidden">

<!-- Header -->
<div style="padding:0.75rem 1.25rem;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:1rem;background:var(--card)">
<div style="flex:1">
<div style="font-weight:600;font-size:0.9rem">Dashboard</div>
<div style="font-size:0.75rem;color:var(--muted-foreground)">Last updated: just now</div>
</div>
<button class="outline small">Export</button>
<button class="small">+ New Tenant</button>
</div>

<!-- Content -->
<div style="flex:1;overflow-y:auto;padding:1.25rem;background:var(--background)">

<!-- KPI cards -->
<div style="display:grid;grid-template-columns:repeat(4,1fr);gap:0.75rem;margin-bottom:1.25rem">
<div class="card stat" style="padding:1rem">
<span class="card-label">Total Tenants</span>
<span class="card-value" style="font-size:1.5rem">142</span>
<span class="card-delta up">+8 this month</span>
</div>
<div class="card stat" style="padding:1rem">
<span class="card-label">Monthly Revenue</span>
<span class="card-value" style="font-size:1.5rem">$98.2k</span>
<span class="card-delta up">+4.2%</span>
</div>
<div class="card stat" style="padding:1rem">
<span class="card-label">Active Users</span>
<span class="card-value" style="font-size:1.5rem">3,841</span>
<span class="card-delta up">+12%</span>
</div>
<div class="card stat" style="padding:1rem">
<span class="card-label">Churn Rate</span>
<span class="card-value" style="font-size:1.5rem">1.8%</span>
<span class="card-delta down">+0.2%</span>
</div>
</div>

<!-- Tenants table + Activity side by side -->
<div style="display:grid;grid-template-columns:1fr 280px;gap:0.75rem">

<!-- Tenants table -->
<div class="card" style="padding:0">
<div style="padding:0.875rem 1rem;border-bottom:1px solid var(--border);display:flex;align-items:center;justify-content:space-between">
<span style="font-weight:600;font-size:0.875rem">Recent Tenants</span>
<a href="#" style="font-size:0.775rem;color:var(--primary)">View all</a>
</div>
<table style="width:100%;font-size:0.8rem;border-collapse:collapse">
<thead>
<tr style="border-bottom:1px solid var(--border)">
<th style="padding:0.625rem 1rem;text-align:left;font-weight:500;color:var(--muted-foreground)">Tenant</th>
<th style="padding:0.625rem 0.5rem;text-align:left;font-weight:500;color:var(--muted-foreground)">Plan</th>
<th style="padding:0.625rem 0.5rem;text-align:left;font-weight:500;color:var(--muted-foreground)">Status</th>
<th style="padding:0.625rem 1rem;text-align:right;font-weight:500;color:var(--muted-foreground)">MRR</th>
</tr>
</thead>
<tbody>
<tr style="border-bottom:1px solid var(--border)">
<td style="padding:0.625rem 1rem;font-weight:500">Acme Corp</td>
<td style="padding:0.625rem 0.5rem">Enterprise</td>
<td style="padding:0.625rem 0.5rem"><span class="badge success" style="font-size:0.7rem">Active</span></td>
<td style="padding:0.625rem 1rem;text-align:right">$12,000</td>
</tr>
<tr style="border-bottom:1px solid var(--border)">
<td style="padding:0.625rem 1rem;font-weight:500">Globex Inc</td>
<td style="padding:0.625rem 0.5rem">Pro</td>
<td style="padding:0.625rem 0.5rem"><span class="badge warning" style="font-size:0.7rem">Trial</span></td>
<td style="padding:0.625rem 1rem;text-align:right">$499</td>
</tr>
<tr>
<td style="padding:0.625rem 1rem;font-weight:500">Initech</td>
<td style="padding:0.625rem 0.5rem">Starter</td>
<td style="padding:0.625rem 0.5rem"><span class="badge danger" style="font-size:0.7rem">Suspended</span></td>
<td style="padding:0.625rem 1rem;text-align:right">—</td>
</tr>
</tbody>
</table>
</div>

<!-- Activity feed -->
<div class="card" style="padding:0">
<div style="padding:0.875rem 1rem;border-bottom:1px solid var(--border);font-weight:600;font-size:0.875rem">Activity</div>
<div style="padding:0.75rem">
<div style="display:flex;flex-direction:column;gap:0.875rem">
<div style="display:flex;gap:0.625rem;font-size:0.775rem">
<div style="width:6px;height:6px;border-radius:50%;background:var(--primary);margin-top:5px;flex-shrink:0"></div>
<div><span style="font-weight:500">Acme Corp</span> upgraded to Enterprise<div style="color:var(--muted-foreground)">2 min ago</div></div>
</div>
<div style="display:flex;gap:0.625rem;font-size:0.775rem">
<div style="width:6px;height:6px;border-radius:50%;background:var(--success);margin-top:5px;flex-shrink:0"></div>
<div><span style="font-weight:500">New tenant</span> Globex Inc created<div style="color:var(--muted-foreground)">18 min ago</div></div>
</div>
<div style="display:flex;gap:0.625rem;font-size:0.775rem">
<div style="width:6px;height:6px;border-radius:50%;background:var(--warning);margin-top:5px;flex-shrink:0"></div>
<div><span style="font-weight:500">Initech</span> payment failed<div style="color:var(--muted-foreground)">1 hr ago</div></div>
</div>
<div style="display:flex;gap:0.625rem;font-size:0.775rem">
<div style="width:6px;height:6px;border-radius:50%;background:var(--muted-foreground);margin-top:5px;flex-shrink:0"></div>
<div><span style="font-weight:500">API key</span> rotated for Acme<div style="color:var(--muted-foreground)">3 hr ago</div></div>
</div>
</div>
</div>
</div>

</div>
</div>
</div>
</div>