Files
hr-portal-v4-designs/02-admin-dashboard.html
T
2026-05-09 17:32:32 +00:00

537 lines
22 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>HR Portal v4 — Admin Dashboard</title>
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; background: #f8fafc; color: #0f172a; display: flex; min-height: 100vh; }
/* SIDEBAR */
.sidebar {
width: 240px; min-height: 100vh; background: #1e3a5f;
display: flex; flex-direction: column; position: fixed; top: 0; left: 0; z-index: 100;
}
.sidebar-logo {
padding: 20px 20px 16px;
border-bottom: 1px solid rgba(255,255,255,0.08);
display: flex; align-items: center; gap: 10px;
}
.sidebar-logo-icon {
width: 36px; height: 36px; background: #2563eb; border-radius: 8px;
display: flex; align-items: center; justify-content: center; flex-shrink: 0;
}
.sidebar-logo-text { font-size: 15px; font-weight: 700; color: #ffffff; letter-spacing: -0.2px; }
.sidebar-logo-sub { font-size: 10px; color: #94a3b8; margin-top: 1px; }
.sidebar-nav { flex: 1; padding: 12px 0; overflow-y: auto; }
.nav-section-label {
font-size: 10px; font-weight: 600; color: #64748b; letter-spacing: 0.8px;
text-transform: uppercase; padding: 8px 20px 4px;
}
.nav-item {
display: flex; align-items: center; gap: 10px;
padding: 9px 20px; color: #cbd5e1; font-size: 13.5px; font-weight: 500;
cursor: pointer; transition: background 0.15s, color 0.15s;
border-left: 3px solid transparent;
text-decoration: none;
}
.nav-item:hover { background: rgba(255,255,255,0.07); color: #ffffff; }
.nav-item.active {
background: rgba(37,99,235,0.25); color: #ffffff;
border-left-color: #2563eb;
}
.nav-item svg { flex-shrink: 0; opacity: 0.8; }
.nav-item.active svg { opacity: 1; }
.nav-badge {
margin-left: auto; background: #2563eb; color: #fff;
font-size: 10px; font-weight: 700; padding: 1px 6px; border-radius: 20px;
}
.sidebar-footer {
padding: 14px 16px; border-top: 1px solid rgba(255,255,255,0.08);
display: flex; align-items: center; gap: 10px;
}
.avatar {
width: 34px; height: 34px; border-radius: 50%; background: #2563eb;
display: flex; align-items: center; justify-content: center;
font-size: 13px; font-weight: 700; color: #fff; flex-shrink: 0;
}
.sidebar-user-name { font-size: 13px; font-weight: 600; color: #ffffff; }
.sidebar-user-role { font-size: 11px; color: #94a3b8; }
/* HEADER */
.main { margin-left: 240px; display: flex; flex-direction: column; flex: 1; }
.header {
position: sticky; top: 0; z-index: 50;
background: #ffffff; border-bottom: 1px solid #e2e8f0;
padding: 0 28px; height: 60px;
display: flex; align-items: center; gap: 16px;
}
.header-title { font-size: 16px; font-weight: 700; color: #0f172a; flex: 1; }
.search-box {
display: flex; align-items: center; gap: 8px;
background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 8px;
padding: 8px 14px; width: 260px;
}
.search-box input {
border: none; background: transparent; font-size: 13px; color: #374151;
outline: none; width: 100%; font-family: inherit;
}
.search-box input::placeholder { color: #94a3b8; }
.header-actions { display: flex; align-items: center; gap: 8px; }
.icon-btn {
width: 36px; height: 36px; border-radius: 8px; border: 1px solid #e2e8f0;
background: #ffffff; display: flex; align-items: center; justify-content: center;
cursor: pointer; position: relative; color: #64748b;
transition: background 0.15s;
}
.icon-btn:hover { background: #f8fafc; }
.notif-badge {
position: absolute; top: -4px; right: -4px;
width: 16px; height: 16px; background: #dc2626; border-radius: 50%;
font-size: 9px; font-weight: 700; color: #fff;
display: flex; align-items: center; justify-content: center;
border: 2px solid #fff;
}
.header-avatar {
width: 34px; height: 34px; border-radius: 50%; background: #1e3a5f;
display: flex; align-items: center; justify-content: center;
font-size: 12px; font-weight: 700; color: #fff; cursor: pointer;
}
/* CONTENT */
.content { padding: 28px; flex: 1; }
.page-header { margin-bottom: 24px; }
.page-header h1 { font-size: 22px; font-weight: 700; color: #0f172a; }
.page-header p { font-size: 13px; color: #64748b; margin-top: 3px; }
/* KPI CARDS */
.kpi-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; margin-bottom: 24px; }
.kpi-card {
background: #ffffff; border: 1px solid #e2e8f0; border-radius: 12px;
padding: 20px; box-shadow: 0 1px 3px rgba(0,0,0,0.06);
display: flex; flex-direction: column; gap: 12px;
}
.kpi-header { display: flex; align-items: flex-start; justify-content: space-between; }
.kpi-icon {
width: 42px; height: 42px; border-radius: 10px;
display: flex; align-items: center; justify-content: center;
}
.kpi-icon.blue { background: #eff6ff; color: #2563eb; }
.kpi-icon.green { background: #f0fdf4; color: #16a34a; }
.kpi-icon.orange { background: #fff7ed; color: #d97706; }
.kpi-icon.purple { background: #f5f3ff; color: #7c3aed; }
.kpi-trend {
display: flex; align-items: center; gap: 3px;
font-size: 12px; font-weight: 600; padding: 3px 8px; border-radius: 20px;
}
.kpi-trend.up { color: #16a34a; background: #f0fdf4; }
.kpi-trend.down { color: #dc2626; background: #fef2f2; }
.kpi-value { font-size: 30px; font-weight: 800; color: #0f172a; letter-spacing: -0.5px; }
.kpi-label { font-size: 13px; color: #64748b; font-weight: 500; }
/* BOTTOM GRID */
.bottom-grid { display: grid; grid-template-columns: 1.4fr 1fr; gap: 20px; margin-bottom: 20px; }
.card {
background: #ffffff; border: 1px solid #e2e8f0; border-radius: 12px;
box-shadow: 0 1px 3px rgba(0,0,0,0.06); overflow: hidden;
}
.card-header {
padding: 16px 20px; border-bottom: 1px solid #f1f5f9;
display: flex; align-items: center; justify-content: space-between;
}
.card-title { font-size: 14px; font-weight: 700; color: #0f172a; }
.card-link { font-size: 12px; color: #2563eb; text-decoration: none; font-weight: 500; }
.card-link:hover { text-decoration: underline; }
/* TABLE */
table { width: 100%; border-collapse: collapse; }
th {
font-size: 11px; font-weight: 600; color: #64748b; text-transform: uppercase;
letter-spacing: 0.5px; padding: 10px 20px; text-align: left;
background: #f8fafc; border-bottom: 1px solid #e2e8f0;
}
td { padding: 11px 20px; font-size: 13px; color: #374151; border-bottom: 1px solid #f1f5f9; }
tr:last-child td { border-bottom: none; }
tr:hover td { background: #fafbfc; }
.badge {
display: inline-flex; align-items: center; gap: 4px;
padding: 3px 10px; border-radius: 20px; font-size: 11px; font-weight: 600;
}
.badge-pending { background: #eff6ff; color: #2563eb; }
.badge-approved { background: #f0fdf4; color: #16a34a; }
.badge-rejected { background: #fef2f2; color: #dc2626; }
/* CHART */
.chart-area { padding: 20px; }
.chart-bars { display: flex; align-items: flex-end; gap: 12px; height: 120px; }
.bar-group { flex: 1; display: flex; flex-direction: column; align-items: center; gap: 6px; }
.bar-wrap { flex: 1; display: flex; align-items: flex-end; width: 100%; }
.bar {
width: 100%; border-radius: 4px 4px 0 0; background: #2563eb;
transition: opacity 0.2s;
}
.bar:hover { opacity: 0.8; }
.bar-label { font-size: 11px; color: #94a3b8; font-weight: 500; }
.bar-val { font-size: 11px; color: #374151; font-weight: 600; }
.chart-legend {
display: flex; align-items: center; gap: 16px; margin-top: 16px;
padding-top: 12px; border-top: 1px solid #f1f5f9;
}
.legend-item { display: flex; align-items: center; gap: 6px; font-size: 12px; color: #64748b; }
.legend-dot { width: 10px; height: 10px; border-radius: 3px; }
/* RECENT HIRES */
.recent-hires { padding: 0; }
.hire-item {
display: flex; align-items: center; gap: 12px; padding: 12px 20px;
border-bottom: 1px solid #f1f5f9;
}
.hire-item:last-child { border-bottom: none; }
.hire-avatar {
width: 36px; height: 36px; border-radius: 50%;
display: flex; align-items: center; justify-content: center;
font-size: 13px; font-weight: 700; color: #fff; flex-shrink: 0;
}
.hire-name { font-size: 13px; font-weight: 600; color: #0f172a; }
.hire-role { font-size: 12px; color: #64748b; }
.hire-date { margin-left: auto; font-size: 11px; color: #94a3b8; }
.hire-new {
background: #f0fdf4; color: #16a34a; font-size: 10px; font-weight: 700;
padding: 2px 7px; border-radius: 20px;
}
.full-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }
</style>
</head>
<body>
<!-- SIDEBAR -->
<aside class="sidebar">
<div class="sidebar-logo">
<div class="sidebar-logo-icon">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="#ffffff" stroke-width="2.2">
<path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/>
<circle cx="9" cy="7" r="4"/>
<path d="M23 21v-2a4 4 0 0 0-3-3.87"/>
<path d="M16 3.13a4 4 0 0 1 0 7.75"/>
</svg>
</div>
<div>
<div class="sidebar-logo-text">HR Portal v4</div>
<div class="sidebar-logo-sub">Admin Console</div>
</div>
</div>
<nav class="sidebar-nav">
<div class="nav-section-label">Main</div>
<a class="nav-item active" href="#">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="7" height="7"/><rect x="14" y="3" width="7" height="7"/><rect x="14" y="14" width="7" height="7"/><rect x="3" y="14" width="7" height="7"/></svg>
Dashboard
</a>
<a class="nav-item" href="03-employee-list.html">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M23 21v-2a4 4 0 0 0-3-3.87"/><path d="M16 3.13a4 4 0 0 1 0 7.75"/></svg>
Employees
</a>
<a class="nav-item" href="#">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><polyline points="9 22 9 12 15 12 15 22"/></svg>
Departments
</a>
<div class="nav-section-label" style="margin-top:8px;">Operations</div>
<a class="nav-item" href="04-leave-management.html">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="4" width="18" height="18" rx="2" ry="2"/><line x1="16" y1="2" x2="16" y2="6"/><line x1="8" y1="2" x2="8" y2="6"/><line x1="3" y1="10" x2="21" y2="10"/></svg>
Leave Management
<span class="nav-badge">5</span>
</a>
<a class="nav-item" href="06-attendance.html">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg>
Attendance
</a>
<a class="nav-item" href="05-payroll.html">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="12" y1="1" x2="12" y2="23"/><path d="M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"/></svg>
Payroll
</a>
<a class="nav-item" href="07-recruitment.html">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>
Recruitment
</a>
<a class="nav-item" href="#">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="22 12 18 12 15 21 9 3 6 12 2 12"/></svg>
Performance
</a>
<div class="nav-section-label" style="margin-top:8px;">Analytics</div>
<a class="nav-item" href="#">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="20" x2="18" y2="10"/><line x1="12" y1="20" x2="12" y2="4"/><line x1="6" y1="20" x2="6" y2="14"/></svg>
Reports
</a>
<a class="nav-item" href="#">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="3"/><path d="M19.07 4.93a10 10 0 0 1 0 14.14"/><path d="M4.93 4.93a10 10 0 0 0 0 14.14"/></svg>
Settings
</a>
</nav>
<div class="sidebar-footer">
<div class="avatar">AK</div>
<div>
<div class="sidebar-user-name">Arun Kumar</div>
<div class="sidebar-user-role">Super Admin</div>
</div>
</div>
</aside>
<!-- MAIN -->
<div class="main">
<header class="header">
<div class="header-title">Dashboard</div>
<div class="search-box">
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="#94a3b8" stroke-width="2"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>
<input type="text" placeholder="Search employees, reports...">
</div>
<div class="header-actions">
<div class="icon-btn">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9"/><path d="M13.73 21a2 2 0 0 1-3.46 0"/></svg>
<span class="notif-badge">5</span>
</div>
<div class="icon-btn">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="3"/><path d="M19.07 4.93a10 10 0 0 1 0 14.14M4.93 4.93a10 10 0 0 0 0 14.14"/></svg>
</div>
<div class="header-avatar">AK</div>
</div>
</header>
<div class="content">
<div class="page-header">
<h1>Good morning, Arun</h1>
<p>Friday, 9 May 2026 &nbsp;&bull;&nbsp; Here's what's happening today</p>
</div>
<!-- KPI Cards -->
<div class="kpi-grid">
<div class="kpi-card">
<div class="kpi-header">
<div class="kpi-icon blue">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M23 21v-2a4 4 0 0 0-3-3.87"/><path d="M16 3.13a4 4 0 0 1 0 7.75"/></svg>
</div>
<span class="kpi-trend up">
<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><polyline points="18 15 12 9 6 15"/></svg>
+3
</span>
</div>
<div class="kpi-value">247</div>
<div class="kpi-label">Total Employees</div>
</div>
<div class="kpi-card">
<div class="kpi-header">
<div class="kpi-icon green">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"/><polyline points="22 4 12 14.01 9 11.01"/></svg>
</div>
<span class="kpi-trend up">
<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><polyline points="18 15 12 9 6 15"/></svg>
96%
</span>
</div>
<div class="kpi-value">198</div>
<div class="kpi-label">Present Today</div>
</div>
<div class="kpi-card">
<div class="kpi-header">
<div class="kpi-icon orange">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="4" width="18" height="18" rx="2" ry="2"/><line x1="16" y1="2" x2="16" y2="6"/><line x1="8" y1="2" x2="8" y2="6"/><line x1="3" y1="10" x2="21" y2="10"/></svg>
</div>
<span class="kpi-trend down">
<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><polyline points="6 9 12 15 18 9"/></svg>
-2
</span>
</div>
<div class="kpi-value">12</div>
<div class="kpi-label">On Leave</div>
</div>
<div class="kpi-card">
<div class="kpi-header">
<div class="kpi-icon purple">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>
</div>
<span class="kpi-trend up">
<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><polyline points="18 15 12 9 6 15"/></svg>
+2
</span>
</div>
<div class="kpi-value">8</div>
<div class="kpi-label">Open Positions</div>
</div>
</div>
<!-- Bottom Grid -->
<div class="bottom-grid">
<!-- Leave Requests Table -->
<div class="card">
<div class="card-header">
<div class="card-title">Recent Leave Requests</div>
<a href="04-leave-management.html" class="card-link">View all</a>
</div>
<table>
<thead>
<tr>
<th>Employee</th>
<th>Type</th>
<th>Dates</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Priya Sharma</strong></td>
<td>Annual Leave</td>
<td>May 1214</td>
<td><span class="badge badge-pending">Pending</span></td>
</tr>
<tr>
<td><strong>Rahul Verma</strong></td>
<td>Sick Leave</td>
<td>May 9</td>
<td><span class="badge badge-approved">Approved</span></td>
</tr>
<tr>
<td><strong>Anjali Patel</strong></td>
<td>Casual Leave</td>
<td>May 1516</td>
<td><span class="badge badge-pending">Pending</span></td>
</tr>
<tr>
<td><strong>Vikram Singh</strong></td>
<td>Annual Leave</td>
<td>May 2024</td>
<td><span class="badge badge-approved">Approved</span></td>
</tr>
<tr>
<td><strong>Meena Iyer</strong></td>
<td>Maternity</td>
<td>May 1Jun 30</td>
<td><span class="badge badge-approved">Approved</span></td>
</tr>
<tr>
<td><strong>Deepak Nair</strong></td>
<td>Sick Leave</td>
<td>May 89</td>
<td><span class="badge badge-rejected">Rejected</span></td>
</tr>
</tbody>
</table>
</div>
<!-- Attendance Chart -->
<div class="card">
<div class="card-header">
<div class="card-title">Attendance This Week</div>
<a href="06-attendance.html" class="card-link">View detail</a>
</div>
<div class="chart-area">
<div class="chart-bars">
<div class="bar-group">
<div class="bar-val">201</div>
<div class="bar-wrap"><div class="bar" style="height:82%"></div></div>
<div class="bar-label">Mon</div>
</div>
<div class="bar-group">
<div class="bar-val">215</div>
<div class="bar-wrap"><div class="bar" style="height:90%"></div></div>
<div class="bar-label">Tue</div>
</div>
<div class="bar-group">
<div class="bar-val">207</div>
<div class="bar-wrap"><div class="bar" style="height:85%"></div></div>
<div class="bar-label">Wed</div>
</div>
<div class="bar-group">
<div class="bar-val">219</div>
<div class="bar-wrap"><div class="bar" style="height:92%"></div></div>
<div class="bar-label">Thu</div>
</div>
<div class="bar-group">
<div class="bar-val">198</div>
<div class="bar-wrap"><div class="bar" style="height:80%; background:#93c5fd"></div></div>
<div class="bar-label">Today</div>
</div>
</div>
<div class="chart-legend">
<div class="legend-item"><div class="legend-dot" style="background:#2563eb"></div>Present</div>
<div class="legend-item"><div class="legend-dot" style="background:#93c5fd"></div>Today (live)</div>
</div>
</div>
</div>
</div>
<!-- Recent Hires -->
<div class="card">
<div class="card-header">
<div class="card-title">Recent Hires</div>
<a href="03-employee-list.html" class="card-link">View all employees</a>
</div>
<div class="recent-hires">
<div class="hire-item">
<div class="hire-avatar" style="background:#7c3aed">PS</div>
<div>
<div class="hire-name">Pooja Subramaniam</div>
<div class="hire-role">Software Engineer &bull; Engineering</div>
</div>
<div style="text-align:right">
<div class="hire-date">May 6, 2026</div>
<span class="hire-new">NEW</span>
</div>
</div>
<div class="hire-item">
<div class="hire-avatar" style="background:#0891b2">RB</div>
<div>
<div class="hire-name">Rohan Bhatia</div>
<div class="hire-role">Product Manager &bull; Product</div>
</div>
<div style="text-align:right">
<div class="hire-date">May 2, 2026</div>
<span class="hire-new">NEW</span>
</div>
</div>
<div class="hire-item">
<div class="hire-avatar" style="background:#16a34a">NK</div>
<div>
<div class="hire-name">Nisha Kulkarni</div>
<div class="hire-role">HR Executive &bull; Human Resources</div>
</div>
<div style="text-align:right">
<div class="hire-date">Apr 28, 2026</div>
</div>
</div>
<div class="hire-item">
<div class="hire-avatar" style="background:#d97706">AM</div>
<div>
<div class="hire-name">Arjun Mehta</div>
<div class="hire-role">Sales Executive &bull; Sales</div>
</div>
<div style="text-align:right">
<div class="hire-date">Apr 22, 2026</div>
</div>
</div>
<div class="hire-item">
<div class="hire-avatar" style="background:#dc2626">SK</div>
<div>
<div class="hire-name">Shalini Krishnamurthy</div>
<div class="hire-role">Data Analyst &bull; Analytics</div>
</div>
<div style="text-align:right">
<div class="hire-date">Apr 18, 2026</div>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>