create-steve-rogers 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/apps/SFMS/.env +9 -0
  2. package/apps/SFMS/README.md +0 -0
  3. package/apps/SFMS/backend/.env +9 -0
  4. package/apps/SFMS/backend/.env.example +9 -0
  5. package/apps/SFMS/backend/package-lock.json +1580 -0
  6. package/apps/SFMS/backend/package.json +23 -0
  7. package/apps/SFMS/backend/src/config/database.js +7 -0
  8. package/apps/SFMS/backend/src/config/env.js +35 -0
  9. package/apps/SFMS/backend/src/middleware/authMiddleware.js +32 -0
  10. package/apps/SFMS/backend/src/models/Payment.js +12 -0
  11. package/apps/SFMS/backend/src/models/Student.js +12 -0
  12. package/apps/SFMS/backend/src/models/User.js +13 -0
  13. package/apps/SFMS/backend/src/routes/authRoutes.js +93 -0
  14. package/apps/SFMS/backend/src/routes/paymentRoutes.js +117 -0
  15. package/apps/SFMS/backend/src/routes/reportRoutes.js +59 -0
  16. package/apps/SFMS/backend/src/routes/studentRoutes.js +79 -0
  17. package/apps/SFMS/backend/src/server.js +34 -0
  18. package/apps/SFMS/frontend/.env.example +8 -0
  19. package/apps/SFMS/frontend/dist/assets/index-B08X8imN.css +1 -0
  20. package/apps/SFMS/frontend/dist/assets/index-DVO0_wcb.js +67 -0
  21. package/apps/SFMS/frontend/dist/favicon.svg +4 -0
  22. package/apps/SFMS/frontend/dist/index.html +20 -0
  23. package/apps/SFMS/frontend/index.html +19 -0
  24. package/apps/SFMS/frontend/package-lock.json +2667 -0
  25. package/apps/SFMS/frontend/package.json +23 -0
  26. package/apps/SFMS/frontend/postcss.config.js +6 -0
  27. package/apps/SFMS/frontend/public/favicon.svg +4 -0
  28. package/apps/SFMS/frontend/src/App.jsx +41 -0
  29. package/apps/SFMS/frontend/src/api/apiClient.js +41 -0
  30. package/apps/SFMS/frontend/src/components/AppLayout.jsx +60 -0
  31. package/apps/SFMS/frontend/src/context/AuthContext.jsx +79 -0
  32. package/apps/SFMS/frontend/src/index.css +229 -0
  33. package/apps/SFMS/frontend/src/main.jsx +16 -0
  34. package/apps/SFMS/frontend/src/pages/DashboardPage.jsx +82 -0
  35. package/apps/SFMS/frontend/src/pages/LoginPage.jsx +142 -0
  36. package/apps/SFMS/frontend/src/pages/PaymentsPage.jsx +269 -0
  37. package/apps/SFMS/frontend/src/pages/ReportsPage.jsx +114 -0
  38. package/apps/SFMS/frontend/src/pages/StudentsPage.jsx +257 -0
  39. package/apps/SFMS/frontend/tailwind.config.js +21 -0
  40. package/apps/SFMS/frontend/vite.config.js +35 -0
  41. package/apps/SIMS/.env +4 -0
  42. package/apps/SIMS/README.md +138 -0
  43. package/apps/SIMS/backend/.env +4 -0
  44. package/apps/SIMS/backend/.env.example +4 -0
  45. package/apps/SIMS/backend/package-lock.json +1600 -0
  46. package/apps/SIMS/backend/package.json +22 -0
  47. package/apps/SIMS/backend/src/config/db.js +9 -0
  48. package/apps/SIMS/backend/src/controllers/authController.js +93 -0
  49. package/apps/SIMS/backend/src/controllers/simsReportController.js +94 -0
  50. package/apps/SIMS/backend/src/controllers/sparePartController.js +41 -0
  51. package/apps/SIMS/backend/src/controllers/stockInController.js +45 -0
  52. package/apps/SIMS/backend/src/controllers/stockOutController.js +123 -0
  53. package/apps/SIMS/backend/src/middleware/auth.js +8 -0
  54. package/apps/SIMS/backend/src/models/SparePart.js +17 -0
  55. package/apps/SIMS/backend/src/models/StockIn.js +16 -0
  56. package/apps/SIMS/backend/src/models/StockOut.js +18 -0
  57. package/apps/SIMS/backend/src/models/User.js +11 -0
  58. package/apps/SIMS/backend/src/routes/authRoutes.js +12 -0
  59. package/apps/SIMS/backend/src/routes/simsReportRoutes.js +8 -0
  60. package/apps/SIMS/backend/src/routes/sparePartRoutes.js +8 -0
  61. package/apps/SIMS/backend/src/routes/stockInRoutes.js +8 -0
  62. package/apps/SIMS/backend/src/routes/stockOutRoutes.js +10 -0
  63. package/apps/SIMS/backend/src/server.js +62 -0
  64. package/apps/SIMS/backend/src/utils/passwordPolicy.js +10 -0
  65. package/apps/SIMS/backend/src/utils/sparePartHelpers.js +5 -0
  66. package/apps/SIMS/frontend/dist/assets/index-3hv-vGL2.css +2 -0
  67. package/apps/SIMS/frontend/dist/assets/index-T8XT7M6y.js +19 -0
  68. package/apps/SIMS/frontend/dist/index.html +14 -0
  69. package/apps/SIMS/frontend/index.html +13 -0
  70. package/apps/SIMS/frontend/package-lock.json +3053 -0
  71. package/apps/SIMS/frontend/package.json +31 -0
  72. package/apps/SIMS/frontend/src/App.jsx +112 -0
  73. package/apps/SIMS/frontend/src/api/authApi.js +7 -0
  74. package/apps/SIMS/frontend/src/api/client.js +8 -0
  75. package/apps/SIMS/frontend/src/api/simsReportApi.js +5 -0
  76. package/apps/SIMS/frontend/src/api/sparePartsApi.js +4 -0
  77. package/apps/SIMS/frontend/src/api/stockInApi.js +4 -0
  78. package/apps/SIMS/frontend/src/api/stockOutApi.js +6 -0
  79. package/apps/SIMS/frontend/src/api/usersApi.js +3 -0
  80. package/apps/SIMS/frontend/src/components/AppLayout.jsx +60 -0
  81. package/apps/SIMS/frontend/src/index.css +737 -0
  82. package/apps/SIMS/frontend/src/main.jsx +13 -0
  83. package/apps/SIMS/frontend/src/pages/DashboardPage.jsx +179 -0
  84. package/apps/SIMS/frontend/src/pages/LoginPage.jsx +75 -0
  85. package/apps/SIMS/frontend/src/pages/RegisterPage.jsx +78 -0
  86. package/apps/SIMS/frontend/src/pages/ReportsPage.jsx +108 -0
  87. package/apps/SIMS/frontend/src/pages/ResetPasswordPage.jsx +75 -0
  88. package/apps/SIMS/frontend/src/pages/SparePartPage.jsx +128 -0
  89. package/apps/SIMS/frontend/src/pages/StockInPage.jsx +100 -0
  90. package/apps/SIMS/frontend/src/pages/StockOutPage.jsx +206 -0
  91. package/apps/SIMS/frontend/src/utils/passwordPolicy.js +8 -0
  92. package/apps/SIMS/frontend/vite.config.js +8 -0
  93. package/apps/config.js +13 -0
  94. package/package.json +1 -1
@@ -0,0 +1,737 @@
1
+ @import "tailwindcss";
2
+
3
+ :root {
4
+ font-family:
5
+ "Segoe UI", Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont,
6
+ sans-serif;
7
+ color: #1b1d1b;
8
+ background: #f4f0e8;
9
+ font-synthesis: none;
10
+ text-rendering: optimizeLegibility;
11
+ }
12
+
13
+ * {
14
+ box-sizing: border-box;
15
+ }
16
+
17
+ html {
18
+ min-width: 320px;
19
+ background: #f4f0e8;
20
+ }
21
+
22
+ body {
23
+ margin: 0;
24
+ min-height: 100vh;
25
+ background:
26
+ linear-gradient(135deg, rgba(31, 125, 116, 0.08) 0 25%, transparent 25% 50%, rgba(217, 89, 63, 0.08) 50% 75%, transparent 75%),
27
+ #f4f0e8;
28
+ background-size: 44px 44px;
29
+ }
30
+
31
+ button,
32
+ input,
33
+ select {
34
+ font: inherit;
35
+ }
36
+
37
+ button,
38
+ a {
39
+ transition:
40
+ transform 140ms ease,
41
+ background-color 140ms ease,
42
+ border-color 140ms ease,
43
+ color 140ms ease,
44
+ box-shadow 140ms ease;
45
+ }
46
+
47
+ button {
48
+ cursor: pointer;
49
+ }
50
+
51
+ button:focus-visible,
52
+ a:focus-visible,
53
+ input:focus-visible,
54
+ select:focus-visible {
55
+ outline: 3px solid #efb84a;
56
+ outline-offset: 2px;
57
+ }
58
+
59
+ /* Application shell */
60
+ .app-shell {
61
+ display: grid;
62
+ grid-template-columns: 18rem minmax(0, 1fr);
63
+ min-height: 100vh;
64
+ }
65
+
66
+ .app-sidebar {
67
+ position: sticky;
68
+ top: 0;
69
+ display: flex;
70
+ flex-direction: column;
71
+ height: 100vh;
72
+ padding: 1.25rem;
73
+ color: #fffaf0;
74
+ background:
75
+ linear-gradient(180deg, rgba(31, 125, 116, 0.2), transparent 28rem),
76
+ #1b1d1b;
77
+ border-right: 1px solid rgba(255, 250, 240, 0.14);
78
+ }
79
+
80
+ .app-brand {
81
+ display: grid;
82
+ grid-template-columns: 3.25rem minmax(0, 1fr);
83
+ gap: 0.9rem;
84
+ align-items: center;
85
+ color: inherit;
86
+ text-decoration: none;
87
+ }
88
+
89
+ .app-brand-mark {
90
+ display: grid;
91
+ width: 3.25rem;
92
+ height: 3.25rem;
93
+ place-items: center;
94
+ border-radius: 18px 4px 18px 4px;
95
+ color: #1b1d1b;
96
+ background: #efb84a;
97
+ font-weight: 900;
98
+ letter-spacing: 0;
99
+ }
100
+
101
+ .app-brand-name,
102
+ .app-brand-caption {
103
+ display: block;
104
+ }
105
+
106
+ .app-brand-name {
107
+ font-size: 1.35rem;
108
+ font-weight: 900;
109
+ letter-spacing: 0;
110
+ }
111
+
112
+ .app-brand-caption {
113
+ margin-top: 0.1rem;
114
+ color: rgba(255, 250, 240, 0.64);
115
+ font-size: 0.78rem;
116
+ }
117
+
118
+ .app-nav {
119
+ display: grid;
120
+ gap: 0.65rem;
121
+ margin-top: 2.5rem;
122
+ }
123
+
124
+ .app-nav-link {
125
+ display: grid;
126
+ grid-template-columns: 2.15rem minmax(0, 1fr);
127
+ align-items: center;
128
+ min-height: 3.3rem;
129
+ padding: 0.4rem 0.75rem;
130
+ border: 1px solid rgba(255, 250, 240, 0.13);
131
+ border-radius: 0 18px 18px 0;
132
+ color: rgba(255, 250, 240, 0.72);
133
+ text-decoration: none;
134
+ background: rgba(255, 250, 240, 0.04);
135
+ }
136
+
137
+ .app-nav-link:hover {
138
+ color: #fffaf0;
139
+ background: rgba(255, 250, 240, 0.1);
140
+ transform: translateX(3px);
141
+ }
142
+
143
+ .app-nav-link-active {
144
+ color: #1b1d1b;
145
+ background: #fffaf0;
146
+ border-color: #fffaf0;
147
+ box-shadow: -8px 0 0 #1f7d74;
148
+ }
149
+
150
+ .app-nav-icon {
151
+ color: #efb84a;
152
+ font-size: 0.75rem;
153
+ font-weight: 900;
154
+ }
155
+
156
+ .app-nav-link-active .app-nav-icon {
157
+ color: #d9593f;
158
+ }
159
+
160
+ .app-sidebar-footer {
161
+ display: grid;
162
+ gap: 0.9rem;
163
+ margin-top: auto;
164
+ }
165
+
166
+ .app-user {
167
+ padding: 0.9rem;
168
+ border: 1px solid rgba(255, 250, 240, 0.14);
169
+ border-radius: 18px;
170
+ background: rgba(255, 250, 240, 0.06);
171
+ }
172
+
173
+ .app-user-label,
174
+ .app-user strong {
175
+ display: block;
176
+ }
177
+
178
+ .app-user-label {
179
+ color: rgba(255, 250, 240, 0.56);
180
+ font-size: 0.72rem;
181
+ text-transform: uppercase;
182
+ }
183
+
184
+ .app-user strong {
185
+ margin-top: 0.2rem;
186
+ overflow: hidden;
187
+ text-overflow: ellipsis;
188
+ }
189
+
190
+ .app-logout {
191
+ min-height: 2.9rem;
192
+ border: 0;
193
+ border-radius: 999px;
194
+ color: #fffaf0;
195
+ background: #d9593f;
196
+ font-weight: 800;
197
+ }
198
+
199
+ .app-logout:hover {
200
+ background: #b94732;
201
+ transform: translateY(-1px);
202
+ }
203
+
204
+ .app-main {
205
+ min-width: 0;
206
+ padding: 1.5rem;
207
+ }
208
+
209
+ .app-main > div {
210
+ width: min(100%, 1180px);
211
+ }
212
+
213
+ /* Workspace pages */
214
+ .grid,
215
+ .space-y-4,
216
+ .space-y-6 {
217
+ gap: 1.1rem !important;
218
+ }
219
+
220
+ section {
221
+ position: relative;
222
+ overflow: hidden;
223
+ border: 1px solid rgba(27, 29, 27, 0.13) !important;
224
+ border-radius: 24px 6px 24px 6px !important;
225
+ background: rgba(255, 250, 240, 0.94) !important;
226
+ box-shadow: none !important;
227
+ }
228
+
229
+ section::before {
230
+ content: "";
231
+ position: absolute;
232
+ inset: 0 auto 0 0;
233
+ width: 0.45rem;
234
+ background: linear-gradient(#1f7d74, #efb84a, #d9593f);
235
+ }
236
+
237
+ section h2 {
238
+ margin-bottom: 1rem !important;
239
+ padding-left: 0.55rem;
240
+ color: #1b1d1b !important;
241
+ font-size: 1rem !important;
242
+ font-weight: 900 !important;
243
+ letter-spacing: 0;
244
+ text-transform: uppercase;
245
+ }
246
+
247
+ p,
248
+ label,
249
+ .text-slate-500,
250
+ .text-slate-600 {
251
+ color: #68625a !important;
252
+ }
253
+
254
+ form {
255
+ position: relative;
256
+ }
257
+
258
+ input,
259
+ select {
260
+ width: 100%;
261
+ min-height: 2.9rem;
262
+ border: 1px solid rgba(27, 29, 27, 0.16) !important;
263
+ border-radius: 999px !important;
264
+ color: #1b1d1b;
265
+ background: #ffffff !important;
266
+ box-shadow: inset 0 0 0 1px transparent;
267
+ }
268
+
269
+ input::placeholder {
270
+ color: #8c867e;
271
+ }
272
+
273
+ input:focus,
274
+ select:focus {
275
+ border-color: #1f7d74 !important;
276
+ box-shadow: 0 0 0 4px rgba(31, 125, 116, 0.14);
277
+ }
278
+
279
+ button[class*="bg-"],
280
+ .app-main button {
281
+ min-height: 2.75rem;
282
+ border: 0 !important;
283
+ border-radius: 999px !important;
284
+ color: #fffaf0 !important;
285
+ background: #1b1d1b !important;
286
+ box-shadow: none !important;
287
+ font-weight: 850;
288
+ }
289
+
290
+ button[class*="bg-"]:hover,
291
+ .app-main button:hover {
292
+ background: #1f7d74 !important;
293
+ transform: translateY(-1px);
294
+ }
295
+
296
+ button[class*="bg-red"],
297
+ .app-main button[class*="bg-red"] {
298
+ background: #d9593f !important;
299
+ }
300
+
301
+ button[class*="bg-amber"],
302
+ button[class*="bg-slate"] {
303
+ color: #1b1d1b !important;
304
+ background: #efb84a !important;
305
+ }
306
+
307
+ .overflow-x-auto,
308
+ .overflow-auto {
309
+ overflow: auto;
310
+ border: 1px solid rgba(27, 29, 27, 0.1);
311
+ border-radius: 18px 4px 18px 4px;
312
+ background: #ffffff;
313
+ }
314
+
315
+ table {
316
+ width: 100%;
317
+ border-collapse: separate;
318
+ border-spacing: 0;
319
+ }
320
+
321
+ thead,
322
+ thead.bg-slate-100,
323
+ tr.bg-slate-100 {
324
+ color: #fffaf0 !important;
325
+ background: #1b1d1b !important;
326
+ }
327
+
328
+ th {
329
+ padding: 0.85rem !important;
330
+ color: inherit;
331
+ font-size: 0.72rem;
332
+ font-weight: 900;
333
+ letter-spacing: 0;
334
+ text-transform: uppercase;
335
+ }
336
+
337
+ td {
338
+ padding: 0.85rem !important;
339
+ border-bottom: 1px solid rgba(27, 29, 27, 0.08);
340
+ }
341
+
342
+ tbody tr:nth-child(odd) {
343
+ background: #ffffff;
344
+ }
345
+
346
+ tbody tr:nth-child(even) {
347
+ background: #f7f4ee;
348
+ }
349
+
350
+ tbody tr:hover {
351
+ background: #eef7f4;
352
+ }
353
+
354
+ .border-b {
355
+ border-bottom-color: rgba(27, 29, 27, 0.08) !important;
356
+ }
357
+
358
+ .rounded.bg-amber-100,
359
+ .rounded.bg-red-100,
360
+ .bg-red-50,
361
+ .bg-green-50 {
362
+ border-radius: 999px !important;
363
+ background: #fff4d8 !important;
364
+ color: #1b1d1b !important;
365
+ }
366
+
367
+ .rounded.bg-red-100,
368
+ .bg-red-50 {
369
+ background: #fde9e3 !important;
370
+ color: #9e3728 !important;
371
+ }
372
+
373
+ .text-red-700,
374
+ .text-red-800 {
375
+ color: #9e3728 !important;
376
+ }
377
+
378
+ .text-green-800 {
379
+ color: #1f7d74 !important;
380
+ }
381
+
382
+ /* Dashboard */
383
+ .dashboard-page {
384
+ display: grid;
385
+ gap: 1.1rem;
386
+ }
387
+
388
+ .dashboard-hero {
389
+ display: flex;
390
+ min-height: 11rem;
391
+ align-items: flex-end;
392
+ justify-content: space-between;
393
+ gap: 1rem;
394
+ padding: clamp(1.25rem, 3vw, 2rem);
395
+ border-radius: 34px 8px 34px 8px;
396
+ color: #fffaf0;
397
+ background:
398
+ linear-gradient(135deg, rgba(27, 29, 27, 0.15), rgba(27, 29, 27, 0.85)),
399
+ repeating-linear-gradient(90deg, rgba(255, 250, 240, 0.12) 0 1px, transparent 1px 18px),
400
+ #1f7d74;
401
+ }
402
+
403
+ .dashboard-kicker {
404
+ margin: 0 0 0.45rem;
405
+ color: #efb84a !important;
406
+ font-size: 0.78rem;
407
+ font-weight: 900;
408
+ text-transform: uppercase;
409
+ }
410
+
411
+ .dashboard-hero h1 {
412
+ margin: 0;
413
+ max-width: 9ch;
414
+ color: #fffaf0;
415
+ font-size: clamp(2.5rem, 6vw, 5.2rem);
416
+ font-weight: 950;
417
+ line-height: 0.9;
418
+ letter-spacing: 0;
419
+ }
420
+
421
+ .dashboard-hero-total {
422
+ display: grid;
423
+ gap: 0.15rem;
424
+ min-width: 14rem;
425
+ padding: 1rem;
426
+ border: 1px solid rgba(255, 250, 240, 0.2);
427
+ border-radius: 20px 6px 20px 6px;
428
+ background: rgba(27, 29, 27, 0.38);
429
+ }
430
+
431
+ .dashboard-hero-total span,
432
+ .dashboard-stats span {
433
+ color: rgba(255, 250, 240, 0.68);
434
+ font-size: 0.74rem;
435
+ font-weight: 850;
436
+ text-transform: uppercase;
437
+ }
438
+
439
+ .dashboard-hero-total strong {
440
+ font-size: 1.65rem;
441
+ line-height: 1.1;
442
+ }
443
+
444
+ .dashboard-message {
445
+ margin: 0;
446
+ padding: 0.85rem 1rem;
447
+ border-radius: 999px;
448
+ color: #9e3728 !important;
449
+ background: #fde9e3;
450
+ }
451
+
452
+ .dashboard-stats {
453
+ display: grid;
454
+ grid-template-columns: repeat(4, minmax(0, 1fr));
455
+ gap: 0.85rem;
456
+ }
457
+
458
+ .dashboard-stats article {
459
+ display: grid;
460
+ gap: 0.4rem;
461
+ min-height: 8rem;
462
+ align-content: end;
463
+ padding: 1rem;
464
+ border-radius: 24px 6px 24px 6px;
465
+ color: #fffaf0;
466
+ background: #1b1d1b;
467
+ }
468
+
469
+ .dashboard-stats article:nth-child(2) {
470
+ background: #1f7d74;
471
+ }
472
+
473
+ .dashboard-stats article:nth-child(3) {
474
+ color: #1b1d1b;
475
+ background: #efb84a;
476
+ }
477
+
478
+ .dashboard-stats article:nth-child(3) span {
479
+ color: rgba(27, 29, 27, 0.62);
480
+ }
481
+
482
+ .dashboard-stats article:nth-child(4) {
483
+ background: #d9593f;
484
+ }
485
+
486
+ .dashboard-stats strong {
487
+ font-size: clamp(1.9rem, 4vw, 3.5rem);
488
+ line-height: 0.95;
489
+ }
490
+
491
+ .dashboard-grid {
492
+ display: grid;
493
+ grid-template-columns: minmax(0, 1.45fr) minmax(17rem, 0.75fr);
494
+ gap: 1.1rem;
495
+ }
496
+
497
+ .dashboard-panel {
498
+ padding: 1.1rem !important;
499
+ }
500
+
501
+ .dashboard-panel-wide {
502
+ min-width: 0;
503
+ }
504
+
505
+ .dashboard-bars {
506
+ display: grid;
507
+ gap: 0.85rem;
508
+ }
509
+
510
+ .dashboard-bar-row {
511
+ display: grid;
512
+ grid-template-columns: minmax(8rem, 0.8fr) minmax(9rem, 1fr) auto;
513
+ gap: 0.85rem;
514
+ align-items: center;
515
+ padding: 0.75rem;
516
+ border-radius: 18px;
517
+ background: #ffffff;
518
+ }
519
+
520
+ .dashboard-bar-row strong,
521
+ .dashboard-list-item strong {
522
+ display: block;
523
+ color: #1b1d1b;
524
+ }
525
+
526
+ .dashboard-bar-row span,
527
+ .dashboard-list-item small {
528
+ display: block;
529
+ color: #68625a;
530
+ font-size: 0.78rem;
531
+ }
532
+
533
+ .dashboard-bar-track {
534
+ overflow: hidden;
535
+ height: 0.75rem;
536
+ border-radius: 999px;
537
+ background: #ece5d8;
538
+ }
539
+
540
+ .dashboard-bar-track span {
541
+ display: block;
542
+ height: 100%;
543
+ border-radius: inherit;
544
+ background: linear-gradient(90deg, #1f7d74, #efb84a);
545
+ }
546
+
547
+ .dashboard-bar-row em,
548
+ .dashboard-list-item em {
549
+ color: #1b1d1b;
550
+ font-style: normal;
551
+ font-weight: 900;
552
+ }
553
+
554
+ .dashboard-list {
555
+ display: grid;
556
+ gap: 0.7rem;
557
+ }
558
+
559
+ .dashboard-list-item {
560
+ display: flex;
561
+ align-items: center;
562
+ justify-content: space-between;
563
+ gap: 1rem;
564
+ padding: 0.85rem;
565
+ border-radius: 18px 4px 18px 4px;
566
+ background: #ffffff;
567
+ }
568
+
569
+ a.text-emerald-800,
570
+ a.text-amber-800,
571
+ a.text-blue-700 {
572
+ color: #1f7d74 !important;
573
+ font-weight: 800;
574
+ text-decoration: none !important;
575
+ }
576
+
577
+ a.text-emerald-800:hover,
578
+ a.text-amber-800:hover,
579
+ a.text-blue-700:hover {
580
+ color: #d9593f !important;
581
+ }
582
+
583
+ /* Auth pages */
584
+ .auth-screen {
585
+ display: grid;
586
+ grid-template-columns: minmax(18rem, 0.9fr) minmax(20rem, 28rem);
587
+ align-items: stretch;
588
+ min-height: 100vh;
589
+ padding: 1.25rem;
590
+ gap: 1.25rem;
591
+ }
592
+
593
+ .auth-intro {
594
+ display: flex;
595
+ flex-direction: column;
596
+ justify-content: flex-end;
597
+ min-height: 32rem;
598
+ padding: clamp(2rem, 6vw, 5rem);
599
+ border-radius: 36px 8px 8px 36px;
600
+ color: #fffaf0;
601
+ background:
602
+ linear-gradient(rgba(27, 29, 27, 0.46), rgba(27, 29, 27, 0.82)),
603
+ repeating-linear-gradient(135deg, rgba(255, 250, 240, 0.12) 0 1px, transparent 1px 18px),
604
+ #1f7d74;
605
+ }
606
+
607
+ .auth-intro p {
608
+ color: #efb84a !important;
609
+ font-size: 0.86rem;
610
+ font-weight: 900;
611
+ text-transform: uppercase;
612
+ }
613
+
614
+ .auth-intro h2 {
615
+ max-width: 12ch;
616
+ margin: 0;
617
+ color: #fffaf0 !important;
618
+ font-size: clamp(2.4rem, 7vw, 5.8rem);
619
+ font-weight: 950;
620
+ line-height: 0.92;
621
+ letter-spacing: 0;
622
+ }
623
+
624
+ .auth-panel {
625
+ align-self: center;
626
+ width: 100%;
627
+ padding: 2rem;
628
+ border: 1px solid rgba(27, 29, 27, 0.14);
629
+ border-radius: 8px 36px 36px 8px;
630
+ background: rgba(255, 250, 240, 0.96);
631
+ }
632
+
633
+ .auth-panel h1 {
634
+ color: #1b1d1b !important;
635
+ font-size: 2rem !important;
636
+ font-weight: 950 !important;
637
+ letter-spacing: 0;
638
+ }
639
+
640
+ .auth-panel form {
641
+ margin-top: 1rem;
642
+ }
643
+
644
+ .auth-panel button {
645
+ background: #d9593f !important;
646
+ }
647
+
648
+ .auth-panel .mt-4,
649
+ .auth-panel .mt-3 {
650
+ display: flex !important;
651
+ flex-wrap: wrap;
652
+ gap: 0.8rem;
653
+ }
654
+
655
+ @media (max-width: 860px) {
656
+ .app-shell {
657
+ display: block;
658
+ }
659
+
660
+ .app-sidebar {
661
+ position: static;
662
+ height: auto;
663
+ padding: 1rem;
664
+ }
665
+
666
+ .app-nav {
667
+ grid-template-columns: repeat(2, minmax(0, 1fr));
668
+ margin-top: 1rem;
669
+ }
670
+
671
+ .app-nav-link {
672
+ border-radius: 16px;
673
+ }
674
+
675
+ .app-sidebar-footer {
676
+ grid-template-columns: 1fr auto;
677
+ align-items: center;
678
+ margin-top: 1rem;
679
+ }
680
+
681
+ .app-main {
682
+ padding: 1rem;
683
+ }
684
+
685
+ .dashboard-hero,
686
+ .dashboard-grid {
687
+ grid-template-columns: 1fr;
688
+ }
689
+
690
+ .dashboard-hero {
691
+ display: grid;
692
+ }
693
+
694
+ .dashboard-stats {
695
+ grid-template-columns: repeat(2, minmax(0, 1fr));
696
+ }
697
+
698
+ .auth-screen {
699
+ grid-template-columns: 1fr;
700
+ }
701
+
702
+ .auth-intro {
703
+ min-height: 18rem;
704
+ border-radius: 28px 28px 8px 8px;
705
+ }
706
+
707
+ .auth-panel {
708
+ border-radius: 8px 8px 28px 28px;
709
+ }
710
+ }
711
+
712
+ @media (max-width: 520px) {
713
+ .app-nav {
714
+ grid-template-columns: 1fr;
715
+ }
716
+
717
+ .app-sidebar-footer {
718
+ grid-template-columns: 1fr;
719
+ }
720
+
721
+ .auth-screen {
722
+ padding: 0.75rem;
723
+ }
724
+
725
+ .auth-panel {
726
+ padding: 1.25rem;
727
+ }
728
+
729
+ .dashboard-stats,
730
+ .dashboard-bar-row {
731
+ grid-template-columns: 1fr;
732
+ }
733
+
734
+ .dashboard-hero-total {
735
+ min-width: 0;
736
+ }
737
+ }
@@ -0,0 +1,13 @@
1
+ import { StrictMode } from "react";
2
+ import { createRoot } from "react-dom/client";
3
+ import { BrowserRouter } from "react-router-dom";
4
+ import "./index.css";
5
+ import App from "./App.jsx";
6
+
7
+ createRoot(document.getElementById("root")).render(
8
+ <StrictMode>
9
+ <BrowserRouter>
10
+ <App />
11
+ </BrowserRouter>
12
+ </StrictMode>
13
+ );