arcticaurora commited on
Commit
a16d403
·
verified ·
1 Parent(s): 02d41e6

Create static/css/app.css

Browse files
Files changed (1) hide show
  1. static/css/app.css +562 -0
static/css/app.css ADDED
@@ -0,0 +1,562 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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; }