inventrack 3.0.0

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 (55) hide show
  1. package/README.md +25 -0
  2. package/api/index.js +13 -0
  3. package/backend/README.md +35 -0
  4. package/backend/data/db.json +1239 -0
  5. package/backend/package-lock.json +532 -0
  6. package/backend/package.json +8 -0
  7. package/frontend/README.md +22 -0
  8. package/frontend/assets/Icon.png +0 -0
  9. package/frontend/assets/IconSort.png +0 -0
  10. package/frontend/assets/activity-1.png +0 -0
  11. package/frontend/assets/activity-2.png +0 -0
  12. package/frontend/assets/activity-3.png +0 -0
  13. package/frontend/assets/activity-4.png +0 -0
  14. package/frontend/assets/card-icon-1.png +0 -0
  15. package/frontend/assets/card-icon-2.png +0 -0
  16. package/frontend/assets/card-icon-3.png +0 -0
  17. package/frontend/assets/card-icon-4.png +0 -0
  18. package/frontend/assets/login.png +0 -0
  19. package/frontend/assets/logo.png +0 -0
  20. package/frontend/categories.html +143 -0
  21. package/frontend/css/all.min.css +9 -0
  22. package/frontend/css/bootstrap.min.css +6 -0
  23. package/frontend/css/categories.css +359 -0
  24. package/frontend/css/dashboard.css +373 -0
  25. package/frontend/css/inventoryInsights.css +308 -0
  26. package/frontend/css/inventoryOverview.css +353 -0
  27. package/frontend/css/orders.css +632 -0
  28. package/frontend/css/products.css +364 -0
  29. package/frontend/css/signin.css +120 -0
  30. package/frontend/css/style.css +282 -0
  31. package/frontend/css/suppliers.css +136 -0
  32. package/frontend/dashboard.html +160 -0
  33. package/frontend/index.html +124 -0
  34. package/frontend/inventoryInsights.html +182 -0
  35. package/frontend/inventoryOverview.html +187 -0
  36. package/frontend/js/api.js +55 -0
  37. package/frontend/js/auth.js +70 -0
  38. package/frontend/js/bootstrap.bundle.min.js +7 -0
  39. package/frontend/js/categories.js +356 -0
  40. package/frontend/js/dashboard.js +341 -0
  41. package/frontend/js/inventoryInsights.js +396 -0
  42. package/frontend/js/inventoryOverview.js +503 -0
  43. package/frontend/js/orders.js +662 -0
  44. package/frontend/js/products.js +650 -0
  45. package/frontend/js/suppliers.js +535 -0
  46. package/frontend/js/utils.js +234 -0
  47. package/frontend/orders.html +216 -0
  48. package/frontend/products.html +152 -0
  49. package/frontend/suppliers.html +175 -0
  50. package/frontend/webfonts/fa-brands-400.woff2 +0 -0
  51. package/frontend/webfonts/fa-regular-400.woff2 +0 -0
  52. package/frontend/webfonts/fa-solid-900.woff2 +0 -0
  53. package/frontend/webfonts/fa-v4compatibility.woff2 +0 -0
  54. package/package.json +38 -0
  55. package/vercel.json +18 -0
@@ -0,0 +1,308 @@
1
+ .reports-page {
2
+ min-height: 100vh;
3
+ display: flex;
4
+ flex-direction: column;
5
+ background: #f7f4fa;
6
+ }
7
+
8
+ .reports-content {
9
+ flex: 1;
10
+ padding: 32px 0 48px;
11
+ }
12
+
13
+ .reports-header {
14
+ margin-bottom: 28px;
15
+ }
16
+
17
+ .reports-title {
18
+ margin: 0 0 6px;
19
+ font-size: 2rem;
20
+ font-weight: 800;
21
+ color: #172033;
22
+ }
23
+
24
+ .reports-subtitle {
25
+ margin: 0;
26
+ font-size: 1rem;
27
+ color: #708099;
28
+ }
29
+
30
+ /* Insight cards */
31
+ .insights-row {
32
+ margin-bottom: 28px;
33
+ }
34
+
35
+ .insight-card {
36
+ height: 100%;
37
+ background: #ffffff;
38
+ border: 1px solid #ece6f5;
39
+ border-radius: 16px;
40
+ padding: 18px 18px 16px;
41
+ box-shadow: 0 1px 0 rgba(15, 23, 42, 0.02);
42
+ }
43
+
44
+ .insight-top {
45
+ display: flex;
46
+ align-items: flex-start;
47
+ justify-content: space-between;
48
+ gap: 12px;
49
+ margin-bottom: 22px;
50
+ }
51
+
52
+ .insight-label {
53
+ margin: 0;
54
+ font-size: 0.96rem;
55
+ color: #708099;
56
+ line-height: 1.45;
57
+ }
58
+
59
+ .insight-icon {
60
+ width: 36px;
61
+ height: 36px;
62
+ border-radius: 10px;
63
+ display: inline-flex;
64
+ align-items: center;
65
+ justify-content: center;
66
+ font-size: 0.95rem;
67
+ flex-shrink: 0;
68
+ }
69
+
70
+ .insight-icon.warning {
71
+ background: #fff1df;
72
+ color: #ff7a1a;
73
+ }
74
+
75
+ .insight-icon.danger {
76
+ background: #ffe5e5;
77
+ color: #ff4d4f;
78
+ }
79
+
80
+ .insight-icon.success {
81
+ background: #dff8ea;
82
+ color: #16a34a;
83
+ }
84
+
85
+ .insight-icon.purple {
86
+ background: #efe3ff;
87
+ color: #7c3aed;
88
+ }
89
+
90
+ .insight-value {
91
+ margin: 0 0 10px;
92
+ font-size: 2rem;
93
+ font-weight: 800;
94
+ color: #172033;
95
+ line-height: 1.1;
96
+ }
97
+
98
+ .insight-trend {
99
+ margin: 0;
100
+ font-size: 0.88rem;
101
+ font-weight: 600;
102
+ display: inline-flex;
103
+ align-items: center;
104
+ gap: 6px;
105
+ }
106
+
107
+ .insight-trend.negative {
108
+ color: #ff6a1a;
109
+ }
110
+
111
+ .insight-trend.positive {
112
+ color: #0f9f67;
113
+ }
114
+
115
+ .purple-text {
116
+ color: #7c3aed;
117
+ }
118
+
119
+ /* Report cards */
120
+ .report-card {
121
+ background: #ffffff;
122
+ border: 1px solid #ece6f5;
123
+ border-radius: 18px;
124
+ overflow: hidden;
125
+ margin-bottom: 28px;
126
+ }
127
+
128
+ .report-card-header {
129
+ padding: 24px 20px;
130
+ border-bottom: 1px solid #efe9f7;
131
+ background: #fff;
132
+ }
133
+
134
+ .report-card-title {
135
+ font-size: 1.7rem;
136
+ font-weight: 800;
137
+ color: #172033;
138
+ }
139
+
140
+ .report-link {
141
+ color: #7c3aed;
142
+ font-weight: 700;
143
+ text-decoration: none;
144
+ }
145
+
146
+ .report-link:hover {
147
+ text-decoration: underline;
148
+ }
149
+
150
+ .sort-select {
151
+ width: auto;
152
+ min-width: 180px;
153
+ border-radius: 10px;
154
+ border: 1px solid #ebe6f3;
155
+ color: #475569;
156
+ font-size: 0.9rem;
157
+ box-shadow: none;
158
+ background-color: #f8f7fb;
159
+ }
160
+
161
+ /* Table */
162
+ .report-table thead th {
163
+ background: #f3eff8;
164
+ color: #6d7b95;
165
+ font-size: 0.74rem;
166
+ font-weight: 800;
167
+ padding: 16px 20px;
168
+ border-bottom: 1px solid #ece6f5;
169
+ white-space: nowrap;
170
+ }
171
+
172
+ .report-table tbody td {
173
+ padding: 16px 20px;
174
+ border-bottom: 1px solid #f1edf6;
175
+ font-size: 0.95rem;
176
+ color: #2f3a4d;
177
+ vertical-align: middle;
178
+ }
179
+
180
+ .report-table tbody tr:last-child td {
181
+ border-bottom: none;
182
+ }
183
+
184
+ .qty-danger {
185
+ color: #ef4444;
186
+ font-weight: 700;
187
+ }
188
+
189
+ .qty-warning {
190
+ color: #f97316;
191
+ font-weight: 700;
192
+ }
193
+
194
+ .table-badge {
195
+ display: inline-block;
196
+ padding: 6px 12px;
197
+ border-radius: 999px;
198
+ font-size: 0.72rem;
199
+ font-weight: 800;
200
+ line-height: 1;
201
+ }
202
+
203
+ .table-badge.critical {
204
+ background: #ffe4e4;
205
+ color: #ef4444;
206
+ }
207
+
208
+ .table-badge.warning {
209
+ background: #ffedd5;
210
+ color: #f97316;
211
+ }
212
+
213
+ /* Mobile report cards */
214
+ .report-mobile-list {
215
+ padding: 16px;
216
+ }
217
+
218
+ .report-mobile-item {
219
+ border: 1px solid #eee8f5;
220
+ border-radius: 14px;
221
+ padding: 14px;
222
+ margin-bottom: 14px;
223
+ background: #fff;
224
+ }
225
+
226
+ .report-mobile-item:last-child {
227
+ margin-bottom: 0;
228
+ }
229
+
230
+ .report-mobile-item h6 {
231
+ margin-bottom: 10px;
232
+ font-size: 1rem;
233
+ font-weight: 800;
234
+ color: #172033;
235
+ }
236
+
237
+ .report-mobile-item p {
238
+ margin-bottom: 8px;
239
+ color: #475569;
240
+ font-size: 0.92rem;
241
+ }
242
+
243
+ /* Responsive */
244
+ @media (max-width: 1199.98px) {
245
+ .insight-value {
246
+ font-size: 1.7rem;
247
+ }
248
+
249
+ .report-card-title {
250
+ font-size: 1.45rem;
251
+ }
252
+ }
253
+
254
+ @media (max-width: 767.98px) {
255
+ .reports-content {
256
+ padding: 24px 0 36px;
257
+ }
258
+
259
+ .reports-title {
260
+ font-size: 1.55rem;
261
+ }
262
+
263
+ .reports-subtitle {
264
+ font-size: 0.95rem;
265
+ }
266
+
267
+ .insight-card {
268
+ padding: 16px;
269
+ }
270
+
271
+ .insight-top {
272
+ margin-bottom: 16px;
273
+ }
274
+
275
+ .insight-value {
276
+ font-size: 1.45rem;
277
+ }
278
+
279
+ .report-card-header {
280
+ padding: 18px 16px;
281
+ }
282
+
283
+ .report-card-title {
284
+ font-size: 1.25rem;
285
+ }
286
+
287
+ .sort-select {
288
+ width: 100%;
289
+ }
290
+ }
291
+
292
+ @media (max-width: 575.98px) {
293
+ .reports-title {
294
+ font-size: 1.35rem;
295
+ }
296
+
297
+ .insight-label {
298
+ font-size: 0.9rem;
299
+ }
300
+
301
+ .insight-value {
302
+ font-size: 1.3rem;
303
+ }
304
+
305
+ .insight-trend {
306
+ font-size: 0.8rem;
307
+ }
308
+ }
@@ -0,0 +1,353 @@
1
+ /* ========================
2
+ Inventory Overview Styles
3
+ Matches dashboard.css conventions
4
+ ======================== */
5
+
6
+ .page-title {
7
+ margin: 20px 0 10px;
8
+ }
9
+
10
+ /* Breadcrumb */
11
+ .breadcrumb-trail {
12
+ display: flex;
13
+ align-items: center;
14
+ gap: 6px;
15
+ font-size: 13px;
16
+ }
17
+
18
+ .breadcrumb-link {
19
+ color: var(--text-muted);
20
+ cursor: pointer;
21
+ }
22
+
23
+ .breadcrumb-link:hover {
24
+ color: var(--primary);
25
+ }
26
+
27
+ .breadcrumb-sep {
28
+ color: var(--text-muted);
29
+ font-size: 10px;
30
+ }
31
+
32
+ .breadcrumb-current {
33
+ color: var(--text-secondary);
34
+ }
35
+
36
+ /* Buttons */
37
+ .export-btn {
38
+ padding: var(--space-2) var(--space-6);
39
+ border: 1.5px solid var(--border-light);
40
+ background: var(--bg-card);
41
+ color: var(--text-primary);
42
+ border-radius: var(--radius-md);
43
+ font-weight: 600;
44
+ cursor: pointer;
45
+ transition: var(--transition-fast);
46
+ }
47
+
48
+ .export-btn:hover {
49
+ background: var(--bg-hover);
50
+ }
51
+
52
+ .add-product-btn {
53
+ padding: var(--space-2) var(--space-6);
54
+ border: none;
55
+ background-color: var(--primary);
56
+ color: var(--text-white);
57
+ border-radius: var(--radius-md);
58
+ font-weight: 600;
59
+ cursor: pointer;
60
+ transition: var(--transition-fast);
61
+ }
62
+
63
+ .add-product-btn:hover {
64
+ background-color: var(--primary-hover);
65
+ }
66
+
67
+ .import-csv-btn {
68
+ padding: var(--space-2) var(--space-6);
69
+ border: 1.5px solid var(--border-light);
70
+ background: var(--bg-card);
71
+ color: var(--text-primary);
72
+ border-radius: var(--radius-md);
73
+ font-weight: 600;
74
+ cursor: pointer;
75
+ transition: var(--transition-fast);
76
+ }
77
+
78
+ .import-csv-btn:hover {
79
+ background: var(--bg-hover);
80
+ }
81
+
82
+ /* Tab Navigation */
83
+ .inventory-tabs {
84
+ display: flex;
85
+ gap: 4px;
86
+ border-bottom: 2px solid var(--border-light);
87
+ margin-bottom: 24px;
88
+ }
89
+
90
+ .inv-tab {
91
+ border: none;
92
+ background: transparent;
93
+ padding: 10px 18px;
94
+ font-size: 14px;
95
+ font-weight: 500;
96
+ color: var(--text-muted);
97
+ cursor: pointer;
98
+ position: relative;
99
+ transition: var(--transition-fast);
100
+ margin-bottom: -2px;
101
+ }
102
+
103
+ .inv-tab:hover {
104
+ color: var(--text-primary);
105
+ }
106
+
107
+ .inv-tab.active {
108
+ color: var(--primary);
109
+ font-weight: 700;
110
+ }
111
+
112
+ .inv-tab.active::after {
113
+ content: "";
114
+ position: absolute;
115
+ bottom: 0;
116
+ left: 0;
117
+ right: 0;
118
+ height: 2px;
119
+ background: var(--primary);
120
+ border-radius: 2px 2px 0 0;
121
+ }
122
+
123
+ /* Inventory Card */
124
+ .inventory-card {
125
+ width: 100%;
126
+ box-shadow: var(--shadow-sm);
127
+ border: 1.5px dashed var(--border-light);
128
+ border-radius: var(--radius-lg);
129
+ overflow: hidden;
130
+ background-color: var(--bg-card);
131
+ padding: var(--space-6);
132
+ }
133
+
134
+ /* Empty State */
135
+ .empty-state {
136
+ text-align: center;
137
+ padding: 40px 20px 32px;
138
+ border-bottom: 1px solid var(--border-soft);
139
+ margin-bottom: 32px;
140
+ }
141
+
142
+ .empty-icon-wrap {
143
+ width: 72px;
144
+ height: 72px;
145
+ border-radius: 50%;
146
+ background-color: var(--icon-purple-bg);
147
+ display: flex;
148
+ align-items: center;
149
+ justify-content: center;
150
+ margin: 0 auto;
151
+ }
152
+
153
+ .empty-icon-wrap i {
154
+ font-size: 28px;
155
+ color: var(--primary);
156
+ }
157
+
158
+ .empty-desc {
159
+ color: var(--text-muted);
160
+ font-size: 14px;
161
+ line-height: 1.7;
162
+ }
163
+
164
+ /* Feature hints */
165
+ .empty-features {
166
+ display: flex;
167
+ justify-content: center;
168
+ gap: 60px;
169
+ padding: 0 20px 16px;
170
+ }
171
+
172
+ .feature-item {
173
+ text-align: center;
174
+ max-width: 160px;
175
+ }
176
+
177
+ .feature-icon {
178
+ margin: 0 auto 10px;
179
+ }
180
+
181
+ .feature-icon i {
182
+ font-size: 22px;
183
+ color: var(--text-muted);
184
+ }
185
+
186
+ .feature-item h6 {
187
+ font-weight: 700;
188
+ color: var(--text-primary);
189
+ margin-bottom: 4px;
190
+ }
191
+
192
+ .feature-item p {
193
+ font-size: 12px;
194
+ color: var(--text-muted);
195
+ line-height: 1.6;
196
+ margin: 0;
197
+ }
198
+
199
+ /* Toolbar (table view) */
200
+ .inv-table-toolbar {
201
+ padding: 0 0 12px;
202
+ border-bottom: 1px solid var(--border-soft);
203
+ }
204
+
205
+ .search-wrapper {
206
+ max-width: 340px;
207
+ }
208
+
209
+ .search-icon {
210
+ color: var(--primary);
211
+ font-size: 15px;
212
+ }
213
+
214
+ .search-input {
215
+ border: none;
216
+ outline: none;
217
+ background: transparent;
218
+ width: 100%;
219
+ color: var(--text-primary);
220
+ font-size: 14px;
221
+ }
222
+
223
+ .search-input::placeholder {
224
+ color: var(--text-muted);
225
+ }
226
+
227
+ .filter-btn {
228
+ padding: var(--space-2) var(--space-4);
229
+ border: 1.5px solid var(--border-light);
230
+ background: transparent;
231
+ border-radius: var(--radius-sm);
232
+ color: var(--text-secondary);
233
+ cursor: pointer;
234
+ font-size: 13px;
235
+ transition: var(--transition-fast);
236
+ }
237
+
238
+ .filter-btn:hover {
239
+ background: var(--bg-hover);
240
+ }
241
+
242
+ /* Inventory Table */
243
+ .inv-table thead th {
244
+ background: #f3f4f6;
245
+ font-size: 12px;
246
+ text-transform: uppercase;
247
+ color: var(--text-secondary);
248
+ padding: 16px;
249
+ font-weight: 700;
250
+ letter-spacing: 0.04em;
251
+ }
252
+
253
+ .inv-table tbody td {
254
+ padding: 16px;
255
+ border-top: 1px solid #eee;
256
+ vertical-align: middle;
257
+ }
258
+
259
+ /* Table Footer & Pagination */
260
+
261
+
262
+ /* ========================
263
+ Modal (shared pattern)
264
+ ======================== */
265
+ .modal-overlay {
266
+ display: none;
267
+ position: fixed;
268
+ inset: 0;
269
+ background: rgba(17, 24, 39, 0.4);
270
+ z-index: 1000;
271
+ align-items: center;
272
+ justify-content: center;
273
+ }
274
+
275
+ .modal-overlay.show {
276
+ display: flex;
277
+ }
278
+
279
+ .modal-box {
280
+ background: var(--bg-card);
281
+ border-radius: var(--radius-lg);
282
+ padding: var(--space-6);
283
+ width: 100%;
284
+ max-width: 520px;
285
+ box-shadow: var(--shadow-md);
286
+ animation: modalIn 0.2s ease;
287
+ }
288
+
289
+ @keyframes modalIn {
290
+ from {
291
+ opacity: 0;
292
+ transform: translateY(-12px);
293
+ }
294
+ to {
295
+ opacity: 1;
296
+ transform: translateY(0);
297
+ }
298
+ }
299
+
300
+ .modal-close {
301
+ background: var(--bg-soft);
302
+ border: none;
303
+ border-radius: var(--radius-sm);
304
+ width: 32px;
305
+ height: 32px;
306
+ cursor: pointer;
307
+ color: var(--text-secondary);
308
+ font-size: 16px;
309
+ display: flex;
310
+ align-items: center;
311
+ justify-content: center;
312
+ transition: var(--transition-fast);
313
+ }
314
+
315
+ .modal-close:hover {
316
+ background: var(--danger-bg);
317
+ color: var(--danger);
318
+ }
319
+
320
+ .cat-input {
321
+ border: 1px solid var(--border-light);
322
+ border-radius: var(--radius-sm);
323
+ padding: var(--space-2) var(--space-3);
324
+ width: 100%;
325
+ color: var(--text-primary);
326
+ background: var(--bg-soft);
327
+ transition: var(--transition-fast);
328
+ }
329
+
330
+ .cat-input:focus {
331
+ outline: none;
332
+ border-color: var(--primary-light);
333
+ background: var(--bg-card);
334
+ box-shadow: 0 0 0 3px rgba(124, 58, 237, 0.1);
335
+ }
336
+
337
+ .cancel-btn {
338
+ padding: var(--space-2) var(--space-6);
339
+ border: 1px solid var(--border-light);
340
+ background: transparent;
341
+ color: var(--text-secondary);
342
+ border-radius: var(--radius-md);
343
+ cursor: pointer;
344
+ transition: var(--transition-fast);
345
+ }
346
+
347
+ .cancel-btn:hover {
348
+ background: var(--bg-hover);
349
+ }
350
+
351
+ .hidden {
352
+ display: none !important;
353
+ }