okit-cli 0.0.1

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 (88) hide show
  1. package/README.md +222 -0
  2. package/dist/commands/check.d.ts +13 -0
  3. package/dist/commands/check.d.ts.map +1 -0
  4. package/dist/commands/check.js +259 -0
  5. package/dist/commands/check.js.map +1 -0
  6. package/dist/commands/claude.d.ts +10 -0
  7. package/dist/commands/claude.d.ts.map +1 -0
  8. package/dist/commands/claude.js +504 -0
  9. package/dist/commands/claude.js.map +1 -0
  10. package/dist/commands/menu.d.ts +3 -0
  11. package/dist/commands/menu.d.ts.map +1 -0
  12. package/dist/commands/menu.js +152 -0
  13. package/dist/commands/menu.js.map +1 -0
  14. package/dist/commands/repo.d.ts +3 -0
  15. package/dist/commands/repo.d.ts.map +1 -0
  16. package/dist/commands/repo.js +266 -0
  17. package/dist/commands/repo.js.map +1 -0
  18. package/dist/commands/uninstall.d.ts +2 -0
  19. package/dist/commands/uninstall.d.ts.map +1 -0
  20. package/dist/commands/uninstall.js +125 -0
  21. package/dist/commands/uninstall.js.map +1 -0
  22. package/dist/commands/upgrade.d.ts +6 -0
  23. package/dist/commands/upgrade.d.ts.map +1 -0
  24. package/dist/commands/upgrade.js +204 -0
  25. package/dist/commands/upgrade.js.map +1 -0
  26. package/dist/config/i18n.d.ts +141 -0
  27. package/dist/config/i18n.d.ts.map +1 -0
  28. package/dist/config/i18n.js +316 -0
  29. package/dist/config/i18n.js.map +1 -0
  30. package/dist/config/registry.d.ts +24 -0
  31. package/dist/config/registry.d.ts.map +1 -0
  32. package/dist/config/registry.js +388 -0
  33. package/dist/config/registry.js.map +1 -0
  34. package/dist/config/user.d.ts +32 -0
  35. package/dist/config/user.d.ts.map +1 -0
  36. package/dist/config/user.js +72 -0
  37. package/dist/config/user.js.map +1 -0
  38. package/dist/executor/deps/BrewDependencyProvider.d.ts +8 -0
  39. package/dist/executor/deps/BrewDependencyProvider.d.ts.map +1 -0
  40. package/dist/executor/deps/BrewDependencyProvider.js +52 -0
  41. package/dist/executor/deps/BrewDependencyProvider.js.map +1 -0
  42. package/dist/executor/deps/DependencyProvider.d.ts +11 -0
  43. package/dist/executor/deps/DependencyProvider.d.ts.map +1 -0
  44. package/dist/executor/deps/DependencyProvider.js +3 -0
  45. package/dist/executor/deps/DependencyProvider.js.map +1 -0
  46. package/dist/executor/deps/NpmDependencyProvider.d.ts +12 -0
  47. package/dist/executor/deps/NpmDependencyProvider.d.ts.map +1 -0
  48. package/dist/executor/deps/NpmDependencyProvider.js +78 -0
  49. package/dist/executor/deps/NpmDependencyProvider.js.map +1 -0
  50. package/dist/executor/deps/PipxDependencyProvider.d.ts +8 -0
  51. package/dist/executor/deps/PipxDependencyProvider.d.ts.map +1 -0
  52. package/dist/executor/deps/PipxDependencyProvider.js +32 -0
  53. package/dist/executor/deps/PipxDependencyProvider.js.map +1 -0
  54. package/dist/executor/deps/UvToolDependencyProvider.d.ts +8 -0
  55. package/dist/executor/deps/UvToolDependencyProvider.d.ts.map +1 -0
  56. package/dist/executor/deps/UvToolDependencyProvider.js +35 -0
  57. package/dist/executor/deps/UvToolDependencyProvider.js.map +1 -0
  58. package/dist/executor/plan/ExecutionPlanner.d.ts +13 -0
  59. package/dist/executor/plan/ExecutionPlanner.d.ts.map +1 -0
  60. package/dist/executor/plan/ExecutionPlanner.js +109 -0
  61. package/dist/executor/plan/ExecutionPlanner.js.map +1 -0
  62. package/dist/executor/plan/TopologicalSorter.d.ts +3 -0
  63. package/dist/executor/plan/TopologicalSorter.d.ts.map +1 -0
  64. package/dist/executor/plan/TopologicalSorter.js +49 -0
  65. package/dist/executor/plan/TopologicalSorter.js.map +1 -0
  66. package/dist/executor/plan/registryDeps.d.ts +3 -0
  67. package/dist/executor/plan/registryDeps.d.ts.map +1 -0
  68. package/dist/executor/plan/registryDeps.js +22 -0
  69. package/dist/executor/plan/registryDeps.js.map +1 -0
  70. package/dist/executor/runner.d.ts +13 -0
  71. package/dist/executor/runner.d.ts.map +1 -0
  72. package/dist/executor/runner.js +430 -0
  73. package/dist/executor/runner.js.map +1 -0
  74. package/dist/main.d.ts +3 -0
  75. package/dist/main.d.ts.map +1 -0
  76. package/dist/main.js +244 -0
  77. package/dist/main.js.map +1 -0
  78. package/dist/utils/sound.d.ts +10 -0
  79. package/dist/utils/sound.d.ts.map +1 -0
  80. package/dist/utils/sound.js +36 -0
  81. package/dist/utils/sound.js.map +1 -0
  82. package/dist/web/api/config.js +73 -0
  83. package/dist/web/api/stats.js +130 -0
  84. package/dist/web/public/app.js +284 -0
  85. package/dist/web/public/index.html +367 -0
  86. package/dist/web/public/styles.css +1004 -0
  87. package/dist/web/server.js +41 -0
  88. package/package.json +61 -0
@@ -0,0 +1,1004 @@
1
+ /* ═══════════════════════════════════════════
2
+ OKIT — Obsidian Observatory Theme
3
+ Premium dark dashboard for Claude Code
4
+ ═══════════════════════════════════════════ */
5
+
6
+ *, *::before, *::after {
7
+ margin: 0;
8
+ padding: 0;
9
+ box-sizing: border-box;
10
+ }
11
+
12
+ :root {
13
+ /* Core palette */
14
+ --void: #07080d;
15
+ --obsidian: #0c0e16;
16
+ --slate-deep: #12141e;
17
+ --slate: #181b28;
18
+ --slate-light: #1f2337;
19
+ --slate-lighter: #272b42;
20
+
21
+ /* Borders & surfaces */
22
+ --border: rgba(255, 255, 255, 0.06);
23
+ --border-hover: rgba(255, 255, 255, 0.12);
24
+ --glass: rgba(255, 255, 255, 0.03);
25
+ --glass-hover: rgba(255, 255, 255, 0.06);
26
+
27
+ /* Text */
28
+ --text-primary: #e8eaf0;
29
+ --text-secondary: #6b7194;
30
+ --text-tertiary: #454a6b;
31
+ --text-ghost: #353a58;
32
+
33
+ /* Accents */
34
+ --purple: #a78bfa;
35
+ --purple-dim: rgba(167, 139, 250, 0.15);
36
+ --purple-glow: rgba(167, 139, 250, 0.08);
37
+ --blue: #60a5fa;
38
+ --blue-dim: rgba(96, 165, 250, 0.15);
39
+ --blue-glow: rgba(96, 165, 250, 0.08);
40
+ --teal: #2dd4bf;
41
+ --teal-dim: rgba(45, 212, 191, 0.15);
42
+ --teal-glow: rgba(45, 212, 191, 0.08);
43
+ --amber: #fbbf24;
44
+ --amber-dim: rgba(251, 191, 36, 0.15);
45
+ --amber-glow: rgba(251, 191, 36, 0.08);
46
+
47
+ /* Status */
48
+ --success: #34d399;
49
+ --danger: #f87171;
50
+
51
+ /* Gradients */
52
+ --grad-primary: linear-gradient(135deg, #a78bfa, #60a5fa);
53
+ --grad-surface: linear-gradient(180deg, rgba(255,255,255,0.04) 0%, rgba(255,255,255,0) 100%);
54
+
55
+ /* Typography */
56
+ --font-display: 'Outfit', sans-serif;
57
+ --font-body: 'DM Sans', sans-serif;
58
+
59
+ /* Sizing */
60
+ --sidebar-w: 240px;
61
+ --radius-sm: 8px;
62
+ --radius-md: 12px;
63
+ --radius-lg: 16px;
64
+ --radius-xl: 20px;
65
+ }
66
+
67
+ /* ─── Base ─── */
68
+ html {
69
+ font-size: 15px;
70
+ -webkit-font-smoothing: antialiased;
71
+ -moz-osx-font-smoothing: grayscale;
72
+ }
73
+
74
+ body {
75
+ font-family: var(--font-body);
76
+ background-color: var(--void);
77
+ color: var(--text-primary);
78
+ line-height: 1.6;
79
+ overflow: hidden;
80
+ }
81
+
82
+ /* ─── Ambient Background ─── */
83
+ .ambient-bg {
84
+ position: fixed;
85
+ inset: 0;
86
+ z-index: 0;
87
+ pointer-events: none;
88
+ overflow: hidden;
89
+ }
90
+
91
+ .ambient-orb {
92
+ position: absolute;
93
+ border-radius: 50%;
94
+ filter: blur(120px);
95
+ opacity: 0.35;
96
+ animation: drift 20s ease-in-out infinite;
97
+ }
98
+
99
+ .ambient-orb--1 {
100
+ width: 500px;
101
+ height: 500px;
102
+ background: radial-gradient(circle, rgba(167, 139, 250, 0.3), transparent 70%);
103
+ top: -10%;
104
+ left: -5%;
105
+ animation-delay: 0s;
106
+ }
107
+
108
+ .ambient-orb--2 {
109
+ width: 400px;
110
+ height: 400px;
111
+ background: radial-gradient(circle, rgba(96, 165, 250, 0.25), transparent 70%);
112
+ bottom: -15%;
113
+ right: -5%;
114
+ animation-delay: -7s;
115
+ }
116
+
117
+ .ambient-orb--3 {
118
+ width: 300px;
119
+ height: 300px;
120
+ background: radial-gradient(circle, rgba(45, 212, 191, 0.15), transparent 70%);
121
+ top: 50%;
122
+ left: 50%;
123
+ animation-delay: -14s;
124
+ }
125
+
126
+ @keyframes drift {
127
+ 0%, 100% { transform: translate(0, 0) scale(1); }
128
+ 25% { transform: translate(30px, -20px) scale(1.05); }
129
+ 50% { transform: translate(-20px, 30px) scale(0.95); }
130
+ 75% { transform: translate(15px, 15px) scale(1.02); }
131
+ }
132
+
133
+ /* ─── Layout ─── */
134
+ #app {
135
+ position: relative;
136
+ z-index: 1;
137
+ display: flex;
138
+ height: 100vh;
139
+ overflow: hidden;
140
+ }
141
+
142
+ /* ─── Sidebar ─── */
143
+ .sidebar {
144
+ width: var(--sidebar-w);
145
+ min-width: var(--sidebar-w);
146
+ background: rgba(12, 14, 22, 0.85);
147
+ backdrop-filter: blur(24px) saturate(1.2);
148
+ -webkit-backdrop-filter: blur(24px) saturate(1.2);
149
+ border-right: 1px solid var(--border);
150
+ display: flex;
151
+ flex-direction: column;
152
+ transition: width 0.3s cubic-bezier(0.4, 0, 0.2, 1),
153
+ min-width 0.3s cubic-bezier(0.4, 0, 0.2, 1);
154
+ }
155
+
156
+ .sidebar-header {
157
+ padding: 22px 20px;
158
+ border-bottom: 1px solid var(--border);
159
+ }
160
+
161
+ .logo {
162
+ display: flex;
163
+ align-items: center;
164
+ gap: 12px;
165
+ }
166
+
167
+ .logo-mark {
168
+ display: flex;
169
+ align-items: center;
170
+ justify-content: center;
171
+ transition: transform 0.3s ease;
172
+ }
173
+
174
+ .logo-mark:hover {
175
+ transform: rotate(-5deg) scale(1.05);
176
+ }
177
+
178
+ .logo-text {
179
+ font-family: var(--font-display);
180
+ font-size: 20px;
181
+ font-weight: 700;
182
+ letter-spacing: 3px;
183
+ background: var(--grad-primary);
184
+ -webkit-background-clip: text;
185
+ -webkit-text-fill-color: transparent;
186
+ background-clip: text;
187
+ }
188
+
189
+ /* Nav */
190
+ .nav-links {
191
+ list-style: none;
192
+ padding: 12px 10px;
193
+ flex: 1;
194
+ display: flex;
195
+ flex-direction: column;
196
+ gap: 4px;
197
+ }
198
+
199
+ .nav-links li a {
200
+ display: flex;
201
+ align-items: center;
202
+ gap: 12px;
203
+ padding: 11px 14px;
204
+ color: var(--text-secondary);
205
+ text-decoration: none;
206
+ border-radius: var(--radius-sm);
207
+ font-size: 14px;
208
+ font-weight: 500;
209
+ transition: all 0.2s ease;
210
+ position: relative;
211
+ }
212
+
213
+ .nav-links li a:hover {
214
+ color: var(--text-primary);
215
+ background: var(--glass-hover);
216
+ }
217
+
218
+ .nav-links li.active a {
219
+ color: var(--purple);
220
+ background: var(--purple-dim);
221
+ }
222
+
223
+ .nav-links li.active a::before {
224
+ content: '';
225
+ position: absolute;
226
+ left: 0;
227
+ top: 50%;
228
+ transform: translateY(-50%);
229
+ width: 3px;
230
+ height: 20px;
231
+ background: var(--grad-primary);
232
+ border-radius: 0 3px 3px 0;
233
+ }
234
+
235
+ .nav-icon {
236
+ display: flex;
237
+ align-items: center;
238
+ justify-content: center;
239
+ width: 20px;
240
+ height: 20px;
241
+ flex-shrink: 0;
242
+ }
243
+
244
+ .nav-label {
245
+ font-family: var(--font-body);
246
+ letter-spacing: 0.3px;
247
+ }
248
+
249
+ /* Sidebar footer */
250
+ .sidebar-footer {
251
+ padding: 16px 20px;
252
+ border-top: 1px solid var(--border);
253
+ display: flex;
254
+ align-items: center;
255
+ justify-content: space-between;
256
+ }
257
+
258
+ .status {
259
+ display: flex;
260
+ align-items: center;
261
+ gap: 8px;
262
+ font-size: 12px;
263
+ color: var(--text-secondary);
264
+ }
265
+
266
+ .status-dot {
267
+ width: 7px;
268
+ height: 7px;
269
+ border-radius: 50%;
270
+ background-color: var(--text-tertiary);
271
+ transition: all 0.3s ease;
272
+ }
273
+
274
+ .status.connected .status-dot {
275
+ background-color: var(--success);
276
+ box-shadow: 0 0 8px rgba(52, 211, 153, 0.5);
277
+ }
278
+
279
+ .status.error .status-dot {
280
+ background-color: var(--danger);
281
+ box-shadow: 0 0 8px rgba(248, 113, 113, 0.5);
282
+ }
283
+
284
+ .version-tag {
285
+ font-size: 10px;
286
+ font-weight: 600;
287
+ color: var(--text-tertiary);
288
+ padding: 2px 8px;
289
+ border: 1px solid var(--border);
290
+ border-radius: 20px;
291
+ letter-spacing: 0.5px;
292
+ font-family: var(--font-display);
293
+ }
294
+
295
+ /* ─── Main Content ─── */
296
+ .main-content {
297
+ flex: 1;
298
+ overflow-y: auto;
299
+ padding: 36px 40px;
300
+ scrollbar-width: thin;
301
+ scrollbar-color: var(--slate-lighter) transparent;
302
+ }
303
+
304
+ .main-content::-webkit-scrollbar {
305
+ width: 6px;
306
+ }
307
+
308
+ .main-content::-webkit-scrollbar-track {
309
+ background: transparent;
310
+ }
311
+
312
+ .main-content::-webkit-scrollbar-thumb {
313
+ background: var(--slate-lighter);
314
+ border-radius: 3px;
315
+ }
316
+
317
+ /* ─── Pages ─── */
318
+ .page {
319
+ display: none;
320
+ animation: fadeIn 0.35s ease;
321
+ }
322
+
323
+ .page.active {
324
+ display: block;
325
+ }
326
+
327
+ @keyframes fadeIn {
328
+ from { opacity: 0; transform: translateY(8px); }
329
+ to { opacity: 1; transform: translateY(0); }
330
+ }
331
+
332
+ /* Page header */
333
+ .page-header {
334
+ display: flex;
335
+ justify-content: space-between;
336
+ align-items: flex-start;
337
+ margin-bottom: 32px;
338
+ }
339
+
340
+ .page-title-group h2 {
341
+ font-family: var(--font-display);
342
+ font-size: 26px;
343
+ font-weight: 700;
344
+ letter-spacing: -0.3px;
345
+ background: linear-gradient(135deg, var(--text-primary) 0%, var(--text-secondary) 100%);
346
+ -webkit-background-clip: text;
347
+ -webkit-text-fill-color: transparent;
348
+ background-clip: text;
349
+ }
350
+
351
+ .page-subtitle {
352
+ font-size: 13px;
353
+ color: var(--text-tertiary);
354
+ margin-top: 4px;
355
+ letter-spacing: 0.2px;
356
+ }
357
+
358
+ /* ─── Buttons ─── */
359
+ .btn-refresh, .btn-save {
360
+ display: flex;
361
+ align-items: center;
362
+ gap: 8px;
363
+ padding: 9px 18px;
364
+ border-radius: var(--radius-sm);
365
+ font-family: var(--font-body);
366
+ font-size: 13px;
367
+ font-weight: 500;
368
+ cursor: pointer;
369
+ border: none;
370
+ transition: all 0.25s ease;
371
+ }
372
+
373
+ .btn-refresh {
374
+ background: var(--glass);
375
+ color: var(--text-secondary);
376
+ border: 1px solid var(--border);
377
+ }
378
+
379
+ .btn-refresh:hover {
380
+ background: var(--glass-hover);
381
+ color: var(--text-primary);
382
+ border-color: var(--border-hover);
383
+ }
384
+
385
+ .btn-refresh:hover .refresh-icon {
386
+ animation: spin 0.6s ease;
387
+ }
388
+
389
+ @keyframes spin {
390
+ from { transform: rotate(0deg); }
391
+ to { transform: rotate(360deg); }
392
+ }
393
+
394
+ .btn-save {
395
+ background: var(--grad-primary);
396
+ color: #fff;
397
+ font-weight: 600;
398
+ box-shadow: 0 4px 20px rgba(167, 139, 250, 0.25);
399
+ }
400
+
401
+ .btn-save:hover {
402
+ transform: translateY(-1px);
403
+ box-shadow: 0 6px 28px rgba(167, 139, 250, 0.35);
404
+ }
405
+
406
+ .btn-save:active {
407
+ transform: translateY(0);
408
+ }
409
+
410
+ /* ─── Stats Grid ─── */
411
+ .stats-grid {
412
+ display: grid;
413
+ grid-template-columns: repeat(4, 1fr);
414
+ gap: 16px;
415
+ margin-bottom: 20px;
416
+ }
417
+
418
+ .stat-card {
419
+ position: relative;
420
+ background: var(--glass);
421
+ border: 1px solid var(--border);
422
+ border-radius: var(--radius-md);
423
+ padding: 22px;
424
+ display: flex;
425
+ flex-direction: column;
426
+ gap: 16px;
427
+ overflow: hidden;
428
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
429
+ cursor: default;
430
+ }
431
+
432
+ .stat-card:hover {
433
+ border-color: var(--border-hover);
434
+ transform: translateY(-2px);
435
+ }
436
+
437
+ .stat-card-bg {
438
+ position: absolute;
439
+ inset: 0;
440
+ background: var(--grad-surface);
441
+ pointer-events: none;
442
+ }
443
+
444
+ .stat-glow {
445
+ position: absolute;
446
+ top: -40px;
447
+ right: -40px;
448
+ width: 120px;
449
+ height: 120px;
450
+ border-radius: 50%;
451
+ filter: blur(40px);
452
+ opacity: 0;
453
+ transition: opacity 0.4s ease;
454
+ pointer-events: none;
455
+ }
456
+
457
+ .stat-card:hover .stat-glow {
458
+ opacity: 1;
459
+ }
460
+
461
+ /* Per-accent colors */
462
+ .stat-card[data-accent="purple"] { --accent: var(--purple); --accent-dim: var(--purple-dim); --accent-glow: var(--purple-glow); }
463
+ .stat-card[data-accent="blue"] { --accent: var(--blue); --accent-dim: var(--blue-dim); --accent-glow: var(--blue-glow); }
464
+ .stat-card[data-accent="teal"] { --accent: var(--teal); --accent-dim: var(--teal-dim); --accent-glow: var(--teal-glow); }
465
+ .stat-card[data-accent="amber"] { --accent: var(--amber); --accent-dim: var(--amber-dim); --accent-glow: var(--amber-glow); }
466
+
467
+ .stat-card:hover {
468
+ border-color: var(--accent-dim);
469
+ }
470
+
471
+ .stat-card .stat-glow {
472
+ background: var(--accent);
473
+ }
474
+
475
+ .stat-icon-wrap {
476
+ width: 40px;
477
+ height: 40px;
478
+ border-radius: var(--radius-sm);
479
+ background: var(--accent-dim);
480
+ color: var(--accent);
481
+ display: flex;
482
+ align-items: center;
483
+ justify-content: center;
484
+ transition: all 0.3s ease;
485
+ }
486
+
487
+ .stat-card:hover .stat-icon-wrap {
488
+ background: var(--accent-glow);
489
+ box-shadow: 0 0 20px var(--accent-glow);
490
+ }
491
+
492
+ .stat-label {
493
+ font-size: 12px;
494
+ font-weight: 500;
495
+ color: var(--text-secondary);
496
+ letter-spacing: 0.4px;
497
+ text-transform: uppercase;
498
+ margin-bottom: 4px;
499
+ }
500
+
501
+ .stat-value {
502
+ font-family: var(--font-display);
503
+ font-size: 28px;
504
+ font-weight: 700;
505
+ letter-spacing: -0.5px;
506
+ line-height: 1.1;
507
+ color: var(--text-primary);
508
+ }
509
+
510
+ /* ─── Secondary Stats ─── */
511
+ .stats-secondary {
512
+ display: grid;
513
+ grid-template-columns: repeat(3, 1fr);
514
+ gap: 12px;
515
+ margin-bottom: 28px;
516
+ }
517
+
518
+ .stat-pill {
519
+ display: flex;
520
+ align-items: center;
521
+ gap: 12px;
522
+ padding: 14px 18px;
523
+ background: var(--glass);
524
+ border: 1px solid var(--border);
525
+ border-radius: var(--radius-sm);
526
+ transition: all 0.25s ease;
527
+ }
528
+
529
+ .stat-pill:hover {
530
+ border-color: var(--border-hover);
531
+ background: var(--glass-hover);
532
+ }
533
+
534
+ .stat-pill-icon {
535
+ color: var(--text-tertiary);
536
+ display: flex;
537
+ align-items: center;
538
+ }
539
+
540
+ .stat-pill-content {
541
+ display: flex;
542
+ flex-direction: column;
543
+ }
544
+
545
+ .stat-pill-label {
546
+ font-size: 11px;
547
+ color: var(--text-tertiary);
548
+ letter-spacing: 0.3px;
549
+ text-transform: uppercase;
550
+ font-weight: 500;
551
+ }
552
+
553
+ .stat-pill-value {
554
+ font-family: var(--font-display);
555
+ font-size: 18px;
556
+ font-weight: 600;
557
+ color: var(--text-primary);
558
+ line-height: 1.2;
559
+ }
560
+
561
+ /* ─── Section ─── */
562
+ .section {
563
+ margin-bottom: 28px;
564
+ }
565
+
566
+ .section-header {
567
+ display: flex;
568
+ align-items: center;
569
+ gap: 12px;
570
+ margin-bottom: 14px;
571
+ }
572
+
573
+ .section-header h3 {
574
+ font-family: var(--font-display);
575
+ font-size: 16px;
576
+ font-weight: 600;
577
+ color: var(--text-primary);
578
+ letter-spacing: 0.2px;
579
+ }
580
+
581
+ .section-badge {
582
+ font-size: 10px;
583
+ font-weight: 600;
584
+ letter-spacing: 0.8px;
585
+ text-transform: uppercase;
586
+ color: var(--success);
587
+ background: rgba(52, 211, 153, 0.1);
588
+ padding: 2px 10px;
589
+ border-radius: 20px;
590
+ border: 1px solid rgba(52, 211, 153, 0.15);
591
+ }
592
+
593
+ /* ─── Table ─── */
594
+ .table-container {
595
+ background: var(--glass);
596
+ border: 1px solid var(--border);
597
+ border-radius: var(--radius-md);
598
+ overflow: hidden;
599
+ }
600
+
601
+ .data-table {
602
+ width: 100%;
603
+ border-collapse: collapse;
604
+ }
605
+
606
+ .data-table th,
607
+ .data-table td {
608
+ padding: 13px 20px;
609
+ text-align: left;
610
+ }
611
+
612
+ .data-table th {
613
+ font-size: 11px;
614
+ font-weight: 600;
615
+ color: var(--text-tertiary);
616
+ letter-spacing: 0.6px;
617
+ text-transform: uppercase;
618
+ background: rgba(255, 255, 255, 0.02);
619
+ border-bottom: 1px solid var(--border);
620
+ }
621
+
622
+ .data-table td {
623
+ font-size: 13.5px;
624
+ color: var(--text-secondary);
625
+ border-bottom: 1px solid var(--border);
626
+ transition: color 0.2s ease;
627
+ }
628
+
629
+ .data-table tr:last-child td {
630
+ border-bottom: none;
631
+ }
632
+
633
+ .data-table tbody tr {
634
+ transition: background 0.2s ease;
635
+ }
636
+
637
+ .data-table tbody tr:hover {
638
+ background: var(--glass-hover);
639
+ }
640
+
641
+ .data-table tbody tr:hover td {
642
+ color: var(--text-primary);
643
+ }
644
+
645
+ .data-table td:first-child {
646
+ color: var(--text-primary);
647
+ font-weight: 500;
648
+ }
649
+
650
+ /* Loading state */
651
+ .loading {
652
+ text-align: center;
653
+ color: var(--text-tertiary);
654
+ padding: 40px 20px !important;
655
+ display: flex;
656
+ flex-direction: column;
657
+ align-items: center;
658
+ gap: 12px;
659
+ font-size: 13px;
660
+ }
661
+
662
+ .loading-spinner {
663
+ width: 20px;
664
+ height: 20px;
665
+ border: 2px solid var(--border);
666
+ border-top-color: var(--purple);
667
+ border-radius: 50%;
668
+ animation: loadSpin 0.8s linear infinite;
669
+ }
670
+
671
+ @keyframes loadSpin {
672
+ to { transform: rotate(360deg); }
673
+ }
674
+
675
+ /* ─── Config ─── */
676
+ .config-grid {
677
+ display: grid;
678
+ grid-template-columns: repeat(2, 1fr);
679
+ gap: 16px;
680
+ }
681
+
682
+ .config-section {
683
+ background: var(--glass);
684
+ border: 1px solid var(--border);
685
+ border-radius: var(--radius-md);
686
+ padding: 24px;
687
+ transition: border-color 0.25s ease;
688
+ }
689
+
690
+ .config-section:hover {
691
+ border-color: var(--border-hover);
692
+ }
693
+
694
+ .config-section-header {
695
+ display: flex;
696
+ align-items: center;
697
+ gap: 12px;
698
+ margin-bottom: 20px;
699
+ padding-bottom: 14px;
700
+ border-bottom: 1px solid var(--border);
701
+ }
702
+
703
+ .config-section-icon {
704
+ width: 32px;
705
+ height: 32px;
706
+ border-radius: var(--radius-sm);
707
+ background: var(--purple-dim);
708
+ color: var(--purple);
709
+ display: flex;
710
+ align-items: center;
711
+ justify-content: center;
712
+ }
713
+
714
+ .config-section-header h3 {
715
+ font-family: var(--font-display);
716
+ font-size: 15px;
717
+ font-weight: 600;
718
+ color: var(--text-primary);
719
+ letter-spacing: 0.2px;
720
+ }
721
+
722
+ /* Form elements */
723
+ .form-group {
724
+ margin-bottom: 18px;
725
+ }
726
+
727
+ .form-group:last-child {
728
+ margin-bottom: 0;
729
+ }
730
+
731
+ .form-group > label:not(.toggle-label) {
732
+ display: block;
733
+ font-size: 12px;
734
+ font-weight: 500;
735
+ color: var(--text-tertiary);
736
+ margin-bottom: 8px;
737
+ letter-spacing: 0.4px;
738
+ text-transform: uppercase;
739
+ }
740
+
741
+ .input-wrap,
742
+ .select-wrap {
743
+ position: relative;
744
+ }
745
+
746
+ .input, .select {
747
+ width: 100%;
748
+ padding: 10px 14px;
749
+ background: var(--obsidian);
750
+ border: 1px solid var(--border);
751
+ border-radius: var(--radius-sm);
752
+ color: var(--text-primary);
753
+ font-family: var(--font-body);
754
+ font-size: 13.5px;
755
+ transition: all 0.25s ease;
756
+ outline: none;
757
+ }
758
+
759
+ .input::placeholder {
760
+ color: var(--text-ghost);
761
+ }
762
+
763
+ .input:focus, .select:focus {
764
+ border-color: var(--purple);
765
+ box-shadow: 0 0 0 3px var(--purple-glow), 0 0 20px var(--purple-glow);
766
+ }
767
+
768
+ .select {
769
+ appearance: none;
770
+ -webkit-appearance: none;
771
+ cursor: pointer;
772
+ padding-right: 36px;
773
+ }
774
+
775
+ .select-wrap {
776
+ position: relative;
777
+ }
778
+
779
+ .select-chevron {
780
+ position: absolute;
781
+ right: 12px;
782
+ top: 50%;
783
+ transform: translateY(-50%);
784
+ color: var(--text-tertiary);
785
+ pointer-events: none;
786
+ transition: color 0.2s ease;
787
+ }
788
+
789
+ .select-wrap:hover .select-chevron {
790
+ color: var(--text-secondary);
791
+ }
792
+
793
+ /* Toggle switches */
794
+ .toggle-label {
795
+ display: flex !important;
796
+ align-items: center;
797
+ gap: 14px;
798
+ cursor: pointer;
799
+ user-select: none;
800
+ padding: 6px 0;
801
+ }
802
+
803
+ .toggle-wrap {
804
+ position: relative;
805
+ display: inline-flex;
806
+ flex-shrink: 0;
807
+ }
808
+
809
+ .toggle-input {
810
+ position: absolute;
811
+ opacity: 0;
812
+ width: 0;
813
+ height: 0;
814
+ }
815
+
816
+ .toggle-track {
817
+ width: 40px;
818
+ height: 22px;
819
+ background: var(--slate-lighter);
820
+ border-radius: 11px;
821
+ position: relative;
822
+ transition: background 0.25s ease;
823
+ cursor: pointer;
824
+ }
825
+
826
+ .toggle-thumb {
827
+ position: absolute;
828
+ top: 3px;
829
+ left: 3px;
830
+ width: 16px;
831
+ height: 16px;
832
+ background: var(--text-secondary);
833
+ border-radius: 50%;
834
+ transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
835
+ }
836
+
837
+ .toggle-input:checked + .toggle-track {
838
+ background: var(--purple);
839
+ }
840
+
841
+ .toggle-input:checked + .toggle-track .toggle-thumb {
842
+ transform: translateX(18px);
843
+ background: #fff;
844
+ }
845
+
846
+ .toggle-text {
847
+ font-size: 14px;
848
+ color: var(--text-secondary);
849
+ transition: color 0.2s ease;
850
+ }
851
+
852
+ .toggle-label:hover .toggle-text {
853
+ color: var(--text-primary);
854
+ }
855
+
856
+ /* ─── Toast Notification ─── */
857
+ .toast {
858
+ position: fixed;
859
+ bottom: 30px;
860
+ left: 50%;
861
+ transform: translateX(-50%) translateY(80px);
862
+ padding: 12px 24px;
863
+ border-radius: var(--radius-sm);
864
+ font-family: var(--font-body);
865
+ font-size: 13px;
866
+ font-weight: 500;
867
+ z-index: 1000;
868
+ opacity: 0;
869
+ pointer-events: none;
870
+ transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
871
+ backdrop-filter: blur(12px);
872
+ -webkit-backdrop-filter: blur(12px);
873
+ }
874
+
875
+ .toast.show {
876
+ opacity: 1;
877
+ transform: translateX(-50%) translateY(0);
878
+ pointer-events: auto;
879
+ }
880
+
881
+ .toast.success {
882
+ background: rgba(52, 211, 153, 0.15);
883
+ border: 1px solid rgba(52, 211, 153, 0.2);
884
+ color: var(--success);
885
+ }
886
+
887
+ .toast.error {
888
+ background: rgba(248, 113, 113, 0.15);
889
+ border: 1px solid rgba(248, 113, 113, 0.2);
890
+ color: var(--danger);
891
+ }
892
+
893
+ /* ─── Page Load Stagger Animation ─── */
894
+ .stat-card {
895
+ opacity: 0;
896
+ animation: cardReveal 0.5s ease forwards;
897
+ }
898
+
899
+ .stat-card:nth-child(1) { animation-delay: 0.05s; }
900
+ .stat-card:nth-child(2) { animation-delay: 0.1s; }
901
+ .stat-card:nth-child(3) { animation-delay: 0.15s; }
902
+ .stat-card:nth-child(4) { animation-delay: 0.2s; }
903
+
904
+ .stat-pill {
905
+ opacity: 0;
906
+ animation: cardReveal 0.5s ease forwards;
907
+ }
908
+
909
+ .stat-pill:nth-child(1) { animation-delay: 0.25s; }
910
+ .stat-pill:nth-child(2) { animation-delay: 0.3s; }
911
+ .stat-pill:nth-child(3) { animation-delay: 0.35s; }
912
+
913
+ .section {
914
+ opacity: 0;
915
+ animation: cardReveal 0.5s ease forwards;
916
+ animation-delay: 0.4s;
917
+ }
918
+
919
+ .config-section {
920
+ opacity: 0;
921
+ animation: cardReveal 0.5s ease forwards;
922
+ }
923
+
924
+ .config-section:nth-child(1) { animation-delay: 0.05s; }
925
+ .config-section:nth-child(2) { animation-delay: 0.1s; }
926
+ .config-section:nth-child(3) { animation-delay: 0.15s; }
927
+ .config-section:nth-child(4) { animation-delay: 0.2s; }
928
+
929
+ @keyframes cardReveal {
930
+ from {
931
+ opacity: 0;
932
+ transform: translateY(12px);
933
+ }
934
+ to {
935
+ opacity: 1;
936
+ transform: translateY(0);
937
+ }
938
+ }
939
+
940
+ /* ─── Responsive ─── */
941
+ @media (max-width: 1100px) {
942
+ .stats-grid {
943
+ grid-template-columns: repeat(2, 1fr);
944
+ }
945
+ .config-grid {
946
+ grid-template-columns: 1fr;
947
+ }
948
+ }
949
+
950
+ @media (max-width: 768px) {
951
+ .sidebar {
952
+ width: 64px;
953
+ min-width: 64px;
954
+ }
955
+
956
+ .logo-text,
957
+ .nav-label,
958
+ .status-text,
959
+ .version-tag {
960
+ display: none;
961
+ }
962
+
963
+ .sidebar-header {
964
+ padding: 18px 0;
965
+ display: flex;
966
+ justify-content: center;
967
+ }
968
+
969
+ .nav-links li a {
970
+ justify-content: center;
971
+ padding: 14px;
972
+ }
973
+
974
+ .sidebar-footer {
975
+ justify-content: center;
976
+ padding: 16px 0;
977
+ }
978
+
979
+ .main-content {
980
+ padding: 20px 16px;
981
+ }
982
+
983
+ .stats-grid {
984
+ grid-template-columns: 1fr;
985
+ }
986
+
987
+ .stats-secondary {
988
+ grid-template-columns: 1fr;
989
+ }
990
+
991
+ .page-header {
992
+ flex-direction: column;
993
+ gap: 16px;
994
+ align-items: stretch;
995
+ }
996
+
997
+ .btn-refresh, .btn-save {
998
+ justify-content: center;
999
+ }
1000
+
1001
+ .stat-value {
1002
+ font-size: 24px;
1003
+ }
1004
+ }