Files
hr-portal-v5-designs/designs/11-attendance.html
T
2026-05-09 19:35:10 +00:00

294 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>Attendance — HR Portal</title>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: 'Inter', sans-serif; background: #FAFAFA; color: #111827; display: flex; min-height: 100vh; }
.sidebar { width: 240px; min-height: 100vh; background: #FFFFFF; border-right: 1px solid #E5E7EB; display: flex; flex-direction: column; position: fixed; top: 0; left: 0; bottom: 0; z-index: 50; }
.sidebar-logo { padding: 20px 20px 16px; display: flex; align-items: center; gap: 10px; font-size: 18px; font-weight: 700; color: #111827; border-bottom: 1px solid #F3F4F6; }
.logo-icon { width: 32px; height: 32px; background: #4F46E5; border-radius: 8px; display: flex; align-items: center; justify-content: center; }
.logo-icon svg { width: 16px; height: 16px; }
.sidebar-nav { flex: 1; padding: 12px 0; overflow-y: auto; }
.nav-item { display: flex; align-items: center; gap: 10px; padding: 9px 16px; margin: 1px 8px; border-radius: 6px; font-size: 14px; font-weight: 500; color: #6B7280; text-decoration: none; cursor: pointer; }
.nav-item:hover { background: #F9FAFB; color: #111827; }
.nav-item.active { background: #EEF2FF; color: #4F46E5; font-weight: 600; }
.nav-item svg { width: 18px; height: 18px; flex-shrink: 0; }
.nav-badge { margin-left: auto; background: #F59E0B; color: #FFF; font-size: 11px; font-weight: 600; padding: 1px 7px; border-radius: 10px; }
.sidebar-footer { padding: 16px; border-top: 1px solid #F3F4F6; }
.user-row { display: flex; align-items: center; gap: 10px; padding: 8px; }
.user-avatar { width: 34px; height: 34px; border-radius: 50%; background: #4F46E5; color: #FFF; display: flex; align-items: center; justify-content: center; font-size: 13px; font-weight: 600; }
.user-name { font-size: 13px; font-weight: 600; color: #111827; }
.user-role { font-size: 11px; color: #9CA3AF; }
.logout-btn { width: 100%; margin-top: 8px; padding: 7px; border: 1.5px solid #E5E7EB; border-radius: 6px; background: transparent; color: #6B7280; font-size: 13px; cursor: pointer; display: flex; align-items: center; justify-content: center; gap: 6px; }
.main-wrapper { margin-left: 240px; flex: 1; display: flex; flex-direction: column; }
.topnav { height: 64px; background: #FFFFFF; border-bottom: 1px solid #E5E7EB; display: flex; align-items: center; gap: 16px; padding: 0 28px; position: sticky; top: 0; z-index: 40; }
.breadcrumb { display: flex; align-items: center; gap: 8px; font-size: 14px; }
.breadcrumb a { color: #9CA3AF; text-decoration: none; }
.breadcrumb svg { width: 14px; height: 14px; color: #D1D5DB; }
.breadcrumb span { color: #111827; font-weight: 500; }
.topnav-actions { margin-left: auto; display: flex; gap: 8px; align-items: center; }
.icon-btn { width: 36px; height: 36px; border-radius: 8px; border: 1.5px solid #E5E7EB; background: #FFFFFF; display: flex; align-items: center; justify-content: center; cursor: pointer; position: relative; }
.icon-btn svg { width: 18px; height: 18px; color: #6B7280; }
.notif-badge { position: absolute; top: -4px; right: -4px; background: #EF4444; color: #FFF; font-size: 10px; font-weight: 700; width: 16px; height: 16px; border-radius: 50%; display: flex; align-items: center; justify-content: center; border: 2px solid #FFFFFF; }
.topnav-avatar { width: 36px; height: 36px; border-radius: 50%; background: #4F46E5; color: #FFF; display: flex; align-items: center; justify-content: center; font-size: 13px; font-weight: 600; cursor: pointer; }
.content { padding: 28px; }
.page-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 20px; }
.page-title { font-size: 22px; font-weight: 700; }
.btn-outline { padding: 8px 16px; border: 1.5px solid #E5E7EB; border-radius: 6px; background: #FFFFFF; color: #374151; font-size: 14px; font-weight: 500; cursor: pointer; display: flex; align-items: center; gap: 6px; }
.tabs { display: flex; border-bottom: 1px solid #E5E7EB; margin-bottom: 20px; }
.tab { padding: 10px 20px; font-size: 14px; font-weight: 500; color: #6B7280; cursor: pointer; border-bottom: 2px solid transparent; }
.tab.active { color: #4F46E5; border-bottom-color: #4F46E5; font-weight: 600; }
.filter-bar { display: flex; align-items: center; gap: 10px; margin-bottom: 20px; }
.filter-input { padding: 8px 13px; background: #FFFFFF; border: 1.5px solid #E5E7EB; border-radius: 6px; font-size: 14px; color: #374151; outline: none; }
.filter-select { padding: 8px 13px; background: #FFFFFF; border: 1.5px solid #E5E7EB; border-radius: 6px; font-size: 14px; color: #374151; outline: none; cursor: pointer; appearance: none; min-width: 150px; }
.stats-row { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; margin-bottom: 24px; }
.stat-card { background: #FFFFFF; border-radius: 10px; padding: 18px 20px; border: 1px solid #E5E7EB; box-shadow: 0 1px 3px rgba(0,0,0,0.06); display: flex; align-items: center; gap: 14px; }
.stat-icon { width: 42px; height: 42px; border-radius: 10px; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.stat-icon svg { width: 20px; height: 20px; }
.stat-value { font-size: 24px; font-weight: 700; color: #111827; }
.stat-label { font-size: 12px; color: #9CA3AF; margin-top: 1px; }
.table-card { background: #FFFFFF; border-radius: 10px; border: 1px solid #E5E7EB; box-shadow: 0 1px 3px rgba(0,0,0,0.06); overflow: hidden; }
table { width: 100%; border-collapse: collapse; }
thead { background: #F9FAFB; border-bottom: 1px solid #E5E7EB; }
th { padding: 12px 16px; font-size: 12px; font-weight: 600; color: #6B7280; text-align: left; text-transform: uppercase; letter-spacing: 0.4px; }
tbody tr { border-bottom: 1px solid #F3F4F6; transition: background 0.1s; }
tbody tr:last-child { border-bottom: none; }
tbody tr:hover { background: #FAFAFA; }
td { padding: 14px 16px; font-size: 14px; color: #374151; vertical-align: middle; }
.emp-cell { display: flex; align-items: center; gap: 10px; }
.emp-avatar { width: 32px; height: 32px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 12px; font-weight: 600; color: #FFF; flex-shrink: 0; }
.emp-name { font-size: 13px; font-weight: 500; color: #111827; }
.emp-dept { font-size: 11px; color: #9CA3AF; }
.time-cell { font-size: 14px; font-weight: 500; color: #111827; }
.hours-cell { font-size: 14px; color: #374151; }
.badge { padding: 3px 9px; border-radius: 4px; font-size: 11px; font-weight: 600; }
.badge-green { background: #ECFDF5; color: #059669; }
.badge-red { background: #FEF2F2; color: #DC2626; }
.badge-yellow { background: #FFFBEB; color: #D97706; }
.badge-blue { background: #EFF6FF; color: #3B82F6; }
.badge-gray { background: #F3F4F6; color: #6B7280; }
.note-text { font-size: 12px; color: #9CA3AF; max-width: 150px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
</style>
</head>
<body>
<aside class="sidebar">
<div class="sidebar-logo"><div class="logo-icon"><svg viewBox="0 0 24 24" fill="none" stroke="#FFFFFF" 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>HR Portal</div>
<nav class="sidebar-nav">
<a href="04-admin-dashboard.html" class="nav-item"><svg 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 href="05-employee-directory.html" class="nav-item"><svg 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 href="08-department-management.html" class="nav-item"><svg 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>
<a href="09-leave-requests.html" class="nav-item"><svg 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">7</span></a>
<a href="11-attendance.html" class="nav-item active"><svg 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 href="12-payroll-dashboard.html" class="nav-item"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="5" width="20" height="14" rx="2"/><line x1="2" y1="10" x2="22" y2="10"/></svg>Payroll</a>
<a href="13-recruitment.html" class="nav-item"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="7" width="20" height="14" rx="2" ry="2"/><path d="M16 21V5a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16"/></svg>Recruitment</a>
<a href="14-expense-claims.html" class="nav-item"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/></svg>Expense Claims</a>
<a href="15-performance-reviews.html" class="nav-item"><svg 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>Performance</a>
<a href="16-reports.html" class="nav-item"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21.21 15.89A10 10 0 1 1 8 2.83"/><path d="M22 12A10 10 0 0 0 12 2v10z"/></svg>Reports</a>
<a href="20-org-chart.html" class="nav-item"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="1" width="6" height="5" rx="1"/><rect x="1" y="14" width="6" height="5" rx="1"/><rect x="17" y="14" width="6" height="5" rx="1"/><path d="M4 14v-4a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v4"/><line x1="12" y1="6" x2="12" y2="9"/></svg>Org Chart</a>
<a href="#" class="nav-item"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M22 12h-4l-3 9L9 3l-3 9H2"/></svg>Announcements</a>
<a href="17-settings.html" class="nav-item"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="3"/><path d="M19.07 4.93l-1.41 1.41M4.93 4.93l1.41 1.41M12 2v2M12 20v2M2 12h2M20 12h2M17.66 17.66l-1.41-1.41M6.34 17.66l1.41-1.41"/></svg>Settings</a>
</nav>
<div class="sidebar-footer">
<div class="user-row"><div class="user-avatar">SC</div><div><div class="user-name">Sarah Chen</div><div class="user-role">HR Administrator</div></div></div>
<button class="logout-btn">Sign Out</button>
</div>
</aside>
<div class="main-wrapper">
<header class="topnav">
<div class="breadcrumb">
<a href="04-admin-dashboard.html">Home</a>
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="9 18 15 12 9 6"/></svg>
<span>Attendance</span>
</div>
<div class="topnav-actions">
<div class="icon-btn"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M22 17H2a3 3 0 0 0 3-3V9a7 7 0 0 1 14 0v5a3 3 0 0 0 3 3zm-8.27 4a2 2 0 0 1-3.46 0"/></svg><span class="notif-badge">3</span></div>
<div class="topnav-avatar">SC</div>
</div>
</header>
<main class="content">
<div class="page-header">
<div class="page-title">Attendance Log</div>
<div style="display:flex;gap:8px;">
<button class="btn-outline">
<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></svg>
Export
</button>
</div>
</div>
<div class="tabs">
<div class="tab active">Daily</div>
<div class="tab">Monthly</div>
<div class="tab">Calendar View</div>
</div>
<div class="filter-bar">
<input class="filter-input" type="date" value="2026-05-09">
<select class="filter-select">
<option>All Departments</option>
<option>Engineering</option>
<option>HR</option>
<option>Finance</option>
<option>Marketing</option>
<option>Operations</option>
</select>
<select class="filter-select">
<option>All Status</option>
<option>Present</option>
<option>Absent</option>
<option>On Leave</option>
<option>Half Day</option>
<option>Late Arrival</option>
</select>
</div>
<div class="stats-row">
<div class="stat-card">
<div class="stat-icon" style="background:#ECFDF5;"><svg viewBox="0 0 24 24" fill="none" stroke="#10B981" stroke-width="2"><polyline points="20 6 9 17 4 12"/></svg></div>
<div><div class="stat-value">198</div><div class="stat-label">Present</div></div>
</div>
<div class="stat-card">
<div class="stat-icon" style="background:#FEF2F2;"><svg viewBox="0 0 24 24" fill="none" stroke="#EF4444" stroke-width="2"><circle cx="12" cy="12" r="10"/><line x1="8" y1="12" x2="16" y2="12"/></svg></div>
<div><div class="stat-value">12</div><div class="stat-label">Absent</div></div>
</div>
<div class="stat-card">
<div class="stat-icon" style="background:#EFF6FF;"><svg viewBox="0 0 24 24" fill="none" stroke="#3B82F6" stroke-width="2"><rect x="3" y="4" width="18" height="18" rx="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>
<div><div class="stat-value">15</div><div class="stat-label">On Leave</div></div>
</div>
<div class="stat-card">
<div class="stat-icon" style="background:#FFFBEB;"><svg viewBox="0 0 24 24" fill="none" stroke="#F59E0B" stroke-width="2"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg></div>
<div><div class="stat-value">5</div><div class="stat-label">Half Day</div></div>
</div>
</div>
<div class="table-card">
<table>
<thead>
<tr>
<th>Employee</th>
<th>Check In</th>
<th>Check Out</th>
<th>Working Hours</th>
<th>Status</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td><div class="emp-cell"><div class="emp-avatar" style="background:#4F46E5;">MR</div><div><div class="emp-name">Michael Rodriguez</div><div class="emp-dept">Engineering</div></div></div></td>
<td><div class="time-cell">09:02 AM</div></td>
<td><div class="time-cell">06:15 PM</div></td>
<td><div class="hours-cell">9h 13m</div></td>
<td><span class="badge badge-green">Present</span></td>
<td><span class="note-text"></span></td>
</tr>
<tr>
<td><div class="emp-cell"><div class="emp-avatar" style="background:#10B981;">PP</div><div><div class="emp-name">Priya Patel</div><div class="emp-dept">Finance</div></div></div></td>
<td><div class="time-cell"></div></td>
<td><div class="time-cell"></div></td>
<td><div class="hours-cell"></div></td>
<td><span class="badge badge-blue">On Leave</span></td>
<td><span class="note-text">Sick leave approved</span></td>
</tr>
<tr>
<td><div class="emp-cell"><div class="emp-avatar" style="background:#F59E0B;">JK</div><div><div class="emp-name">James Kim</div><div class="emp-dept">Engineering</div></div></div></td>
<td><div class="time-cell">09:45 AM</div></td>
<td><div class="time-cell">06:30 PM</div></td>
<td><div class="hours-cell">8h 45m</div></td>
<td><span class="badge badge-yellow">Late Arrival</span></td>
<td><span class="note-text">Traffic delay</span></td>
</tr>
<tr>
<td><div class="emp-cell"><div class="emp-avatar" style="background:#7C3AED;">AL</div><div><div class="emp-name">Aisha Larsson</div><div class="emp-dept">Marketing</div></div></div></td>
<td><div class="time-cell">08:55 AM</div></td>
<td><div class="time-cell">05:55 PM</div></td>
<td><div class="hours-cell">9h 00m</div></td>
<td><span class="badge badge-green">Present</span></td>
<td><span class="note-text"></span></td>
</tr>
<tr>
<td><div class="emp-cell"><div class="emp-avatar" style="background:#3B82F6;">RS</div><div><div class="emp-name">Ravi Shankar</div><div class="emp-dept">Operations</div></div></div></td>
<td><div class="time-cell">08:30 AM</div></td>
<td><div class="time-cell">01:00 PM</div></td>
<td><div class="hours-cell">4h 30m</div></td>
<td><span class="badge badge-yellow">Half Day</span></td>
<td><span class="note-text">Doctor appointment PM</span></td>
</tr>
<tr>
<td><div class="emp-cell"><div class="emp-avatar" style="background:#EC4899;">DT</div><div><div class="emp-name">Diana Torres</div><div class="emp-dept">Sales</div></div></div></td>
<td><div class="time-cell">09:00 AM</div></td>
<td><div class="time-cell">06:05 PM</div></td>
<td><div class="hours-cell">9h 05m</div></td>
<td><span class="badge badge-green">Present</span></td>
<td><span class="note-text"></span></td>
</tr>
<tr>
<td><div class="emp-cell"><div class="emp-avatar" style="background:#059669;">LO</div><div><div class="emp-name">Lucas Oliveira</div><div class="emp-dept">Operations</div></div></div></td>
<td><div class="time-cell"></div></td>
<td><div class="time-cell"></div></td>
<td><div class="hours-cell"></div></td>
<td><span class="badge badge-red">Absent</span></td>
<td><span class="note-text">No notice provided</span></td>
</tr>
<tr>
<td><div class="emp-cell"><div class="emp-avatar" style="background:#D97706;">FA</div><div><div class="emp-name">Fatima Al-Rashid</div><div class="emp-dept">Finance</div></div></div></td>
<td><div class="time-cell">08:48 AM</div></td>
<td><div class="time-cell">05:50 PM</div></td>
<td><div class="hours-cell">9h 02m</div></td>
<td><span class="badge badge-green">Present</span></td>
<td><span class="note-text"></span></td>
</tr>
<tr>
<td><div class="emp-cell"><div class="emp-avatar" style="background:#6366F1;">NW</div><div><div class="emp-name">Noah Williams</div><div class="emp-dept">Engineering</div></div></div></td>
<td><div class="time-cell">09:15 AM</div></td>
<td><div class="time-cell">06:20 PM</div></td>
<td><div class="hours-cell">9h 05m</div></td>
<td><span class="badge badge-green">Present</span></td>
<td><span class="note-text">WFH approved</span></td>
</tr>
<tr>
<td><div class="emp-cell"><div class="emp-avatar" style="background:#7C3AED;">KL</div><div><div class="emp-name">Kevin Liu</div><div class="emp-dept">Marketing</div></div></div></td>
<td><div class="time-cell">09:00 AM</div></td>
<td><div class="time-cell">06:00 PM</div></td>
<td><div class="hours-cell">9h 00m</div></td>
<td><span class="badge badge-green">Present</span></td>
<td><span class="note-text"></span></td>
</tr>
</tbody>
</table>
<div style="padding:14px 20px;border-top:1px solid #F3F4F6;display:flex;justify-content:space-between;align-items:center;">
<span style="font-size:13px;color:#6B7280;">Showing 110 of 230 employees</span>
<div style="display:flex;gap:4px;">
<button style="width:30px;height:30px;border-radius:6px;border:1.5px solid #E5E7EB;background:#FFFFFF;cursor:pointer;display:flex;align-items:center;justify-content:center;">
<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="15 18 9 12 15 6"/></svg>
</button>
<button style="width:30px;height:30px;border-radius:6px;border:1.5px solid #4F46E5;background:#4F46E5;color:#FFF;font-size:13px;font-weight:600;cursor:pointer;">1</button>
<button style="width:30px;height:30px;border-radius:6px;border:1.5px solid #E5E7EB;background:#FFFFFF;font-size:13px;cursor:pointer;">2</button>
<button style="width:30px;height:30px;border-radius:6px;border:1.5px solid #E5E7EB;background:#FFFFFF;font-size:13px;cursor:pointer;">3</button>
<button style="width:30px;height:30px;border-radius:6px;border:1.5px solid #E5E7EB;background:#FFFFFF;cursor:pointer;display:flex;align-items:center;justify-content:center;">
<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="9 18 15 12 9 6"/></svg>
</button>
</div>
</div>
</div>
</main>
</div>
</body>
</html>