nguyenhai266 commited on
Commit
711dab1
·
1 Parent(s): ded4cd1

Refactor theme vars; add employee list UI & scripts

Browse files

Introduce centralized theme variables and refactor many CSS files to use them (base/theme/sidebar + many component styles). Add new employee management feature: template (employee-list.html), styles (employee-list.css) and JS (employee-popup.js, room-code.js, copy-code.js). Add sidebar activation JS and various template tweaks (dashboard links, faceID/document actions, user info edit popup). Add /employeeList mapping in HomeController. Remove legacy attendance-common/manager CSS. Update application.properties datasource (switch to MySQL and credential changes) and minor footer/formatting fixes.

Files changed (38) hide show
  1. src/main/java/com/attendenceSystem/frontroller/HomeController.java +4 -0
  2. src/main/resources/static/css/absent/absent-create.css +10 -10
  3. src/main/resources/static/css/absent/absent-history.css +18 -18
  4. src/main/resources/static/css/absent/absent-list.css +2 -2
  5. src/main/resources/static/css/account/account-list.css +19 -19
  6. src/main/resources/static/css/account/employee-list.css +627 -0
  7. src/main/resources/static/css/attendance/attendance-common.css +0 -64
  8. src/main/resources/static/css/attendance/attendance-history.css +18 -18
  9. src/main/resources/static/css/attendance/attendance-manager.css +0 -27
  10. src/main/resources/static/css/attendance/attendance.css +15 -15
  11. src/main/resources/static/css/base.css +43 -18
  12. src/main/resources/static/css/dashboard/dashboard-admin.css +28 -28
  13. src/main/resources/static/css/dashboard/dashboard-employee.css +18 -18
  14. src/main/resources/static/css/dashboard/dashboard-manager.css +6 -6
  15. src/main/resources/static/css/document/document-create.css +11 -11
  16. src/main/resources/static/css/document/document-list.css +97 -84
  17. src/main/resources/static/css/faceID/faceID-create.css +24 -24
  18. src/main/resources/static/css/faceID/faceID-list.css +20 -12
  19. src/main/resources/static/css/layout/footer.css +14 -13
  20. src/main/resources/static/css/report/report-day.css +17 -17
  21. src/main/resources/static/css/report/report-month.css +14 -14
  22. src/main/resources/static/css/sidebar/sidebar.css +84 -34
  23. src/main/resources/static/css/theme.css +32 -224
  24. src/main/resources/static/css/user/user-information.css +235 -18
  25. src/main/resources/static/js/employee/copy-code.js +7 -0
  26. src/main/resources/static/js/employee/employee-popup.js +24 -0
  27. src/main/resources/static/js/employee/room-code.js +13 -0
  28. src/main/resources/static/js/main.js +8 -4
  29. src/main/resources/static/js/sidebar.js +13 -0
  30. src/main/resources/templates/cms/account/employee-list.html +271 -0
  31. src/main/resources/templates/cms/dashboard/dashboard-employee.html +7 -7
  32. src/main/resources/templates/cms/document/document-list.html +18 -25
  33. src/main/resources/templates/cms/face-id/faceID-list.html +5 -3
  34. src/main/resources/templates/cms/layout/footer.html +1 -0
  35. src/main/resources/templates/cms/sidebar/sidebar-admin.html +12 -2
  36. src/main/resources/templates/cms/sidebar/sidebar-employee.html +10 -0
  37. src/main/resources/templates/cms/sidebar/sidebar-manage.html +31 -9
  38. src/main/resources/templates/cms/user/user-information.html +59 -2
src/main/java/com/attendenceSystem/frontroller/HomeController.java CHANGED
@@ -84,6 +84,10 @@ public class HomeController {
84
  public String accountList() {
85
  return "cms/account/account-list";
86
  }
 
 
 
 
87
  @GetMapping("/absentCreate")
88
  public String absentCreate() {
89
  return "cms/absent/absent-create";
 
84
  public String accountList() {
85
  return "cms/account/account-list";
86
  }
87
+ @GetMapping("/employeeList")
88
+ public String employeeList() {
89
+ return "cms/account/employee-list";
90
+ }
91
  @GetMapping("/absentCreate")
92
  public String absentCreate() {
93
  return "cms/absent/absent-create";
src/main/resources/static/css/absent/absent-create.css CHANGED
@@ -70,13 +70,13 @@
70
  .form-group textarea {
71
  width: 100%;
72
 
73
- background: rgba(255, 255, 255, .04);
74
 
75
- border: 1px solid rgba(255, 255, 255, .08);
76
 
77
  border-radius: 14px;
78
 
79
- color: white;
80
 
81
  padding: 14px 16px;
82
 
@@ -98,7 +98,7 @@
98
  .form-group textarea:focus {
99
  outline: none;
100
 
101
- border-color: var(--indigo);
102
 
103
  box-shadow:
104
  0 0 0 4px rgba(99, 102, 241, .15);
@@ -109,8 +109,8 @@
109
  ========================= */
110
 
111
  .form-group select option {
112
- background: #0f172a;
113
- color: white;
114
  }
115
 
116
  /* =========================
@@ -150,7 +150,7 @@
150
 
151
  background:
152
  linear-gradient(to right,
153
- var(--indigo),
154
  var(--purple));
155
  }
156
 
@@ -159,12 +159,12 @@
159
  }
160
 
161
  .btn-secondary {
162
- background: #334155;
163
- color: white;
164
  }
165
 
166
  .btn-secondary:hover {
167
- background: #475569;
168
  }
169
 
170
  /* =========================
 
70
  .form-group textarea {
71
  width: 100%;
72
 
73
+ background: var(--bg-form);
74
 
75
+ border: 1px solid var(--border);
76
 
77
  border-radius: 14px;
78
 
79
+ color: var(--text-white);
80
 
81
  padding: 14px 16px;
82
 
 
98
  .form-group textarea:focus {
99
  outline: none;
100
 
101
+ border-color: var(--indigo-06);
102
 
103
  box-shadow:
104
  0 0 0 4px rgba(99, 102, 241, .15);
 
109
  ========================= */
110
 
111
  .form-group select option {
112
+ background: var(--bg-card);
113
+ color: var(--text-white);
114
  }
115
 
116
  /* =========================
 
150
 
151
  background:
152
  linear-gradient(to right,
153
+ var(--indigo-06),
154
  var(--purple));
155
  }
156
 
 
159
  }
160
 
161
  .btn-secondary {
162
+ background: var(--btn-secondary);
163
+ color: var(--text-white);
164
  }
165
 
166
  .btn-secondary:hover {
167
+ background: var(--btn-secondary-hover);
168
  }
169
 
170
  /* =========================
src/main/resources/static/css/absent/absent-history.css CHANGED
@@ -71,9 +71,9 @@
71
 
72
  color: white;
73
 
74
- background: rgba(255, 255, 255, .05);
75
 
76
- border: 1px solid rgba(255, 255, 255, .08);
77
 
78
  transition: .3s;
79
  }
@@ -82,14 +82,14 @@
82
  .form-group select:focus {
83
  outline: none;
84
 
85
- border-color: var(--indigo);
86
 
87
  box-shadow:
88
- 0 0 0 4px rgba(99, 102, 241, .15);
89
  }
90
 
91
  .form-group select option {
92
- background: #0f172a;
93
  }
94
 
95
  /* ===================================
@@ -127,7 +127,7 @@
127
 
128
  background:
129
  linear-gradient(to right,
130
- var(--indigo),
131
  var(--purple));
132
  }
133
 
@@ -136,12 +136,12 @@
136
  }
137
 
138
  .btn-secondary {
139
- background: #334155;
140
- color: white;
141
  }
142
 
143
  .btn-secondary:hover {
144
- background: #475569;
145
  }
146
 
147
  /* ===================================
@@ -159,7 +159,7 @@
159
 
160
  .table thead {
161
  background:
162
- rgba(255, 255, 255, .03);
163
  }
164
 
165
  .table th {
@@ -180,7 +180,7 @@
180
  color: #e2e8f0;
181
 
182
  border-bottom:
183
- 1px solid rgba(255, 255, 255, .04);
184
  }
185
 
186
  .table tbody tr {
@@ -189,7 +189,7 @@
189
 
190
  .table tbody tr:hover {
191
  background:
192
- rgba(255, 255, 255, .03);
193
  }
194
 
195
  /* ===================================
@@ -218,14 +218,14 @@
218
 
219
  .approved {
220
  background:
221
- rgba(34, 197, 94, .15);
222
 
223
  color: var(--success);
224
  }
225
 
226
  .rejected {
227
  background:
228
- rgba(239, 68, 68, .15);
229
 
230
  color: var(--danger);
231
  }
@@ -253,20 +253,20 @@
253
 
254
  transition: .25s;
255
 
256
- color: white;
257
  }
258
 
259
  .btn-view {
260
- background: #334155;
261
  }
262
 
263
  .btn-approve {
264
- background: rgba(34, 197, 94, .18);
265
  color: var(--success);
266
  }
267
 
268
  .btn-reject {
269
- background: rgba(239, 68, 68, .18);
270
  color: var(--danger);
271
  }
272
 
 
71
 
72
  color: white;
73
 
74
+ background: var(--bg-form);
75
 
76
+ border: 1px solid var(--border);
77
 
78
  transition: .3s;
79
  }
 
82
  .form-group select:focus {
83
  outline: none;
84
 
85
+ border-color: var(--indigo-06);
86
 
87
  box-shadow:
88
+ 0 0 0 4px var(--shadow-box);
89
  }
90
 
91
  .form-group select option {
92
+ background: var(--bg-dark);
93
  }
94
 
95
  /* ===================================
 
127
 
128
  background:
129
  linear-gradient(to right,
130
+ var(--indigo-06),
131
  var(--purple));
132
  }
133
 
 
136
  }
137
 
138
  .btn-secondary {
139
+ background: var(--btn-secondary);
140
+ color: var(--text-white);
141
  }
142
 
143
  .btn-secondary:hover {
144
+ background: var(--btn-secondary-hover);
145
  }
146
 
147
  /* ===================================
 
159
 
160
  .table thead {
161
  background:
162
+ var(--bg-table);
163
  }
164
 
165
  .table th {
 
180
  color: #e2e8f0;
181
 
182
  border-bottom:
183
+ 1px solid var(--bg-form);
184
  }
185
 
186
  .table tbody tr {
 
189
 
190
  .table tbody tr:hover {
191
  background:
192
+ var(--bg-table);
193
  }
194
 
195
  /* ===================================
 
218
 
219
  .approved {
220
  background:
221
+ var(--btn-approv-15);
222
 
223
  color: var(--success);
224
  }
225
 
226
  .rejected {
227
  background:
228
+ var(--btn-reject-15);
229
 
230
  color: var(--danger);
231
  }
 
253
 
254
  transition: .25s;
255
 
256
+ color: var(--text-white);
257
  }
258
 
259
  .btn-view {
260
+ background: var(--border);
261
  }
262
 
263
  .btn-approve {
264
+ background: var(--btn-approv-18);
265
  color: var(--success);
266
  }
267
 
268
  .btn-reject {
269
+ background: var(--btn-reject-18);
270
  color: var(--danger);
271
  }
272
 
src/main/resources/static/css/absent/absent-list.css CHANGED
@@ -83,7 +83,7 @@
83
  .form-group select:focus {
84
  outline: none;
85
 
86
- border-color: var(--indigo);
87
 
88
  box-shadow:
89
  0 0 0 4px rgba(99, 102, 241, .15);
@@ -128,7 +128,7 @@
128
 
129
  background:
130
  linear-gradient(to right,
131
- var(--indigo),
132
  var(--purple));
133
  }
134
 
 
83
  .form-group select:focus {
84
  outline: none;
85
 
86
+ border-color: var(--indigo-06);
87
 
88
  box-shadow:
89
  0 0 0 4px rgba(99, 102, 241, .15);
 
128
 
129
  background:
130
  linear-gradient(to right,
131
+ var(--indigo-06),
132
  var(--purple));
133
  }
134
 
src/main/resources/static/css/account/account-list.css CHANGED
@@ -57,7 +57,7 @@
57
 
58
  background:
59
  linear-gradient(to right,
60
- var(--indigo),
61
  var(--purple));
62
 
63
  transition: .25s;
@@ -85,11 +85,11 @@
85
 
86
  border-radius: 14px;
87
 
88
- border: 1px solid rgba(255, 255, 255, .08);
89
 
90
- background: rgba(255, 255, 255, .05);
91
 
92
- color: white;
93
 
94
  transition: .3s;
95
  }
@@ -97,9 +97,9 @@
97
  .search-box input:focus {
98
  outline: none;
99
 
100
- border-color: var(--indigo);
101
 
102
- box-shadow: 0 0 0 4px rgba(99, 102, 241, .15);
103
  }
104
 
105
  /* ===================================
@@ -117,7 +117,7 @@ table {
117
  }
118
 
119
  thead {
120
- background: rgba(255, 255, 255, .03);
121
  }
122
 
123
  th {
@@ -137,7 +137,7 @@ td {
137
 
138
  color: #e2e8f0;
139
 
140
- border-bottom: 1px solid rgba(255, 255, 255, .04);
141
  }
142
 
143
  tbody tr {
@@ -145,7 +145,7 @@ tbody tr {
145
  }
146
 
147
  tbody tr:hover {
148
- background: rgba(255, 255, 255, .03);
149
  }
150
 
151
  /* ===================================
@@ -174,7 +174,7 @@ tbody tr:hover {
174
 
175
  background:
176
  linear-gradient(135deg,
177
- var(--indigo),
178
  var(--purple));
179
  }
180
 
@@ -192,7 +192,7 @@ tbody tr:hover {
192
  font-size: .85rem;
193
  font-weight: 600;
194
 
195
- background: rgba(99, 102, 241, .15);
196
 
197
  color: #a5b4fc;
198
  }
@@ -213,14 +213,14 @@ tbody tr:hover {
213
  }
214
 
215
  .active {
216
- background: rgba(34, 197, 94, .15);
217
 
218
  color: var(--success);
219
  }
220
 
221
  .inactive,
222
  .locked {
223
- background: rgba(239, 68, 68, .15);
224
 
225
  color: var(--danger);
226
  }
@@ -246,7 +246,7 @@ tbody tr:hover {
246
 
247
  font-weight: 600;
248
 
249
- color: white;
250
 
251
  transition: .25s;
252
  }
@@ -254,12 +254,12 @@ tbody tr:hover {
254
  .btn-role {
255
  background:
256
  linear-gradient(to right,
257
- var(--indigo),
258
  var(--purple));
259
  }
260
 
261
  .lock {
262
- background: rgba(239, 68, 68, .18);
263
 
264
  color: var(--danger);
265
  }
@@ -281,7 +281,7 @@ tbody tr:hover {
281
  align-items: center;
282
  justify-content: center;
283
 
284
- background: rgba(0, 0, 0, .65);
285
 
286
  backdrop-filter: blur(6px);
287
 
@@ -327,9 +327,9 @@ tbody tr:hover {
327
 
328
  cursor: pointer;
329
 
330
- color: white;
331
 
332
- background: rgba(255, 255, 255, .05);
333
  }
334
 
335
  .detail-body {
 
57
 
58
  background:
59
  linear-gradient(to right,
60
+ var(--indigo-06),
61
  var(--purple));
62
 
63
  transition: .25s;
 
85
 
86
  border-radius: 14px;
87
 
88
+ border: 1px solid var(--border);
89
 
90
+ background: var(--bg-form);
91
 
92
+ color: var(--text-white);
93
 
94
  transition: .3s;
95
  }
 
97
  .search-box input:focus {
98
  outline: none;
99
 
100
+ border-color: var(--indigo-06);
101
 
102
+ box-shadow: 0 0 0 4px var(--shadow-box);
103
  }
104
 
105
  /* ===================================
 
117
  }
118
 
119
  thead {
120
+ background: var(--bg-table);
121
  }
122
 
123
  th {
 
137
 
138
  color: #e2e8f0;
139
 
140
+ border-bottom: 1px solid var(--bg-form) ;
141
  }
142
 
143
  tbody tr {
 
145
  }
146
 
147
  tbody tr:hover {
148
+ background: var(--bg-table);
149
  }
150
 
151
  /* ===================================
 
174
 
175
  background:
176
  linear-gradient(135deg,
177
+ var(--indigo-06),
178
  var(--purple));
179
  }
180
 
 
192
  font-size: .85rem;
193
  font-weight: 600;
194
 
195
+ background: var(--shadow-box);
196
 
197
  color: #a5b4fc;
198
  }
 
213
  }
214
 
215
  .active {
216
+ background: var(--btn-approv-15);
217
 
218
  color: var(--success);
219
  }
220
 
221
  .inactive,
222
  .locked {
223
+ background:var(--btn-reject-15);
224
 
225
  color: var(--danger);
226
  }
 
246
 
247
  font-weight: 600;
248
 
249
+ color: var(--text-white);
250
 
251
  transition: .25s;
252
  }
 
254
  .btn-role {
255
  background:
256
  linear-gradient(to right,
257
+ var(--indigo-06),
258
  var(--purple));
259
  }
260
 
261
  .lock {
262
+ background:var(--btn-reject-18);
263
 
264
  color: var(--danger);
265
  }
 
281
  align-items: center;
282
  justify-content: center;
283
 
284
+ background: var(--bg-dark);
285
 
286
  backdrop-filter: blur(6px);
287
 
 
327
 
328
  cursor: pointer;
329
 
330
+ color: var(--text-white);
331
 
332
+ background: var(--bg-form);
333
  }
334
 
335
  .detail-body {
src/main/resources/static/css/account/employee-list.css ADDED
@@ -0,0 +1,627 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @import url("../base.css");
2
+
3
+ /* ===================================
4
+ DASHBOARD CARD
5
+ =================================== */
6
+
7
+ .dashboard-card {
8
+ background: var(--bg-card);
9
+ backdrop-filter: blur(20px);
10
+ border: 1px solid var(--border);
11
+ border-radius: 24px;
12
+ overflow: hidden;
13
+ }
14
+
15
+ .card-header {
16
+ padding: 24px;
17
+ display: flex;
18
+ justify-content: space-between;
19
+ align-items: center;
20
+ border-bottom: 1px solid var(--border);
21
+ }
22
+
23
+ .card-header h2 {
24
+ font-size: 1.3rem;
25
+ font-weight: 700;
26
+ }
27
+
28
+ /* ===================================
29
+ BUTTON
30
+ =================================== */
31
+
32
+ .add-btn {
33
+ height: 46px;
34
+ padding: 0 22px;
35
+ border: none;
36
+ border-radius: 12px;
37
+ cursor: pointer;
38
+ font-weight: 600;
39
+ color: white;
40
+ background: linear-gradient(135deg,
41
+ var(--indigo-06),
42
+ var(--purple));
43
+ transition: .25s;
44
+ }
45
+
46
+ .add-btn:hover {
47
+ transform: translateY(-2px);
48
+ box-shadow: 0 10px 25px rgba(99, 102, 241, .35);
49
+ }
50
+
51
+
52
+ /* ===================================
53
+ TOOLBAR
54
+ =================================== */
55
+
56
+ .toolbar {
57
+ padding: 20px 24px;
58
+ display: flex;
59
+ justify-content: space-between;
60
+ gap: 20px;
61
+ flex-wrap: wrap;
62
+ border-bottom: 1px solid var(--border);
63
+ }
64
+
65
+ /* ===================================
66
+ SEARCH
67
+ =================================== */
68
+
69
+ .search-box {
70
+ flex: 1;
71
+ min-width: 320px;
72
+ }
73
+
74
+ .search-box input {
75
+ width: 100%;
76
+ height: 50px;
77
+ padding: 0 18px;
78
+ border-radius: 14px;
79
+ border: 1px solid rgba(255, 255, 255, .08);
80
+ background: rgba(255, 255, 255, .05);
81
+ color: white;
82
+ font-size: .95rem;
83
+ transition: .25s;
84
+ }
85
+
86
+ .search-box input::placeholder {
87
+ color: #94a3b8;
88
+ }
89
+
90
+ .search-box input:focus {
91
+ outline: none;
92
+ border-color: var(--indigo-06);
93
+ box-shadow: 0 0 0 4px rgba(99, 102, 241, .15);
94
+ }
95
+
96
+ /* ===================================
97
+ FILTER
98
+ =================================== */
99
+
100
+ .filter-box {
101
+ display: flex;
102
+ gap: 14px;
103
+ flex-wrap: wrap;
104
+ }
105
+
106
+ .filter-box select {
107
+ min-width: 190px;
108
+ height: 50px;
109
+ padding: 0 16px;
110
+ border-radius: 14px;
111
+ border: 1px solid rgba(255, 255, 255, .08);
112
+ background: rgba(255, 255, 255, .05);
113
+ color: white;
114
+ cursor: pointer;
115
+ transition: .25s;
116
+ }
117
+
118
+ .filter-box select:focus {
119
+ outline: none;
120
+ border-color: var(--indigo-06);
121
+ }
122
+
123
+ .filter-box option {
124
+ background: #0f172a;
125
+ color: white;
126
+ }
127
+
128
+ /* ===================================
129
+ TABLE
130
+ =================================== */
131
+
132
+ table {
133
+ width: 100%;
134
+ border-collapse: collapse;
135
+ }
136
+
137
+ thead {
138
+ background: rgba(255, 255, 255, .03);
139
+ }
140
+
141
+ th {
142
+ padding: 18px;
143
+ text-align: left;
144
+ color: var(--text-light);
145
+ font-size: .9rem;
146
+ font-weight: 600;
147
+ border-bottom: 1px solid var(--border);
148
+ }
149
+
150
+ td {
151
+ padding: 18px;
152
+ border-bottom: 1px solid rgba(255, 255, 255, .05);
153
+ color: #e2e8f0;
154
+ }
155
+
156
+ tbody tr {
157
+ transition: .25s;
158
+ }
159
+
160
+ tbody tr:hover {
161
+ background: rgba(255, 255, 255, .03);
162
+ }
163
+
164
+ /* ===================================
165
+ USER
166
+ =================================== */
167
+
168
+ .user {
169
+ display: flex;
170
+ align-items: center;
171
+ gap: 14px;
172
+ }
173
+
174
+ .avatar {
175
+ width: 44px;
176
+ height: 44px;
177
+ border-radius: 50%;
178
+ display: flex;
179
+ align-items: center;
180
+ justify-content: center;
181
+ font-weight: 700;
182
+ color: white;
183
+ background: linear-gradient(135deg,
184
+ var(--indigo-06),
185
+ var(--purple));
186
+ }
187
+
188
+ /* ===================================
189
+ STATUS
190
+ =================================== */
191
+
192
+ .status {
193
+ display: inline-flex;
194
+ align-items: center;
195
+ padding: 6px 14px;
196
+ border-radius: 999px;
197
+ font-size: .85rem;
198
+ font-weight: 600;
199
+ }
200
+
201
+ .active {
202
+ background: rgba(34, 197, 94, .15);
203
+ color: var(--success);
204
+ }
205
+
206
+ .inactive {
207
+ background: rgba(245, 158, 11, .15);
208
+ color: var(--warning);
209
+ }
210
+
211
+ .locked {
212
+ background: rgba(239, 68, 68, .15);
213
+ color: var(--danger);
214
+ }
215
+
216
+ /* ===================================
217
+ ACTIONS
218
+ =================================== */
219
+
220
+ .actions {
221
+ display: flex;
222
+ gap: 10px;
223
+ }
224
+
225
+ .icon-btn {
226
+ border: none;
227
+ border-radius: 10px;
228
+ padding: 10px 16px;
229
+ cursor: pointer;
230
+ font-size: .85rem;
231
+ font-weight: 600;
232
+ color: white;
233
+ background: rgba(255, 255, 255, .06);
234
+ transition: .25s;
235
+ }
236
+
237
+ .icon-btn:hover {
238
+ transform: translateY(-2px);
239
+ background: rgba(255, 255, 255, .12);
240
+ }
241
+
242
+ .btn-role {
243
+ background: linear-gradient(135deg,
244
+ var(--indigo-06),
245
+ var(--purple));
246
+ }
247
+
248
+ .btn-role:hover {
249
+ box-shadow: 0 10px 20px rgba(99, 102, 241, .35);
250
+ }
251
+
252
+ .lock {
253
+ background: rgba(239, 68, 68, .18);
254
+ color: var(--danger);
255
+ }
256
+
257
+
258
+ .lock:hover {
259
+ background: rgba(239, 68, 68, .28);
260
+ }
261
+
262
+ /* ===================================
263
+ ADD EMPLOYEE POPUP
264
+ =================================== */
265
+
266
+ .card-add {
267
+ position: fixed;
268
+ inset: 0;
269
+ background: rgba(15, 23, 42, .65);
270
+ backdrop-filter: blur(8px);
271
+
272
+ display: none;
273
+ justify-content: center;
274
+ align-items: center;
275
+
276
+ z-index: 9999;
277
+ animation: fadeIn .25s ease;
278
+ }
279
+
280
+ .card-add.show {
281
+ display: flex;
282
+ }
283
+
284
+ .card-container {
285
+ width: 520px;
286
+ max-width: 92%;
287
+ background: var(--bg-card);
288
+ backdrop-filter: blur(20px);
289
+ border: 1px solid var(--border);
290
+ border-radius: 24px;
291
+ overflow: hidden;
292
+ animation: popup .3s ease;
293
+ box-shadow: 0 20px 60px rgba(0, 0, 0, .35);
294
+ }
295
+
296
+ /* ===================================
297
+ HEADER
298
+ =================================== */
299
+
300
+ .card-add .card-headers {
301
+ padding: 24px;
302
+ display: flex;
303
+ align-items: center;
304
+ gap: 18px;
305
+ border-bottom: 1px solid var(--border);
306
+ }
307
+
308
+ .header-icon {
309
+ width: 54px;
310
+ height: 54px;
311
+
312
+ display: flex;
313
+ justify-content: center;
314
+ align-items: center;
315
+
316
+ border-radius: 16px;
317
+
318
+ background: linear-gradient(135deg,
319
+ var(--indigo-06),
320
+ var(--purple));
321
+
322
+ color: white;
323
+ font-size: 22px;
324
+
325
+ flex-shrink: 0;
326
+ }
327
+
328
+ .card-add .card-headers h2 {
329
+ font-size: 1.25rem;
330
+ color: white;
331
+ font-weight: 700;
332
+ }
333
+
334
+ /* ===================================
335
+ BODY
336
+ =================================== */
337
+
338
+ .card-body {
339
+ padding: 28px;
340
+ }
341
+
342
+ /* ===================================
343
+ SELECT
344
+ =================================== */
345
+
346
+ .card-body label {
347
+ display: block;
348
+ margin-bottom: 10px;
349
+ color: var(--text-light);
350
+ font-size: .9rem;
351
+ font-weight: 600;
352
+ }
353
+
354
+ .card-add .filter-box {
355
+ display: block;
356
+ }
357
+
358
+ .card-add select {
359
+ width: 100%;
360
+ height: 52px;
361
+
362
+ padding: 0 18px;
363
+
364
+ border-radius: 14px;
365
+ border: 1px solid rgba(255, 255, 255, .08);
366
+
367
+ background: rgba(255, 255, 255, .05);
368
+ color: white;
369
+
370
+ font-size: .95rem;
371
+ transition: .25s;
372
+ }
373
+
374
+ .card-add select:focus {
375
+ outline: none;
376
+ border-color: var(--indigo-06);
377
+ box-shadow: 0 0 0 4px rgba(99, 102, 241, .15);
378
+ }
379
+
380
+ /* ===================================
381
+ QR CONTAINER
382
+ =================================== */
383
+
384
+ .container-QR {
385
+ margin-top: 28px;
386
+
387
+ display: flex;
388
+ flex-direction: column;
389
+ align-items: center;
390
+ gap: 24px;
391
+ }
392
+
393
+ /* ===================================
394
+ ROOM CODE
395
+ =================================== */
396
+
397
+ .room-code-box {
398
+ width: 100%;
399
+
400
+ padding: 22px;
401
+
402
+ border-radius: 18px;
403
+
404
+ border: 1px solid rgba(255, 255, 255, .08);
405
+
406
+ background: rgba(255, 255, 255, .04);
407
+
408
+ text-align: center;
409
+ }
410
+
411
+ .room-code-box span {
412
+ color: var(--text-light);
413
+ font-size: .9rem;
414
+ }
415
+
416
+ .room-code-box h1 {
417
+ margin: 16px 0 20px;
418
+
419
+ font-size: 2rem;
420
+ letter-spacing: 4px;
421
+ color: white;
422
+ }
423
+
424
+ /* ===================================
425
+ COPY BUTTON
426
+ =================================== */
427
+
428
+ #copyBtn {
429
+ border: none;
430
+ cursor: pointer;
431
+
432
+ padding: 12px 26px;
433
+
434
+ border-radius: 12px;
435
+
436
+ font-weight: 600;
437
+ color: white;
438
+
439
+ background: linear-gradient(135deg,
440
+ var(--indigo-06),
441
+ var(--purple));
442
+
443
+ transition: .25s;
444
+ }
445
+
446
+ #copyBtn:hover {
447
+ transform: translateY(-2px);
448
+ box-shadow: 0 10px 25px rgba(99, 102, 241, .35);
449
+ }
450
+
451
+ /* ===================================
452
+ QR
453
+ =================================== */
454
+
455
+ .qr-box {
456
+ width: 220px;
457
+ height: 220px;
458
+
459
+ padding: 14px;
460
+
461
+ background: white;
462
+ border-radius: 20px;
463
+
464
+ display: flex;
465
+ justify-content: center;
466
+ align-items: center;
467
+ }
468
+
469
+ .qr-box img {
470
+ width: 100%;
471
+ height: 100%;
472
+ object-fit: contain;
473
+ }
474
+
475
+ /* ===================================
476
+ NOTE
477
+ =================================== */
478
+
479
+ .note {
480
+ text-align: center;
481
+ color: var(--text-light);
482
+ line-height: 1.6;
483
+ font-size: .9rem;
484
+ }
485
+
486
+ /* ===================================
487
+ CLOSE BUTTON
488
+ =================================== */
489
+
490
+ .close-btn {
491
+ margin-left: auto;
492
+
493
+ width:60px;
494
+ height: 42px;
495
+ padding:5px;
496
+ border: none;
497
+ border-radius: 12px;
498
+ margin-top: 10px;
499
+ cursor: pointer;
500
+
501
+ background: linear-gradient(135deg,
502
+ var(--indigo-06),
503
+ var(--purple));
504
+ transition: .25s;
505
+ color: var(--text-white);
506
+
507
+ font-size: 22px;
508
+
509
+ transition: .25s;
510
+ display:flex;
511
+ align-items: center;
512
+ justify-content: end;
513
+ }
514
+
515
+
516
+
517
+ .close-btn:hover {
518
+ background: var(--btn-reject-18);
519
+ color: var(--danger);
520
+ }
521
+
522
+ /* ===================================
523
+ ANIMATION
524
+ =================================== */
525
+
526
+ @keyframes popup {
527
+
528
+ from {
529
+ opacity: 0;
530
+ transform: translateY(20px) scale(.95);
531
+ }
532
+
533
+ to {
534
+ opacity: 1;
535
+ transform: translateY(0) scale(1);
536
+ }
537
+
538
+ }
539
+
540
+ @keyframes fadeIn {
541
+
542
+ from {
543
+ opacity: 0;
544
+ }
545
+
546
+ to {
547
+ opacity: 1;
548
+ }
549
+
550
+ }
551
+
552
+ /* ===================================
553
+ RESPONSIVE
554
+ =================================== */
555
+
556
+ @media (max-width: 600px) {
557
+
558
+ .card-container {
559
+ width: 95%;
560
+ }
561
+
562
+ .room-code-box h1 {
563
+ font-size: 1.5rem;
564
+ letter-spacing: 2px;
565
+ }
566
+
567
+ .qr-box {
568
+ width: 180px;
569
+ height: 180px;
570
+ }
571
+
572
+ }
573
+
574
+ /* ===================================
575
+ RESPONSIVE
576
+ =================================== */
577
+
578
+ @media (max-width:1200px) {
579
+
580
+ .actions {
581
+ flex-direction: column;
582
+ }
583
+
584
+ .icon-btn {
585
+ width: 100%;
586
+ }
587
+
588
+ }
589
+
590
+ @media (max-width:900px) {
591
+
592
+ .toolbar {
593
+ flex-direction: column;
594
+ }
595
+
596
+ .search-box {
597
+ min-width: 100%;
598
+ }
599
+
600
+ .filter-box {
601
+ width: 100%;
602
+ flex-direction: column;
603
+ }
604
+
605
+ .filter-box select {
606
+ width: 100%;
607
+ }
608
+
609
+ }
610
+
611
+ @media (max-width:768px) {
612
+
613
+ .card-header {
614
+ flex-direction: column;
615
+ align-items: flex-start;
616
+ gap: 15px;
617
+ }
618
+
619
+ table {
620
+ min-width: 900px;
621
+ }
622
+
623
+ .dashboard-card {
624
+ overflow-x: auto;
625
+ }
626
+
627
+ }
src/main/resources/static/css/attendance/attendance-common.css DELETED
@@ -1,64 +0,0 @@
1
- /* =========================
2
- ATTENDANCE BASE UI
3
- ========================= */
4
-
5
- /* CONTAINER */
6
- .attendance-container{
7
- max-width:1400px;
8
- margin:auto;
9
- }
10
-
11
- /* =========================
12
- HEADER (CHUNG)
13
- ========================= */
14
- .attendance-header{
15
- padding:20px;
16
- margin-bottom:20px;
17
- }
18
-
19
- .attendance-header h1{
20
- font-size:1.6rem;
21
- font-weight:800;
22
-
23
- background: linear-gradient(to right, #c7cbeb, #e5e1e8);
24
- background-clip: text;
25
- -webkit-background-clip: text;
26
- -webkit-text-fill-color: transparent;
27
- }
28
-
29
- .attendance-header p{
30
- color:var(--text-gray);
31
- }
32
-
33
- /* =========================
34
- STATS GRID (CHUNG)
35
- ========================= */
36
- .stats-grid{
37
- display:grid;
38
- grid-template-columns:repeat(5,1fr);
39
- gap:16px;
40
- margin-bottom:20px;
41
- }
42
-
43
- /* CARD CHUNG */
44
- .stats-card{
45
- padding:18px;
46
- border-radius:18px;
47
-
48
- background:var(--bg-card);
49
- border:1px solid var(--border);
50
-
51
- backdrop-filter:blur(16px);
52
- }
53
-
54
- /* VALUE */
55
- .stats-value{
56
- font-size:1.8rem;
57
- font-weight:800;
58
- display:block;
59
- }
60
-
61
- /* LABEL */
62
- .stats-label{
63
- color:var(--text-gray);
64
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/main/resources/static/css/attendance/attendance-history.css CHANGED
@@ -30,7 +30,7 @@
30
 
31
  object-fit: cover;
32
 
33
- border: 2px solid rgba(255, 255, 255, .1);
34
  }
35
 
36
  .profile-info h3 {
@@ -86,7 +86,7 @@
86
 
87
  margin-bottom: 6px;
88
 
89
- color: white;
90
  }
91
 
92
  .stats-label {
@@ -107,7 +107,7 @@
107
  }
108
 
109
  .total .stats-value {
110
- color: var(--indigo);
111
  }
112
 
113
  /* ===================================
@@ -132,11 +132,11 @@
132
 
133
  border-radius: 14px;
134
 
135
- border: 1px solid rgba(255, 255, 255, .08);
136
 
137
- background: rgba(255, 255, 255, .05);
138
 
139
- color: white;
140
 
141
  transition: .25s;
142
  }
@@ -145,9 +145,9 @@
145
  .filter-panel select:focus {
146
  outline: none;
147
 
148
- border-color: var(--indigo);
149
 
150
- box-shadow: 0 0 0 4px rgba(99, 102, 241, .15);
151
  }
152
 
153
  .filter-panel button {
@@ -162,9 +162,9 @@
162
 
163
  font-weight: 600;
164
 
165
- color: white;
166
 
167
- background: linear-gradient(to right, var(--indigo), var(--purple));
168
 
169
  transition: .25s;
170
  }
@@ -205,7 +205,7 @@
205
  font-size: 1.2rem;
206
  font-weight: 700;
207
 
208
- color: white;
209
  }
210
 
211
  .table-header span {
@@ -224,7 +224,7 @@
224
  }
225
 
226
  .attendance-table thead {
227
- background: rgba(255, 255, 255, .03);
228
  }
229
 
230
  .attendance-table th {
@@ -240,13 +240,13 @@
240
  .attendance-table td {
241
  padding: 16px;
242
 
243
- color: #e2e8f0;
244
 
245
- border-bottom: 1px solid rgba(255, 255, 255, .04);
246
  }
247
 
248
  .attendance-table tbody tr:hover {
249
- background: rgba(255, 255, 255, .03);
250
  }
251
 
252
  /* ===================================
@@ -265,17 +265,17 @@
265
  }
266
 
267
  .badge.success {
268
- background: rgba(34, 197, 94, .15);
269
  color: var(--success);
270
  }
271
 
272
  .badge.late {
273
- background: rgba(245, 158, 11, .15);
274
  color: var(--warning);
275
  }
276
 
277
  .badge.warning {
278
- background: rgba(139, 92, 246, .15);
279
  color: var(--purple);
280
  }
281
 
 
30
 
31
  object-fit: cover;
32
 
33
+ border: 2px solid var(--bg-table);
34
  }
35
 
36
  .profile-info h3 {
 
86
 
87
  margin-bottom: 6px;
88
 
89
+ color: var(--text-white);
90
  }
91
 
92
  .stats-label {
 
107
  }
108
 
109
  .total .stats-value {
110
+ color: var(--indigo-06);
111
  }
112
 
113
  /* ===================================
 
132
 
133
  border-radius: 14px;
134
 
135
+ border: 1px solid var(--border);
136
 
137
+ background: var(--bg-form);
138
 
139
+ color: var(--text-white);
140
 
141
  transition: .25s;
142
  }
 
145
  .filter-panel select:focus {
146
  outline: none;
147
 
148
+ border-color: var(--indigo-06);
149
 
150
+ box-shadow: 0 0 0 4px var(--shadow-box);
151
  }
152
 
153
  .filter-panel button {
 
162
 
163
  font-weight: 600;
164
 
165
+ color: var(--text-white);
166
 
167
+ background: linear-gradient(to right, var(--indigo-06), var(--purple));
168
 
169
  transition: .25s;
170
  }
 
205
  font-size: 1.2rem;
206
  font-weight: 700;
207
 
208
+ color: var(--text-white);
209
  }
210
 
211
  .table-header span {
 
224
  }
225
 
226
  .attendance-table thead {
227
+ background: var(--bg-table);
228
  }
229
 
230
  .attendance-table th {
 
240
  .attendance-table td {
241
  padding: 16px;
242
 
243
+ color: var(--text-white);
244
 
245
+ border-bottom: 1px solid var(--bg-form);
246
  }
247
 
248
  .attendance-table tbody tr:hover {
249
+ background: var(--bg-table);
250
  }
251
 
252
  /* ===================================
 
265
  }
266
 
267
  .badge.success {
268
+ background: var(--btn-approv-15);
269
  color: var(--success);
270
  }
271
 
272
  .badge.late {
273
+ background: var(--btn-reject-15);
274
  color: var(--warning);
275
  }
276
 
277
  .badge.warning {
278
+ background: var( --btn-warning);
279
  color: var(--purple);
280
  }
281
 
src/main/resources/static/css/attendance/attendance-manager.css DELETED
@@ -1,27 +0,0 @@
1
- @import url("/css/layout/footer.css");
2
- @import url("/css/sidebar/sidebar.css");
3
- @import url("/css/attendance/attendance-common.css");
4
- @import url("/css/base.css");
5
- /* =========================
6
- STATS VARIANTS
7
- ========================= */
8
-
9
- .present .stats-value{
10
- color:var(--success);
11
- }
12
-
13
- .absent .stats-value{
14
- color:var(--danger);
15
- }
16
-
17
- .pending .stats-value{
18
- color:var(--warning);
19
- }
20
-
21
- .late .stats-value{
22
- color:var(--purple);
23
- }
24
-
25
- /* =========================
26
- PAGE CUSTOM (nếu có)
27
- ========================= */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/main/resources/static/css/attendance/attendance.css CHANGED
@@ -99,11 +99,11 @@
99
  padding:0 16px;
100
 
101
  background:
102
- rgba(255,255,255,.05);
103
 
104
  color:white;
105
 
106
- border:1px solid rgba(255,255,255,.08);
107
 
108
  transition:.3s;
109
  }
@@ -112,10 +112,10 @@
112
  .filter-panel select:focus{
113
  outline:none;
114
 
115
- border-color:var(--indigo);
116
 
117
  box-shadow:
118
- 0 0 0 4px rgba(99,102,241,.15);
119
  }
120
 
121
  .search-input{
@@ -133,13 +133,13 @@
133
 
134
  cursor:pointer;
135
 
136
- color:white;
137
  font-weight:600;
138
 
139
  background:
140
  linear-gradient(
141
  to right,
142
- var(--indigo),
143
  var(--purple)
144
  );
145
 
@@ -151,7 +151,7 @@
151
  }
152
 
153
  .secondary{
154
- background:#334155 !important;
155
  }
156
 
157
  /* ===================================
@@ -206,10 +206,10 @@
206
  .attendance-table td{
207
  padding:18px;
208
 
209
- color:#e2e8f0;
210
 
211
  border-bottom:
212
- 1px solid rgba(255,255,255,.04);
213
  }
214
 
215
  .attendance-table tbody tr{
@@ -218,7 +218,7 @@
218
 
219
  .attendance-table tbody tr:hover{
220
  background:
221
- rgba(255,255,255,.03);
222
  }
223
 
224
  /* ===================================
@@ -236,21 +236,21 @@
236
 
237
  .badge-success{
238
  background:
239
- rgba(34,197,94,.15);
240
 
241
  color:var(--success);
242
  }
243
 
244
  .badge-warning{
245
  background:
246
- rgba(245,158,11,.15);
247
 
248
  color:var(--warning);
249
  }
250
 
251
  .badge-danger{
252
  background:
253
- rgba(239,68,68,.15);
254
 
255
  color:var(--danger);
256
  }
@@ -265,11 +265,11 @@
265
  }
266
 
267
  ::-webkit-scrollbar-track{
268
- background:#1e293b;
269
  }
270
 
271
  ::-webkit-scrollbar-thumb{
272
- background:#475569;
273
  border-radius:8px;
274
  }
275
 
 
99
  padding:0 16px;
100
 
101
  background:
102
+ var(--bg-form);
103
 
104
  color:white;
105
 
106
+ border:1px solid var(--border);
107
 
108
  transition:.3s;
109
  }
 
112
  .filter-panel select:focus{
113
  outline:none;
114
 
115
+ border-color:var(--indigo-06);
116
 
117
  box-shadow:
118
+ 0 0 0 4px var(--shadow-box);
119
  }
120
 
121
  .search-input{
 
133
 
134
  cursor:pointer;
135
 
136
+ color:var(--text-white);
137
  font-weight:600;
138
 
139
  background:
140
  linear-gradient(
141
  to right,
142
+ var(--indigo-06),
143
  var(--purple)
144
  );
145
 
 
151
  }
152
 
153
  .secondary{
154
+ background:var(--btn-secondary) !important;
155
  }
156
 
157
  /* ===================================
 
206
  .attendance-table td{
207
  padding:18px;
208
 
209
+ color:var(--text-white);
210
 
211
  border-bottom:
212
+ 1px solid var(--bg-form);
213
  }
214
 
215
  .attendance-table tbody tr{
 
218
 
219
  .attendance-table tbody tr:hover{
220
  background:
221
+ var(--bg-table);
222
  }
223
 
224
  /* ===================================
 
236
 
237
  .badge-success{
238
  background:
239
+ var(--btn-approv-15);
240
 
241
  color:var(--success);
242
  }
243
 
244
  .badge-warning{
245
  background:
246
+ var(--btn-warning-15);
247
 
248
  color:var(--warning);
249
  }
250
 
251
  .badge-danger{
252
  background:
253
+ var(--btn-reject-15);
254
 
255
  color:var(--danger);
256
  }
 
265
  }
266
 
267
  ::-webkit-scrollbar-track{
268
+ background:var(--bg-card);
269
  }
270
 
271
  ::-webkit-scrollbar-thumb{
272
+ background:var(--border);
273
  border-radius:8px;
274
  }
275
 
src/main/resources/static/css/base.css CHANGED
@@ -6,22 +6,47 @@
6
  =================================== */
7
 
8
  :root {
9
- --bg-dark: #020617;
10
  --bg-card: rgba(15, 23, 42, .65);
11
 
 
 
 
 
 
 
 
12
  --border: rgba(255, 255, 255, .08);
13
 
14
  --text-white: #ffffff;
15
  --text-gray: #94a3b8;
16
  --text-light: #cbd5e1;
17
 
18
- --indigo: #6366f1;
 
 
19
  --purple: #8b5cf6;
 
20
  --pink: #ec4899;
 
 
21
 
22
- --success: #22c55e;
23
  --warning: #f59e0b;
24
  --danger: #ef4444;
 
 
 
 
 
 
 
 
 
 
 
 
 
25
  }
26
 
27
  /* ===================================
@@ -44,13 +69,13 @@ body {
44
  "Segoe UI",
45
  sans-serif;
46
 
47
- color: white;
48
 
49
  background:
50
  linear-gradient(135deg,
51
- #020617 0%,
52
- #1e1b4b 50%,
53
- #020617 100%);
54
  }
55
 
56
  .layout {
@@ -85,11 +110,11 @@ body {
85
 
86
  background:
87
  radial-gradient(circle at top left,
88
- rgba(1, 1, 11, 0.25),
89
- transparent 100%),
90
  radial-gradient(circle at bottom right,
91
- rgba(31, 20, 58, 0.25),
92
- transparent 50%);
93
  }
94
 
95
  /* ===================================
@@ -111,14 +136,14 @@ body {
111
  =================================== */
112
 
113
  .container-header {
114
- background-color: #020c2e;
115
  margin-bottom: 32px;
116
  padding: 15px 20px 15px 15px;
117
  border-radius: 1px;
118
  height: 112px;
119
- border: 0.65px solid #291c56;
120
  padding-left: 20px;
121
- height:140px;
122
  }
123
 
124
  .container-header h1 {
@@ -130,9 +155,9 @@ body {
130
 
131
  background:
132
  linear-gradient(to right,
133
- #c7cbeb,
134
- #e5e1e8,
135
- #e5e2e3);
136
 
137
  background-clip: text;
138
  -webkit-background-clip: text;
@@ -140,7 +165,7 @@ body {
140
  }
141
 
142
  .container-header p {
143
- color: #94a3b8;
144
  font-size: 1rem;
145
  }
146
 
 
6
  =================================== */
7
 
8
  :root {
9
+ --bg-dark: #171233;
10
  --bg-card: rgba(15, 23, 42, .65);
11
 
12
+ --bg-table: rgba(255, 255, 255, .03);
13
+ --bg-form: rgba(255, 255, 255, .04);
14
+ --bg-table-06: rgba(255, 255, 255, .06);
15
+ --bg-table-015: rgba(255, 255, 255, .15);
16
+
17
+ --bg-purple-025:rgba(1, 1, 11, 0.25);
18
+
19
  --border: rgba(255, 255, 255, .08);
20
 
21
  --text-white: #ffffff;
22
  --text-gray: #94a3b8;
23
  --text-light: #cbd5e1;
24
 
25
+ --indigo-06: rgba(99, 102, 241, .6);
26
+ --indigo-15: rgba(99, 102, 241, .15);
27
+ --indigo-08: rgba(10, 11, 65, 0.08);
28
  --purple: #8b5cf6;
29
+ --purple-light: #b794ff;
30
  --pink: #ec4899;
31
+ --blue: #3b82f6;
32
+ --pinl-light: #d68eff;
33
 
34
+ --success: rgb(37, 249, 83);
35
  --warning: #f59e0b;
36
  --danger: #ef4444;
37
+
38
+ --shadow-box: rgba(99, 102, 241, .15);
39
+
40
+ --btn-secondary: #334155;
41
+ --btn-secondary-hover: #475569;
42
+
43
+ --btn-warning-15: rgba(139, 92, 246, .15);
44
+
45
+ --btn-reject-18: rgba(239, 68, 68, .18);
46
+ --btn-reject-15: rgba(239, 68, 68, .15);
47
+
48
+ --btn-approv-18: rgba(34, 197, 94, .18);
49
+ --btn-approv-15: rgba(34, 197, 94, .15);
50
  }
51
 
52
  /* ===================================
 
69
  "Segoe UI",
70
  sans-serif;
71
 
72
+ color: var(--text-white);
73
 
74
  background:
75
  linear-gradient(135deg,
76
+ #1a1633 0%,
77
+ rgba(188, 163, 237) 50%,
78
+ #191339 100%);
79
  }
80
 
81
  .layout {
 
110
 
111
  background:
112
  radial-gradient(circle at top left,
113
+ #1b0f38,
114
+ transparent 80%),
115
  radial-gradient(circle at bottom right,
116
+ #220d54,
117
+ transparent 80%);
118
  }
119
 
120
  /* ===================================
 
136
  =================================== */
137
 
138
  .container-header {
139
+ background-color: var(--bg-dark);
140
  margin-bottom: 32px;
141
  padding: 15px 20px 15px 15px;
142
  border-radius: 1px;
143
  height: 112px;
144
+ border: 0.65px solid var(--shadow-box);
145
  padding-left: 20px;
146
+ height: 140px;
147
  }
148
 
149
  .container-header h1 {
 
155
 
156
  background:
157
  linear-gradient(to right,
158
+ var(--text-white),
159
+ var(--text-light),
160
+ var(--text-white));
161
 
162
  background-clip: text;
163
  -webkit-background-clip: text;
 
165
  }
166
 
167
  .container-header p {
168
+ color: var(--text-gray);
169
  font-size: 1rem;
170
  }
171
 
src/main/resources/static/css/dashboard/dashboard-admin.css CHANGED
@@ -24,7 +24,7 @@
24
 
25
  background:
26
  linear-gradient(135deg,
27
- var(--indigo),
28
  var(--purple));
29
  }
30
 
@@ -32,7 +32,7 @@
32
  /* width: 42px;
33
  height: 42px; */
34
  font-size: 20px;
35
- color: white;
36
  }
37
  /* ===================================
38
  STAT CARD
@@ -112,7 +112,7 @@
112
 
113
  .admin-action-card:hover {
114
  transform: translateY(-4px);
115
- border-color: rgba(99, 102, 241, .4);
116
  }
117
 
118
  .admin-action-card__badge {
@@ -123,8 +123,8 @@
123
  height: 24px;
124
  padding: 0 7px;
125
  border-radius: 999px;
126
- background: linear-gradient(to right, var(--indigo), var(--purple));
127
- color: white;
128
  font-size: .75rem;
129
  font-weight: 700;
130
  display: flex;
@@ -145,7 +145,7 @@
145
 
146
  background:
147
  linear-gradient(135deg,
148
- var(--indigo),
149
  var(--purple));
150
  }
151
 
@@ -153,7 +153,7 @@
153
  /* width: 42px;
154
  height: 42px; */
155
  font-size: 20px;
156
- color: white;
157
  }
158
 
159
  .admin-action-card__title {
@@ -248,7 +248,7 @@
248
  }
249
 
250
  .activity-item:hover {
251
- background: rgba(255, 255, 255, .03);
252
  }
253
 
254
  .activity-item__left {
@@ -264,7 +264,7 @@
264
  flex-shrink: 0;
265
  }
266
 
267
- .activity-dot--blue { background: var(--indigo); }
268
  .activity-dot--green { background: var(--success); }
269
  .activity-dot--yellow { background: var(--warning); }
270
  .activity-dot--red { background: var(--danger); }
@@ -319,8 +319,8 @@
319
  border-radius: 12px;
320
  cursor: pointer;
321
  font-weight: 600;
322
- color: white;
323
- background: linear-gradient(to right, var(--indigo), var(--purple));
324
  transition: .25s;
325
  }
326
 
@@ -342,14 +342,14 @@
342
  padding: 12px 14px;
343
  border-radius: 12px;
344
  border: 1px solid var(--border);
345
- background: rgba(255, 255, 255, .03);
346
- color: white;
347
  outline: none;
348
  transition: .2s;
349
  }
350
 
351
  .search-box input:focus {
352
- border-color: rgba(99, 102, 241, .6);
353
  }
354
 
355
 
@@ -363,7 +363,7 @@ table {
363
  }
364
 
365
  thead {
366
- background: rgba(255, 255, 255, .03);
367
  }
368
 
369
  th {
@@ -376,12 +376,12 @@ th {
376
 
377
  td {
378
  padding: 14px;
379
- color: #e2e8f0;
380
- border-bottom: 1px solid rgba(255, 255, 255, .04);
381
  }
382
 
383
  tbody tr:hover {
384
- background: rgba(255, 255, 255, .03);
385
  }
386
 
387
 
@@ -402,7 +402,7 @@ tbody tr:hover {
402
  display: flex;
403
  align-items: center;
404
  justify-content: center;
405
- background: rgba(255, 255, 255, .06);
406
  font-weight: 700;
407
  color: white;
408
  }
@@ -418,8 +418,8 @@ tbody tr:hover {
418
  border-radius: 999px;
419
  font-size: .8rem;
420
  font-weight: 600;
421
- background: rgba(99, 102, 241, .15);
422
- color: var(--indigo);
423
  }
424
 
425
  .status {
@@ -431,12 +431,12 @@ tbody tr:hover {
431
  }
432
 
433
  .status.active {
434
- background: rgba(34, 197, 94, .15);
435
  color: var(--success);
436
  }
437
 
438
  .status.locked {
439
- background: rgba(239, 68, 68, .15);
440
  color: var(--danger);
441
  }
442
 
@@ -454,7 +454,7 @@ tbody tr:hover {
454
  padding: 6px 10px;
455
  border-radius: 10px;
456
  border: 1px solid var(--border);
457
- background: rgba(255, 255, 255, .03);
458
  color: white;
459
  cursor: pointer;
460
  transition: .2s;
@@ -479,7 +479,7 @@ tbody tr:hover {
479
  display: none;
480
  align-items: center;
481
  justify-content: center;
482
- background: rgba(0, 0, 0, .6);
483
  backdrop-filter: blur(6px);
484
  }
485
 
@@ -499,14 +499,14 @@ tbody tr:hover {
499
  }
500
 
501
  .detail-header h2 {
502
- color: white;
503
  font-size: 1.1rem;
504
  }
505
 
506
  .close-btn {
507
  background: transparent;
508
  border: none;
509
- color: white;
510
  font-size: 1.3rem;
511
  cursor: pointer;
512
  }
@@ -524,7 +524,7 @@ tbody tr:hover {
524
 
525
  .detail-item p,
526
  .detail-item span {
527
- color: white;
528
  font-weight: 600;
529
  }
530
 
 
24
 
25
  background:
26
  linear-gradient(135deg,
27
+ var(--indigo-06),
28
  var(--purple));
29
  }
30
 
 
32
  /* width: 42px;
33
  height: 42px; */
34
  font-size: 20px;
35
+ color: var(--text-white);
36
  }
37
  /* ===================================
38
  STAT CARD
 
112
 
113
  .admin-action-card:hover {
114
  transform: translateY(-4px);
115
+ border-color: var(--shadow-box);
116
  }
117
 
118
  .admin-action-card__badge {
 
123
  height: 24px;
124
  padding: 0 7px;
125
  border-radius: 999px;
126
+ background: linear-gradient(to right, var(--indigo-06), var(--purple));
127
+ color: var(--text-white);
128
  font-size: .75rem;
129
  font-weight: 700;
130
  display: flex;
 
145
 
146
  background:
147
  linear-gradient(135deg,
148
+ var(--indigo-06),
149
  var(--purple));
150
  }
151
 
 
153
  /* width: 42px;
154
  height: 42px; */
155
  font-size: 20px;
156
+ color: var(--text-white);
157
  }
158
 
159
  .admin-action-card__title {
 
248
  }
249
 
250
  .activity-item:hover {
251
+ background: var(--bg-form);
252
  }
253
 
254
  .activity-item__left {
 
264
  flex-shrink: 0;
265
  }
266
 
267
+ .activity-dot--blue { background: var(--indigo-06); }
268
  .activity-dot--green { background: var(--success); }
269
  .activity-dot--yellow { background: var(--warning); }
270
  .activity-dot--red { background: var(--danger); }
 
319
  border-radius: 12px;
320
  cursor: pointer;
321
  font-weight: 600;
322
+ color: var(--text-white);
323
+ background: linear-gradient(to right, var(--indigo-06), var(--purple));
324
  transition: .25s;
325
  }
326
 
 
342
  padding: 12px 14px;
343
  border-radius: 12px;
344
  border: 1px solid var(--border);
345
+ background: var(--bg-table);
346
+ color: var(--text-white);
347
  outline: none;
348
  transition: .2s;
349
  }
350
 
351
  .search-box input:focus {
352
+ border-color: var(--indigo-06);
353
  }
354
 
355
 
 
363
  }
364
 
365
  thead {
366
+ background: var(--bg-table);
367
  }
368
 
369
  th {
 
376
 
377
  td {
378
  padding: 14px;
379
+ color: var(--text-white);
380
+ border-bottom: 1px solid var(--bg-form);
381
  }
382
 
383
  tbody tr:hover {
384
+ background: var(--bg-table);
385
  }
386
 
387
 
 
402
  display: flex;
403
  align-items: center;
404
  justify-content: center;
405
+ background: var(--bg-table-06);
406
  font-weight: 700;
407
  color: white;
408
  }
 
418
  border-radius: 999px;
419
  font-size: .8rem;
420
  font-weight: 600;
421
+ background: var(--indigo-15);
422
+ color: var(--indigo-06);
423
  }
424
 
425
  .status {
 
431
  }
432
 
433
  .status.active {
434
+ background: var(--btn-approv-15);
435
  color: var(--success);
436
  }
437
 
438
  .status.locked {
439
+ background: var(--btn-reject-15);
440
  color: var(--danger);
441
  }
442
 
 
454
  padding: 6px 10px;
455
  border-radius: 10px;
456
  border: 1px solid var(--border);
457
+ background: var(--bg-table);
458
  color: white;
459
  cursor: pointer;
460
  transition: .2s;
 
479
  display: none;
480
  align-items: center;
481
  justify-content: center;
482
+ background: var(--bg-dark);
483
  backdrop-filter: blur(6px);
484
  }
485
 
 
499
  }
500
 
501
  .detail-header h2 {
502
+ color: var(--text-white);
503
  font-size: 1.1rem;
504
  }
505
 
506
  .close-btn {
507
  background: transparent;
508
  border: none;
509
+ color: var(--text-white);
510
  font-size: 1.3rem;
511
  cursor: pointer;
512
  }
 
524
 
525
  .detail-item p,
526
  .detail-item span {
527
+ color: var(--text-white);
528
  font-weight: 600;
529
  }
530
 
src/main/resources/static/css/dashboard/dashboard-employee.css CHANGED
@@ -56,7 +56,7 @@
56
 
57
  background:
58
  linear-gradient(135deg,
59
- var(--indigo),
60
  var(--purple));
61
  }
62
 
@@ -64,14 +64,14 @@
64
  /* width: 42px;
65
  height: 42px; */
66
  font-size: 24px;
67
- color: white;
68
  }
69
 
70
  .employee-stat-card__number {
71
  font-size: 1.6rem;
72
  font-weight: 800;
73
 
74
- color: white;
75
  }
76
 
77
  .employee-stat-card__label {
@@ -88,7 +88,7 @@
88
 
89
  border-radius: 999px;
90
 
91
- background: rgba(255, 255, 255, .05);
92
 
93
  color: var(--text-light);
94
  }
@@ -96,7 +96,7 @@
96
  /* color variants */
97
 
98
  .report-submitted .employee-stat-card__number {
99
- color: var(--indigo);
100
  }
101
 
102
  .report-approved .employee-stat-card__number {
@@ -137,7 +137,7 @@
137
 
138
  margin-bottom: 14px;
139
 
140
- color: white;
141
  }
142
 
143
  .quick-actions-grid {
@@ -159,7 +159,7 @@
159
 
160
  text-decoration: none;
161
 
162
- color: white;
163
 
164
  transition: .25s;
165
 
@@ -176,7 +176,7 @@
176
  /* width: 42px;
177
  height: 42px; */
178
  font-size: 25px;
179
- color: white;
180
  }
181
 
182
  .quick-action-card:hover {
@@ -210,7 +210,7 @@
210
  }
211
 
212
  .attendance-table thead {
213
- background: rgba(255, 255, 255, .03);
214
  }
215
 
216
  .attendance-table th {
@@ -226,13 +226,13 @@
226
  .attendance-table td {
227
  padding: 16px;
228
 
229
- color: #e2e8f0;
230
 
231
- border-bottom: 1px solid rgba(255, 255, 255, .04);
232
  }
233
 
234
  .attendance-table tbody tr:hover {
235
- background: rgba(255, 255, 255, .03);
236
  }
237
 
238
  /* ===================================
@@ -252,17 +252,17 @@
252
  }
253
 
254
  .status-success {
255
- background: rgba(34, 197, 94, .15);
256
  color: var(--success);
257
  }
258
 
259
  .status-warning {
260
- background: rgba(245, 158, 11, .15);
261
  color: var(--warning);
262
  }
263
 
264
  .status-danger {
265
- background: rgba(239, 68, 68, .15);
266
  color: var(--danger);
267
  }
268
 
@@ -332,9 +332,9 @@
332
 
333
  font-weight: 600;
334
 
335
- color: white;
336
 
337
- background: linear-gradient(to right, var(--indigo), var(--purple));
338
 
339
  transition: .25s;
340
  }
@@ -352,7 +352,7 @@
352
 
353
  margin-bottom: 8px;
354
 
355
- color: white;
356
  }
357
 
358
  .reminder-card__content {
 
56
 
57
  background:
58
  linear-gradient(135deg,
59
+ var(--indigo-06),
60
  var(--purple));
61
  }
62
 
 
64
  /* width: 42px;
65
  height: 42px; */
66
  font-size: 24px;
67
+ color: var(--text-white);
68
  }
69
 
70
  .employee-stat-card__number {
71
  font-size: 1.6rem;
72
  font-weight: 800;
73
 
74
+ color: var(--text-white);
75
  }
76
 
77
  .employee-stat-card__label {
 
88
 
89
  border-radius: 999px;
90
 
91
+ background: var(--bg-form);
92
 
93
  color: var(--text-light);
94
  }
 
96
  /* color variants */
97
 
98
  .report-submitted .employee-stat-card__number {
99
+ color: var(--indigo-06);
100
  }
101
 
102
  .report-approved .employee-stat-card__number {
 
137
 
138
  margin-bottom: 14px;
139
 
140
+ color: var(--text-white);
141
  }
142
 
143
  .quick-actions-grid {
 
159
 
160
  text-decoration: none;
161
 
162
+ color: var(--text-white);
163
 
164
  transition: .25s;
165
 
 
176
  /* width: 42px;
177
  height: 42px; */
178
  font-size: 25px;
179
+ color: var(--text-white);
180
  }
181
 
182
  .quick-action-card:hover {
 
210
  }
211
 
212
  .attendance-table thead {
213
+ background: var(--bg-table);
214
  }
215
 
216
  .attendance-table th {
 
226
  .attendance-table td {
227
  padding: 16px;
228
 
229
+ color: var(--text-white);
230
 
231
+ border-bottom: 1px solid var(--bg-form);
232
  }
233
 
234
  .attendance-table tbody tr:hover {
235
+ background: var(--bg-table);
236
  }
237
 
238
  /* ===================================
 
252
  }
253
 
254
  .status-success {
255
+ background: var(--btn-approv-15);
256
  color: var(--success);
257
  }
258
 
259
  .status-warning {
260
+ background: var(--btn-warning-15);
261
  color: var(--warning);
262
  }
263
 
264
  .status-danger {
265
+ background: var(--btn-reject-15);
266
  color: var(--danger);
267
  }
268
 
 
332
 
333
  font-weight: 600;
334
 
335
+ color: var(--text-white);
336
 
337
+ background: linear-gradient(to right, var(--indigo-06), var(--purple));
338
 
339
  transition: .25s;
340
  }
 
352
 
353
  margin-bottom: 8px;
354
 
355
+ color: var(--text-white);
356
  }
357
 
358
  .reminder-card__content {
src/main/resources/static/css/dashboard/dashboard-manager.css CHANGED
@@ -48,7 +48,7 @@
48
 
49
  margin-bottom:6px;
50
 
51
- color:white;
52
  }
53
 
54
  .stat-card p{
@@ -59,7 +59,7 @@
59
 
60
  /* COLORS */
61
  .stat-card.total h3{
62
- color:var(--indigo);
63
  }
64
 
65
  .stat-card.present h3{
@@ -112,7 +112,7 @@
112
 
113
  font-weight:700;
114
 
115
- color:white;
116
  }
117
 
118
  .card-body{
@@ -134,7 +134,7 @@
134
 
135
  border-radius:14px;
136
 
137
- background:rgba(255,255,255,.03);
138
 
139
  margin-bottom:10px;
140
 
@@ -142,7 +142,7 @@
142
  }
143
 
144
  .activity-card .activity-item:hover{
145
- background:rgba(255,255,255,.06);
146
  }
147
 
148
  .activity-left{
@@ -169,7 +169,7 @@
169
  .activity-item h4{
170
  font-size:.95rem;
171
 
172
- color:white;
173
  }
174
 
175
  .activity-item p{
 
48
 
49
  margin-bottom:6px;
50
 
51
+ color:var(--text-white);
52
  }
53
 
54
  .stat-card p{
 
59
 
60
  /* COLORS */
61
  .stat-card.total h3{
62
+ color:var(--indigo-06);
63
  }
64
 
65
  .stat-card.present h3{
 
112
 
113
  font-weight:700;
114
 
115
+ color:var(--text-white);
116
  }
117
 
118
  .card-body{
 
134
 
135
  border-radius:14px;
136
 
137
+ background:var(--bg-table);
138
 
139
  margin-bottom:10px;
140
 
 
142
  }
143
 
144
  .activity-card .activity-item:hover{
145
+ background:var(--bg-table-06);
146
  }
147
 
148
  .activity-left{
 
169
  .activity-item h4{
170
  font-size:.95rem;
171
 
172
+ color:var(--text-white);
173
  }
174
 
175
  .activity-item p{
src/main/resources/static/css/document/document-create.css CHANGED
@@ -64,11 +64,11 @@
64
 
65
  border-radius:14px;
66
 
67
- border:1px solid rgba(255,255,255,.08);
68
 
69
- background:rgba(255,255,255,.05);
70
 
71
- color:white;
72
 
73
  outline:none;
74
 
@@ -82,9 +82,9 @@
82
  .form-group input:focus,
83
  .form-group textarea:focus,
84
  .form-group select:focus{
85
- border-color:var(--indigo);
86
 
87
- box-shadow:0 0 0 4px rgba(99,102,241,.15);
88
  }
89
 
90
  /* ===================================
@@ -102,11 +102,11 @@
102
  input[type="file"]{
103
  padding:10px;
104
 
105
- background:rgba(255,255,255,.03);
106
 
107
  border-radius:14px;
108
 
109
- border:1px dashed rgba(255,255,255,.15);
110
 
111
  color:var(--text-gray);
112
  }
@@ -137,7 +137,7 @@ input[type="file"]{
137
 
138
  color:white;
139
 
140
- background:linear-gradient(to right, var(--indigo), var(--purple));
141
 
142
  transition:.25s;
143
 
@@ -158,9 +158,9 @@ input[type="file"]{
158
 
159
  border-radius:14px;
160
 
161
- border:1px solid rgba(255,255,255,.1);
162
 
163
- background:rgba(255,255,255,.05);
164
 
165
  color:var(--text-light);
166
 
@@ -170,7 +170,7 @@ input[type="file"]{
170
  }
171
 
172
  .btn-secondary:hover{
173
- background:rgba(255,255,255,.08);
174
  }
175
 
176
  /* ===================================
 
64
 
65
  border-radius:14px;
66
 
67
+ border:1px solid var(--border);
68
 
69
+ background:var(--bg-table-06);
70
 
71
+ color:var(--text-white);
72
 
73
  outline:none;
74
 
 
82
  .form-group input:focus,
83
  .form-group textarea:focus,
84
  .form-group select:focus{
85
+ border-color:var(--indigo-06);
86
 
87
+ box-shadow:0 0 0 4px var(--indigo-15);
88
  }
89
 
90
  /* ===================================
 
102
  input[type="file"]{
103
  padding:10px;
104
 
105
+ background:var(--bg-table);
106
 
107
  border-radius:14px;
108
 
109
+ border:1px dashed var(--bg-table-015);
110
 
111
  color:var(--text-gray);
112
  }
 
137
 
138
  color:white;
139
 
140
+ background:linear-gradient(to right, var(--indigo-06), var(--purple));
141
 
142
  transition:.25s;
143
 
 
158
 
159
  border-radius:14px;
160
 
161
+ border:1px solid var(--bg-table);
162
 
163
+ background:var(--bg-table-015);
164
 
165
  color:var(--text-light);
166
 
 
170
  }
171
 
172
  .btn-secondary:hover{
173
+ background:var(--border);
174
  }
175
 
176
  /* ===================================
src/main/resources/static/css/document/document-list.css CHANGED
@@ -1,35 +1,27 @@
1
  @import url("../base.css");
2
 
3
- /* ===================================
4
- CARD WRAPPER
5
- =================================== */
6
 
7
  .document-card {
8
  background: var(--bg-card);
9
-
10
  border: 1px solid var(--border);
11
-
12
  border-radius: 24px;
13
-
14
- backdrop-filter: blur(20px);
15
-
16
  overflow: hidden;
 
17
  }
18
 
 
 
 
 
19
  .document-container {
20
  overflow-x: auto;
21
  }
22
 
23
- /* ===================================
24
- TABLE SYSTEM (UNIFIED)
25
- =================================== */
26
-
27
  .document-table {
28
  width: 100%;
29
-
30
  border-collapse: collapse;
31
-
32
- min-width: 900px;
33
  }
34
 
35
  .document-table thead {
@@ -37,60 +29,64 @@
37
  }
38
 
39
  .document-table th {
40
- padding: 16px;
41
-
42
  text-align: left;
43
-
44
  color: var(--text-light);
45
-
46
  font-size: .9rem;
47
-
48
  border-bottom: 1px solid var(--border);
49
  }
50
 
51
  .document-table td {
52
- padding: 16px;
53
-
54
  color: #e2e8f0;
 
 
 
55
 
56
- border-bottom: 1px solid rgba(255, 255, 255, .04);
 
57
  }
58
 
59
  .document-table tbody tr:hover {
60
  background: rgba(255, 255, 255, .03);
61
  }
62
 
63
- /* ===================================
64
  FILE LINK
65
- =================================== */
66
 
67
  .file-link {
68
- color: var(--indigo);
69
-
70
- text-decoration: none;
71
-
72
  font-weight: 600;
 
 
73
  }
74
 
75
  .file-link:hover {
76
- text-decoration: underline;
 
 
 
 
 
 
 
77
  }
78
 
79
- /* ===================================
80
- STATUS BADGE (SYSTEM UNIFIED)
81
- =================================== */
82
 
83
  .status-pending,
84
  .status-approved,
85
  .status-rejected {
86
  display: inline-flex;
87
-
88
- padding: 6px 12px;
89
-
90
  border-radius: 999px;
91
-
92
  font-size: .85rem;
93
-
94
  font-weight: 600;
95
  }
96
 
@@ -109,113 +105,130 @@
109
  color: var(--danger);
110
  }
111
 
112
- /* ===================================
113
- BUTTON SYSTEM
114
- =================================== */
115
 
116
  .btn {
117
- padding: 8px 14px;
118
-
119
- border-radius: 12px;
120
-
121
  border: none;
122
-
 
123
  cursor: pointer;
124
-
125
- font-weight: 600;
126
-
127
  font-size: .85rem;
128
-
129
  transition: .25s;
 
 
 
 
130
  }
131
 
132
- /* DETAIL */
133
- .btn-detail {
134
- background: rgba(59, 130, 246, .15);
135
 
136
- color: #3b82f6;
 
 
137
  }
138
 
139
  .btn-detail:hover {
140
- background: rgba(59, 130, 246, .25);
 
141
  }
142
 
143
- /* SUCCESS */
 
144
  .btn-success {
145
  background: rgba(34, 197, 94, .15);
146
-
147
  color: var(--success);
148
  }
149
 
150
  .btn-success:hover {
151
  background: rgba(34, 197, 94, .25);
 
152
  }
153
 
154
- /* DANGER */
 
155
  .btn-danger {
156
  background: rgba(239, 68, 68, .15);
157
-
158
  color: var(--danger);
159
  }
160
 
161
  .btn-danger:hover {
162
  background: rgba(239, 68, 68, .25);
 
163
  }
164
 
165
- /* ACTION GROUP */
 
 
 
166
  .action-group {
167
  display: flex;
168
-
169
  gap: 10px;
170
  }
171
 
172
- /* ===================================
 
 
 
 
173
  PAGINATION
174
- =================================== */
175
 
176
  .pagination {
177
- display: flex;
 
178
 
 
179
  justify-content: space-between;
180
-
181
  align-items: center;
182
-
183
- padding: 16px;
184
-
185
- border-top: 1px solid var(--border);
186
  }
187
 
188
  .btn-pagination {
189
- background: rgba(255, 255, 255, .05);
190
-
191
- color: var(--text-light);
192
-
193
- padding: 8px 14px;
194
 
195
- border-radius: 12px;
196
-
197
- text-decoration: none;
 
 
198
 
199
- transition: .25s;
200
  }
201
 
202
  .btn-pagination:hover {
203
- background: rgba(255, 255, 255, .08);
 
204
  }
205
 
206
- /* ===================================
 
 
 
 
207
  RESPONSIVE
208
- =================================== */
209
 
210
- @media(max-width:768px) {
211
 
212
  .action-group {
213
  flex-direction: column;
214
  }
215
 
 
 
 
 
 
 
 
 
 
 
 
216
  .pagination {
217
  flex-direction: column;
218
-
219
- gap: 10px;
220
  }
221
  }
 
1
  @import url("../base.css");
2
 
 
 
 
3
 
4
  .document-card {
5
  background: var(--bg-card);
6
+ backdrop-filter: blur(20px);
7
  border: 1px solid var(--border);
 
8
  border-radius: 24px;
 
 
 
9
  overflow: hidden;
10
+ box-shadow: 0 20px 60px rgba(0, 0, 0, .25);
11
  }
12
 
13
+ /* ==========================
14
+ TABLE
15
+ ========================== */
16
+
17
  .document-container {
18
  overflow-x: auto;
19
  }
20
 
 
 
 
 
21
  .document-table {
22
  width: 100%;
23
+ min-width: 1200px;
24
  border-collapse: collapse;
 
 
25
  }
26
 
27
  .document-table thead {
 
29
  }
30
 
31
  .document-table th {
32
+ padding: 18px;
 
33
  text-align: left;
 
34
  color: var(--text-light);
 
35
  font-size: .9rem;
36
+ font-weight: 600;
37
  border-bottom: 1px solid var(--border);
38
  }
39
 
40
  .document-table td {
41
+ padding: 18px;
 
42
  color: #e2e8f0;
43
+ border-bottom: 1px solid rgba(255, 255, 255, .05);
44
+ vertical-align: middle;
45
+ }
46
 
47
+ .document-table tbody tr {
48
+ transition: .25s;
49
  }
50
 
51
  .document-table tbody tr:hover {
52
  background: rgba(255, 255, 255, .03);
53
  }
54
 
55
+ /* ==========================
56
  FILE LINK
57
+ ========================== */
58
 
59
  .file-link {
60
+ color: var(--indigo-06);
 
 
 
61
  font-weight: 600;
62
+ text-decoration: none;
63
+ transition: .25s;
64
  }
65
 
66
  .file-link:hover {
67
+ color: var(--purple);
68
+ }
69
+
70
+ td span {
71
+ display: block;
72
+ margin-top: 6px;
73
+ font-size: .85rem;
74
+ color: #94a3b8;
75
  }
76
 
77
+ /* ==========================
78
+ STATUS
79
+ ========================== */
80
 
81
  .status-pending,
82
  .status-approved,
83
  .status-rejected {
84
  display: inline-flex;
85
+ align-items: center;
86
+ justify-content: center;
87
+ padding: 6px 14px;
88
  border-radius: 999px;
 
89
  font-size: .85rem;
 
90
  font-weight: 600;
91
  }
92
 
 
105
  color: var(--danger);
106
  }
107
 
108
+ /* ==========================
109
+ BUTTON
110
+ ========================== */
111
 
112
  .btn {
 
 
 
 
113
  border: none;
114
+ border-radius: 12px;
115
+ padding: 10px 16px;
116
  cursor: pointer;
 
 
 
117
  font-size: .85rem;
118
+ font-weight: 600;
119
  transition: .25s;
120
+ text-decoration: none;
121
+ display: inline-flex;
122
+ align-items: center;
123
+ justify-content: center;
124
  }
125
 
126
+ /* XEM */
 
 
127
 
128
+ .btn-detail {
129
+ background: rgba(255, 255, 255, .06);
130
+ color: white;
131
  }
132
 
133
  .btn-detail:hover {
134
+ background: rgba(255, 255, 255, .12);
135
+ transform: translateY(-2px);
136
  }
137
 
138
+ /* DUYỆT */
139
+
140
  .btn-success {
141
  background: rgba(34, 197, 94, .15);
 
142
  color: var(--success);
143
  }
144
 
145
  .btn-success:hover {
146
  background: rgba(34, 197, 94, .25);
147
+ transform: translateY(-2px);
148
  }
149
 
150
+ /* TỪ CHỐI */
151
+
152
  .btn-danger {
153
  background: rgba(239, 68, 68, .15);
 
154
  color: var(--danger);
155
  }
156
 
157
  .btn-danger:hover {
158
  background: rgba(239, 68, 68, .25);
159
+ transform: translateY(-2px);
160
  }
161
 
162
+ /* ==========================
163
+ ACTIONS
164
+ ========================== */
165
+
166
  .action-group {
167
  display: flex;
 
168
  gap: 10px;
169
  }
170
 
171
+ .action-group form {
172
+ margin: 0;
173
+ }
174
+
175
+ /* ==========================
176
  PAGINATION
177
+ ========================== */
178
 
179
  .pagination {
180
+ padding: 20px 24px;
181
+ border-top: 1px solid var(--border);
182
 
183
+ display: flex;
184
  justify-content: space-between;
 
185
  align-items: center;
 
 
 
 
186
  }
187
 
188
  .btn-pagination {
189
+ min-width: 120px;
 
 
 
 
190
 
191
+ background: linear-gradient(
192
+ 135deg,
193
+ var(--indigo-06),
194
+ var(--purple)
195
+ );
196
 
197
+ color: white;
198
  }
199
 
200
  .btn-pagination:hover {
201
+ transform: translateY(-2px);
202
+ box-shadow: 0 10px 25px rgba(99, 102, 241, .35);
203
  }
204
 
205
+ .pagination span {
206
+ color: var(--text-light);
207
+ }
208
+
209
+ /* ==========================
210
  RESPONSIVE
211
+ ========================== */
212
 
213
+ @media (max-width: 1200px) {
214
 
215
  .action-group {
216
  flex-direction: column;
217
  }
218
 
219
+ .action-group .btn {
220
+ width: 100%;
221
+ }
222
+ }
223
+
224
+ @media (max-width: 768px) {
225
+
226
+ .document-table {
227
+ min-width: 1200px;
228
+ }
229
+
230
  .pagination {
231
  flex-direction: column;
232
+ gap: 15px;
 
233
  }
234
  }
src/main/resources/static/css/faceID/faceID-create.css CHANGED
@@ -31,7 +31,7 @@ video {
31
 
32
  font-weight:700;
33
 
34
- color:white;
35
  }
36
 
37
  .card-body{
@@ -65,11 +65,11 @@ video {
65
 
66
  border-radius:14px;
67
 
68
- border:1px solid rgba(255,255,255,.08);
69
 
70
- background:rgba(255,255,255,.05);
71
 
72
- color:white;
73
 
74
  outline:none;
75
 
@@ -77,9 +77,9 @@ video {
77
  }
78
 
79
  .room-code-input input:focus{
80
- border-color:var(--indigo);
81
 
82
- box-shadow:0 0 0 4px rgba(99,102,241,.15);
83
  }
84
 
85
  /* ===================================
@@ -113,11 +113,11 @@ video {
113
 
114
  border-radius:14px;
115
 
116
- border:1px solid rgba(255,255,255,.08);
117
 
118
- background:rgba(255,255,255,.05);
119
 
120
- color:white;
121
 
122
  outline:none;
123
  }
@@ -127,9 +127,9 @@ video {
127
 
128
  border-radius:14px;
129
 
130
- border:1px solid rgba(255,255,255,.1);
131
 
132
- background:rgba(255,255,255,.05);
133
 
134
  color:var(--text-light);
135
 
@@ -153,7 +153,7 @@ video {
153
  =================================== */
154
 
155
  .panel{
156
- background:rgba(255,255,255,.03);
157
 
158
  border:1px solid var(--border);
159
 
@@ -187,9 +187,9 @@ video {
187
 
188
  cursor:pointer;
189
 
190
- background:linear-gradient(to right, var(--indigo), var(--purple));
191
 
192
- color:white;
193
 
194
  font-weight:600;
195
  }
@@ -213,9 +213,9 @@ video {
213
 
214
  border-radius:12px;
215
 
216
- border:1px solid rgba(255,255,255,.1);
217
 
218
- background:rgba(255,255,255,.05);
219
 
220
  color:var(--text-light);
221
 
@@ -225,11 +225,11 @@ video {
225
  }
226
 
227
  .mode-tabs button.active{
228
- background:rgba(99,102,241,.2);
229
 
230
  border-color:var(--indigo);
231
 
232
- color:white;
233
  }
234
 
235
  /* ===================================
@@ -241,9 +241,9 @@ video {
241
 
242
  border-radius:14px;
243
 
244
- background:rgba(255,255,255,.03);
245
 
246
- border:1px solid rgba(255,255,255,.08);
247
 
248
  margin-bottom:12px;
249
 
@@ -308,19 +308,19 @@ video {
308
 
309
  font-weight:600;
310
 
311
- color:white;
312
  }
313
 
314
  /* PRIMARY */
315
  #captureFaceBtn{
316
- background:linear-gradient(to right, var(--indigo), var(--purple));
317
  }
318
 
319
  /* SECONDARY */
320
  .action-row .secondary{
321
- background:rgba(255,255,255,.05);
322
 
323
- border:1px solid rgba(255,255,255,.1);
324
 
325
  color:var(--text-light);
326
  }
 
31
 
32
  font-weight:700;
33
 
34
+ color:var(--text-white);
35
  }
36
 
37
  .card-body{
 
65
 
66
  border-radius:14px;
67
 
68
+ border:1px solid var(--border);
69
 
70
+ background:var(--bg-form);
71
 
72
+ color:var(--text-white);
73
 
74
  outline:none;
75
 
 
77
  }
78
 
79
  .room-code-input input:focus{
80
+ border-color:var(--indigo-06);
81
 
82
+ box-shadow:0 0 0 4px var(--indigo-15);
83
  }
84
 
85
  /* ===================================
 
113
 
114
  border-radius:14px;
115
 
116
+ border:1px solid var(--border);
117
 
118
+ background:var(--bg-table-06);
119
 
120
+ color:var(--text-white);
121
 
122
  outline:none;
123
  }
 
127
 
128
  border-radius:14px;
129
 
130
+ border:1px solid var(--border);
131
 
132
+ background:var(--bg-table-06);
133
 
134
  color:var(--text-light);
135
 
 
153
  =================================== */
154
 
155
  .panel{
156
+ background:var(--bg-table);
157
 
158
  border:1px solid var(--border);
159
 
 
187
 
188
  cursor:pointer;
189
 
190
+ background:linear-gradient(to right, var(--indigo-06), var(--purple));
191
 
192
+ color:var(--text-white);
193
 
194
  font-weight:600;
195
  }
 
213
 
214
  border-radius:12px;
215
 
216
+ border:1px solid var(--border);
217
 
218
+ background:var(--bg-table-06);
219
 
220
  color:var(--text-light);
221
 
 
225
  }
226
 
227
  .mode-tabs button.active{
228
+ background:var(--indigo-15);
229
 
230
  border-color:var(--indigo);
231
 
232
+ color:var(--text-white);
233
  }
234
 
235
  /* ===================================
 
241
 
242
  border-radius:14px;
243
 
244
+ background:var(--bg-table);
245
 
246
+ border:1px solid var(--border);
247
 
248
  margin-bottom:12px;
249
 
 
308
 
309
  font-weight:600;
310
 
311
+ color:var(--text-white);
312
  }
313
 
314
  /* PRIMARY */
315
  #captureFaceBtn{
316
+ background:linear-gradient(to right, var(--indigo-06), var(--purple));
317
  }
318
 
319
  /* SECONDARY */
320
  .action-row .secondary{
321
+ background:var(--bg-table-06);
322
 
323
+ border:1px solid var(--border);
324
 
325
  color:var(--text-light);
326
  }
src/main/resources/static/css/faceID/faceID-list.css CHANGED
@@ -25,11 +25,11 @@
25
 
26
  border-collapse:collapse;
27
 
28
- color:#e2e8f0;
29
  }
30
 
31
  .face-table thead{
32
- background:rgba(255,255,255,.03);
33
  }
34
 
35
  .face-table th{
@@ -47,7 +47,7 @@
47
  .face-table td{
48
  padding:16px;
49
 
50
- border-bottom:1px solid rgba(255,255,255,.04);
51
 
52
  font-size:.95rem;
53
  }
@@ -57,9 +57,10 @@
57
  }
58
 
59
  .face-table tbody tr:hover{
60
- background:rgba(255,255,255,.03);
61
  }
62
 
 
63
  /* ===================================
64
  BADGE
65
  =================================== */
@@ -75,11 +76,11 @@
75
 
76
  font-weight:600;
77
 
78
- background:rgba(99,102,241,.15);
79
 
80
- color:var(--indigo);
81
 
82
- border:1px solid rgba(99,102,241,.25);
83
  }
84
 
85
  /* ===================================
@@ -91,9 +92,9 @@
91
 
92
  border-radius:12px;
93
 
94
- border:1px solid rgba(255,255,255,.1);
95
 
96
- background:rgba(255,255,255,.05);
97
 
98
  color:var(--text-light);
99
 
@@ -103,9 +104,9 @@
103
  }
104
 
105
  .detail-btn:hover{
106
- background:rgba(99,102,241,.2);
107
 
108
- border-color:var(--indigo);
109
 
110
  color:white;
111
  }
@@ -125,7 +126,14 @@
125
 
126
  font-weight:600;
127
  }
128
-
 
 
 
 
 
 
 
129
  /* ===================================
130
  TABLE WRAPPER IMPROVEMENT
131
  =================================== */
 
25
 
26
  border-collapse:collapse;
27
 
28
+ color:var(--text-white);
29
  }
30
 
31
  .face-table thead{
32
+ background:var(--bg-table);
33
  }
34
 
35
  .face-table th{
 
47
  .face-table td{
48
  padding:16px;
49
 
50
+ border-bottom:1px solid var(--bg-form);
51
 
52
  font-size:.95rem;
53
  }
 
57
  }
58
 
59
  .face-table tbody tr:hover{
60
+ background:var(--bg-table);
61
  }
62
 
63
+
64
  /* ===================================
65
  BADGE
66
  =================================== */
 
76
 
77
  font-weight:600;
78
 
79
+ background:var(--bg-table-015);
80
 
81
+ color:var(--text-white );
82
 
83
+ border:1px solid var(--indigo-15);
84
  }
85
 
86
  /* ===================================
 
92
 
93
  border-radius:12px;
94
 
95
+ border:1px solid var(--border);
96
 
97
+ background:var(--bg-table-06);
98
 
99
  color:var(--text-light);
100
 
 
104
  }
105
 
106
  .detail-btn:hover{
107
+ background:var(--indigo-15);
108
 
109
+ border-color:var(--indigo-06);
110
 
111
  color:white;
112
  }
 
126
 
127
  font-weight:600;
128
  }
129
+ .btn-secondery{
130
+ background-color:var(--danger) ;
131
+ color: var(--text-white);
132
+ }
133
+ .btn-primary{
134
+ background-color:var(--success) ;
135
+ color: var(--text-white);
136
+ }
137
  /* ===================================
138
  TABLE WRAPPER IMPROVEMENT
139
  =================================== */
src/main/resources/static/css/layout/footer.css CHANGED
@@ -4,24 +4,24 @@
4
 
5
  footer {
6
  width: 100%;
7
-
8
  }
9
 
10
  .footer-layout {
11
  max-width: 1550px;
12
 
13
  margin: 0px;
14
- padding:40px 60px 30px 60px;
15
 
16
  display: flex;
17
  justify-content: space-between;
18
  align-items: flex-start;
19
 
20
- background: rgba(3, 7, 30, 0.85);
21
 
22
  backdrop-filter: blur(12px);
23
 
24
- border-top: 1px solid rgba(255, 255, 255, 0.08);
25
  }
26
 
27
  /* =========================
@@ -39,15 +39,15 @@ footer {
39
  font-weight: 700;
40
 
41
  background: linear-gradient(90deg,
42
- #8b7cff,
43
- #d68eff);
44
  background-clip: text;
45
  -webkit-background-clip: text;
46
  -webkit-text-fill-color: transparent;
47
  }
48
 
49
  .left-description {
50
- color: #9ca3af;
51
  font-size: 1rem;
52
  line-height: 1.6;
53
  }
@@ -63,7 +63,7 @@ footer {
63
  }
64
 
65
  .right-title {
66
- color: white;
67
  font-size: 1.1rem;
68
  font-weight: 600;
69
 
@@ -73,13 +73,13 @@ footer {
73
  .right-description {
74
  text-decoration: none;
75
 
76
- color: #9ca3af;
77
 
78
  transition: .3s;
79
  }
80
 
81
  .right-description:hover {
82
- color: #b794ff;
83
  }
84
 
85
  /* =========================
@@ -91,9 +91,10 @@ footer {
91
 
92
  padding: 20px;
93
 
94
- color: #aeb5c4;
95
- background-color: #070d20;
96
- border-top: 1px solid rgba(255, 255, 255, 0.05);
 
97
  }
98
 
99
  /* =========================
 
4
 
5
  footer {
6
  width: 100%;
7
+
8
  }
9
 
10
  .footer-layout {
11
  max-width: 1550px;
12
 
13
  margin: 0px;
14
+ padding: 40px 60px 30px 60px;
15
 
16
  display: flex;
17
  justify-content: space-between;
18
  align-items: flex-start;
19
 
20
+ background: var(--bg-card);
21
 
22
  backdrop-filter: blur(12px);
23
 
24
+ border-top: 1px solid var(--border);
25
  }
26
 
27
  /* =========================
 
39
  font-weight: 700;
40
 
41
  background: linear-gradient(90deg,
42
+ #8b5cf6,
43
+ #b794ff);
44
  background-clip: text;
45
  -webkit-background-clip: text;
46
  -webkit-text-fill-color: transparent;
47
  }
48
 
49
  .left-description {
50
+ color: var(--text-light);
51
  font-size: 1rem;
52
  line-height: 1.6;
53
  }
 
63
  }
64
 
65
  .right-title {
66
+ color: var(--text-white);
67
  font-size: 1.1rem;
68
  font-weight: 600;
69
 
 
73
  .right-description {
74
  text-decoration: none;
75
 
76
+ color: var(--text-light);
77
 
78
  transition: .3s;
79
  }
80
 
81
  .right-description:hover {
82
+ color: var(--purple-light);
83
  }
84
 
85
  /* =========================
 
91
 
92
  padding: 20px;
93
 
94
+ color: var(--text-light);
95
+ background-color: #0f172a;
96
+
97
+ border-top: 1px solid var(--bg-table-06);
98
  }
99
 
100
  /* =========================
src/main/resources/static/css/report/report-day.css CHANGED
@@ -23,7 +23,7 @@
23
 
24
  font-weight: 800;
25
 
26
- color: white;
27
  }
28
 
29
  .container-header p {
@@ -37,7 +37,7 @@
37
  =================================== */
38
 
39
  .card-header {
40
- background: rgba(255, 255, 255, .03);
41
 
42
  border: 1px solid var(--border);
43
 
@@ -51,7 +51,7 @@
51
 
52
  font-weight: 700;
53
 
54
- color: white;
55
  }
56
 
57
  /* ===================================
@@ -90,11 +90,11 @@
90
 
91
  border-radius: 14px;
92
 
93
- border: 1px solid rgba(255, 255, 255, .08);
94
 
95
- background: rgba(255, 255, 255, .05);
96
 
97
- color: white;
98
 
99
  outline: none;
100
 
@@ -103,9 +103,9 @@
103
 
104
  .filter-group input:focus,
105
  .filter-group select:focus {
106
- border-color: var(--indigo);
107
 
108
- box-shadow: 0 0 0 4px rgba(99, 102, 241, .15);
109
  }
110
 
111
  /* FILTER BUTTON */
@@ -123,9 +123,9 @@
123
 
124
  font-weight: 700;
125
 
126
- color: white;
127
 
128
- background: linear-gradient(to right, var(--indigo), var(--purple));
129
 
130
  transition: .25s;
131
  }
@@ -153,11 +153,11 @@
153
 
154
  border-collapse: collapse;
155
 
156
- color: #e2e8f0;
157
  }
158
 
159
  .attendance-table thead {
160
- background: rgba(255, 255, 255, .03);
161
  }
162
 
163
  .attendance-table th {
@@ -175,7 +175,7 @@
175
  .attendance-table td {
176
  padding: 16px;
177
 
178
- border-bottom: 1px solid rgba(255, 255, 255, .04);
179
  }
180
 
181
  .attendance-table tbody tr {
@@ -183,7 +183,7 @@
183
  }
184
 
185
  .attendance-table tbody tr:hover {
186
- background: rgba(255, 255, 255, .03);
187
  }
188
 
189
  /* ===================================
@@ -201,19 +201,19 @@
201
  }
202
 
203
  .status.present {
204
- background: rgba(34, 197, 94, .15);
205
 
206
  color: var(--success);
207
  }
208
 
209
  .status.late {
210
- background: rgba(245, 158, 11, .15);
211
 
212
  color: var(--warning);
213
  }
214
 
215
  .status.absent {
216
- background: rgba(239, 68, 68, .15);
217
 
218
  color: var(--danger);
219
  }
 
23
 
24
  font-weight: 800;
25
 
26
+ color: var(--text-white);
27
  }
28
 
29
  .container-header p {
 
37
  =================================== */
38
 
39
  .card-header {
40
+ background: var(--bg-table);
41
 
42
  border: 1px solid var(--border);
43
 
 
51
 
52
  font-weight: 700;
53
 
54
+ color: var(--text-white);
55
  }
56
 
57
  /* ===================================
 
90
 
91
  border-radius: 14px;
92
 
93
+ border: 1px solid var(--border);
94
 
95
+ background: var(--bg-table-06);
96
 
97
+ color: var(--text-white);
98
 
99
  outline: none;
100
 
 
103
 
104
  .filter-group input:focus,
105
  .filter-group select:focus {
106
+ border-color: var(--indigo-06);
107
 
108
+ box-shadow: 0 0 0 4px var(--indigo-15);
109
  }
110
 
111
  /* FILTER BUTTON */
 
123
 
124
  font-weight: 700;
125
 
126
+ color: var(--text-white);
127
 
128
+ background: linear-gradient(to right, var(--indigo-06), var(--purple));
129
 
130
  transition: .25s;
131
  }
 
153
 
154
  border-collapse: collapse;
155
 
156
+ color: var(--text-white);
157
  }
158
 
159
  .attendance-table thead {
160
+ background: var(--bg-table);
161
  }
162
 
163
  .attendance-table th {
 
175
  .attendance-table td {
176
  padding: 16px;
177
 
178
+ border-bottom: 1px solid var(--bg-form);
179
  }
180
 
181
  .attendance-table tbody tr {
 
183
  }
184
 
185
  .attendance-table tbody tr:hover {
186
+ background: var(--bg-table);
187
  }
188
 
189
  /* ===================================
 
201
  }
202
 
203
  .status.present {
204
+ background: var(--btn-approv-15);
205
 
206
  color: var(--success);
207
  }
208
 
209
  .status.late {
210
+ background: var(--btn-warning-15);
211
 
212
  color: var(--warning);
213
  }
214
 
215
  .status.absent {
216
+ background: var(--btn-reject-15);
217
 
218
  color: var(--danger);
219
  }
src/main/resources/static/css/report/report-month.css CHANGED
@@ -23,7 +23,7 @@
23
 
24
  font-weight: 800;
25
 
26
- color: white;
27
  }
28
 
29
  .container-header p {
@@ -80,11 +80,11 @@
80
 
81
  border-radius: 14px;
82
 
83
- border: 1px solid rgba(255, 255, 255, .08);
84
 
85
- background: rgba(255, 255, 255, .05);
86
 
87
- color: white;
88
 
89
  outline: none;
90
 
@@ -93,9 +93,9 @@
93
 
94
  .filter-group input:focus,
95
  .filter-group select:focus {
96
- border-color: var(--indigo);
97
 
98
- box-shadow: 0 0 0 4px rgba(99, 102, 241, .15);
99
  }
100
 
101
  /* EXPORT BUTTON */
@@ -111,9 +111,9 @@
111
 
112
  font-weight: 700;
113
 
114
- color: white;
115
 
116
- background: linear-gradient(to right, var(--indigo), var(--purple));
117
 
118
  transition: .25s;
119
  }
@@ -169,7 +169,7 @@
169
 
170
  font-weight: 800;
171
 
172
- color: white;
173
  }
174
 
175
  /* ===================================
@@ -195,7 +195,7 @@
195
 
196
  font-weight: 700;
197
 
198
- color: white;
199
 
200
  margin-bottom: 12px;
201
  }
@@ -221,7 +221,7 @@
221
  .table-card h2 {
222
  font-size: 1.1rem;
223
 
224
- color: white;
225
 
226
  margin-bottom: 12px;
227
  }
@@ -231,7 +231,7 @@
231
 
232
  border-collapse: collapse;
233
 
234
- color: #e2e8f0;
235
  }
236
 
237
  .report-table th {
@@ -249,11 +249,11 @@
249
  .report-table td {
250
  padding: 14px;
251
 
252
- border-bottom: 1px solid rgba(255, 255, 255, .04);
253
  }
254
 
255
  .report-table tbody tr:hover {
256
- background: rgba(255, 255, 255, .03);
257
  }
258
 
259
  /* ===================================
 
23
 
24
  font-weight: 800;
25
 
26
+ color: var(--text-white);
27
  }
28
 
29
  .container-header p {
 
80
 
81
  border-radius: 14px;
82
 
83
+ border: 1px solid var(--border);
84
 
85
+ background: var(--bg-table-06);
86
 
87
+ color: var(--text-white);
88
 
89
  outline: none;
90
 
 
93
 
94
  .filter-group input:focus,
95
  .filter-group select:focus {
96
+ border-color: var(--indigo-06);
97
 
98
+ box-shadow: 0 0 0 4px var(--indigo-15);
99
  }
100
 
101
  /* EXPORT BUTTON */
 
111
 
112
  font-weight: 700;
113
 
114
+ color: var(--text-white);
115
 
116
+ background: linear-gradient(to right, var(--indigo-06), var(--purple));
117
 
118
  transition: .25s;
119
  }
 
169
 
170
  font-weight: 800;
171
 
172
+ color: var(--text-white);
173
  }
174
 
175
  /* ===================================
 
195
 
196
  font-weight: 700;
197
 
198
+ color: var(--text-white);
199
 
200
  margin-bottom: 12px;
201
  }
 
221
  .table-card h2 {
222
  font-size: 1.1rem;
223
 
224
+ color: var(--text-white);
225
 
226
  margin-bottom: 12px;
227
  }
 
231
 
232
  border-collapse: collapse;
233
 
234
+ color: var(--text-white);
235
  }
236
 
237
  .report-table th {
 
249
  .report-table td {
250
  padding: 14px;
251
 
252
+ border-bottom: 1px solid var(--bg-form);
253
  }
254
 
255
  .report-table tbody tr:hover {
256
+ background: var(--bg-table);
257
  }
258
 
259
  /* ===================================
src/main/resources/static/css/sidebar/sidebar.css CHANGED
@@ -1,15 +1,56 @@
1
  /* ===== SIDEBAR ===== */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
 
3
  .sidebar {
4
-
5
  min-height: 100vh;
6
 
7
- background: #020c2e;
8
 
9
  display: flex;
10
  flex-direction: column;
11
 
12
- color: white;
13
  font-family: "Segoe UI", sans-serif;
14
  padding-bottom: 30px;
15
  }
@@ -25,7 +66,7 @@
25
  }
26
 
27
  .logo {
28
- width:56px;
29
  height: 48px;
30
 
31
  border-radius: 18px;
@@ -36,15 +77,14 @@
36
 
37
  font-size: 24px;
38
 
39
- background: linear-gradient(
40
- 135deg,
41
- #02085c,
42
- #2461ca
43
- );
44
  }
45
- .logo i{
 
46
  width: 26px;
47
- height:26px;
48
  }
49
 
50
  .sidebar-header h2 {
@@ -53,7 +93,7 @@
53
  }
54
 
55
  .header-description {
56
- color: #94a3b8;
57
  margin-top: 4px;
58
  font-size: 0.95rem;
59
  }
@@ -62,7 +102,7 @@
62
 
63
  .sidebar-line {
64
  height: 1px;
65
- background: rgba(255,255,255,0.08);
66
  }
67
 
68
  /* ===== MENU ===== */
@@ -85,7 +125,7 @@
85
 
86
  text-decoration: none;
87
 
88
- color: #94a3b8;
89
 
90
  padding: 14px 18px;
91
 
@@ -100,23 +140,33 @@
100
  /* Hover */
101
 
102
  .sidebar-link:hover {
103
- background: rgba(255,255,255,0.05);
104
- color: white;
105
  }
106
 
107
  /* Active giống ảnh */
 
 
 
 
 
 
 
108
 
109
- .sidebar-option.active .sidebar-link {
110
- background: linear-gradient(
111
- 90deg,
112
- #02085c,
113
- #2461ca
114
- );
115
 
116
- color: white;
117
 
118
  box-shadow:
119
- 0 8px 25px rgba(63, 120, 235, 0.3);
 
 
 
 
 
 
 
 
120
  }
121
 
122
  /* ===== FOOTER ===== */
@@ -135,7 +185,7 @@
135
 
136
  border-radius: 20px;
137
 
138
- background: rgba(255,255,255,0.05);
139
 
140
  margin-bottom: 20px;
141
  }
@@ -152,16 +202,16 @@
152
 
153
  font-size: 20px;
154
 
155
- background: linear-gradient(
156
- 135deg,
157
- #1e044d,
158
- #251785
159
- );
160
  }
 
161
  .avatar i {
162
  font-size: 28px;
163
- color:white;
164
  }
 
165
  .footer-user h3 {
166
  font-size: 1.1rem;
167
  }
@@ -171,7 +221,7 @@
171
  align-items: center;
172
  gap: 12px;
173
 
174
- color: #94a3b8;
175
 
176
  cursor: pointer;
177
 
@@ -186,6 +236,6 @@
186
  }
187
 
188
  .logout:hover {
189
- background: rgba(255,255,255,0.05);
190
- color: white;
191
  }
 
1
  /* ===== SIDEBAR ===== */
2
+ :root {
3
+ --bg-dark: #020617;
4
+ --bg-card: rgba(15, 23, 42, .65);
5
+
6
+ --bg-table: rgba(255, 255, 255, .03);
7
+ --bg-form: rgba(255, 255, 255, .04);
8
+ --bg-table-06: rgba(255, 255, 255, .06);
9
+ --bg-table-015: rgba(255, 255, 255, .15);
10
+
11
+ --border: rgba(255, 255, 255, .08);
12
+
13
+ --text-white: #ffffff;
14
+ --text-gray: #94a3b8;
15
+ --text-light: #cbd5e1;
16
+
17
+ --indigo-06: rgba(99, 102, 241, .6);
18
+ --indigo-15: rgba(99, 102, 241, .15);
19
+
20
+ --purple: #8b5cf6;
21
+ --purple-light: #b794ff;
22
+ --pink: #ec4899;
23
+ --blue: #3b82f6;
24
+ --pinl-light: #d68eff;
25
+
26
+ --success: rgb(37, 249, 83);
27
+ --warning: #f59e0b;
28
+ --danger: #ef4444;
29
+
30
+ --shadow-box: rgba(99, 102, 241, .15);
31
+
32
+ --btn-secondary: #334155;
33
+ --btn-secondary-hover: #475569;
34
+
35
+ --btn-warning-15: rgba(139, 92, 246, .15);
36
+
37
+ --btn-reject-18: rgba(239, 68, 68, .18);
38
+ --btn-reject-15: rgba(239, 68, 68, .15);
39
+
40
+ --btn-approv-18: rgba(34, 197, 94, .18);
41
+ --btn-approv-15: rgba(34, 197, 94, .15);
42
+ }
43
 
44
  .sidebar {
45
+
46
  min-height: 100vh;
47
 
48
+ background: var(--bg-dark);
49
 
50
  display: flex;
51
  flex-direction: column;
52
 
53
+ color: var(--text-white);
54
  font-family: "Segoe UI", sans-serif;
55
  padding-bottom: 30px;
56
  }
 
66
  }
67
 
68
  .logo {
69
+ width: 56px;
70
  height: 48px;
71
 
72
  border-radius: 18px;
 
77
 
78
  font-size: 24px;
79
 
80
+ background: linear-gradient(135deg,
81
+ #02085c,
82
+ #2461ca);
 
 
83
  }
84
+
85
+ .logo i {
86
  width: 26px;
87
+ height: 26px;
88
  }
89
 
90
  .sidebar-header h2 {
 
93
  }
94
 
95
  .header-description {
96
+ color: var(--text-gray);
97
  margin-top: 4px;
98
  font-size: 0.95rem;
99
  }
 
102
 
103
  .sidebar-line {
104
  height: 1px;
105
+ background: var(--border);
106
  }
107
 
108
  /* ===== MENU ===== */
 
125
 
126
  text-decoration: none;
127
 
128
+ color: var(--text-gray);
129
 
130
  padding: 14px 18px;
131
 
 
140
  /* Hover */
141
 
142
  .sidebar-link:hover {
143
+ background: var(--bg-table-06);
144
+ color: var(--text-white);
145
  }
146
 
147
  /* Active giống ảnh */
148
+ .sidebar-link.active {
149
+ background: linear-gradient(135deg,
150
+ #3b82f6,
151
+ #6366f1,
152
+ #8b5cf6);
153
+
154
+ color: #fff;
155
 
156
+ border: 1px solid rgba(255, 255, 255, .08);
 
 
 
 
 
157
 
158
+ transform: translateX(6px);
159
 
160
  box-shadow:
161
+ 0 0 20px rgba(99, 102, 241, .45),
162
+ 0 10px 30px rgba(99, 102, 241, .35);
163
+
164
+ backdrop-filter: blur(10px);
165
+ }
166
+
167
+ .sidebar-link.active span {
168
+ transform: scale(1.15);
169
+ text-shadow: 0 0 12px rgba(255, 255, 255, .8);
170
  }
171
 
172
  /* ===== FOOTER ===== */
 
185
 
186
  border-radius: 20px;
187
 
188
+ background: var(--bg-table-06);
189
 
190
  margin-bottom: 20px;
191
  }
 
202
 
203
  font-size: 20px;
204
 
205
+ background: linear-gradient(135deg,
206
+ #1e044d,
207
+ #251785);
 
 
208
  }
209
+
210
  .avatar i {
211
  font-size: 28px;
212
+ color: var(--text-white);
213
  }
214
+
215
  .footer-user h3 {
216
  font-size: 1.1rem;
217
  }
 
221
  align-items: center;
222
  gap: 12px;
223
 
224
+ color: var(--text-gray);
225
 
226
  cursor: pointer;
227
 
 
236
  }
237
 
238
  .logout:hover {
239
+ background: var(--bg-table-06);
240
+ color: var(--text-white);
241
  }
src/main/resources/static/css/theme.css CHANGED
@@ -1,235 +1,43 @@
1
- /* ===========================
2
- FACE ID ATTENDANCE SYSTEM
3
- Theme CSS - Light & Dark Mode
4
- =========================== */
5
 
6
- :root {
7
- /* Light Mode Colors */
8
- --background: #ffffff;
9
- --foreground: #0F1117;
10
- --card: #ffffff;
11
- --card-foreground: #0F1117;
12
- --popover: #ffffff;
13
- --popover-foreground: #0F1117;
14
- --primary: #3B82F6;
15
- --primary-foreground: #ffffff;
16
- --secondary: #F3F4F6;
17
- --secondary-foreground: #0F1117;
18
- --muted: #F3F4F6;
19
- --muted-foreground: #6B7280;
20
- --accent: #F3F4F6;
21
- --accent-foreground: #0F1117;
22
- --destructive: #EF4444;
23
- --destructive-foreground: #ffffff;
24
- --border: #E5E7EB;
25
- --input: #E5E7EB;
26
- --input-background: #ffffff;
27
- --ring: #3B82F6;
28
- --success: #10B981;
29
- --warning: #F59E0B;
30
- --info: #3B82F6;
31
 
32
- /* Spacing */
33
- --radius: 0.5rem;
34
- --transition-duration: 300ms;
35
- }
36
 
37
- [data-theme="dark"] {
38
- /* Dark Mode Colors */
39
- --background: #0F1117;
40
- --foreground: #F9FAFB;
41
- --card: #1B1F2A;
42
- --card-foreground: #F9FAFB;
43
- --popover: #1B1F2A;
44
- --popover-foreground: #F9FAFB;
45
- --primary: #60A5FA;
46
- --primary-foreground: #0F1117;
47
- --secondary: #1F2937;
48
- --secondary-foreground: #F9FAFB;
49
- --muted: #1F2937;
50
- --muted-foreground: #9CA3AF;
51
- --accent: #1F2937;
52
- --accent-foreground: #F9FAFB;
53
- --destructive: #EF4444;
54
- --destructive-foreground: #ffffff;
55
- --border: #374151;
56
- --input: #374151;
57
- --input-background: #1F2937;
58
- --ring: #60A5FA;
59
- --success: #10B981;
60
- --warning: #F59E0B;
61
- --info: #60A5FA;
62
- }
63
 
64
- /* ===========================
65
- RESET & BASE STYLES
66
- =========================== */
67
 
68
- * {
69
- margin: 0;
70
- padding: 0;
71
- box-sizing: border-box;
72
- }
 
 
 
73
 
74
- body {
75
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
76
- 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
77
- background-color: var(--background);
78
- color: var(--foreground);
79
- line-height: 1.5;
80
- transition: background-color var(--transition-duration), color var(--transition-duration);
81
- }
82
 
83
- h1, h2, h3, h4, h5, h6 {
84
- font-weight: 700;
85
- line-height: 1.2;
86
- }
87
 
88
- h1 { font-size: 2rem; }
89
- h2 { font-size: 1.5rem; }
90
- h3 { font-size: 1.25rem; }
91
 
92
- /* ===========================
93
- SCROLLBAR STYLING
94
- =========================== */
95
 
96
- ::-webkit-scrollbar {
97
- width: 8px;
98
- height: 8px;
99
- }
100
 
101
- ::-webkit-scrollbar-track {
102
- background: var(--secondary);
103
- }
104
-
105
- ::-webkit-scrollbar-thumb {
106
- background: var(--muted-foreground);
107
- border-radius: 4px;
108
- }
109
-
110
- ::-webkit-scrollbar-thumb:hover {
111
- background: var(--foreground);
112
- }
113
-
114
- /* ===========================
115
- UTILITY CLASSES
116
- =========================== */
117
-
118
- .container {
119
- max-width: 1280px;
120
- margin: 0 auto;
121
- padding: 0 1.5rem;
122
- }
123
-
124
- .text-center { text-align: center; }
125
- .text-left { text-align: left; }
126
- .text-right { text-align: right; }
127
-
128
- .font-bold { font-weight: 700; }
129
- .font-semibold { font-weight: 600; }
130
- .font-medium { font-weight: 500; }
131
-
132
- .text-sm { font-size: 0.875rem; }
133
- .text-xs { font-size: 0.75rem; }
134
- .text-lg { font-size: 1.125rem; }
135
- .text-xl { font-size: 1.25rem; }
136
- .text-2xl { font-size: 1.5rem; }
137
- .text-3xl { font-size: 1.875rem; }
138
-
139
- .text-muted { color: var(--muted-foreground); }
140
- .text-primary { color: var(--primary); }
141
- .text-success { color: var(--success); }
142
- .text-warning { color: var(--warning); }
143
- .text-destructive { color: var(--destructive); }
144
-
145
- .bg-card { background-color: var(--card); }
146
- .bg-secondary { background-color: var(--secondary); }
147
- .bg-primary { background-color: var(--primary); }
148
- .bg-success { background-color: var(--success); }
149
- .bg-warning { background-color: var(--warning); }
150
- .bg-destructive { background-color: var(--destructive); }
151
-
152
- .border { border: 1px solid var(--border); }
153
- .border-primary { border-color: var(--primary); }
154
- .border-success { border-color: var(--success); }
155
- .border-warning { border-color: var(--warning); }
156
- .border-destructive { border-color: var(--destructive); }
157
-
158
- .rounded { border-radius: var(--radius); }
159
- .rounded-lg { border-radius: calc(var(--radius) * 1.5); }
160
- .rounded-xl { border-radius: calc(var(--radius) * 2); }
161
- .rounded-full { border-radius: 9999px; }
162
-
163
- .shadow { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1); }
164
- .shadow-lg { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1); }
165
-
166
- .transition-all {
167
- transition: all var(--transition-duration);
168
- }
169
-
170
- /* Flexbox */
171
- .flex { display: flex; }
172
- .flex-col { flex-direction: column; }
173
- .items-center { align-items: center; }
174
- .items-start { align-items: flex-start; }
175
- .items-end { align-items: flex-end; }
176
- .justify-center { justify-content: center; }
177
- .justify-between { justify-content: space-between; }
178
- .justify-end { justify-content: flex-end; }
179
- .gap-1 { gap: 0.25rem; }
180
- .gap-2 { gap: 0.5rem; }
181
- .gap-3 { gap: 0.75rem; }
182
- .gap-4 { gap: 1rem; }
183
- .gap-6 { gap: 1.5rem; }
184
-
185
- /* Grid */
186
- .grid { display: grid; }
187
- .grid-cols-1 { grid-template-columns: repeat(1, 1fr); }
188
- .grid-cols-2 { grid-template-columns: repeat(2, 1fr); }
189
- .grid-cols-3 { grid-template-columns: repeat(3, 1fr); }
190
- .grid-cols-4 { grid-template-columns: repeat(4, 1fr); }
191
- .grid-cols-5 { grid-template-columns: repeat(5, 1fr); }
192
-
193
- /* Spacing */
194
- .p-1 { padding: 0.25rem; }
195
- .p-2 { padding: 0.5rem; }
196
- .p-3 { padding: 0.75rem; }
197
- .p-4 { padding: 1rem; }
198
- .p-6 { padding: 1.5rem; }
199
- .px-3 { padding-left: 0.75rem; padding-right: 0.75rem; }
200
- .px-4 { padding-left: 1rem; padding-right: 1rem; }
201
- .px-6 { padding-left: 1.5rem; padding-right: 1.5rem; }
202
- .py-1 { padding-top: 0.25rem; padding-bottom: 0.25rem; }
203
- .py-2 { padding-top: 0.5rem; padding-bottom: 0.5rem; }
204
- .py-4 { padding-top: 1rem; padding-bottom: 1rem; }
205
-
206
- .m-0 { margin: 0; }
207
- .mb-1 { margin-bottom: 0.25rem; }
208
- .mb-2 { margin-bottom: 0.5rem; }
209
- .mb-3 { margin-bottom: 0.75rem; }
210
- .mb-4 { margin-bottom: 1rem; }
211
- .mb-6 { margin-bottom: 1.5rem; }
212
- .mt-1 { margin-top: 0.25rem; }
213
- .mt-2 { margin-top: 0.5rem; }
214
- .mt-4 { margin-top: 1rem; }
215
- .mx-auto { margin-left: auto; margin-right: auto; }
216
-
217
- /* Width & Height */
218
- .w-full { width: 100%; }
219
- .h-full { height: 100%; }
220
- .min-h-screen { min-height: 100vh; }
221
-
222
- /* Display */
223
- .hidden { display: none; }
224
- .block { display: block; }
225
- .inline-block { display: inline-block; }
226
- .inline-flex { display: inline-flex; }
227
-
228
- /* Position */
229
- .relative { position: relative; }
230
- .absolute { position: absolute; }
231
- .fixed { position: fixed; }
232
-
233
- /* Overflow */
234
- .overflow-hidden { overflow: hidden; }
235
- .overflow-auto { overflow: auto; }
 
1
+ [data-theme="light"] {
2
+ --bg-dark: #020617;
3
+ --bg-card: rgba(15, 23, 42, .65);
 
4
 
5
+ --bg-table: rgba(255, 255, 255, .03);
6
+ --bg-form: rgba(255, 255, 255, .04);
7
+ --bg-table-06: rgba(255, 255, 255, .06);
8
+ --bg-table-015: rgba(255, 255, 255, .15);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
 
10
+ --bg-purple-025:rgba(1, 1, 11, 0.25);
 
 
 
11
 
12
+ --border: rgba(255, 255, 255, .08);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
 
14
+ --text-white: #ffffff;
15
+ --text-gray: #94a3b8;
16
+ --text-light: #cbd5e1;
17
 
18
+ --indigo-06: rgba(99, 102, 241, .6);
19
+ --indigo-15: rgba(99, 102, 241, .15);
20
+ --indigo-08: rgba(10, 11, 65, 0.08);
21
+ --purple: #8b5cf6;
22
+ --purple-light: #b794ff;
23
+ --pink: #ec4899;
24
+ --blue: #3b82f6;
25
+ --pinl-light: #d68eff;
26
 
27
+ --success: rgb(37, 249, 83);
28
+ --warning: #f59e0b;
29
+ --danger: #ef4444;
 
 
 
 
 
30
 
31
+ --shadow-box: rgba(99, 102, 241, .15);
 
 
 
32
 
33
+ --btn-secondary: #334155;
34
+ --btn-secondary-hover: #475569;
 
35
 
36
+ --btn-warning-15: rgba(139, 92, 246, .15);
 
 
37
 
38
+ --btn-reject-18: rgba(239, 68, 68, .18);
39
+ --btn-reject-15: rgba(239, 68, 68, .15);
 
 
40
 
41
+ --btn-approv-18: rgba(34, 197, 94, .18);
42
+ --btn-approv-15: rgba(34, 197, 94, .15);
43
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/main/resources/static/css/user/user-information.css CHANGED
@@ -7,7 +7,7 @@
7
  .container-card,
8
  .dashboard-card {
9
  background: var(--bg-card);
10
- border: 0.65px solid rgba(41, 28, 86, 0.6);
11
  border-radius: 14px;
12
 
13
  backdrop-filter: blur(10px);
@@ -22,15 +22,35 @@
22
 
23
  .card-header {
24
  padding: 16px 20px;
25
-
26
- border-bottom: 1px solid rgba(255,255,255,0.06);
27
- background: rgba(2, 12, 46, 0.6);
 
 
28
  }
29
 
30
  .card-header h2 {
31
  font-size: 16px;
32
  font-weight: 700;
33
  color: var(--text-white);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
34
  }
35
 
36
  /* =========================
@@ -40,24 +60,35 @@
40
  .card-body {
41
  padding: 18px 20px;
42
  }
 
 
 
 
 
 
 
 
43
 
 
 
 
 
 
 
 
44
  /* =========================
45
  INFO GRID
46
  ========================= */
47
 
48
- .info-grid {
49
- display: grid;
50
- grid-template-columns: repeat(2, minmax(0, 1fr));
51
- gap: 14px;
52
- }
53
 
54
  .info-item {
55
  padding: 12px 14px;
56
 
57
  border-radius: 12px;
58
- border: 1px solid rgba(255,255,255,0.06);
59
 
60
- background: rgba(2, 6, 23, 0.35);
61
  }
62
 
63
  .info-item label {
@@ -93,16 +124,16 @@
93
  padding: 10px 12px;
94
 
95
  border-radius: 10px;
96
- border: 1px solid rgba(255,255,255,0.08);
97
 
98
- background: rgba(2, 6, 23, 0.6);
99
  color: var(--text-white);
100
 
101
  outline: none;
102
  }
103
 
104
  .form-group input:focus {
105
- border-color: var(--indigo);
106
  }
107
 
108
  /* =========================
@@ -124,8 +155,8 @@
124
  cursor: pointer;
125
  font-weight: 600;
126
 
127
- color: white;
128
- background: linear-gradient(90deg, var(--indigo), var(--purple));
129
 
130
  transition: 0.2s;
131
  }
@@ -139,7 +170,7 @@
139
  padding: 10px 14px;
140
 
141
  border-radius: 10px;
142
- border: 1px solid rgba(255,255,255,0.12);
143
 
144
  background: transparent;
145
  color: var(--text-white);
@@ -149,9 +180,195 @@
149
  }
150
 
151
  .btn-secondary:hover {
152
- background: rgba(255,255,255,0.05);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
153
  }
154
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
155
  /* =========================
156
  RESPONSIVE
157
  ========================= */
 
7
  .container-card,
8
  .dashboard-card {
9
  background: var(--bg-card);
10
+ border: 0.65px solid var(--indigo-15);
11
  border-radius: 14px;
12
 
13
  backdrop-filter: blur(10px);
 
22
 
23
  .card-header {
24
  padding: 16px 20px;
25
+ display: flex;
26
+ justify-content: space-between;
27
+ align-items: center;
28
+ border-bottom: 1px solid var(--bg-table-06);
29
+ background: var(--indigo-08);
30
  }
31
 
32
  .card-header h2 {
33
  font-size: 16px;
34
  font-weight: 700;
35
  color: var(--text-white);
36
+ padding-right: 730px;
37
+ }
38
+ .edit-header {
39
+ padding: 16px 20px;
40
+ display: flex;
41
+ justify-content: space-between;
42
+ align-items: center;
43
+ border-bottom: 1px solid var(--bg-table-06);
44
+ background: var(--indigo-08);
45
+ margin-bottom: 30px;
46
+ border-radius: 15px;
47
+ }
48
+
49
+ .edit-header h2 {
50
+ font-size: 16px;
51
+ font-weight: 700;
52
+ color: var(--text-white);
53
+ padding-right: 730px;
54
  }
55
 
56
  /* =========================
 
60
  .card-body {
61
  padding: 18px 20px;
62
  }
63
+ #editInformation {
64
+ display: none;
65
+ position: fixed;
66
+ top: 0;
67
+ left: 0;
68
+
69
+ width: 100%;
70
+ height: 100%;
71
 
72
+ background: var(--bg-dark);
73
+
74
+ justify-content: center;
75
+ align-items: center;
76
+
77
+ z-index: 9999;
78
+ }
79
  /* =========================
80
  INFO GRID
81
  ========================= */
82
 
83
+
 
 
 
 
84
 
85
  .info-item {
86
  padding: 12px 14px;
87
 
88
  border-radius: 12px;
89
+ border: 1px solid var(--bg-table-06);
90
 
91
+ background: var(--bg-card);
92
  }
93
 
94
  .info-item label {
 
124
  padding: 10px 12px;
125
 
126
  border-radius: 10px;
127
+ border: 1px solid var(--bg-table-06);
128
 
129
+ background: var(--bg-dark);
130
  color: var(--text-white);
131
 
132
  outline: none;
133
  }
134
 
135
  .form-group input:focus {
136
+ border-color: var(--indigo-06);
137
  }
138
 
139
  /* =========================
 
155
  cursor: pointer;
156
  font-weight: 600;
157
 
158
+ color: var(--text-white);
159
+ background: linear-gradient(90deg, var(--indigo-06), var(--purple));
160
 
161
  transition: 0.2s;
162
  }
 
170
  padding: 10px 14px;
171
 
172
  border-radius: 10px;
173
+ border: 1px solid var(--bg-table-015);
174
 
175
  background: transparent;
176
  color: var(--text-white);
 
180
  }
181
 
182
  .btn-secondary:hover {
183
+ background: var(--bg-table-06);
184
+ }
185
+
186
+
187
+ /* =========================
188
+ POPUP
189
+ ========================= */
190
+
191
+ #editInformation {
192
+ display: none;
193
+ position: fixed;
194
+ inset: 0;
195
+
196
+ background: var(--bg-dark);
197
+ backdrop-filter: blur(6px);
198
+
199
+ justify-content: center;
200
+ align-items: center;
201
+
202
+ z-index: 9999;
203
+ }
204
+
205
+ /* hiện popup */
206
+ #editInformation.show {
207
+ display: flex;
208
+ }
209
+
210
+ /* =========================
211
+ CARD
212
+ ========================= */
213
+
214
+ .edit-card {
215
+ width: 1550px;
216
+ max-width: 100%;
217
+
218
+ background: var(--bg-card);
219
+ border: 1px solid var(--border);
220
+ border-radius: 18px;
221
+
222
+ overflow: hidden;
223
+
224
+ box-shadow: 0 20px 60px var(--bg-dark);
225
+ animation: popup .25s ease;
226
+
227
+ backdrop-filter: blur(10px);
228
+
229
+ margin-bottom: 20px;
230
+ }
231
+
232
+ @keyframes popup{
233
+ from{
234
+ opacity:0;
235
+ transform:translateY(-20px) scale(.95);
236
+ }
237
+ to{
238
+ opacity:1;
239
+ transform:translateY(0) scale(1);
240
+ }
241
+ }
242
+
243
+ /* =========================
244
+ HEADER
245
+ ========================= */
246
+
247
+ .card-header{
248
+ padding:18px 24px;
249
+
250
+ background: var(--bg-card);
251
+ border-bottom:1px solid var(--border);
252
+ }
253
+
254
+ .card-header h2{
255
+ margin:0;
256
+ font-size:18px;
257
+ color:var(--text-white);
258
+ }
259
+
260
+ /* =========================
261
+ BODY
262
+ ========================= */
263
+
264
+ .edit-body{
265
+
266
+ padding: 18px 20px;
267
+
268
+ background-color: var(--bg-card);
269
+ border-radius: 30px;
270
+ border-color:1px var(--border) ;
271
  }
272
 
273
+ .info-grid{
274
+
275
+
276
+ display:grid;
277
+ grid-template-columns:repeat(2,1fr);
278
+ gap:18px;
279
+ }
280
+
281
+ /* =========================
282
+ INPUT
283
+ ========================= */
284
+
285
+ .info-item{
286
+ display:flex;
287
+ flex-direction:column;
288
+ }
289
+
290
+ .info-item label{
291
+ margin-bottom:8px;
292
+
293
+ font-size:13px;
294
+ font-weight:600;
295
+
296
+ color:var(--text-gray);
297
+ }
298
+
299
+ .info-item input{
300
+ width:100%;
301
+ padding:12px 14px;
302
+
303
+ border-radius:12px;
304
+ border:1px solid var(--border);
305
+
306
+ background:var(--bg-card);
307
+
308
+ color:var(--text-white);
309
+ font-size:14px;
310
+
311
+ outline:none;
312
+ transition:.25s;
313
+ }
314
+
315
+ .info-item input::placeholder{
316
+ color:var(--text-gray);
317
+ }
318
+
319
+ .info-item input:focus{
320
+ border-color:var(--indigo-06);
321
+ box-shadow:0 0 0 3px var(--indigo-15);
322
+ }
323
+
324
+ /* =========================
325
+ BUTTONS
326
+ ========================= */
327
+
328
+ .btn-run{
329
+ grid-column:1 / -1;
330
+
331
+ display:flex;
332
+ justify-content:flex-end;
333
+ gap:12px;
334
+
335
+ margin-top:10px;
336
+ }
337
+
338
+ .btn{
339
+ min-width:120px;
340
+ padding:12px 18px;
341
+
342
+ border:none;
343
+ border-radius:10px;
344
+
345
+ font-size:14px;
346
+ font-weight:600;
347
+
348
+ cursor:pointer;
349
+ transition:.25s;
350
+ }
351
+
352
+ .btn-primary{
353
+ color:var(--text-white);
354
+ background:linear-gradient(135deg,var(--indigo-06),var(--purple));
355
+ }
356
+
357
+ .btn-primary:hover{
358
+ transform:translateY(-2px);
359
+ box-shadow:0 10px 20px var(--indigo-15);
360
+ }
361
+
362
+ .btn-close{
363
+ color:var(--text-white);
364
+
365
+ background:transparent;
366
+ border:1px solid var(--bg-table-015);
367
+ }
368
+
369
+ .btn-close:hover{
370
+ background:var(--bg-table-06);
371
+ }
372
  /* =========================
373
  RESPONSIVE
374
  ========================= */
src/main/resources/static/js/employee/copy-code.js ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ const copyBtn = document.getElementById("copyBtn");
2
+
3
+ copyBtn.addEventListener("click", () => {
4
+ navigator.clipboard.writeText(
5
+ document.getElementById("roomCode").textContent
6
+ );
7
+ });
src/main/resources/static/js/employee/employee-popup.js ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const popup = document.getElementById("card-addEmployee");
2
+
3
+ function openPopup() {
4
+ popup.classList.add("show");
5
+ }
6
+
7
+ function closePopup() {
8
+ popup.classList.remove("show");
9
+ }
10
+
11
+ // Mở popup
12
+ document.getElementById("add-employee")
13
+ .addEventListener("click", openPopup);
14
+
15
+ // Đóng bằng nút X
16
+ document.getElementById("closePopup")
17
+ .addEventListener("click", closePopup);
18
+
19
+ // Đóng khi click nền tối
20
+ popup.addEventListener("click", (e) => {
21
+ if (e.target === popup) {
22
+ closePopup();
23
+ }
24
+ });
src/main/resources/static/js/employee/room-code.js ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const roomSelect = document.getElementById("roomSelect");
2
+ const roomCode = document.getElementById("roomCode");
3
+
4
+ const roomCodes = {
5
+ DE211: "DE211-X7A9",
6
+ DE212: "DE212-LP81",
7
+ DE213: "DE213-KM32"
8
+ };
9
+
10
+ roomSelect.addEventListener("change", () => {
11
+ roomCode.textContent =
12
+ roomCodes[roomSelect.value] || "--------";
13
+ });
src/main/resources/static/js/main.js CHANGED
@@ -8,14 +8,18 @@
8
  // ===========================
9
 
10
  function initTheme() {
11
- const savedTheme = localStorage.getItem('theme') || 'light';
12
- document.documentElement.setAttribute('data-theme', savedTheme);
13
- updateThemeIcon(savedTheme);
 
 
 
 
14
  }
15
 
16
  function toggleTheme() {
17
  const currentTheme = document.documentElement.getAttribute('data-theme');
18
- const newTheme = currentTheme === 'light' ? 'dark' : 'light';
19
  document.documentElement.setAttribute('data-theme', newTheme);
20
  localStorage.setItem('theme', newTheme);
21
  updateThemeIcon(newTheme);
 
8
  // ===========================
9
 
10
  function initTheme() {
11
+ const savedTheme = localStorage.getItem("theme");
12
+
13
+ if (savedTheme) {
14
+ document.documentElement.setAttribute("data-theme", savedTheme);
15
+ }
16
+
17
+ updateThemeIcon(savedTheme || "dark");
18
  }
19
 
20
  function toggleTheme() {
21
  const currentTheme = document.documentElement.getAttribute('data-theme');
22
+ const newTheme = currentTheme === 'light' ? 'dark' : 'dark';
23
  document.documentElement.setAttribute('data-theme', newTheme);
24
  localStorage.setItem('theme', newTheme);
25
  updateThemeIcon(newTheme);
src/main/resources/static/js/sidebar.js ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ document.addEventListener("DOMContentLoaded", () => {
3
+ const links = document.querySelectorAll(".sidebar-link");
4
+
5
+ links.forEach(link => {
6
+ link.addEventListener("click", function (e) {
7
+ e.preventDefault();
8
+
9
+ links.forEach(item => item.classList.remove("active"));
10
+ this.classList.add("active");
11
+ });
12
+ });
13
+ });
src/main/resources/templates/cms/account/employee-list.html ADDED
@@ -0,0 +1,271 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+
3
+ <html xmlns:th="http://www.thymeleaf.org">
4
+
5
+ <head>
6
+ <meta charset="UTF-8">
7
+ <title>Quản lý nhân viên</title>
8
+
9
+ <link rel="stylesheet" th:href="@{/css/account/employee-list.css}">
10
+ </head>
11
+
12
+ <body>
13
+
14
+ <div class="bg-image"></div>
15
+
16
+ <div class="layout">
17
+
18
+ <div th:replace="~{cms/sidebar/sidebar-manage :: sidebar}"></div>
19
+
20
+ <div class="container-layout">
21
+
22
+ <!-- HEADER -->
23
+ <div class="container-header">
24
+ <h1>Quản lý nhân viên</h1>
25
+ <p>Quản lý nhân viên theo phòng ban</p>
26
+ </div>
27
+
28
+ <main class="main-container">
29
+
30
+ <section class="dashboard-card">
31
+
32
+ <!-- Header -->
33
+ <div class="card-header">
34
+
35
+ <h2>Danh sách nhân viên</h2>
36
+
37
+ <button id="add-employee" class="add-btn">
38
+ + Thêm nhân viên
39
+ </button>
40
+
41
+ </div>
42
+
43
+ <!-- Search + Filter -->
44
+ <div class="toolbar">
45
+
46
+ <div class="search-box">
47
+ <input type="text" placeholder="Tìm theo tên, email hoặc mã nhân viên...">
48
+ </div>
49
+
50
+ <div class="filter-box">
51
+
52
+ <select>
53
+ <option>Tất cả phòng ban</option>
54
+ <option>Phòng IT</option>
55
+ <option>Phòng Nhân sự</option>
56
+ <option>Phòng Kế toán</option>
57
+ <option>Phòng Marketing</option>
58
+ </select>
59
+
60
+ <select>
61
+ <option>Tất cả trạng thái</option>
62
+ <option>Đang làm việc</option>
63
+ <option>Nghỉ việc</option>
64
+ <option>Tạm khóa</option>
65
+ </select>
66
+
67
+ </div>
68
+
69
+ </div>
70
+
71
+ <!-- TABLE -->
72
+ <table>
73
+
74
+ <thead>
75
+
76
+ <tr>
77
+
78
+ <th>Nhân viên</th>
79
+
80
+ <th>Mã NV</th>
81
+
82
+ <th>Email</th>
83
+
84
+ <th>Phòng ban</th>
85
+
86
+ <th>Vai trò</th>
87
+
88
+ <th>Trạng thái</th>
89
+
90
+ <th>Hành động</th>
91
+
92
+ </tr>
93
+
94
+ </thead>
95
+
96
+ <tbody>
97
+
98
+ <tr>
99
+
100
+ <td>
101
+
102
+ <div class="user">
103
+
104
+ <div class="avatar">H</div>
105
+
106
+ <strong>Nguyễn Minh Hải</strong>
107
+
108
+ </div>
109
+
110
+ </td>
111
+
112
+ <td>EMP001</td>
113
+
114
+ <td>hai@gmail.com</td>
115
+
116
+ <td>IT</td>
117
+
118
+ <td>Nhân viên</td>
119
+
120
+ <td>
121
+
122
+ <span class="status active">
123
+ Đang làm việc
124
+ </span>
125
+
126
+ </td>
127
+
128
+ <td>
129
+
130
+ <div class="actions">
131
+
132
+ <button class="icon-btn">
133
+ Chi tiết
134
+ </button>
135
+
136
+ <button class="icon-btn btn-role">
137
+ Chuyển phòng
138
+ </button>
139
+
140
+ <button class="icon-btn lock">
141
+ Khóa
142
+ </button>
143
+
144
+ </div>
145
+
146
+ </td>
147
+
148
+ </tr>
149
+
150
+ <tr>
151
+
152
+ <td>
153
+
154
+ <div class="user">
155
+
156
+ <div class="avatar">A</div>
157
+
158
+ <strong>Nguyễn Văn An</strong>
159
+
160
+ </div>
161
+
162
+ </td>
163
+
164
+ <td>EMP002</td>
165
+
166
+ <td>an@gmail.com</td>
167
+
168
+ <td>Nhân sự</td>
169
+
170
+ <td>Trưởng phòng</td>
171
+
172
+ <td>
173
+
174
+ <span class="status inactive">
175
+ Nghỉ việc
176
+ </span>
177
+
178
+ </td>
179
+
180
+ <td>
181
+
182
+ <div class="actions">
183
+
184
+ <button class="icon-btn">
185
+ Chi tiết
186
+ </button>
187
+
188
+ <button class="icon-btn btn-role">
189
+ Chuyển phòng
190
+ </button>
191
+
192
+ <button class="icon-btn lock">
193
+ Mở khóa
194
+ </button>
195
+
196
+ </div>
197
+
198
+ </td>
199
+
200
+ </tr>
201
+
202
+ </tbody>
203
+
204
+ </table>
205
+
206
+ </section>
207
+
208
+ </main>
209
+
210
+ <div th:replace="~{cms/layout/footer :: footer}"></div>
211
+
212
+ </div>
213
+
214
+ </div>
215
+ <section id="card-addEmployee" class="card-add">
216
+ <div class="card-container">
217
+
218
+ <div class="card-headers">
219
+ <div class="header-icon">
220
+ <i class="bi bi-person-add"></i>
221
+ </div>
222
+
223
+ <h2>Mời thành viên vào phòng</h2>
224
+ </div>
225
+
226
+ <div class="card-body">
227
+
228
+ <!-- Chọn phòng -->
229
+ <div class="filter-box">
230
+ <label>Chọn phòng</label>
231
+
232
+ <select id="roomSelect">
233
+ <option value="">-- Chọn phòng ban --</option>
234
+ <option value="DE211">Phòng DE211</option>
235
+ <option value="DE212">Phòng DE212</option>
236
+ <option value="DE213">Phòng DE213</option>
237
+ </select>
238
+ </div>
239
+
240
+ <!-- Hiển thị sau khi chọn -->
241
+ <div class="container-QR" id="joinInfo">
242
+
243
+ <div class="room-code-box">
244
+ <span>Mã tham gia</span>
245
+
246
+ <h1 id="roomCode">DE211-X7A9</h1>
247
+
248
+ <button id="copyBtn">
249
+ Sao chép mã
250
+ </button>
251
+ </div>
252
+
253
+ <p class="note">
254
+ Sinh viên nhập mã trên hoặc quét QR để tham gia phòng.
255
+ </p>
256
+
257
+ </div>
258
+ <button id="closePopup" class="close-btn">
259
+ <i class="fas fa-times">Đóng</i>
260
+
261
+ </button>
262
+ </div>
263
+
264
+ </div>
265
+ </section>
266
+ <script src="/js/employee/employee-popup.js"></script>
267
+ <script src="/js/employee/room-code.js"></script>
268
+ <script src="/js/employee/copy-code.js"></script>
269
+ </body>
270
+
271
+ </html>
src/main/resources/templates/cms/dashboard/dashboard-employee.html CHANGED
@@ -103,7 +103,7 @@
103
 
104
  <div class="quick-actions-grid">
105
 
106
- <a href="#" class="quick-action-card">
107
  <div class="quick-action-card__icon">
108
  <i class="bi bi-person-lines-fill"></i>
109
  </div>
@@ -115,7 +115,7 @@
115
  </div>
116
  </a>
117
 
118
- <a href="#" class="quick-action-card">
119
  <div class="quick-action-card__icon">
120
  <i class="bi bi-file-earmark-arrow-up-fill"></i>
121
  </div>
@@ -125,7 +125,7 @@
125
  </div>
126
  </a>
127
 
128
- <a href="#" class="quick-action-card">
129
  <div class="quick-action-card__icon">
130
  <i class="bi bi-calendar-check-fill"></i>
131
  </div>
@@ -135,7 +135,7 @@
135
  </div>
136
  </a>
137
 
138
- <a href="#" class="quick-action-card">
139
  <div class="quick-action-card__icon">
140
  <i class="bi bi-calendar2-x-fill"></i>
141
  </div>
@@ -241,17 +241,17 @@
241
 
242
  <div class="profile-item">
243
  <label>Email</label>
244
- <span th:text="${#authentication.principal.email}"></span>
245
  </div>
246
 
247
  <div class="profile-item">
248
  <label>Số điện thoại</label>
249
- <span th:text="${#authentication.principal.phone}"></span>
250
  </div>
251
 
252
  <div class="profile-item">
253
  <label>Phòng ban</label>
254
- <span th:text="${#authentication.principal.department}">IT Department</span>
255
  </div>
256
 
257
  <div class="profile-item">
 
103
 
104
  <div class="quick-actions-grid">
105
 
106
+ <a href="/useInformation" class="quick-action-card">
107
  <div class="quick-action-card__icon">
108
  <i class="bi bi-person-lines-fill"></i>
109
  </div>
 
115
  </div>
116
  </a>
117
 
118
+ <a href="/documentCreate" class="quick-action-card">
119
  <div class="quick-action-card__icon">
120
  <i class="bi bi-file-earmark-arrow-up-fill"></i>
121
  </div>
 
125
  </div>
126
  </a>
127
 
128
+ <a href="/attendanceHistory" class="quick-action-card">
129
  <div class="quick-action-card__icon">
130
  <i class="bi bi-calendar-check-fill"></i>
131
  </div>
 
135
  </div>
136
  </a>
137
 
138
+ <a href="/absentCreate" class="quick-action-card">
139
  <div class="quick-action-card__icon">
140
  <i class="bi bi-calendar2-x-fill"></i>
141
  </div>
 
241
 
242
  <div class="profile-item">
243
  <label>Email</label>
244
+ <span >haivuive266@gmail.com</span>
245
  </div>
246
 
247
  <div class="profile-item">
248
  <label>Số điện thoại</label>
249
+ <span >0987654321</span>
250
  </div>
251
 
252
  <div class="profile-item">
253
  <label>Phòng ban</label>
254
+ <span >IT Department</span>
255
  </div>
256
 
257
  <div class="profile-item">
src/main/resources/templates/cms/document/document-list.html CHANGED
@@ -45,22 +45,21 @@
45
 
46
  <tr>
47
 
48
- <td ">
49
- Nguyễn Văn A
50
- </td>
51
-
52
- <td >
53
- Báo cáo tuần 01
54
- </td>
55
-
56
- <td >
57
- 15/02/2025
58
- </td>
59
-
60
- <td>
61
- <a
62
- class=" file-link">
63
- 📎 Tải file
64
  </a>
65
 
66
  <span>
@@ -80,17 +79,11 @@
80
 
81
  <td>
82
 
83
- <span th:if="${report.status == 'PENDING'}" class="status-pending">
84
  Chờ duyệt
85
  </span>
86
 
87
- <span th:if="${report.status == 'APPROVED'}" class="status-approved">
88
- Đã duyệt
89
- </span>
90
-
91
- <span th:if="${report.status == 'REJECTED'}" class="status-rejected">
92
- Từ chối
93
- </span>
94
 
95
  </td>
96
 
@@ -102,7 +95,7 @@
102
 
103
  <td>
104
 
105
- <div class="action-group" th:if="${report.status == 'PENDING'}">
106
 
107
  <form method="post">
108
 
 
45
 
46
  <tr>
47
 
48
+ <td>
49
+ Nguyễn Văn A
50
+ </td>
51
+
52
+ <td>
53
+ Báo cáo tuần 01
54
+ </td>
55
+
56
+ <td>
57
+ 15/02/2025
58
+ </td>
59
+
60
+ <td>
61
+ <a class=" file-link">
62
+ 📎 Tải file
 
63
  </a>
64
 
65
  <span>
 
79
 
80
  <td>
81
 
82
+ <span class="status-pending">
83
  Chờ duyệt
84
  </span>
85
 
86
+
 
 
 
 
 
 
87
 
88
  </td>
89
 
 
95
 
96
  <td>
97
 
98
+ <div class="action-group" >
99
 
100
  <form method="post">
101
 
src/main/resources/templates/cms/face-id/faceID-list.html CHANGED
@@ -57,6 +57,7 @@
57
  10 / 10
58
  </span>
59
  </td>
 
60
  <td><button class="detail-btn" onclick="openFaceGallery()">
61
 
62
  Xem ảnh
@@ -65,8 +66,8 @@
65
  </td>
66
 
67
  <td>
68
-
69
- Chấp nhận -từ chốt
70
  </td>
71
  </tr>
72
 
@@ -89,7 +90,8 @@
89
 
90
  </button>
91
  </td>
92
- <td>Đồng ý</td>
 
93
  </tr>
94
 
95
  </tbody>
 
57
  10 / 10
58
  </span>
59
  </td>
60
+ <td>DE214</td>
61
  <td><button class="detail-btn" onclick="openFaceGallery()">
62
 
63
  Xem ảnh
 
66
  </td>
67
 
68
  <td>
69
+ <button class="detail-btn btn-primary" type="submit">Chấp nhận</button>
70
+ <button class="detail-btn btn-secondery" type="submit">Từ chối</button>
71
  </td>
72
  </tr>
73
 
 
90
 
91
  </button>
92
  </td>
93
+ <td><button class="detail-btn btn-primary" type="submit">Chấp nhận</button>
94
+ <button class="detail-btn btn-secondery" type="submit">Từ chối</button></td>
95
  </tr>
96
 
97
  </tbody>
src/main/resources/templates/cms/layout/footer.html CHANGED
@@ -45,6 +45,7 @@
45
  © 2026 Smart Attendance. All rights reserved.
46
  </div>
47
  </footer>
 
48
  </body>
49
 
50
  </html>
 
45
  © 2026 Smart Attendance. All rights reserved.
46
  </div>
47
  </footer>
48
+
49
  </body>
50
 
51
  </html>
src/main/resources/templates/cms/sidebar/sidebar-admin.html CHANGED
@@ -60,8 +60,8 @@
60
  </div>
61
  </div> -->
62
  <div>
63
- <h3 >Nguyen van an</h3>
64
- <div class="header-description" >
65
  admin
66
  </div>
67
  </div>
@@ -74,4 +74,14 @@
74
  </form>
75
 
76
  </div>
 
 
 
 
 
 
 
 
 
 
77
  </div>
 
60
  </div>
61
  </div> -->
62
  <div>
63
+ <h3>Nguyen van an</h3>
64
+ <div class="header-description">
65
  admin
66
  </div>
67
  </div>
 
74
  </form>
75
 
76
  </div>
77
+ <script>
78
+ const links = document.querySelectorAll(".sidebar-link");
79
+ const currentPath = window.location.pathname;
80
+
81
+ links.forEach(link => {
82
+ if (link.getAttribute("href") === currentPath) {
83
+ link.classList.add("active");
84
+ }
85
+ });
86
+ </script>
87
  </div>
src/main/resources/templates/cms/sidebar/sidebar-employee.html CHANGED
@@ -94,4 +94,14 @@
94
  </form>
95
 
96
  </div>
 
 
 
 
 
 
 
 
 
 
97
  </div>
 
94
  </form>
95
 
96
  </div>
97
+ <script>
98
+ const links = document.querySelectorAll(".sidebar-link");
99
+ const currentPath = window.location.pathname;
100
+
101
+ links.forEach(link => {
102
+ if (link.getAttribute("href") === currentPath) {
103
+ link.classList.add("active");
104
+ }
105
+ });
106
+ </script>
107
  </div>
src/main/resources/templates/cms/sidebar/sidebar-manage.html CHANGED
@@ -1,18 +1,20 @@
1
  <div class="sidebar" th:fragment="sidebar">
2
 
3
  <div class="sidebar-header">
4
- <div class="logo">
5
- <a href="/" >
6
- 📷
7
- </a>
8
 
 
 
 
 
9
  </div>
10
-
11
 
12
  <div>
13
  <h2>Smart Attendance</h2>
14
  <div class="header-description">Quản lý</div>
15
  </div>
 
 
16
  </div>
17
 
18
  <div class="sidebar-line"></div>
@@ -32,7 +34,12 @@
32
  Quản lý điểm danh
33
  </a>
34
  </li>
35
-
 
 
 
 
 
36
  <li class="sidebar-option">
37
  <a href="/faceIDList" class="sidebar-link">
38
  <span>👤</span>
@@ -46,6 +53,12 @@
46
  Duyệt nghỉ phép
47
  </a>
48
  </li>
 
 
 
 
 
 
49
  <li class="sidebar-option">
50
  <a href="/userInformation" class="sidebar-link">
51
  <span>🪪</span>
@@ -73,9 +86,9 @@
73
  Vai trò
74
  </div>
75
  </div> -->
76
- <div>
77
- <h3 >Nguyen van an</h3>
78
- <div class="header-description" >
79
  Manager
80
  </div>
81
  </div>
@@ -88,5 +101,14 @@
88
  </form>
89
 
90
  </div>
 
 
 
91
 
 
 
 
 
 
 
92
  </div>
 
1
  <div class="sidebar" th:fragment="sidebar">
2
 
3
  <div class="sidebar-header">
 
 
 
 
4
 
5
+ <div class="logo">
6
+ <a href="/">
7
+ 📷
8
+ </a>
9
  </div>
10
+
11
 
12
  <div>
13
  <h2>Smart Attendance</h2>
14
  <div class="header-description">Quản lý</div>
15
  </div>
16
+
17
+
18
  </div>
19
 
20
  <div class="sidebar-line"></div>
 
34
  Quản lý điểm danh
35
  </a>
36
  </li>
37
+ <li class="sidebar-option">
38
+ <a href="/employeeList" class="sidebar-link">
39
+ <span>👥</span>
40
+ Quản lý nhân viên
41
+ </a>
42
+ </li>
43
  <li class="sidebar-option">
44
  <a href="/faceIDList" class="sidebar-link">
45
  <span>👤</span>
 
53
  Duyệt nghỉ phép
54
  </a>
55
  </li>
56
+ <li class="sidebar-option">
57
+ <a href="/documentList" class="sidebar-link">
58
+ <span>📝</span>
59
+ Danh sách báo cáo
60
+ </a>
61
+ </li>
62
  <li class="sidebar-option">
63
  <a href="/userInformation" class="sidebar-link">
64
  <span>🪪</span>
 
86
  Vai trò
87
  </div>
88
  </div> -->
89
+ <div>
90
+ <h3>Nguyen van an</h3>
91
+ <div class="header-description">
92
  Manager
93
  </div>
94
  </div>
 
101
  </form>
102
 
103
  </div>
104
+ <script>
105
+ const links = document.querySelectorAll(".sidebar-link");
106
+ const currentPath = window.location.pathname;
107
 
108
+ links.forEach(link => {
109
+ if (link.getAttribute("href") === currentPath) {
110
+ link.classList.add("active");
111
+ }
112
+ });
113
+ </script>
114
  </div>
src/main/resources/templates/cms/user/user-information.html CHANGED
@@ -34,10 +34,11 @@
34
 
35
  <div class="card-header">
36
  <h2>Thông tin cá nhân</h2>
 
 
37
  </div>
38
 
39
  <div class="card-body">
40
-
41
  <div class="info-grid">
42
 
43
  <div class="info-item">
@@ -112,13 +113,69 @@
112
  </section>
113
 
114
  </main>
 
115
  <div th:replace="~{cms/layout/footer :: footer}"></div>
116
 
117
  </div>
118
  </div>
119
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
120
  <!-- FOOTER -->
121
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
122
  </body>
123
 
124
  </html>
 
34
 
35
  <div class="card-header">
36
  <h2>Thông tin cá nhân</h2>
37
+ <button class="btn btn-primary" id="changeInformation">Sửa</button>
38
+
39
  </div>
40
 
41
  <div class="card-body">
 
42
  <div class="info-grid">
43
 
44
  <div class="info-item">
 
113
  </section>
114
 
115
  </main>
116
+
117
  <div th:replace="~{cms/layout/footer :: footer}"></div>
118
 
119
  </div>
120
  </div>
121
 
122
+ <section class="edit-card" id="editInformation">
123
+
124
+
125
+ <div class="edit-body">
126
+ <div class="edit-header">
127
+ <h2>Thông tin cá nhân</h2>
128
+ </div>
129
+ <div class="info-grid">
130
+ <div class="info-item">
131
+ <label >Họ và tên</label>
132
+ <input type="text">
133
+ </div>
134
+ <div class="info-item">
135
+ <label >Tên đăng nhập</label>
136
+ <input type="text">
137
+ </div>
138
+ <div class="info-item">
139
+ <label >Email</label>
140
+ <input type="text">
141
+ </div>
142
+ <div class="info-item">
143
+ <label >Số điện thoại</label>
144
+ <input type="text">
145
+ </div>
146
+ <div class="info-item">
147
+ <label >Bộ phận</label>
148
+ <input type="text">
149
+ </div>
150
+ <div class="btn-run">
151
+ <button id="btnEdit" class="btn btn-primary">
152
+ Sửa
153
+ </button>
154
+
155
+ <button id="btnClose" class="btn btn-close">
156
+ Đóng
157
+ </button>
158
+ </div>
159
+ </div>
160
+ </div>
161
+
162
+ </section>
163
  <!-- FOOTER -->
164
+ <script>
165
+ const btn = document.getElementById("editInformation");
166
+ document.getElementById("changeInformation").onclick = function () {
167
+ btn.style.display = "flex";
168
+ };
169
+ document.getElementById("btnClose").onclick = function () {
170
+ btn.style.display = "none";
171
+ }
172
+
173
+ btn.addEventListener("click", function (e) {
174
+ if (e.target === btn) {
175
+ btn.style.display = "none";
176
+ }
177
+ });
178
+ </script>
179
  </body>
180
 
181
  </html>