arcticaurora commited on
Commit
df31cca
·
verified ·
1 Parent(s): 9a24b3e

Update static/css/app.css

Browse files
Files changed (1) hide show
  1. static/css/app.css +114 -551
static/css/app.css CHANGED
@@ -1,562 +1,125 @@
1
  /* static/css/app.css */
2
-
3
- /* --- ROOT VARIABLES & RESET --- */
4
  :root {
5
- --bg-primary: #111827;
6
- --bg-secondary: #1F2937;
7
- --bg-tertiary: #374151;
8
- --border-color: #4B5563;
9
- --text-primary: #F9FAFB;
10
- --text-secondary: #D1D5DB;
11
- --text-muted: #9CA3AF;
12
- --accent-primary: #06B6D4; /* Cyan */
13
- --accent-secondary: #8B5CF6; /* Violet */
14
- --accent-success: #10B981;
15
- --accent-warning: #F59E0B;
16
- --accent-danger: #EF4444;
17
- --font-sans: 'Inter', sans-serif;
18
- --font-mono: 'JetBrains Mono', monospace;
19
- --sidebar-width: 240px;
20
- --header-height: 60px;
21
- --border-radius: 8px;
22
- --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
23
- }
24
-
25
- * {
26
- margin: 0;
27
- padding: 0;
28
- box-sizing: border-box;
29
- }
30
-
31
- body {
32
- font-family: var(--font-sans);
33
- background-color: var(--bg-primary);
34
- color: var(--text-primary);
35
- font-size: 16px;
36
- line-height: 1.5;
37
- overflow-x: hidden;
38
- }
39
-
40
- /* --- MAIN LAYOUT --- */
41
- .app-container {
42
- display: flex;
43
- height: 100vh;
44
- }
45
-
46
- .sidebar {
47
- width: var(--sidebar-width);
48
- background-color: var(--bg-primary);
49
- border-right: 1px solid var(--border-color);
50
- display: flex;
51
- flex-direction: column;
52
- padding: 1.5rem 1rem;
53
- transition: width 0.3s ease;
54
- }
55
-
56
- .sidebar-header {
57
- font-size: 1.5rem;
58
- font-weight: 700;
59
- color: var(--accent-primary);
60
- display: flex;
61
- align-items: center;
62
- gap: 0.75rem;
63
- margin-bottom: 2rem;
64
- }
65
-
66
- .sidebar-nav {
67
- list-style: none;
68
- display: flex;
69
- flex-direction: column;
70
- gap: 0.5rem;
71
- }
72
-
73
- .nav-link {
74
- display: flex;
75
- align-items: center;
76
- gap: 0.75rem;
77
- padding: 0.75rem 1rem;
78
- border-radius: var(--border-radius);
79
- text-decoration: none;
80
- color: var(--text-secondary);
81
- font-weight: 500;
82
- transition: background-color 0.2s ease, color 0.2s ease;
83
- }
84
-
85
- .nav-link i {
86
- width: 20px;
87
- text-align: center;
88
- }
89
-
90
- .nav-link:hover {
91
- background-color: var(--bg-secondary);
92
- color: var(--text-primary);
93
- }
94
-
95
- .nav-link.active {
96
- background-color: var(--accent-primary);
97
- color: var(--bg-primary);
98
- font-weight: 600;
99
- }
100
-
101
- .main-content {
102
- flex: 1;
103
- display: flex;
104
- flex-direction: column;
105
- overflow-y: auto;
106
- }
107
-
108
- .main-header {
109
- height: var(--header-height);
110
- display: flex;
111
- align-items: center;
112
- justify-content: space-between;
113
- padding: 0 2rem;
114
- border-bottom: 1px solid var(--border-color);
115
- background-color: var(--bg-primary);
116
- position: sticky;
117
- top: 0;
118
- z-index: 10;
119
- }
120
-
121
- .main-header h1 {
122
- font-size: 1.25rem;
123
- font-weight: 600;
124
- }
125
-
126
- .page-content {
127
- padding: 2rem;
128
- flex: 1;
129
- }
130
-
131
- .page {
132
- display: none;
133
- }
134
-
135
- .page.active {
136
- display: block;
137
- animation: fadeIn 0.5s ease-in-out;
138
- }
139
-
140
- @keyframes fadeIn {
141
- from { opacity: 0; transform: translateY(10px); }
142
- to { opacity: 1; transform: translateY(0); }
143
- }
144
-
145
- /* --- STATUS BADGE --- */
146
- .status-badge {
147
- display: flex;
148
- align-items: center;
149
- gap: 0.5rem;
150
- padding: 0.375rem 0.75rem;
151
- border-radius: 999px;
152
- font-size: 0.875rem;
153
- font-weight: 500;
154
- }
155
- .status-dot {
156
- width: 10px;
157
- height: 10px;
158
- border-radius: 50%;
159
- }
160
- .status-badge.idle { background-color: rgba(156, 163, 175, 0.2); color: var(--text-muted); }
161
- .status-badge.idle .status-dot { background-color: var(--text-muted); }
162
- .status-badge.running { background-color: rgba(6, 182, 212, 0.2); color: var(--accent-primary); }
163
- .status-badge.running .status-dot { background-color: var(--accent-primary); animation: pulse 1.5s infinite; }
164
- .status-badge.success { background-color: rgba(16, 185, 129, 0.2); color: var(--accent-success); }
165
- .status-badge.success .status-dot { background-color: var(--accent-success); }
166
- .status-badge.error { background-color: rgba(239, 68, 68, 0.2); color: var(--accent-danger); }
167
- .status-badge.error .status-dot { background-color: var(--accent-danger); }
168
-
169
- @keyframes pulse {
170
- 0% { box-shadow: 0 0 0 0 var(--accent-primary); }
171
- 70% { box-shadow: 0 0 0 8px rgba(6, 182, 212, 0); }
172
- 100% { box-shadow: 0 0 0 0 rgba(6, 182, 212, 0); }
173
- }
174
-
175
-
176
- /* --- DASHBOARD --- */
177
- .dashboard-grid {
178
- display: grid;
179
- grid-template-columns: repeat(2, 1fr);
180
- gap: 1.5rem;
181
- }
182
- .dashboard-card {
183
- background-color: var(--bg-secondary);
184
- border: 1px solid var(--border-color);
185
- border-radius: var(--border-radius);
186
- padding: 1.5rem;
187
- }
188
- .dashboard-card.full-width {
189
- grid-column: 1 / -1;
190
- }
191
- .dashboard-card h4 {
192
- font-size: 1rem;
193
- font-weight: 500;
194
- color: var(--text-secondary);
195
- margin-bottom: 1rem;
196
- }
197
- .status-highlight p {
198
- font-size: 1.125rem;
199
- color: var(--text-primary);
200
- margin-bottom: 1.5rem;
201
- }
202
- .quick-actions {
203
- display: flex;
204
- gap: 1rem;
205
- }
206
- #last-operation-summary .op-status {
207
- font-size: 1.25rem;
208
- font-weight: 600;
209
- margin-bottom: 0.5rem;
210
- }
211
- #last-operation-summary .op-status.success { color: var(--accent-success); }
212
- #last-operation-summary .op-status.error { color: var(--accent-danger); }
213
- #last-operation-summary .op-details {
214
- display: grid;
215
- grid-template-columns: auto 1fr;
216
- gap: 0.25rem 1rem;
217
- color: var(--text-muted);
218
- font-size: 0.875rem;
219
- }
220
- .mini-log-feed {
221
- font-family: var(--font-mono);
222
- font-size: 0.875rem;
223
- max-height: 200px;
224
- overflow-y: auto;
225
- }
226
- .mini-log-entry {
227
- display: flex;
228
- gap: 1rem;
229
- padding: 0.25rem 0;
230
- color: var(--text-secondary);
231
- }
232
- .mini-log-entry .timestamp { color: var(--text-muted); }
233
- .mini-log-entry .level-info { color: var(--accent-primary); }
234
- .mini-log-entry .level-success { color: var(--accent-success); }
235
- .mini-log-entry .level-warning { color: var(--accent-warning); }
236
- .mini-log-entry .level-error { color: var(--accent-danger); }
237
-
238
- /* --- FORMS & CONNECTIONS --- */
239
- .form-card {
240
- background-color: var(--bg-secondary);
241
- border: 1px solid var(--border-color);
242
- border-radius: var(--border-radius);
243
- padding: 2rem;
244
- }
245
- .connection-grid, .form-grid {
246
- display: grid;
247
- grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
248
- gap: 1.5rem;
249
- }
250
- .form-card h3 {
251
- margin-bottom: 1.5rem;
252
- font-weight: 600;
253
- display: flex;
254
- align-items: center;
255
- gap: 0.5rem;
256
- }
257
- .form-group {
258
- margin-bottom: 1.25rem;
259
- }
260
- .form-group label {
261
- display: block;
262
- font-weight: 500;
263
- margin-bottom: 0.5rem;
264
- color: var(--text-secondary);
265
- }
266
- .form-control {
267
- width: 100%;
268
- padding: 0.75rem 1rem;
269
- background-color: var(--bg-primary);
270
- border: 1px solid var(--border-color);
271
- border-radius: var(--border-radius);
272
- color: var(--text-primary);
273
- font-family: var(--font-sans);
274
- font-size: 1rem;
275
- transition: border-color 0.2s ease, box-shadow 0.2s ease;
276
- }
277
- .form-control:focus {
278
- outline: none;
279
- border-color: var(--accent-primary);
280
- box-shadow: 0 0 0 3px rgba(6, 182, 212, 0.3);
281
- }
282
- .input-group {
283
- display: flex;
284
- }
285
- .input-group .form-control {
286
- border-right: none;
287
- border-top-right-radius: 0;
288
- border-bottom-right-radius: 0;
289
- }
290
- .input-group .btn-icon {
291
- border-top-left-radius: 0;
292
- border-bottom-left-radius: 0;
293
- border: 1px solid var(--border-color);
294
- border-left: 0;
295
- background-color: var(--bg-primary);
296
- }
297
- .connection-details {
298
- margin-top: 1.5rem;
299
- padding-top: 1.5rem;
300
- border-top: 1px solid var(--border-color);
301
- font-size: 0.875rem;
302
- }
303
- .connection-details p { margin-bottom: 0.5rem; }
304
- .connection-details .success { color: var(--accent-success); }
305
- .connection-details .error { color: var(--accent-danger); }
306
- .checkbox-group { display: flex; flex-direction: column; gap: 0.75rem; }
307
- .checkbox-group label { display: flex; align-items: center; gap: 0.5rem; cursor: pointer; }
308
- .form-actions { margin-top: 1.5rem; }
309
-
310
- /* --- BUTTONS --- */
311
- .btn {
312
- display: inline-flex;
313
- align-items: center;
314
- justify-content: center;
315
- gap: 0.5rem;
316
- padding: 0.75rem 1.5rem;
317
- font-size: 1rem;
318
- font-weight: 600;
319
- border-radius: var(--border-radius);
320
- border: none;
321
- cursor: pointer;
322
- transition: all 0.2s ease;
323
- text-decoration: none;
324
- }
325
  .btn:disabled { opacity: 0.5; cursor: not-allowed; }
326
  .btn-primary { background-color: var(--accent-primary); color: var(--bg-primary); }
327
  .btn-primary:hover:not(:disabled) { filter: brightness(1.1); }
328
- .btn-secondary { background-color: var(--accent-secondary); color: var(--text-primary); }
329
- .btn-secondary:hover:not(:disabled) { filter: brightness(1.1); }
330
  .btn-danger { background-color: var(--accent-danger); color: var(--text-primary); }
331
  .btn-danger:hover:not(:disabled) { filter: brightness(1.1); }
332
- .btn-icon {
333
- padding: 0.75rem;
334
- width: auto;
335
- line-height: 1;
336
- }
337
-
338
- /* --- PROGRESS VIEW --- */
339
- .progress-card {
340
- background-color: var(--bg-secondary);
341
- border: 1px solid var(--border-color);
342
- border-radius: var(--border-radius);
343
- padding: 2rem;
344
- }
345
- .progress-header {
346
- display: flex;
347
- justify-content: space-between;
348
- align-items: center;
349
- margin-bottom: 1.5rem;
350
- }
351
- .progress-header h3 { display: flex; align-items: center; gap: 0.75rem; }
352
- .progress-stats {
353
- display: grid;
354
- grid-template-columns: repeat(3, 1fr);
355
- gap: 1.5rem;
356
- margin-bottom: 2rem;
357
- text-align: center;
358
- }
359
- .stat-label {
360
- display: block;
361
- color: var(--text-muted);
362
- font-size: 0.875rem;
363
- margin-bottom: 0.25rem;
364
- }
365
- .stat-value {
366
- font-size: 1.5rem;
367
- font-weight: 600;
368
- font-family: var(--font-mono);
369
- white-space: nowrap;
370
- overflow: hidden;
371
- text-overflow: ellipsis;
372
- }
373
- .progress-tracker {
374
- margin-bottom: 1.5rem;
375
- }
376
- .progress-tracker:last-child { margin-bottom: 0; }
377
- .progress-tracker label {
378
- display: block;
379
- margin-bottom: 0.5rem;
380
- font-weight: 500;
381
- color: var(--text-secondary);
382
- }
383
- .progress-bar-container {
384
- height: 12px;
385
- background-color: var(--bg-primary);
386
- border-radius: 999px;
387
- overflow: hidden;
388
- }
389
- .progress-bar {
390
- height: 100%;
391
- width: 0%;
392
- background: linear-gradient(90deg, var(--accent-secondary), var(--accent-primary));
393
- border-radius: 999px;
394
- transition: width 0.5s ease-out;
395
- }
396
- .progress-bar.secondary {
397
- background: var(--accent-primary);
398
- }
399
- .progress-subtext {
400
- display: block;
401
- margin-top: 0.5rem;
402
- font-size: 0.875rem;
403
- color: var(--text-muted);
404
- font-family: var(--font-mono);
405
- }
406
 
407
- /* --- LOGS --- */
408
- .log-container {
409
- background-color: var(--bg-secondary);
410
- border: 1px solid var(--border-color);
411
- border-radius: var(--border-radius);
412
- height: 70vh;
413
- display: flex;
414
- flex-direction: column;
415
- }
416
- .log-header {
417
- padding: 1rem 1.5rem;
418
- border-bottom: 1px solid var(--border-color);
419
- display: flex;
420
- justify-content: space-between;
421
- align-items: center;
422
- }
423
- .log-controls {
424
- display: flex;
425
- align-items: center;
426
- gap: 0.75rem;
427
- }
428
- .log-output {
429
- flex: 1;
430
- padding: 1rem 1.5rem;
431
- font-family: var(--font-mono);
432
- font-size: 0.875rem;
433
- overflow-y: auto;
434
- white-space: pre-wrap;
435
- word-break: break-word;
436
- }
437
- .log-entry {
438
- display: flex;
439
- gap: 1rem;
440
- line-height: 1.6;
441
- }
 
 
442
  .log-entry .timestamp { color: var(--text-muted); }
443
  .log-entry .level { font-weight: 600; }
444
- .log-entry .level-info { color: var(--accent-primary); }
445
- .log-entry .level-success { color: var(--accent-success); }
446
- .log-entry .level-warning { color: var(--accent-warning); }
447
- .log-entry .level-error { color: var(--accent-danger); }
448
-
449
- /* --- TOGGLE SWITCH --- */
450
- .toggle-switch {
451
- position: relative;
452
- display: inline-block;
453
- width: 40px;
454
- height: 22px;
455
- }
456
- .toggle-switch input { opacity: 0; width: 0; height: 0; }
457
- .slider {
458
- position: absolute;
459
- cursor: pointer;
460
- top: 0;
461
- left: 0;
462
- right: 0;
463
- bottom: 0;
464
- background-color: var(--bg-tertiary);
465
- transition: .4s;
466
- border-radius: 22px;
467
- }
468
- .slider:before {
469
- position: absolute;
470
- content: "";
471
- height: 16px;
472
- width: 16px;
473
- left: 3px;
474
- bottom: 3px;
475
- background-color: white;
476
- transition: .4s;
477
- border-radius: 50%;
478
- }
479
- input:checked + .slider { background-color: var(--accent-primary); }
480
- input:checked + .slider:before { transform: translateX(18px); }
481
-
482
- /* --- MODAL --- */
483
- .modal-backdrop {
484
- position: fixed;
485
- top: 0;
486
- left: 0;
487
- width: 100%;
488
- height: 100%;
489
- background-color: rgba(0, 0, 0, 0.6);
490
- backdrop-filter: blur(5px);
491
- display: flex;
492
- align-items: center;
493
- justify-content: center;
494
- z-index: 1000;
495
- opacity: 0;
496
- transition: opacity 0.3s ease;
497
- }
498
- .modal-backdrop:not(.hidden) { opacity: 1; }
499
- .modal {
500
- background-color: var(--bg-secondary);
501
- border-radius: var(--border-radius);
502
- width: 90%;
503
- max-width: 500px;
504
- box-shadow: var(--shadow-md);
505
- transform: scale(0.95);
506
- transition: transform 0.3s ease;
507
- }
508
- .modal-backdrop:not(.hidden) .modal { transform: scale(1); }
509
- .modal-header {
510
- padding: 1.5rem;
511
- border-bottom: 1px solid var(--border-color);
512
- display: flex;
513
- justify-content: space-between;
514
- align-items: center;
515
- }
516
- .modal-header h3 { font-size: 1.25rem; }
517
  .modal-body { padding: 1.5rem; }
518
- .modal-footer {
519
- padding: 1.5rem;
520
- border-top: 1px solid var(--border-color);
521
- display: flex;
522
- justify-content: flex-end;
523
- gap: 1rem;
524
- }
525
-
526
- /* --- TOAST NOTIFICATIONS --- */
527
- #toast-container {
528
- position: fixed;
529
- bottom: 1.5rem;
530
- right: 1.5rem;
531
- z-index: 2000;
532
- display: flex;
533
- flex-direction: column;
534
- gap: 1rem;
535
- }
536
- .toast {
537
- background-color: var(--bg-secondary);
538
- border-left: 4px solid var(--accent-primary);
539
- border-radius: var(--border-radius);
540
- padding: 1rem 1.5rem;
541
- box-shadow: var(--shadow-md);
542
- display: flex;
543
- align-items: center;
544
- gap: 1rem;
545
- min-width: 300px;
546
- animation: slideIn 0.3s ease-out;
547
- }
548
- .toast.success { border-color: var(--accent-success); }
549
- .toast.error { border-color: var(--accent-danger); }
550
- .toast-icon { font-size: 1.25rem; }
551
- .toast-body h4 { font-weight: 600; margin-bottom: 0.25rem; }
552
- .toast-body p { font-size: 0.875rem; color: var(--text-secondary); }
553
-
554
- @keyframes slideIn {
555
- from { transform: translateX(100%); opacity: 0; }
556
- to { transform: translateX(0); opacity: 1; }
557
- }
558
-
559
- /* --- UTILITIES --- */
560
- .hidden { display: none !important; }
561
- .text-muted { color: var(--text-muted); }
562
- .text-center { text-align: center; }
 
1
  /* static/css/app.css */
 
 
2
  :root {
3
+ --bg-primary: #030712; --bg-secondary: #111827; --bg-tertiary: #1f2937;
4
+ --border-color: #374151; --text-primary: #f9fafb; --text-secondary: #d1d5db;
5
+ --text-muted: #9ca3af; --accent-primary: #06b6d4; --accent-secondary: #8b5cf6;
6
+ --accent-success: #10b981; --accent-warning: #f59e0b; --accent-danger: #ef4444;
7
+ --font-sans: 'Inter', sans-serif; --font-mono: 'JetBrains Mono', monospace;
8
+ --sidebar-width: 250px; --header-height: 60px; --border-radius: 0.5rem;
9
+ --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
10
+ }
11
+
12
+ * { margin: 0; padding: 0; box-sizing: border-box; }
13
+ body { font-family: var(--font-sans); background-color: var(--bg-primary); color: var(--text-primary); font-size: 16px; line-height: 1.5; }
14
+ .app-container { display: flex; height: 100vh; }
15
+
16
+ /* --- Layout --- */
17
+ .sidebar { width: var(--sidebar-width); background-color: var(--bg-primary); border-right: 1px solid var(--border-color); padding: 1rem; display: flex; flex-direction: column; transition: transform 0.3s ease; }
18
+ .sidebar-header { font-size: 1.5rem; font-weight: 700; color: var(--accent-primary); display: flex; align-items: center; gap: 0.75rem; margin-bottom: 2rem; padding: 0.5rem; }
19
+ .sidebar-nav { list-style: none; display: flex; flex-direction: column; gap: 0.5rem; }
20
+ .nav-link { display: flex; align-items: center; gap: 1rem; padding: 0.75rem 1rem; border-radius: var(--border-radius); text-decoration: none; color: var(--text-secondary); font-weight: 500; transition: all 0.2s ease; }
21
+ .nav-link i { width: 20px; text-align: center; }
22
+ .nav-link:hover { background-color: var(--bg-secondary); color: var(--text-primary); }
23
+ .nav-link.active { background: linear-gradient(90deg, var(--accent-primary), var(--accent-secondary)); color: var(--text-primary); font-weight: 600; }
24
+ .main-content { flex: 1; display: flex; flex-direction: column; overflow-y: auto; }
25
+ .main-header { height: var(--header-height); display: flex; align-items: center; justify-content: space-between; padding: 0 1.5rem; border-bottom: 1px solid var(--border-color); background-color: var(--bg-primary); position: sticky; top: 0; z-index: 10; }
26
+ .main-header h1 { font-size: 1.25rem; font-weight: 600; }
27
+ .page-content { padding: 1.5rem; flex: 1; }
28
+ .page { display: none; }
29
+ .page.active { display: block; animation: fadeIn 0.5s ease; }
30
+ @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }
31
+ .menu-toggle { display: none; background: none; border: none; color: var(--text-primary); font-size: 1.25rem; cursor: pointer; }
32
+
33
+ /* --- Responsive Design --- */
34
+ @media (max-width: 1024px) {
35
+ .sidebar { position: fixed; top: 0; left: 0; height: 100%; z-index: 100; transform: translateX(-100%); }
36
+ .sidebar.open { transform: translateX(0); box-shadow: var(--shadow-lg); }
37
+ .menu-toggle { display: block; }
38
+ .grid-container { grid-template-columns: 1fr; }
39
+ }
40
+
41
+ /* --- Components --- */
42
+ .card { background-color: var(--bg-secondary); border: 1px solid var(--border-color); border-radius: var(--border-radius); padding: 1.5rem; }
43
+ .card h3 { margin-bottom: 1.5rem; font-weight: 600; display: flex; align-items: center; gap: 0.75rem; }
44
+ .grid-container { display: grid; grid-template-columns: repeat(auto-fit, minmax(400px, 1fr)); gap: 1.5rem; }
45
+ .form-group { margin-bottom: 1.25rem; }
46
+ .form-group label { display: block; font-weight: 500; margin-bottom: 0.5rem; color: var(--text-secondary); }
47
+ .form-control { width: 100%; padding: 0.75rem 1rem; background-color: var(--bg-primary); border: 1px solid var(--border-color); border-radius: var(--border-radius); color: var(--text-primary); font-size: 1rem; transition: all 0.2s ease; }
48
+ .form-control:focus { outline: none; border-color: var(--accent-primary); box-shadow: 0 0 0 3px rgba(6, 182, 212, 0.3); }
49
+ .btn { display: inline-flex; align-items: center; justify-content: center; gap: 0.5rem; padding: 0.625rem 1.25rem; font-size: 0.875rem; font-weight: 600; border-radius: var(--border-radius); border: none; cursor: pointer; transition: all 0.2s ease; text-decoration: none; }
50
+ .btn-lg { padding: 0.75rem 1.5rem; font-size: 1rem; }
51
+ .btn-sm { padding: 0.25rem 0.75rem; font-size: 0.75rem; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
52
  .btn:disabled { opacity: 0.5; cursor: not-allowed; }
53
  .btn-primary { background-color: var(--accent-primary); color: var(--bg-primary); }
54
  .btn-primary:hover:not(:disabled) { filter: brightness(1.1); }
55
+ .btn-secondary { background-color: var(--bg-tertiary); color: var(--text-primary); }
56
+ .btn-secondary:hover:not(:disabled) { background-color: var(--border-color); }
57
  .btn-danger { background-color: var(--accent-danger); color: var(--text-primary); }
58
  .btn-danger:hover:not(:disabled) { filter: brightness(1.1); }
59
+ .btn-group { display: flex; gap: 0.5rem; }
60
+ .btn-group .btn { background-color: var(--bg-tertiary); color: var(--text-secondary); }
61
+ .btn-group .btn.active { background-color: var(--accent-primary); color: var(--bg-primary); }
62
+ .command-preview { font-family: var(--font-mono); font-size: 0.8rem; background-color: var(--bg-primary); padding: 1rem; border-radius: var(--border-radius); margin-top: 1.5rem; white-space: pre-wrap; word-break: break-all; }
63
+ .command-preview .keyword { color: var(--accent-primary); }
64
+ .command-preview .flag { color: var(--accent-warning); }
65
+ .command-preview .value { color: var(--text-primary); }
66
+ .checkbox-group { display: flex; flex-direction: column; gap: 0.75rem; }
67
+ .checkbox-group label { display: flex; align-items: center; gap: 0.5rem; cursor: pointer; }
68
+ .form-actions { margin-top: 1.5rem; display: flex; justify-content: flex-end; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
69
 
70
+ /* Status Badge */
71
+ .status-badge { display: flex; align-items: center; gap: 0.5rem; padding: 0.375rem 0.75rem; border-radius: 999px; font-size: 0.875rem; font-weight: 500; }
72
+ .status-dot { width: 10px; height: 10px; border-radius: 50%; }
73
+ .status-badge.idle { background-color: rgba(156, 163, 175, 0.2); color: var(--text-muted); }
74
+ .status-badge.idle .status-dot { background-color: var(--text-muted); }
75
+ .status-badge.running { background-color: rgba(6, 182, 212, 0.2); color: var(--accent-primary); }
76
+ .status-badge.running .status-dot { background-color: var(--accent-primary); animation: pulse 1.5s infinite; }
77
+ @keyframes pulse { 0% { box-shadow: 0 0 0 0 var(--accent-primary); } 70% { box-shadow: 0 0 0 8px rgba(6, 182, 212, 0); } 100% { box-shadow: 0 0 0 0 rgba(6, 182, 212, 0); } }
78
+
79
+ /* Connection Status Card */
80
+ .connection-status-card { margin-top: 1.5rem; padding-top: 1.5rem; border-top: 1px solid var(--border-color); }
81
+ .connection-status-card .status-header { font-size: 1.125rem; font-weight: 600; margin-bottom: 1rem; display: flex; align-items: center; gap: 0.5rem; }
82
+ .connection-status-card .status-header.success { color: var(--accent-success); }
83
+ .connection-status-card .status-header.error { color: var(--accent-danger); }
84
+ .connection-status-card .details-grid { display: grid; grid-template-columns: auto 1fr; gap: 0.5rem 1.5rem; font-size: 0.875rem; }
85
+ .connection-status-card .details-grid strong { color: var(--text-secondary); }
86
+
87
+ /* Monitoring View */
88
+ .monitoring-card { background-color: var(--bg-secondary); border: 1px solid var(--border-color); border-radius: var(--border-radius); padding: 1.5rem; }
89
+ .monitoring-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 1.5rem; }
90
+ .monitoring-header h3 { display: flex; align-items: center; gap: 0.75rem; font-size: 1.25rem; }
91
+ .monitoring-stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 1.5rem; margin-bottom: 2rem; text-align: center; }
92
+ .stat-label { display: block; color: var(--text-muted); font-size: 0.875rem; }
93
+ .stat-value { font-size: 1.5rem; font-weight: 600; font-family: var(--font-mono); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
94
+ .progress-tracker { margin-bottom: 1.5rem; }
95
+ .progress-tracker label { display: block; margin-bottom: 0.5rem; font-weight: 500; color: var(--text-secondary); }
96
+ .progress-bar-container { height: 1rem; background-color: var(--bg-primary); border-radius: 999px; overflow: hidden; border: 1px solid var(--border-color); }
97
+ .progress-bar { height: 100%; width: 0%; background: linear-gradient(90deg, var(--accent-secondary), var(--accent-primary)); border-radius: 999px; transition: width 0.5s ease-out; }
98
+ .progress-subtext { display: block; margin-top: 0.5rem; font-size: 0.875rem; color: var(--text-muted); font-family: var(--font-mono); }
99
+ .monitoring-footer { margin-top: 1.5rem; display: flex; justify-content: flex-end; gap: 1rem; }
100
+
101
+ /* Log Explorer */
102
+ .log-explorer { display: flex; flex-direction: column; height: 80vh; padding: 0; }
103
+ .log-header { padding: 1rem 1.5rem; border-bottom: 1px solid var(--border-color); display: flex; flex-wrap: wrap; justify-content: space-between; align-items: center; gap: 1rem; }
104
+ .log-controls { display: flex; flex-wrap: wrap; align-items: center; gap: 1rem; }
105
+ .log-output { flex: 1; padding: 1rem 1.5rem; font-family: var(--font-mono); font-size: 0.875rem; overflow-y: auto; }
106
+ .log-entry { display: flex; gap: 1rem; line-height: 1.6; }
107
  .log-entry .timestamp { color: var(--text-muted); }
108
  .log-entry .level { font-weight: 600; }
109
+ .log-entry .level-info { color: var(--accent-primary); } .log-entry .level-success { color: var(--accent-success); }
110
+ .log-entry .level-warning { color: var(--accent-warning); } .log-entry .level-error { color: var(--accent-danger); }
111
+ .log-footer { padding: 1rem 1.5rem; border-top: 1px solid var(--border-color); display: flex; justify-content: space-between; align-items: center; }
112
+ .autoscroll-toggle { display: flex; align-items: center; gap: 0.5rem; }
113
+ .log-actions { display: flex; gap: 1rem; }
114
+
115
+ /* Modal & Toast */
116
+ .modal-backdrop { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.6); backdrop-filter: blur(5px); display: flex; align-items: center; justify-content: center; z-index: 1000; opacity: 0; transition: opacity 0.3s ease; pointer-events: none; }
117
+ .modal-backdrop:not(.hidden) { opacity: 1; pointer-events: all; }
118
+ .modal { background-color: var(--bg-secondary); border-radius: var(--border-radius); width: 90%; max-width: 500px; box-shadow: var(--shadow-lg); }
119
+ .modal-header { padding: 1.5rem; border-bottom: 1px solid var(--border-color); }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
120
  .modal-body { padding: 1.5rem; }
121
+ .modal-footer { padding: 1rem 1.5rem; border-top: 1px solid var(--border-color); display: flex; justify-content: flex-end; gap: 1rem; }
122
+ #toast-container { position: fixed; bottom: 1.5rem; right: 1.5rem; z-index: 2000; display: flex; flex-direction: column; gap: 1rem; }
123
+ .toast { background-color: var(--bg-tertiary); border-left: 4px solid var(--accent-primary); border-radius: var(--border-radius); padding: 1rem 1.5rem; box-shadow: var(--shadow-lg); display: flex; align-items: center; gap: 1rem; min-width: 300px; animation: slideIn 0.3s ease-out; }
124
+ .toast.success { border-color: var(--accent-success); } .toast.error { border-color: var(--accent-danger); }
125
+ @keyframes slideIn { from { transform: translateX(100%); opacity: 0; } to { transform: translateX(0); opacity: 1; } }