appclean 2.0.0 → 2.0.3

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 (57) hide show
  1. package/.github/workflows/npm-publish.yml +104 -0
  2. package/DEVELOPMENT.md +84 -0
  3. package/RELEASE_GUIDE.md +257 -0
  4. package/RELEASE_QUICK_START.md +176 -0
  5. package/assets/logo.svg +48 -32
  6. package/dist/index.js +1 -1
  7. package/dist/ui/client/api/client.d.ts.map +1 -1
  8. package/dist/ui/client/api/client.js +5 -1
  9. package/dist/ui/client/api/client.js.map +1 -1
  10. package/dist/ui/client/app.d.ts +1 -1
  11. package/dist/ui/client/app.d.ts.map +1 -1
  12. package/dist/ui/client/app.js +10 -6
  13. package/dist/ui/client/app.js.map +1 -1
  14. package/dist/ui/client/index.html +103 -46
  15. package/dist/ui/client/pages/appSearch.js +12 -1
  16. package/dist/ui/client/pages/appSearch.js.map +1 -1
  17. package/dist/ui/client/pages/dashboard.d.ts.map +1 -1
  18. package/dist/ui/client/pages/dashboard.js +26 -5
  19. package/dist/ui/client/pages/dashboard.js.map +1 -1
  20. package/dist/ui/client/state/appStore.d.ts.map +1 -1
  21. package/dist/ui/client/state/appStore.js +21 -12
  22. package/dist/ui/client/state/appStore.js.map +1 -1
  23. package/dist/ui/client/state/dashboardStore.d.ts.map +1 -1
  24. package/dist/ui/client/state/dashboardStore.js +9 -3
  25. package/dist/ui/client/state/dashboardStore.js.map +1 -1
  26. package/dist/ui/client/styles/animations.css +384 -2
  27. package/dist/ui/client/styles/base.css +347 -73
  28. package/dist/ui/client/styles/components.css +566 -189
  29. package/dist/ui/client/styles/layout.css +618 -1
  30. package/dist/ui/client/styles/responsive.css +388 -0
  31. package/dist/ui/client/styles/variables.css +163 -69
  32. package/dist/ui/guiServer.d.ts +3 -0
  33. package/dist/ui/guiServer.d.ts.map +1 -1
  34. package/dist/ui/guiServer.js +48 -1
  35. package/dist/ui/guiServer.js.map +1 -1
  36. package/dist/utils/upgrade.d.ts +2 -1
  37. package/dist/utils/upgrade.d.ts.map +1 -1
  38. package/dist/utils/upgrade.js +14 -1
  39. package/dist/utils/upgrade.js.map +1 -1
  40. package/package.json +1 -1
  41. package/scripts/publish-npm.sh +64 -0
  42. package/src/index.ts +1 -1
  43. package/src/ui/client/api/client.ts +6 -1
  44. package/src/ui/client/app.ts +15 -11
  45. package/src/ui/client/index.html +103 -46
  46. package/src/ui/client/pages/appSearch.ts +14 -1
  47. package/src/ui/client/pages/dashboard.ts +27 -5
  48. package/src/ui/client/state/appStore.ts +24 -12
  49. package/src/ui/client/state/dashboardStore.ts +13 -3
  50. package/src/ui/client/styles/animations.css +384 -2
  51. package/src/ui/client/styles/base.css +347 -73
  52. package/src/ui/client/styles/components.css +566 -189
  53. package/src/ui/client/styles/layout.css +618 -1
  54. package/src/ui/client/styles/responsive.css +388 -0
  55. package/src/ui/client/styles/variables.css +163 -69
  56. package/src/ui/guiServer.ts +67 -1
  57. package/src/utils/upgrade.ts +18 -1
@@ -1,22 +1,30 @@
1
- /* Component Styles - Buttons, Cards, Inputs, Badges, Modals */
1
+ /* ============================================================================
2
+ Component Styles - Buttons, Cards, Inputs, Badges, Alerts, and More
3
+ ============================================================================ */
4
+
5
+ /* ============================================================================
6
+ Buttons
7
+ ============================================================================ */
2
8
 
3
- /* Buttons */
4
9
  .btn {
5
10
  display: inline-flex;
6
11
  align-items: center;
7
12
  justify-content: center;
8
13
  gap: var(--space-2);
9
- padding: var(--space-2) var(--space-4);
10
- font-size: var(--font-sm);
14
+ padding: var(--space-3) var(--space-6);
15
+ font-family: inherit;
16
+ font-size: var(--font-base);
11
17
  font-weight: var(--fw-medium);
12
18
  line-height: var(--lh-normal);
13
19
  border: 1px solid transparent;
14
- border-radius: var(--radius-md);
20
+ border-radius: var(--radius-lg);
15
21
  cursor: pointer;
16
22
  transition: all var(--transition-fast);
17
23
  user-select: none;
18
24
  text-decoration: none;
19
25
  white-space: nowrap;
26
+ position: relative;
27
+ overflow: hidden;
20
28
  }
21
29
 
22
30
  .btn:disabled {
@@ -24,91 +32,134 @@
24
32
  cursor: not-allowed;
25
33
  }
26
34
 
35
+ .btn:focus-visible {
36
+ outline: 2px solid var(--color-primary);
37
+ outline-offset: 2px;
38
+ }
39
+
27
40
  /* Button Sizes */
28
- .btn-sm {
29
- padding: var(--space-1) var(--space-3);
41
+ .btn-xs {
42
+ padding: var(--space-1) var(--space-2);
30
43
  font-size: var(--font-xs);
31
44
  }
32
45
 
46
+ .btn-sm {
47
+ padding: var(--space-2) var(--space-4);
48
+ font-size: var(--font-sm);
49
+ }
50
+
33
51
  .btn-lg {
34
- padding: var(--space-3) var(--space-6);
35
- font-size: var(--font-base);
52
+ padding: var(--space-4) var(--space-8);
53
+ font-size: var(--font-lg);
54
+ }
55
+
56
+ .btn-xl {
57
+ padding: var(--space-5) var(--space-10);
58
+ font-size: var(--font-lg);
36
59
  }
37
60
 
38
61
  /* Button Variants */
62
+
63
+ /* Primary Button */
39
64
  .btn-primary {
40
- background-color: var(--color-primary);
65
+ background: var(--gradient-primary);
41
66
  color: white;
42
- border-color: var(--color-primary);
67
+ border: none;
68
+ box-shadow: 0 2px 8px rgba(59, 130, 246, 0.3);
43
69
  }
44
70
 
45
71
  .btn-primary:hover:not(:disabled) {
46
- background-color: var(--color-primary-hover);
47
- border-color: var(--color-primary-hover);
48
- transform: translateY(-1px);
49
- box-shadow: var(--shadow-md);
72
+ transform: translateY(-2px);
73
+ box-shadow: 0 4px 12px rgba(59, 130, 246, 0.4);
50
74
  }
51
75
 
52
76
  .btn-primary:active:not(:disabled) {
53
77
  transform: translateY(0);
54
- box-shadow: var(--shadow-sm);
55
78
  }
56
79
 
80
+ /* Secondary Button */
57
81
  .btn-secondary {
58
- background-color: var(--color-neutral-200);
82
+ background-color: var(--bg-secondary);
59
83
  color: var(--text-primary);
60
- border-color: var(--color-neutral-200);
84
+ border: 1px solid var(--border-color);
61
85
  }
62
86
 
63
87
  .btn-secondary:hover:not(:disabled) {
64
- background-color: var(--color-neutral-300);
65
- border-color: var(--color-neutral-300);
88
+ background-color: var(--bg-hover);
89
+ border-color: var(--border-color-hover);
66
90
  transform: translateY(-1px);
67
- box-shadow: var(--shadow-md);
68
91
  }
69
92
 
93
+ /* Danger Button */
70
94
  .btn-danger {
71
- background-color: var(--color-danger);
95
+ background: var(--gradient-danger);
72
96
  color: white;
73
- border-color: var(--color-danger);
97
+ border: none;
74
98
  }
75
99
 
76
100
  .btn-danger:hover:not(:disabled) {
77
- background-color: #dc2626;
78
- border-color: #dc2626;
79
- transform: translateY(-1px);
80
- box-shadow: var(--shadow-md);
101
+ transform: translateY(-2px);
102
+ box-shadow: 0 4px 12px rgba(239, 68, 68, 0.3);
81
103
  }
82
104
 
105
+ /* Success Button */
106
+ .btn-success {
107
+ background: var(--gradient-success);
108
+ color: white;
109
+ border: none;
110
+ }
111
+
112
+ .btn-success:hover:not(:disabled) {
113
+ transform: translateY(-2px);
114
+ box-shadow: 0 4px 12px rgba(16, 185, 129, 0.3);
115
+ }
116
+
117
+ /* Ghost Button (Text-only) */
83
118
  .btn-ghost {
84
119
  background-color: transparent;
85
- color: var(--text-secondary);
86
- border-color: transparent;
120
+ color: var(--text-primary);
121
+ border: none;
87
122
  }
88
123
 
89
124
  .btn-ghost:hover:not(:disabled) {
90
- background-color: var(--bg-secondary);
91
- border-color: var(--border-color);
125
+ background-color: var(--bg-hover);
92
126
  }
93
127
 
94
- .btn-ghost-primary {
95
- background-color: var(--color-primary-light);
128
+ /* Outline Button */
129
+ .btn-outline {
130
+ background-color: transparent;
96
131
  color: var(--color-primary);
97
- border-color: transparent;
132
+ border: 2px solid var(--color-primary);
98
133
  }
99
134
 
100
- .btn-ghost-primary:hover:not(:disabled) {
101
- background-color: var(--color-primary);
102
- color: white;
135
+ .btn-outline:hover:not(:disabled) {
136
+ background-color: var(--color-primary-50);
137
+ }
138
+
139
+ /* Link Button */
140
+ .btn-link {
141
+ background: none;
142
+ border: none;
143
+ color: var(--color-primary);
144
+ padding: var(--space-1) 0;
145
+ text-decoration: underline;
146
+ }
147
+
148
+ .btn-link:hover:not(:disabled) {
149
+ color: var(--color-primary-600);
103
150
  }
104
151
 
105
- /* Cards */
152
+ /* ============================================================================
153
+ Cards
154
+ ============================================================================ */
155
+
106
156
  .card {
107
- background-color: var(--bg-primary);
157
+ background-color: var(--bg-secondary);
108
158
  border: 1px solid var(--border-color);
109
- border-radius: var(--radius-lg);
110
- padding: var(--space-4);
159
+ border-radius: var(--radius-xl);
160
+ padding: var(--space-6);
111
161
  transition: all var(--transition-normal);
162
+ position: relative;
112
163
  }
113
164
 
114
165
  .card:hover {
@@ -119,11 +170,23 @@
119
170
 
120
171
  .card-header {
121
172
  display: flex;
122
- align-items: center;
173
+ align-items: flex-start;
123
174
  justify-content: space-between;
124
- padding-bottom: var(--space-3);
175
+ margin-bottom: var(--space-4);
176
+ padding-bottom: var(--space-4);
125
177
  border-bottom: 1px solid var(--border-color);
126
- margin-bottom: var(--space-3);
178
+ }
179
+
180
+ .card-title {
181
+ font-size: var(--font-lg);
182
+ font-weight: var(--fw-semibold);
183
+ color: var(--text-primary);
184
+ }
185
+
186
+ .card-subtitle {
187
+ font-size: var(--font-sm);
188
+ color: var(--text-muted);
189
+ margin-top: var(--space-1);
127
190
  }
128
191
 
129
192
  .card-body {
@@ -131,69 +194,76 @@
131
194
  }
132
195
 
133
196
  .card-footer {
134
- display: flex;
135
- gap: var(--space-2);
136
- padding-top: var(--space-3);
197
+ margin-top: var(--space-4);
198
+ padding-top: var(--space-4);
137
199
  border-top: 1px solid var(--border-color);
138
- margin-top: var(--space-3);
200
+ display: flex;
201
+ gap: var(--space-3);
202
+ justify-content: flex-end;
139
203
  }
140
204
 
141
- /* Input Fields */
142
- .form-group {
143
- margin-bottom: var(--space-4);
205
+ .card-icon {
206
+ width: 3rem;
207
+ height: 3rem;
208
+ border-radius: var(--radius-xl);
209
+ background-color: var(--color-primary-50);
210
+ display: flex;
211
+ align-items: center;
212
+ justify-content: center;
213
+ color: var(--color-primary);
214
+ flex-shrink: 0;
144
215
  }
145
216
 
146
- .form-label {
147
- display: block;
148
- margin-bottom: var(--space-2);
149
- font-weight: var(--fw-medium);
150
- color: var(--text-primary);
151
- font-size: var(--font-sm);
217
+ .card-stat {
218
+ text-align: center;
219
+ padding: var(--space-4);
152
220
  }
153
221
 
154
- .form-input {
155
- width: 100%;
156
- padding: var(--space-2) var(--space-3);
157
- border: 1px solid var(--border-color);
158
- border-radius: var(--radius-md);
159
- background-color: var(--bg-primary);
222
+ .card-stat-value {
223
+ font-size: var(--font-3xl);
224
+ font-weight: var(--fw-bold);
160
225
  color: var(--text-primary);
161
- font-size: var(--font-base);
162
- transition: border-color var(--transition-fast), box-shadow var(--transition-fast);
163
226
  }
164
227
 
165
- .form-input::placeholder {
228
+ .card-stat-label {
229
+ font-size: var(--font-sm);
166
230
  color: var(--text-muted);
231
+ margin-top: var(--space-1);
167
232
  }
168
233
 
169
- .form-input:focus {
170
- outline: none;
171
- border-color: var(--color-primary);
172
- box-shadow: 0 0 0 3px var(--color-primary-light);
234
+ /* Elevated Card */
235
+ .card-elevated {
236
+ box-shadow: var(--shadow-md);
237
+ border: none;
173
238
  }
174
239
 
175
- .form-input:disabled {
176
- background-color: var(--bg-secondary);
177
- color: var(--text-muted);
178
- cursor: not-allowed;
179
- opacity: 0.5;
240
+ .card-elevated:hover {
241
+ box-shadow: var(--shadow-lg);
180
242
  }
181
243
 
182
- /* Badges */
244
+ /* ============================================================================
245
+ Badges & Tags
246
+ ============================================================================ */
247
+
183
248
  .badge {
184
249
  display: inline-flex;
185
250
  align-items: center;
186
251
  gap: var(--space-1);
187
- padding: var(--space-1) var(--space-2);
188
- border-radius: var(--radius-sm);
252
+ padding: var(--space-1) var(--space-3);
189
253
  font-size: var(--font-xs);
190
- font-weight: var(--fw-medium);
254
+ font-weight: var(--fw-semibold);
255
+ border-radius: var(--radius-full);
191
256
  white-space: nowrap;
192
257
  }
193
258
 
194
259
  .badge-primary {
195
- background-color: var(--color-primary-light);
196
- color: var(--color-primary);
260
+ background-color: var(--color-primary-100);
261
+ color: var(--color-primary-700);
262
+ }
263
+
264
+ body.dark-mode .badge-primary {
265
+ background-color: var(--color-primary-900);
266
+ color: var(--color-primary-300);
197
267
  }
198
268
 
199
269
  .badge-success {
@@ -201,161 +271,228 @@
201
271
  color: var(--color-success);
202
272
  }
203
273
 
204
- .badge-warning {
205
- background-color: var(--color-warning-light);
206
- color: var(--color-warning);
207
- }
208
-
209
274
  .badge-danger {
210
275
  background-color: var(--color-danger-light);
211
276
  color: var(--color-danger);
212
277
  }
213
278
 
214
- .badge-neutral {
215
- background-color: var(--color-neutral-100);
216
- color: var(--color-neutral-700);
279
+ .badge-warning {
280
+ background-color: var(--color-warning-light);
281
+ color: var(--color-warning);
217
282
  }
218
283
 
219
- /* Modals */
220
- .modal-backdrop {
221
- display: none;
222
- position: fixed;
223
- top: 0;
224
- left: 0;
225
- right: 0;
226
- bottom: 0;
227
- background-color: rgba(0, 0, 0, 0.5);
228
- z-index: var(--z-modal-backdrop);
284
+ .badge-info {
285
+ background-color: var(--color-info-light);
286
+ color: var(--color-info);
229
287
  }
230
288
 
231
- .modal-backdrop.active {
232
- display: flex;
233
- align-items: center;
234
- justify-content: center;
289
+ .badge-dot {
290
+ width: 0.5rem;
291
+ height: 0.5rem;
292
+ border-radius: 50%;
293
+ margin-right: var(--space-1);
235
294
  }
236
295
 
237
- .modal {
238
- background-color: var(--bg-primary);
239
- border-radius: var(--radius-xl);
240
- box-shadow: var(--shadow-xl);
241
- padding: var(--space-6);
242
- max-width: 500px;
243
- width: 90%;
244
- max-height: 90vh;
245
- overflow-y: auto;
246
- z-index: var(--z-modal);
247
- position: relative;
248
- }
296
+ /* ============================================================================
297
+ Alerts
298
+ ============================================================================ */
249
299
 
250
- .modal-header {
300
+ .alert {
301
+ padding: var(--space-4);
302
+ border-radius: var(--radius-lg);
303
+ border-left: 4px solid;
251
304
  display: flex;
252
- align-items: center;
253
- justify-content: space-between;
305
+ gap: var(--space-3);
254
306
  margin-bottom: var(--space-4);
255
- padding-bottom: var(--space-3);
256
- border-bottom: 1px solid var(--border-color);
307
+ animation: slideUp var(--transition-normal);
257
308
  }
258
309
 
259
- .modal-title {
260
- font-size: var(--font-xl);
261
- font-weight: var(--fw-bold);
262
- margin: 0;
263
- }
264
-
265
- .modal-close {
266
- background: none;
267
- border: none;
268
- font-size: var(--font-xl);
269
- cursor: pointer;
270
- color: var(--text-muted);
271
- padding: 0;
272
- width: 32px;
273
- height: 32px;
310
+ .alert-icon {
311
+ flex-shrink: 0;
312
+ width: 1.5rem;
313
+ height: 1.5rem;
274
314
  display: flex;
275
315
  align-items: center;
276
316
  justify-content: center;
277
- border-radius: var(--radius-md);
278
- transition: all var(--transition-fast);
279
317
  }
280
318
 
281
- .modal-close:hover {
282
- background-color: var(--bg-secondary);
283
- color: var(--text-primary);
319
+ .alert-content {
320
+ flex: 1;
284
321
  }
285
322
 
286
- .modal-body {
287
- margin-bottom: var(--space-4);
323
+ .alert-title {
324
+ font-weight: var(--fw-semibold);
325
+ margin-bottom: var(--space-1);
288
326
  }
289
327
 
290
- .modal-footer {
291
- display: flex;
292
- gap: var(--space-2);
293
- justify-content: flex-end;
294
- padding-top: var(--space-4);
295
- border-top: 1px solid var(--border-color);
328
+ .alert-message {
329
+ font-size: var(--font-sm);
330
+ line-height: var(--lh-normal);
296
331
  }
297
332
 
298
- /* Alerts */
299
- .alert {
300
- padding: var(--space-3) var(--space-4);
301
- border-radius: var(--radius-md);
302
- margin-bottom: var(--space-4);
303
- display: flex;
304
- gap: var(--space-2);
305
- align-items: flex-start;
333
+ .alert-close {
334
+ flex-shrink: 0;
335
+ background: none;
336
+ border: none;
337
+ color: inherit;
338
+ cursor: pointer;
339
+ opacity: 0.7;
340
+ transition: opacity var(--transition-fast);
341
+ }
342
+
343
+ .alert-close:hover {
344
+ opacity: 1;
306
345
  }
307
346
 
308
347
  .alert-success {
309
348
  background-color: var(--color-success-light);
349
+ border-color: var(--color-success);
310
350
  color: var(--color-success);
311
- border: 1px solid var(--color-success);
312
351
  }
313
352
 
314
353
  .alert-danger {
315
354
  background-color: var(--color-danger-light);
355
+ border-color: var(--color-danger);
316
356
  color: var(--color-danger);
317
- border: 1px solid var(--color-danger);
318
357
  }
319
358
 
320
359
  .alert-warning {
321
360
  background-color: var(--color-warning-light);
361
+ border-color: var(--color-warning);
322
362
  color: var(--color-warning);
323
- border: 1px solid var(--color-warning);
324
363
  }
325
364
 
326
365
  .alert-info {
327
366
  background-color: var(--color-info-light);
367
+ border-color: var(--color-info);
328
368
  color: var(--color-info);
329
- border: 1px solid var(--color-info);
330
369
  }
331
370
 
332
- /* Tabs */
371
+ /* ============================================================================
372
+ Form Elements
373
+ ============================================================================ */
374
+
375
+ .form-group {
376
+ margin-bottom: var(--space-6);
377
+ }
378
+
379
+ .form-group:last-child {
380
+ margin-bottom: 0;
381
+ }
382
+
383
+ .form-label {
384
+ display: block;
385
+ font-weight: var(--fw-medium);
386
+ margin-bottom: var(--space-2);
387
+ color: var(--text-primary);
388
+ }
389
+
390
+ .form-label.required::after {
391
+ content: '*';
392
+ color: var(--color-danger);
393
+ margin-left: var(--space-1);
394
+ }
395
+
396
+ .form-hint {
397
+ font-size: var(--font-sm);
398
+ color: var(--text-muted);
399
+ margin-top: var(--space-1);
400
+ }
401
+
402
+ .form-error {
403
+ font-size: var(--font-sm);
404
+ color: var(--color-danger);
405
+ margin-top: var(--space-1);
406
+ }
407
+
408
+ .form-control {
409
+ display: flex;
410
+ align-items: center;
411
+ gap: var(--space-2);
412
+ }
413
+
414
+ .form-control input[type="checkbox"],
415
+ .form-control input[type="radio"] {
416
+ width: 1.25rem;
417
+ height: 1.25rem;
418
+ cursor: pointer;
419
+ }
420
+
421
+ /* ============================================================================
422
+ Modals & Dialogs
423
+ ============================================================================ */
424
+
425
+ .modal-dialog {
426
+ background-color: var(--bg-primary);
427
+ border-radius: var(--radius-2xl);
428
+ }
429
+
430
+ .modal-header {
431
+ display: flex;
432
+ align-items: center;
433
+ justify-content: space-between;
434
+ padding: var(--space-6);
435
+ border-bottom: 1px solid var(--border-color);
436
+ }
437
+
438
+ .modal-title {
439
+ font-size: var(--font-2xl);
440
+ font-weight: var(--fw-bold);
441
+ margin: 0;
442
+ }
443
+
444
+ .modal-body {
445
+ padding: var(--space-6);
446
+ max-height: 60vh;
447
+ overflow-y: auto;
448
+ }
449
+
450
+ .modal-footer {
451
+ padding: var(--space-6);
452
+ border-top: 1px solid var(--border-color);
453
+ display: flex;
454
+ gap: var(--space-3);
455
+ justify-content: flex-end;
456
+ }
457
+
458
+ /* ============================================================================
459
+ Tabs
460
+ ============================================================================ */
461
+
333
462
  .tabs {
334
463
  display: flex;
335
- gap: 0;
336
464
  border-bottom: 1px solid var(--border-color);
337
- margin-bottom: var(--space-4);
465
+ margin-bottom: var(--space-6);
466
+ gap: var(--space-4);
338
467
  }
339
468
 
340
- .tab-button {
341
- padding: var(--space-3) var(--space-4);
342
- background: none;
469
+ .tab {
470
+ padding: var(--space-4);
343
471
  border: none;
472
+ background: none;
344
473
  cursor: pointer;
345
- font-size: var(--font-base);
346
- font-weight: var(--fw-medium);
347
474
  color: var(--text-secondary);
348
- border-bottom: 2px solid transparent;
349
- transition: all var(--transition-fast);
475
+ font-weight: var(--fw-medium);
476
+ position: relative;
477
+ transition: color var(--transition-fast);
350
478
  }
351
479
 
352
- .tab-button:hover {
480
+ .tab:hover {
353
481
  color: var(--text-primary);
354
482
  }
355
483
 
356
- .tab-button.active {
484
+ .tab.active {
357
485
  color: var(--color-primary);
358
- border-bottom-color: var(--color-primary);
486
+ }
487
+
488
+ .tab.active::after {
489
+ content: '';
490
+ position: absolute;
491
+ bottom: -1px;
492
+ left: 0;
493
+ right: 0;
494
+ height: 2px;
495
+ background-color: var(--color-primary);
359
496
  }
360
497
 
361
498
  .tab-content {
@@ -364,37 +501,277 @@
364
501
 
365
502
  .tab-content.active {
366
503
  display: block;
504
+ animation: fadeIn var(--transition-normal);
367
505
  }
368
506
 
369
- /* Status Indicator */
370
- .status {
371
- display: inline-flex;
507
+ /* ============================================================================
508
+ Lists
509
+ ============================================================================ */
510
+
511
+ .list {
512
+ list-style: none;
513
+ }
514
+
515
+ .list-item {
516
+ padding: var(--space-4);
517
+ border-bottom: 1px solid var(--border-color);
518
+ display: flex;
519
+ align-items: center;
520
+ justify-content: space-between;
521
+ transition: background-color var(--transition-fast);
522
+ }
523
+
524
+ .list-item:last-child {
525
+ border-bottom: none;
526
+ }
527
+
528
+ .list-item:hover {
529
+ background-color: var(--bg-hover);
530
+ }
531
+
532
+ .list-item-content {
533
+ flex: 1;
534
+ }
535
+
536
+ .list-item-title {
537
+ font-weight: var(--fw-medium);
538
+ color: var(--text-primary);
539
+ }
540
+
541
+ .list-item-subtitle {
542
+ font-size: var(--font-sm);
543
+ color: var(--text-muted);
544
+ margin-top: var(--space-1);
545
+ }
546
+
547
+ /* ============================================================================
548
+ Progress Bar
549
+ ============================================================================ */
550
+
551
+ .progress {
552
+ width: 100%;
553
+ height: 0.5rem;
554
+ background-color: var(--border-color);
555
+ border-radius: var(--radius-full);
556
+ overflow: hidden;
557
+ margin-bottom: var(--space-2);
558
+ }
559
+
560
+ .progress-bar {
561
+ height: 100%;
562
+ background: var(--gradient-primary);
563
+ border-radius: var(--radius-full);
564
+ transition: width var(--transition-slow);
565
+ }
566
+
567
+ .progress-bar.success {
568
+ background: var(--gradient-success);
569
+ }
570
+
571
+ .progress-bar.danger {
572
+ background: var(--gradient-danger);
573
+ }
574
+
575
+ .progress-bar.warning {
576
+ background: var(--gradient-warning);
577
+ }
578
+
579
+ /* ============================================================================
580
+ Breadcrumbs
581
+ ============================================================================ */
582
+
583
+ .breadcrumbs {
584
+ display: flex;
372
585
  align-items: center;
373
586
  gap: var(--space-2);
374
587
  font-size: var(--font-sm);
588
+ margin-bottom: var(--space-6);
589
+ }
590
+
591
+ .breadcrumb {
592
+ color: var(--text-secondary);
593
+ text-decoration: none;
594
+ transition: color var(--transition-fast);
595
+ }
596
+
597
+ .breadcrumb:hover {
598
+ color: var(--text-primary);
599
+ }
600
+
601
+ .breadcrumb.active {
602
+ color: var(--text-primary);
375
603
  font-weight: var(--fw-medium);
376
604
  }
377
605
 
378
- .status::before {
379
- content: '';
606
+ .breadcrumb-separator {
607
+ color: var(--text-muted);
608
+ }
609
+
610
+ /* ============================================================================
611
+ Dropdowns
612
+ ============================================================================ */
613
+
614
+ .dropdown {
615
+ position: relative;
380
616
  display: inline-block;
381
- width: 8px;
382
- height: 8px;
383
- border-radius: 50%;
384
617
  }
385
618
 
386
- .status-success::before {
387
- background-color: var(--color-success);
619
+ .dropdown-menu {
620
+ position: absolute;
621
+ top: 100%;
622
+ left: 0;
623
+ background-color: var(--bg-primary);
624
+ border: 1px solid var(--border-color);
625
+ border-radius: var(--radius-lg);
626
+ box-shadow: var(--shadow-lg);
627
+ min-width: 200px;
628
+ z-index: var(--z-dropdown);
629
+ opacity: 0;
630
+ visibility: hidden;
631
+ transform: translateY(-10px);
632
+ transition: all var(--transition-fast);
633
+ margin-top: var(--space-2);
634
+ }
635
+
636
+ .dropdown.open .dropdown-menu {
637
+ opacity: 1;
638
+ visibility: visible;
639
+ transform: translateY(0);
640
+ }
641
+
642
+ .dropdown-item {
643
+ padding: var(--space-3) var(--space-4);
644
+ color: var(--text-secondary);
645
+ text-decoration: none;
646
+ display: block;
647
+ transition: all var(--transition-fast);
648
+ border: none;
649
+ background: none;
650
+ width: 100%;
651
+ text-align: left;
652
+ cursor: pointer;
653
+ font-size: var(--font-sm);
388
654
  }
389
655
 
390
- .status-warning::before {
391
- background-color: var(--color-warning);
656
+ .dropdown-item:hover {
657
+ background-color: var(--bg-hover);
658
+ color: var(--text-primary);
392
659
  }
393
660
 
394
- .status-danger::before {
395
- background-color: var(--color-danger);
661
+ .dropdown-divider {
662
+ height: 1px;
663
+ background-color: var(--border-color);
664
+ margin: var(--space-2) 0;
396
665
  }
397
666
 
398
- .status-neutral::before {
399
- background-color: var(--text-muted);
667
+ /* ============================================================================
668
+ Tooltips
669
+ ============================================================================ */
670
+
671
+ .tooltip {
672
+ position: relative;
673
+ display: inline-block;
674
+ }
675
+
676
+ .tooltip-text {
677
+ position: absolute;
678
+ bottom: 125%;
679
+ left: 50%;
680
+ transform: translateX(-50%);
681
+ background-color: var(--text-primary);
682
+ color: var(--bg-primary);
683
+ text-align: center;
684
+ padding: var(--space-2) var(--space-3);
685
+ border-radius: var(--radius-md);
686
+ z-index: var(--z-tooltip);
687
+ white-space: nowrap;
688
+ opacity: 0;
689
+ visibility: hidden;
690
+ transition: all var(--transition-fast);
691
+ font-size: var(--font-xs);
692
+ }
693
+
694
+ .tooltip:hover .tooltip-text {
695
+ opacity: 1;
696
+ visibility: visible;
697
+ }
698
+
699
+ /* ============================================================================
700
+ Search Input
701
+ ============================================================================ */
702
+
703
+ .search-input {
704
+ position: relative;
705
+ }
706
+
707
+ .search-input input {
708
+ padding-left: var(--space-10);
709
+ }
710
+
711
+ .search-icon {
712
+ position: absolute;
713
+ left: var(--space-3);
714
+ top: 50%;
715
+ transform: translateY(-50%);
716
+ color: var(--text-muted);
717
+ pointer-events: none;
718
+ }
719
+
720
+ .search-clear {
721
+ position: absolute;
722
+ right: var(--space-3);
723
+ top: 50%;
724
+ transform: translateY(-50%);
725
+ background: none;
726
+ border: none;
727
+ color: var(--text-muted);
728
+ cursor: pointer;
729
+ padding: var(--space-1);
730
+ transition: color var(--transition-fast);
731
+ }
732
+
733
+ .search-clear:hover {
734
+ color: var(--text-primary);
735
+ }
736
+
737
+ /* ============================================================================
738
+ Skeleton Loader
739
+ ============================================================================ */
740
+
741
+ .skeleton {
742
+ background: linear-gradient(90deg, var(--bg-secondary) 0%, var(--bg-hover) 50%, var(--bg-secondary) 100%);
743
+ background-size: 200% 100%;
744
+ animation: loading 2s infinite;
745
+ border-radius: var(--radius-lg);
746
+ }
747
+
748
+ @keyframes loading {
749
+ 0% {
750
+ background-position: 200% 0;
751
+ }
752
+ 100% {
753
+ background-position: -200% 0;
754
+ }
755
+ }
756
+
757
+ .skeleton-avatar {
758
+ width: 3rem;
759
+ height: 3rem;
760
+ border-radius: 50%;
761
+ }
762
+
763
+ .skeleton-text {
764
+ height: 1rem;
765
+ margin-bottom: var(--space-2);
766
+ border-radius: var(--radius-md);
767
+ }
768
+
769
+ .skeleton-text:last-child {
770
+ margin-bottom: 0;
771
+ }
772
+
773
+ .skeleton-button {
774
+ height: 2.5rem;
775
+ border-radius: var(--radius-lg);
776
+ min-width: 100px;
400
777
  }