@nexus-ai-nexoralabs/cli 0.1.3 → 0.1.4

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 (133) hide show
  1. package/.env.example +16 -16
  2. package/LICENSE +21 -21
  3. package/README.md +135 -106
  4. package/dist/api/index.d.ts +4 -0
  5. package/dist/api/index.d.ts.map +1 -1
  6. package/dist/api/index.js +9 -3
  7. package/dist/api/index.js.map +1 -1
  8. package/dist/chat/chatService.d.ts.map +1 -1
  9. package/dist/chat/chatService.js +22 -3
  10. package/dist/chat/chatService.js.map +1 -1
  11. package/dist/chat/conversationService.d.ts +7 -1
  12. package/dist/chat/conversationService.d.ts.map +1 -1
  13. package/dist/chat/conversationService.js +48 -15
  14. package/dist/chat/conversationService.js.map +1 -1
  15. package/dist/cli/agentRunner.d.ts.map +1 -1
  16. package/dist/cli/agentRunner.js +88 -8
  17. package/dist/cli/agentRunner.js.map +1 -1
  18. package/dist/cli/chatRunner.d.ts +65 -0
  19. package/dist/cli/chatRunner.d.ts.map +1 -0
  20. package/dist/cli/chatRunner.js +289 -0
  21. package/dist/cli/chatRunner.js.map +1 -0
  22. package/dist/cli/index.d.ts +2 -0
  23. package/dist/cli/index.d.ts.map +1 -1
  24. package/dist/cli/index.js +2 -0
  25. package/dist/cli/index.js.map +1 -1
  26. package/dist/cli/inputEngine.d.ts +10 -0
  27. package/dist/cli/inputEngine.d.ts.map +1 -1
  28. package/dist/cli/inputEngine.js +28 -1
  29. package/dist/cli/inputEngine.js.map +1 -1
  30. package/dist/cli/main.d.ts +4 -0
  31. package/dist/cli/main.d.ts.map +1 -1
  32. package/dist/cli/main.js +89 -25
  33. package/dist/cli/main.js.map +1 -1
  34. package/dist/cli/uiFormatters.d.ts +11 -1
  35. package/dist/cli/uiFormatters.d.ts.map +1 -1
  36. package/dist/cli/uiFormatters.js +253 -15
  37. package/dist/cli/uiFormatters.js.map +1 -1
  38. package/dist/intelligence/modelGateway.d.ts +1 -0
  39. package/dist/intelligence/modelGateway.d.ts.map +1 -1
  40. package/dist/intelligence/modelGateway.js +63 -6
  41. package/dist/intelligence/modelGateway.js.map +1 -1
  42. package/dist/intelligence/modelRegistry.d.ts +2 -2
  43. package/dist/intelligence/modelRegistry.d.ts.map +1 -1
  44. package/dist/intelligence/modelRegistry.js +72 -31
  45. package/dist/intelligence/modelRegistry.js.map +1 -1
  46. package/dist/intelligence/modelRouter.d.ts.map +1 -1
  47. package/dist/intelligence/modelRouter.js +62 -16
  48. package/dist/intelligence/modelRouter.js.map +1 -1
  49. package/dist/intelligence/providers/embeddedInferenceProvider.d.ts.map +1 -1
  50. package/dist/intelligence/providers/embeddedInferenceProvider.js +2224 -6
  51. package/dist/intelligence/providers/embeddedInferenceProvider.js.map +1 -1
  52. package/dist/intelligence/runtime/runtimeManager.d.ts +5 -0
  53. package/dist/intelligence/runtime/runtimeManager.d.ts.map +1 -1
  54. package/dist/intelligence/runtime/runtimeManager.js +64 -4
  55. package/dist/intelligence/runtime/runtimeManager.js.map +1 -1
  56. package/dist/orchestration/agentExecutionService.d.ts.map +1 -1
  57. package/dist/orchestration/agentExecutionService.js +22 -0
  58. package/dist/orchestration/agentExecutionService.js.map +1 -1
  59. package/dist/orchestration/agentTaskService.d.ts +24 -10
  60. package/dist/orchestration/agentTaskService.d.ts.map +1 -1
  61. package/dist/orchestration/agentTaskService.js +76 -13
  62. package/dist/orchestration/agentTaskService.js.map +1 -1
  63. package/dist/orchestration/codingAgentService.d.ts.map +1 -1
  64. package/dist/orchestration/codingAgentService.js +2 -0
  65. package/dist/orchestration/codingAgentService.js.map +1 -1
  66. package/dist/orchestration/goalCompletionVerifier.d.ts +9 -0
  67. package/dist/orchestration/goalCompletionVerifier.d.ts.map +1 -1
  68. package/dist/orchestration/goalCompletionVerifier.js +131 -9
  69. package/dist/orchestration/goalCompletionVerifier.js.map +1 -1
  70. package/dist/orchestration/index.d.ts +16 -2
  71. package/dist/orchestration/index.d.ts.map +1 -1
  72. package/dist/orchestration/index.js +20 -4
  73. package/dist/orchestration/index.js.map +1 -1
  74. package/dist/orchestration/placeholderDetector.d.ts +74 -0
  75. package/dist/orchestration/placeholderDetector.d.ts.map +1 -0
  76. package/dist/orchestration/placeholderDetector.js +741 -0
  77. package/dist/orchestration/placeholderDetector.js.map +1 -0
  78. package/dist/orchestration/planner.d.ts.map +1 -1
  79. package/dist/orchestration/planner.js +94 -55
  80. package/dist/orchestration/planner.js.map +1 -1
  81. package/dist/orchestration/projectOrchestrator.d.ts +63 -0
  82. package/dist/orchestration/projectOrchestrator.d.ts.map +1 -0
  83. package/dist/orchestration/projectOrchestrator.js +555 -0
  84. package/dist/orchestration/projectOrchestrator.js.map +1 -0
  85. package/dist/orchestration/taskDecompositionService.d.ts +36 -0
  86. package/dist/orchestration/taskDecompositionService.d.ts.map +1 -0
  87. package/dist/orchestration/taskDecompositionService.js +367 -0
  88. package/dist/orchestration/taskDecompositionService.js.map +1 -0
  89. package/dist/orchestration/taskDecompositionTypes.d.ts +62 -0
  90. package/dist/orchestration/taskDecompositionTypes.d.ts.map +1 -0
  91. package/dist/orchestration/taskDecompositionTypes.js +5 -0
  92. package/dist/orchestration/taskDecompositionTypes.js.map +1 -0
  93. package/dist/preview/previewServer.d.ts.map +1 -1
  94. package/dist/preview/previewServer.js +28 -7
  95. package/dist/preview/previewServer.js.map +1 -1
  96. package/dist/preview/previewService.d.ts +32 -3
  97. package/dist/preview/previewService.d.ts.map +1 -1
  98. package/dist/preview/previewService.js +370 -108
  99. package/dist/preview/previewService.js.map +1 -1
  100. package/dist/preview/previewTypes.d.ts +1 -1
  101. package/dist/preview/previewTypes.d.ts.map +1 -1
  102. package/dist/storage/index.d.ts +2 -0
  103. package/dist/storage/index.d.ts.map +1 -1
  104. package/dist/storage/index.js +3 -0
  105. package/dist/storage/index.js.map +1 -1
  106. package/dist/storage/migration.d.ts.map +1 -1
  107. package/dist/storage/migration.js +79 -0
  108. package/dist/storage/migration.js.map +1 -1
  109. package/dist/storage/repositories/agentTaskRepository.d.ts +13 -0
  110. package/dist/storage/repositories/agentTaskRepository.d.ts.map +1 -1
  111. package/dist/storage/repositories/agentTaskRepository.js +87 -25
  112. package/dist/storage/repositories/agentTaskRepository.js.map +1 -1
  113. package/dist/storage/repositories/conversationRepository.d.ts +5 -1
  114. package/dist/storage/repositories/conversationRepository.d.ts.map +1 -1
  115. package/dist/storage/repositories/conversationRepository.js +69 -0
  116. package/dist/storage/repositories/conversationRepository.js.map +1 -1
  117. package/dist/storage/repositories/messageRepository.d.ts +3 -0
  118. package/dist/storage/repositories/messageRepository.d.ts.map +1 -1
  119. package/dist/storage/repositories/messageRepository.js +29 -0
  120. package/dist/storage/repositories/messageRepository.js.map +1 -1
  121. package/dist/storage/repositories/taskArtifactRepository.d.ts +19 -0
  122. package/dist/storage/repositories/taskArtifactRepository.d.ts.map +1 -0
  123. package/dist/storage/repositories/taskArtifactRepository.js +82 -0
  124. package/dist/storage/repositories/taskArtifactRepository.js.map +1 -0
  125. package/dist/storage/repositories/types.d.ts +32 -0
  126. package/dist/storage/repositories/types.d.ts.map +1 -1
  127. package/dist/tools/adapters/filesystemAdapter.d.ts.map +1 -1
  128. package/dist/tools/adapters/filesystemAdapter.js +8 -1
  129. package/dist/tools/adapters/filesystemAdapter.js.map +1 -1
  130. package/dist/ui/public/app.js +777 -777
  131. package/dist/ui/public/index.html +117 -117
  132. package/dist/ui/public/styles.css +413 -413
  133. package/package.json +64 -63
@@ -1,413 +1,413 @@
1
- /* NEXUS AI — Desktop UI Dark-First Design System */
2
-
3
- :root {
4
- --bg-dark: #0b0f19;
5
- --bg-surface: #111827;
6
- --bg-card: #1f2937;
7
- --bg-card-hover: #374151;
8
- --border: #374151;
9
- --border-focus: #38bdf8;
10
-
11
- --text-main: #f9fafb;
12
- --text-muted: #9ca3af;
13
- --text-dim: #6b7280;
14
-
15
- --accent: #38bdf8;
16
- --accent-glow: rgba(56, 189, 248, 0.15);
17
- --primary: #6366f1;
18
- --success: #10b981;
19
- --warning: #f59e0b;
20
- --error: #ef4444;
21
-
22
- --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
23
- --font-mono: 'JetBrains Mono', 'Fira Code', Consolas, monospace;
24
- }
25
-
26
- * {
27
- box-sizing: border-box;
28
- margin: 0;
29
- padding: 0;
30
- }
31
-
32
- body {
33
- background-color: var(--bg-dark);
34
- color: var(--text-main);
35
- font-family: var(--font-sans);
36
- font-size: 14px;
37
- line-height: 1.5;
38
- overflow: hidden;
39
- height: 100vh;
40
- }
41
-
42
- /* Layout */
43
- .app-container {
44
- display: flex;
45
- flex-direction: column;
46
- height: 100vh;
47
- }
48
-
49
- .top-header {
50
- height: 52px;
51
- background-color: var(--bg-surface);
52
- border-bottom: 1px solid var(--border);
53
- display: flex;
54
- align-items: center;
55
- justify-content: space-between;
56
- padding: 0 20px;
57
- user-select: none;
58
- }
59
-
60
- .brand {
61
- display: flex;
62
- align-items: center;
63
- gap: 10px;
64
- }
65
-
66
- .brand-icon {
67
- font-size: 18px;
68
- color: var(--accent);
69
- }
70
-
71
- .brand-name {
72
- font-weight: 700;
73
- font-size: 16px;
74
- letter-spacing: 0.5px;
75
- }
76
-
77
- .brand-badge {
78
- background-color: rgba(56, 189, 248, 0.1);
79
- color: var(--accent);
80
- border: 1px solid rgba(56, 189, 248, 0.3);
81
- font-size: 10px;
82
- font-weight: 600;
83
- padding: 2px 6px;
84
- border-radius: 4px;
85
- }
86
-
87
- .header-status {
88
- display: flex;
89
- align-items: center;
90
- gap: 14px;
91
- }
92
-
93
- .status-chip {
94
- font-size: 12px;
95
- color: var(--text-muted);
96
- background-color: var(--bg-dark);
97
- border: 1px solid var(--border);
98
- padding: 4px 10px;
99
- border-radius: 6px;
100
- display: flex;
101
- align-items: center;
102
- gap: 6px;
103
- }
104
-
105
- .dot {
106
- width: 8px;
107
- height: 8px;
108
- border-radius: 50%;
109
- display: inline-block;
110
- }
111
-
112
- .dot.green { background-color: var(--success); box-shadow: 0 0 6px var(--success); }
113
- .dot.yellow { background-color: var(--warning); }
114
- .dot.red { background-color: var(--error); }
115
- .dot.gray { background-color: var(--text-dim); }
116
-
117
- .app-body {
118
- display: flex;
119
- flex: 1;
120
- overflow: hidden;
121
- }
122
-
123
- /* Sidebar */
124
- .sidebar {
125
- width: 240px;
126
- background-color: var(--bg-surface);
127
- border-right: 1px solid var(--border);
128
- display: flex;
129
- flex-direction: column;
130
- padding: 16px 12px;
131
- overflow-y: auto;
132
- user-select: none;
133
- }
134
-
135
- .nav-group {
136
- margin-bottom: 20px;
137
- }
138
-
139
- .nav-group-title {
140
- font-size: 10px;
141
- font-weight: 700;
142
- color: var(--text-dim);
143
- letter-spacing: 0.8px;
144
- padding: 0 8px 6px 8px;
145
- }
146
-
147
- .nav-item {
148
- display: flex;
149
- align-items: center;
150
- gap: 10px;
151
- width: 100%;
152
- padding: 8px 10px;
153
- border: none;
154
- background: transparent;
155
- color: var(--text-muted);
156
- font-size: 13px;
157
- font-weight: 500;
158
- border-radius: 6px;
159
- cursor: pointer;
160
- text-align: left;
161
- transition: all 0.15s ease;
162
- }
163
-
164
- .nav-item:hover {
165
- background-color: var(--bg-card);
166
- color: var(--text-main);
167
- }
168
-
169
- .nav-item.active {
170
- background-color: rgba(56, 189, 248, 0.12);
171
- color: var(--accent);
172
- font-weight: 600;
173
- }
174
-
175
- .nav-badge {
176
- margin-left: auto;
177
- background-color: var(--warning);
178
- color: #000;
179
- font-weight: 700;
180
- font-size: 11px;
181
- padding: 1px 6px;
182
- border-radius: 10px;
183
- }
184
-
185
- .sidebar-footer {
186
- margin-top: auto;
187
- padding-top: 12px;
188
- }
189
-
190
- /* Main Content Area */
191
- .main-content {
192
- flex: 1;
193
- padding: 24px 32px;
194
- overflow-y: auto;
195
- background-color: var(--bg-dark);
196
- }
197
-
198
- /* Views & Cards */
199
- .view-header {
200
- margin-bottom: 24px;
201
- }
202
-
203
- .view-title {
204
- font-size: 22px;
205
- font-weight: 700;
206
- color: var(--text-main);
207
- }
208
-
209
- .view-subtitle {
210
- font-size: 13px;
211
- color: var(--text-muted);
212
- }
213
-
214
- .grid-2 { display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px; }
215
- .grid-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
216
- .grid-4 { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; }
217
-
218
- .card {
219
- background-color: var(--bg-card);
220
- border: 1px solid var(--border);
221
- border-radius: 8px;
222
- padding: 18px;
223
- }
224
-
225
- .card-title {
226
- font-size: 12px;
227
- font-weight: 700;
228
- color: var(--text-muted);
229
- text-transform: uppercase;
230
- letter-spacing: 0.5px;
231
- margin-bottom: 8px;
232
- }
233
-
234
- .card-value {
235
- font-size: 20px;
236
- font-weight: 700;
237
- color: var(--text-main);
238
- }
239
-
240
- /* Buttons */
241
- button { font-family: var(--font-sans); }
242
-
243
- .btn-primary {
244
- background-color: var(--primary);
245
- color: #fff;
246
- border: none;
247
- padding: 8px 16px;
248
- border-radius: 6px;
249
- font-weight: 600;
250
- cursor: pointer;
251
- transition: opacity 0.15s ease;
252
- }
253
-
254
- .btn-primary:hover { opacity: 0.9; }
255
-
256
- .btn-secondary {
257
- background-color: var(--bg-card);
258
- color: var(--text-main);
259
- border: 1px solid var(--border);
260
- padding: 8px 16px;
261
- border-radius: 6px;
262
- font-weight: 500;
263
- cursor: pointer;
264
- }
265
-
266
- .btn-secondary:hover { background-color: var(--bg-card-hover); }
267
-
268
- .btn-danger {
269
- background-color: var(--error);
270
- color: #fff;
271
- border: none;
272
- padding: 8px 16px;
273
- border-radius: 6px;
274
- font-weight: 600;
275
- cursor: pointer;
276
- }
277
-
278
- .full-width { width: 100%; }
279
-
280
- /* Form inputs */
281
- input, textarea, select {
282
- width: 100%;
283
- background-color: var(--bg-surface);
284
- border: 1px solid var(--border);
285
- color: var(--text-main);
286
- padding: 10px 14px;
287
- border-radius: 6px;
288
- font-family: var(--font-sans);
289
- font-size: 13px;
290
- outline: none;
291
- }
292
-
293
- input:focus, textarea:focus, select:focus {
294
- border-color: var(--border-focus);
295
- }
296
-
297
- /* Code & Pre */
298
- pre, code {
299
- font-family: var(--font-mono);
300
- font-size: 12px;
301
- }
302
-
303
- .code-box {
304
- background-color: var(--bg-surface);
305
- border: 1px solid var(--border);
306
- border-radius: 6px;
307
- padding: 14px;
308
- overflow-x: auto;
309
- max-height: 400px;
310
- }
311
-
312
- /* Modal */
313
- .modal-overlay {
314
- position: fixed;
315
- top: 0; left: 0; right: 0; bottom: 0;
316
- background-color: rgba(0,0,0,0.7);
317
- display: flex;
318
- align-items: center;
319
- justify-content: center;
320
- z-index: 1000;
321
- }
322
-
323
- .modal-card {
324
- background-color: var(--bg-surface);
325
- border: 1px solid var(--border);
326
- border-radius: 12px;
327
- width: 600px;
328
- max-width: 90vw;
329
- max-height: 85vh;
330
- display: flex;
331
- flex-direction: column;
332
- overflow: hidden;
333
- box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.5);
334
- }
335
-
336
- .modal-header {
337
- padding: 16px 20px;
338
- border-bottom: 1px solid var(--border);
339
- display: flex;
340
- justify-content: space-between;
341
- align-items: center;
342
- }
343
-
344
- .modal-body {
345
- padding: 20px;
346
- overflow-y: auto;
347
- flex: 1;
348
- }
349
-
350
- .modal-footer {
351
- padding: 16px 20px;
352
- border-top: 1px solid var(--border);
353
- display: flex;
354
- justify-content: flex-end;
355
- gap: 10px;
356
- }
357
-
358
- .btn-close {
359
- background: transparent;
360
- border: none;
361
- color: var(--text-muted);
362
- font-size: 16px;
363
- cursor: pointer;
364
- }
365
-
366
- .hidden { display: none !important; }
367
-
368
- /* Timeline & Flow */
369
- .flow-steps {
370
- display: flex;
371
- gap: 8px;
372
- margin: 16px 0;
373
- }
374
-
375
- .flow-step {
376
- flex: 1;
377
- background-color: var(--bg-card);
378
- border: 1px solid var(--border);
379
- padding: 8px;
380
- text-align: center;
381
- border-radius: 6px;
382
- font-size: 11px;
383
- font-weight: 600;
384
- color: var(--text-muted);
385
- }
386
-
387
- .flow-step.active {
388
- background-color: rgba(56, 189, 248, 0.15);
389
- border-color: var(--accent);
390
- color: var(--accent);
391
- }
392
-
393
- .flow-step.done {
394
- background-color: rgba(16, 185, 129, 0.15);
395
- border-color: var(--success);
396
- color: var(--success);
397
- }
398
-
399
- /* Spinner */
400
- .spinner {
401
- border: 3px solid var(--border);
402
- border-top: 3px solid var(--accent);
403
- border-radius: 50%;
404
- width: 24px;
405
- height: 24px;
406
- animation: spin 0.8s linear infinite;
407
- margin: 20px auto;
408
- }
409
-
410
- @keyframes spin {
411
- 0% { transform: rotate(0deg); }
412
- 100% { transform: rotate(360deg); }
413
- }
1
+ /* NEXUS AI — Desktop UI Dark-First Design System */
2
+
3
+ :root {
4
+ --bg-dark: #0b0f19;
5
+ --bg-surface: #111827;
6
+ --bg-card: #1f2937;
7
+ --bg-card-hover: #374151;
8
+ --border: #374151;
9
+ --border-focus: #38bdf8;
10
+
11
+ --text-main: #f9fafb;
12
+ --text-muted: #9ca3af;
13
+ --text-dim: #6b7280;
14
+
15
+ --accent: #38bdf8;
16
+ --accent-glow: rgba(56, 189, 248, 0.15);
17
+ --primary: #6366f1;
18
+ --success: #10b981;
19
+ --warning: #f59e0b;
20
+ --error: #ef4444;
21
+
22
+ --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
23
+ --font-mono: 'JetBrains Mono', 'Fira Code', Consolas, monospace;
24
+ }
25
+
26
+ * {
27
+ box-sizing: border-box;
28
+ margin: 0;
29
+ padding: 0;
30
+ }
31
+
32
+ body {
33
+ background-color: var(--bg-dark);
34
+ color: var(--text-main);
35
+ font-family: var(--font-sans);
36
+ font-size: 14px;
37
+ line-height: 1.5;
38
+ overflow: hidden;
39
+ height: 100vh;
40
+ }
41
+
42
+ /* Layout */
43
+ .app-container {
44
+ display: flex;
45
+ flex-direction: column;
46
+ height: 100vh;
47
+ }
48
+
49
+ .top-header {
50
+ height: 52px;
51
+ background-color: var(--bg-surface);
52
+ border-bottom: 1px solid var(--border);
53
+ display: flex;
54
+ align-items: center;
55
+ justify-content: space-between;
56
+ padding: 0 20px;
57
+ user-select: none;
58
+ }
59
+
60
+ .brand {
61
+ display: flex;
62
+ align-items: center;
63
+ gap: 10px;
64
+ }
65
+
66
+ .brand-icon {
67
+ font-size: 18px;
68
+ color: var(--accent);
69
+ }
70
+
71
+ .brand-name {
72
+ font-weight: 700;
73
+ font-size: 16px;
74
+ letter-spacing: 0.5px;
75
+ }
76
+
77
+ .brand-badge {
78
+ background-color: rgba(56, 189, 248, 0.1);
79
+ color: var(--accent);
80
+ border: 1px solid rgba(56, 189, 248, 0.3);
81
+ font-size: 10px;
82
+ font-weight: 600;
83
+ padding: 2px 6px;
84
+ border-radius: 4px;
85
+ }
86
+
87
+ .header-status {
88
+ display: flex;
89
+ align-items: center;
90
+ gap: 14px;
91
+ }
92
+
93
+ .status-chip {
94
+ font-size: 12px;
95
+ color: var(--text-muted);
96
+ background-color: var(--bg-dark);
97
+ border: 1px solid var(--border);
98
+ padding: 4px 10px;
99
+ border-radius: 6px;
100
+ display: flex;
101
+ align-items: center;
102
+ gap: 6px;
103
+ }
104
+
105
+ .dot {
106
+ width: 8px;
107
+ height: 8px;
108
+ border-radius: 50%;
109
+ display: inline-block;
110
+ }
111
+
112
+ .dot.green { background-color: var(--success); box-shadow: 0 0 6px var(--success); }
113
+ .dot.yellow { background-color: var(--warning); }
114
+ .dot.red { background-color: var(--error); }
115
+ .dot.gray { background-color: var(--text-dim); }
116
+
117
+ .app-body {
118
+ display: flex;
119
+ flex: 1;
120
+ overflow: hidden;
121
+ }
122
+
123
+ /* Sidebar */
124
+ .sidebar {
125
+ width: 240px;
126
+ background-color: var(--bg-surface);
127
+ border-right: 1px solid var(--border);
128
+ display: flex;
129
+ flex-direction: column;
130
+ padding: 16px 12px;
131
+ overflow-y: auto;
132
+ user-select: none;
133
+ }
134
+
135
+ .nav-group {
136
+ margin-bottom: 20px;
137
+ }
138
+
139
+ .nav-group-title {
140
+ font-size: 10px;
141
+ font-weight: 700;
142
+ color: var(--text-dim);
143
+ letter-spacing: 0.8px;
144
+ padding: 0 8px 6px 8px;
145
+ }
146
+
147
+ .nav-item {
148
+ display: flex;
149
+ align-items: center;
150
+ gap: 10px;
151
+ width: 100%;
152
+ padding: 8px 10px;
153
+ border: none;
154
+ background: transparent;
155
+ color: var(--text-muted);
156
+ font-size: 13px;
157
+ font-weight: 500;
158
+ border-radius: 6px;
159
+ cursor: pointer;
160
+ text-align: left;
161
+ transition: all 0.15s ease;
162
+ }
163
+
164
+ .nav-item:hover {
165
+ background-color: var(--bg-card);
166
+ color: var(--text-main);
167
+ }
168
+
169
+ .nav-item.active {
170
+ background-color: rgba(56, 189, 248, 0.12);
171
+ color: var(--accent);
172
+ font-weight: 600;
173
+ }
174
+
175
+ .nav-badge {
176
+ margin-left: auto;
177
+ background-color: var(--warning);
178
+ color: #000;
179
+ font-weight: 700;
180
+ font-size: 11px;
181
+ padding: 1px 6px;
182
+ border-radius: 10px;
183
+ }
184
+
185
+ .sidebar-footer {
186
+ margin-top: auto;
187
+ padding-top: 12px;
188
+ }
189
+
190
+ /* Main Content Area */
191
+ .main-content {
192
+ flex: 1;
193
+ padding: 24px 32px;
194
+ overflow-y: auto;
195
+ background-color: var(--bg-dark);
196
+ }
197
+
198
+ /* Views & Cards */
199
+ .view-header {
200
+ margin-bottom: 24px;
201
+ }
202
+
203
+ .view-title {
204
+ font-size: 22px;
205
+ font-weight: 700;
206
+ color: var(--text-main);
207
+ }
208
+
209
+ .view-subtitle {
210
+ font-size: 13px;
211
+ color: var(--text-muted);
212
+ }
213
+
214
+ .grid-2 { display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px; }
215
+ .grid-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
216
+ .grid-4 { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; }
217
+
218
+ .card {
219
+ background-color: var(--bg-card);
220
+ border: 1px solid var(--border);
221
+ border-radius: 8px;
222
+ padding: 18px;
223
+ }
224
+
225
+ .card-title {
226
+ font-size: 12px;
227
+ font-weight: 700;
228
+ color: var(--text-muted);
229
+ text-transform: uppercase;
230
+ letter-spacing: 0.5px;
231
+ margin-bottom: 8px;
232
+ }
233
+
234
+ .card-value {
235
+ font-size: 20px;
236
+ font-weight: 700;
237
+ color: var(--text-main);
238
+ }
239
+
240
+ /* Buttons */
241
+ button { font-family: var(--font-sans); }
242
+
243
+ .btn-primary {
244
+ background-color: var(--primary);
245
+ color: #fff;
246
+ border: none;
247
+ padding: 8px 16px;
248
+ border-radius: 6px;
249
+ font-weight: 600;
250
+ cursor: pointer;
251
+ transition: opacity 0.15s ease;
252
+ }
253
+
254
+ .btn-primary:hover { opacity: 0.9; }
255
+
256
+ .btn-secondary {
257
+ background-color: var(--bg-card);
258
+ color: var(--text-main);
259
+ border: 1px solid var(--border);
260
+ padding: 8px 16px;
261
+ border-radius: 6px;
262
+ font-weight: 500;
263
+ cursor: pointer;
264
+ }
265
+
266
+ .btn-secondary:hover { background-color: var(--bg-card-hover); }
267
+
268
+ .btn-danger {
269
+ background-color: var(--error);
270
+ color: #fff;
271
+ border: none;
272
+ padding: 8px 16px;
273
+ border-radius: 6px;
274
+ font-weight: 600;
275
+ cursor: pointer;
276
+ }
277
+
278
+ .full-width { width: 100%; }
279
+
280
+ /* Form inputs */
281
+ input, textarea, select {
282
+ width: 100%;
283
+ background-color: var(--bg-surface);
284
+ border: 1px solid var(--border);
285
+ color: var(--text-main);
286
+ padding: 10px 14px;
287
+ border-radius: 6px;
288
+ font-family: var(--font-sans);
289
+ font-size: 13px;
290
+ outline: none;
291
+ }
292
+
293
+ input:focus, textarea:focus, select:focus {
294
+ border-color: var(--border-focus);
295
+ }
296
+
297
+ /* Code & Pre */
298
+ pre, code {
299
+ font-family: var(--font-mono);
300
+ font-size: 12px;
301
+ }
302
+
303
+ .code-box {
304
+ background-color: var(--bg-surface);
305
+ border: 1px solid var(--border);
306
+ border-radius: 6px;
307
+ padding: 14px;
308
+ overflow-x: auto;
309
+ max-height: 400px;
310
+ }
311
+
312
+ /* Modal */
313
+ .modal-overlay {
314
+ position: fixed;
315
+ top: 0; left: 0; right: 0; bottom: 0;
316
+ background-color: rgba(0,0,0,0.7);
317
+ display: flex;
318
+ align-items: center;
319
+ justify-content: center;
320
+ z-index: 1000;
321
+ }
322
+
323
+ .modal-card {
324
+ background-color: var(--bg-surface);
325
+ border: 1px solid var(--border);
326
+ border-radius: 12px;
327
+ width: 600px;
328
+ max-width: 90vw;
329
+ max-height: 85vh;
330
+ display: flex;
331
+ flex-direction: column;
332
+ overflow: hidden;
333
+ box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.5);
334
+ }
335
+
336
+ .modal-header {
337
+ padding: 16px 20px;
338
+ border-bottom: 1px solid var(--border);
339
+ display: flex;
340
+ justify-content: space-between;
341
+ align-items: center;
342
+ }
343
+
344
+ .modal-body {
345
+ padding: 20px;
346
+ overflow-y: auto;
347
+ flex: 1;
348
+ }
349
+
350
+ .modal-footer {
351
+ padding: 16px 20px;
352
+ border-top: 1px solid var(--border);
353
+ display: flex;
354
+ justify-content: flex-end;
355
+ gap: 10px;
356
+ }
357
+
358
+ .btn-close {
359
+ background: transparent;
360
+ border: none;
361
+ color: var(--text-muted);
362
+ font-size: 16px;
363
+ cursor: pointer;
364
+ }
365
+
366
+ .hidden { display: none !important; }
367
+
368
+ /* Timeline & Flow */
369
+ .flow-steps {
370
+ display: flex;
371
+ gap: 8px;
372
+ margin: 16px 0;
373
+ }
374
+
375
+ .flow-step {
376
+ flex: 1;
377
+ background-color: var(--bg-card);
378
+ border: 1px solid var(--border);
379
+ padding: 8px;
380
+ text-align: center;
381
+ border-radius: 6px;
382
+ font-size: 11px;
383
+ font-weight: 600;
384
+ color: var(--text-muted);
385
+ }
386
+
387
+ .flow-step.active {
388
+ background-color: rgba(56, 189, 248, 0.15);
389
+ border-color: var(--accent);
390
+ color: var(--accent);
391
+ }
392
+
393
+ .flow-step.done {
394
+ background-color: rgba(16, 185, 129, 0.15);
395
+ border-color: var(--success);
396
+ color: var(--success);
397
+ }
398
+
399
+ /* Spinner */
400
+ .spinner {
401
+ border: 3px solid var(--border);
402
+ border-top: 3px solid var(--accent);
403
+ border-radius: 50%;
404
+ width: 24px;
405
+ height: 24px;
406
+ animation: spin 0.8s linear infinite;
407
+ margin: 20px auto;
408
+ }
409
+
410
+ @keyframes spin {
411
+ 0% { transform: rotate(0deg); }
412
+ 100% { transform: rotate(360deg); }
413
+ }