bgrun 3.3.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.
@@ -0,0 +1,1135 @@
1
+ /* BGR Dashboard — Design System v2 */
2
+
3
+ /* ─── Design Tokens ─── */
4
+ :root {
5
+ --bg-primary: #07070d;
6
+ --bg-secondary: #0e0e16;
7
+ --bg-card: rgba(16, 16, 24, 0.85);
8
+ --bg-glass: rgba(255, 255, 255, 0.03);
9
+ --bg-hover: rgba(255, 255, 255, 0.04);
10
+ --border-glass: rgba(255, 255, 255, 0.07);
11
+ --border-hover: rgba(255, 255, 255, 0.12);
12
+ --accent-primary: #6366f1;
13
+ --accent-secondary: #8b5cf6;
14
+ --accent-gradient: linear-gradient(135deg, #6366f1 0%, #8b5cf6 50%, #a855f7 100%);
15
+ --success: #22c55e;
16
+ --success-soft: #16a34a;
17
+ --success-bg: rgba(34, 197, 94, 0.12);
18
+ --danger: #ef4444;
19
+ --danger-bg: rgba(239, 68, 68, 0.12);
20
+ --warning: #f59e0b;
21
+ --warning-bg: rgba(245, 158, 11, 0.12);
22
+ --info: #38bdf8;
23
+ --info-bg: rgba(56, 189, 248, 0.12);
24
+ --text-primary: #f1f5f9;
25
+ --text-secondary: #94a3b8;
26
+ --text-muted: #64748b;
27
+ --shadow-glow: 0 0 80px rgba(99, 102, 241, 0.1);
28
+ --shadow-card: 0 1px 3px rgba(0, 0, 0, 0.3), 0 4px 20px rgba(0, 0, 0, 0.2);
29
+ --font-mono: 'JetBrains Mono', 'Fira Code', 'SF Mono', Monaco, 'Cascadia Code', monospace;
30
+ --radius-sm: 8px;
31
+ --radius-md: 12px;
32
+ --radius-lg: 16px;
33
+ --radius-xl: 20px;
34
+ --transition-fast: 0.15s cubic-bezier(0.4, 0, 0.2, 1);
35
+ --transition-smooth: 0.3s cubic-bezier(0.4, 0, 0.2, 1);
36
+ }
37
+
38
+ * {
39
+ margin: 0;
40
+ padding: 0;
41
+ box-sizing: border-box;
42
+ }
43
+
44
+ html {
45
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
46
+ background: var(--bg-primary);
47
+ color: var(--text-primary);
48
+ line-height: 1.5;
49
+ -webkit-font-smoothing: antialiased;
50
+ }
51
+
52
+ body {
53
+ min-height: 100vh;
54
+ overflow-x: hidden;
55
+ }
56
+
57
+ /* Ambient background */
58
+ body::before {
59
+ content: '';
60
+ position: fixed;
61
+ inset: 0;
62
+ background:
63
+ radial-gradient(ellipse 600px 400px at 15% 10%, rgba(99, 102, 241, 0.08) 0%, transparent 100%),
64
+ radial-gradient(ellipse 500px 500px at 85% 80%, rgba(139, 92, 246, 0.06) 0%, transparent 100%);
65
+ pointer-events: none;
66
+ z-index: 0;
67
+ }
68
+
69
+ .container {
70
+ max-width: 1400px;
71
+ margin: 0 auto;
72
+ padding: 1.75rem 2rem;
73
+ position: relative;
74
+ z-index: 1;
75
+ }
76
+
77
+ /* ─── Header ─── */
78
+ .header {
79
+ display: flex;
80
+ justify-content: space-between;
81
+ align-items: center;
82
+ margin-bottom: 2rem;
83
+ padding-bottom: 1.25rem;
84
+ border-bottom: 1px solid var(--border-glass);
85
+ }
86
+
87
+ .logo {
88
+ display: flex;
89
+ align-items: center;
90
+ gap: 0.875rem;
91
+ }
92
+
93
+ .logo-icon {
94
+ width: 44px;
95
+ height: 44px;
96
+ background: var(--accent-gradient);
97
+ border-radius: 12px;
98
+ display: flex;
99
+ align-items: center;
100
+ justify-content: center;
101
+ font-size: 1.25rem;
102
+ box-shadow: 0 4px 20px rgba(99, 102, 241, 0.25);
103
+ }
104
+
105
+ .logo h1 {
106
+ font-size: 1.5rem;
107
+ font-weight: 700;
108
+ background: var(--accent-gradient);
109
+ -webkit-background-clip: text;
110
+ -webkit-text-fill-color: transparent;
111
+ background-clip: text;
112
+ letter-spacing: -0.02em;
113
+ }
114
+
115
+ .logo-subtitle {
116
+ color: var(--text-muted);
117
+ font-size: 0.8rem;
118
+ font-weight: 400;
119
+ letter-spacing: 0.01em;
120
+ }
121
+
122
+ .header-actions {
123
+ display: flex;
124
+ gap: 0.75rem;
125
+ align-items: center;
126
+ }
127
+
128
+ .version-badge {
129
+ padding: 0.375rem 0.875rem;
130
+ background: var(--bg-glass);
131
+ border: 1px solid var(--border-glass);
132
+ border-radius: 9999px;
133
+ font-size: 0.7rem;
134
+ color: var(--text-muted);
135
+ font-family: var(--font-mono);
136
+ letter-spacing: 0.02em;
137
+ }
138
+
139
+ /* ─── Stats Grid ─── */
140
+ .stats-grid {
141
+ display: grid;
142
+ grid-template-columns: repeat(3, 1fr);
143
+ gap: 1rem;
144
+ margin-bottom: 2rem;
145
+ }
146
+
147
+ .stat-card {
148
+ background: var(--bg-card);
149
+ border: 1px solid var(--border-glass);
150
+ border-radius: var(--radius-lg);
151
+ padding: 1.25rem 1.5rem;
152
+ backdrop-filter: blur(20px);
153
+ transition: all var(--transition-smooth);
154
+ position: relative;
155
+ overflow: hidden;
156
+ }
157
+
158
+ .stat-card::after {
159
+ content: '';
160
+ position: absolute;
161
+ top: 0;
162
+ right: 0;
163
+ width: 100px;
164
+ height: 100px;
165
+ border-radius: 50%;
166
+ opacity: 0.04;
167
+ transform: translate(30%, -30%);
168
+ pointer-events: none;
169
+ }
170
+
171
+ .stat-card:hover {
172
+ border-color: var(--border-hover);
173
+ transform: translateY(-1px);
174
+ }
175
+
176
+ .stat-card.running {
177
+ border-left: 3px solid var(--success);
178
+ }
179
+
180
+ .stat-card.running::after {
181
+ background: var(--success);
182
+ opacity: 0.06;
183
+ }
184
+
185
+ .stat-card.stopped {
186
+ border-left: 3px solid var(--danger);
187
+ }
188
+
189
+ .stat-card.stopped::after {
190
+ background: var(--danger);
191
+ opacity: 0.06;
192
+ }
193
+
194
+ .stat-label {
195
+ font-size: 0.7rem;
196
+ text-transform: uppercase;
197
+ letter-spacing: 0.1em;
198
+ color: var(--text-muted);
199
+ margin-bottom: 0.375rem;
200
+ font-weight: 500;
201
+ }
202
+
203
+ .stat-value {
204
+ font-size: 1.875rem;
205
+ font-weight: 700;
206
+ line-height: 1.1;
207
+ letter-spacing: -0.02em;
208
+ }
209
+
210
+ .stat-card:not(.running):not(.stopped) .stat-value {
211
+ background: var(--accent-gradient);
212
+ -webkit-background-clip: text;
213
+ -webkit-text-fill-color: transparent;
214
+ background-clip: text;
215
+ }
216
+
217
+ .stat-card.running .stat-value {
218
+ color: var(--success);
219
+ }
220
+
221
+ .stat-card.stopped .stat-value {
222
+ color: var(--danger);
223
+ }
224
+
225
+ /* ─── Toolbar ─── */
226
+ .toolbar {
227
+ display: flex;
228
+ justify-content: space-between;
229
+ align-items: center;
230
+ margin-bottom: 1rem;
231
+ gap: 1rem;
232
+ }
233
+
234
+ .toolbar-left {
235
+ display: flex;
236
+ align-items: center;
237
+ gap: 1rem;
238
+ flex: 1;
239
+ }
240
+
241
+ .toolbar h2 {
242
+ font-size: 1.125rem;
243
+ font-weight: 600;
244
+ color: var(--text-primary);
245
+ white-space: nowrap;
246
+ }
247
+
248
+ /* ─── Search ─── */
249
+ .search-wrapper {
250
+ position: relative;
251
+ flex: 1;
252
+ max-width: 320px;
253
+ }
254
+
255
+ .search-icon {
256
+ position: absolute;
257
+ left: 0.875rem;
258
+ top: 50%;
259
+ transform: translateY(-50%);
260
+ color: var(--text-muted);
261
+ pointer-events: none;
262
+ width: 16px;
263
+ height: 16px;
264
+ }
265
+
266
+ .search-input {
267
+ width: 100%;
268
+ padding: 0.5rem 0.875rem 0.5rem 2.5rem;
269
+ background: var(--bg-glass);
270
+ border: 1px solid var(--border-glass);
271
+ border-radius: var(--radius-md);
272
+ color: var(--text-primary);
273
+ font-size: 0.8125rem;
274
+ font-family: inherit;
275
+ transition: all var(--transition-fast);
276
+ outline: none;
277
+ }
278
+
279
+ .search-input:focus {
280
+ border-color: var(--accent-primary);
281
+ box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1);
282
+ background: rgba(255, 255, 255, 0.05);
283
+ }
284
+
285
+ .search-input::placeholder {
286
+ color: var(--text-muted);
287
+ }
288
+
289
+ .search-shortcut {
290
+ position: absolute;
291
+ right: 0.625rem;
292
+ top: 50%;
293
+ transform: translateY(-50%);
294
+ padding: 0.125rem 0.375rem;
295
+ font-size: 0.625rem;
296
+ font-family: var(--font-mono);
297
+ color: var(--text-muted);
298
+ border: 1px solid var(--border-glass);
299
+ border-radius: 4px;
300
+ background: var(--bg-secondary);
301
+ pointer-events: none;
302
+ }
303
+
304
+ /* ─── Buttons ─── */
305
+ .btn {
306
+ display: inline-flex;
307
+ align-items: center;
308
+ gap: 0.5rem;
309
+ padding: 0.5rem 1.125rem;
310
+ border: none;
311
+ border-radius: var(--radius-sm);
312
+ font-size: 0.8125rem;
313
+ font-weight: 500;
314
+ cursor: pointer;
315
+ transition: all var(--transition-fast);
316
+ font-family: inherit;
317
+ white-space: nowrap;
318
+ }
319
+
320
+ .btn-primary {
321
+ background: var(--accent-gradient);
322
+ color: white;
323
+ box-shadow: 0 2px 12px rgba(99, 102, 241, 0.3);
324
+ }
325
+
326
+ .btn-primary:hover {
327
+ transform: translateY(-1px);
328
+ box-shadow: 0 4px 20px rgba(99, 102, 241, 0.4);
329
+ }
330
+
331
+ .btn-ghost {
332
+ background: var(--bg-glass);
333
+ border: 1px solid var(--border-glass);
334
+ color: var(--text-secondary);
335
+ }
336
+
337
+ .btn-ghost:hover {
338
+ background: var(--bg-hover);
339
+ color: var(--text-primary);
340
+ border-color: var(--border-hover);
341
+ }
342
+
343
+ .btn-danger {
344
+ background: var(--danger-bg);
345
+ color: var(--danger);
346
+ border: 1px solid rgba(239, 68, 68, 0.15);
347
+ }
348
+
349
+ .btn-danger:hover {
350
+ background: rgba(239, 68, 68, 0.2);
351
+ }
352
+
353
+ .btn svg {
354
+ width: 16px;
355
+ height: 16px;
356
+ }
357
+
358
+ /* ─── Process Table ─── */
359
+ .table-container {
360
+ background: var(--bg-card);
361
+ border: 1px solid var(--border-glass);
362
+ border-radius: var(--radius-xl);
363
+ overflow: hidden;
364
+ backdrop-filter: blur(20px);
365
+ box-shadow: var(--shadow-card);
366
+ }
367
+
368
+ table {
369
+ width: 100%;
370
+ border-collapse: collapse;
371
+ }
372
+
373
+ th {
374
+ text-align: left;
375
+ padding: 0.75rem 1.25rem;
376
+ font-size: 0.6875rem;
377
+ text-transform: uppercase;
378
+ letter-spacing: 0.08em;
379
+ color: var(--text-muted);
380
+ background: rgba(0, 0, 0, 0.25);
381
+ border-bottom: 1px solid var(--border-glass);
382
+ font-weight: 600;
383
+ }
384
+
385
+ td {
386
+ padding: 0.875rem 1.25rem;
387
+ border-bottom: 1px solid rgba(255, 255, 255, 0.04);
388
+ transition: background var(--transition-fast);
389
+ vertical-align: middle;
390
+ }
391
+
392
+ tr:last-child td {
393
+ border-bottom: none;
394
+ }
395
+
396
+ tr[data-process-name] {
397
+ cursor: pointer;
398
+ }
399
+
400
+ tr[data-process-name]:hover td {
401
+ background: var(--bg-hover);
402
+ }
403
+
404
+ tr[data-process-name].selected td {
405
+ background: rgba(99, 102, 241, 0.06);
406
+ }
407
+
408
+ /* Row entrance animation */
409
+ @keyframes fadeSlideIn {
410
+ from {
411
+ opacity: 0;
412
+ transform: translateY(8px);
413
+ }
414
+
415
+ to {
416
+ opacity: 1;
417
+ transform: translateY(0);
418
+ }
419
+ }
420
+
421
+ tr.animate-in {
422
+ animation: fadeSlideIn 0.35s ease forwards;
423
+ }
424
+
425
+ tr.animate-in:nth-child(1) {
426
+ animation-delay: 0s;
427
+ }
428
+
429
+ tr.animate-in:nth-child(2) {
430
+ animation-delay: 0.05s;
431
+ }
432
+
433
+ tr.animate-in:nth-child(3) {
434
+ animation-delay: 0.1s;
435
+ }
436
+
437
+ tr.animate-in:nth-child(4) {
438
+ animation-delay: 0.15s;
439
+ }
440
+
441
+ tr.animate-in:nth-child(5) {
442
+ animation-delay: 0.2s;
443
+ }
444
+
445
+ tr.animate-in:nth-child(6) {
446
+ animation-delay: 0.25s;
447
+ }
448
+
449
+ tr.animate-in:nth-child(7) {
450
+ animation-delay: 0.3s;
451
+ }
452
+
453
+ tr.animate-in:nth-child(8) {
454
+ animation-delay: 0.35s;
455
+ }
456
+
457
+ .process-name {
458
+ font-weight: 600;
459
+ color: var(--text-primary);
460
+ display: flex;
461
+ align-items: center;
462
+ gap: 0.75rem;
463
+ font-size: 0.875rem;
464
+ }
465
+
466
+ .process-icon {
467
+ width: 32px;
468
+ height: 32px;
469
+ background: var(--accent-gradient);
470
+ border-radius: var(--radius-sm);
471
+ display: flex;
472
+ align-items: center;
473
+ justify-content: center;
474
+ font-size: 0.75rem;
475
+ color: white;
476
+ font-weight: 700;
477
+ flex-shrink: 0;
478
+ }
479
+
480
+ /* ─── Status Badge ─── */
481
+ .status-badge {
482
+ display: inline-flex;
483
+ align-items: center;
484
+ gap: 0.375rem;
485
+ padding: 0.25rem 0.75rem;
486
+ border-radius: 9999px;
487
+ font-size: 0.7rem;
488
+ font-weight: 600;
489
+ letter-spacing: 0.01em;
490
+ }
491
+
492
+ .status-badge.running {
493
+ background: var(--success-bg);
494
+ color: var(--success);
495
+ }
496
+
497
+ .status-badge.stopped {
498
+ background: var(--danger-bg);
499
+ color: var(--danger);
500
+ }
501
+
502
+ .status-dot {
503
+ width: 6px;
504
+ height: 6px;
505
+ border-radius: 50%;
506
+ position: relative;
507
+ }
508
+
509
+ .status-badge.running .status-dot {
510
+ background: var(--success);
511
+ box-shadow: 0 0 8px rgba(34, 197, 94, 0.5);
512
+ animation: statusPulse 2s ease-in-out infinite;
513
+ }
514
+
515
+ .status-badge.stopped .status-dot {
516
+ background: var(--danger);
517
+ opacity: 0.6;
518
+ }
519
+
520
+ @keyframes statusPulse {
521
+
522
+ 0%,
523
+ 100% {
524
+ box-shadow: 0 0 4px rgba(34, 197, 94, 0.4);
525
+ opacity: 1;
526
+ }
527
+
528
+ 50% {
529
+ box-shadow: 0 0 12px rgba(34, 197, 94, 0.6);
530
+ opacity: 0.7;
531
+ }
532
+ }
533
+
534
+ .pid {
535
+ font-family: var(--font-mono);
536
+ color: var(--text-muted);
537
+ font-size: 0.8125rem;
538
+ }
539
+
540
+ .port-num {
541
+ color: var(--info);
542
+ font-family: var(--font-mono);
543
+ font-size: 0.8125rem;
544
+ font-weight: 500;
545
+ }
546
+
547
+ .command {
548
+ font-family: var(--font-mono);
549
+ font-size: 0.75rem;
550
+ color: var(--text-muted);
551
+ max-width: 260px;
552
+ overflow: hidden;
553
+ text-overflow: ellipsis;
554
+ white-space: nowrap;
555
+ }
556
+
557
+ .runtime {
558
+ color: var(--text-muted);
559
+ font-size: 0.8125rem;
560
+ font-family: var(--font-mono);
561
+ }
562
+
563
+ /* ─── Action Buttons (SVG-based) ─── */
564
+ .actions {
565
+ display: flex;
566
+ gap: 0.25rem;
567
+ }
568
+
569
+ .action-btn {
570
+ width: 32px;
571
+ height: 32px;
572
+ border: 1px solid transparent;
573
+ border-radius: var(--radius-sm);
574
+ cursor: pointer;
575
+ display: flex;
576
+ align-items: center;
577
+ justify-content: center;
578
+ transition: all var(--transition-fast);
579
+ background: transparent;
580
+ color: var(--text-muted);
581
+ padding: 0;
582
+ }
583
+
584
+ .action-btn svg {
585
+ width: 16px;
586
+ height: 16px;
587
+ stroke: currentColor;
588
+ fill: none;
589
+ stroke-width: 2;
590
+ stroke-linecap: round;
591
+ stroke-linejoin: round;
592
+ }
593
+
594
+ .action-btn:hover {
595
+ background: var(--bg-hover);
596
+ color: var(--text-primary);
597
+ border-color: var(--border-glass);
598
+ }
599
+
600
+ .action-btn.danger:hover {
601
+ background: var(--danger-bg);
602
+ color: var(--danger);
603
+ border-color: rgba(239, 68, 68, 0.2);
604
+ }
605
+
606
+ .action-btn.success:hover {
607
+ background: var(--success-bg);
608
+ color: var(--success);
609
+ border-color: rgba(34, 197, 94, 0.2);
610
+ }
611
+
612
+ .action-btn.info:hover {
613
+ background: var(--info-bg);
614
+ color: var(--info);
615
+ border-color: rgba(56, 189, 248, 0.2);
616
+ }
617
+
618
+ /* ─── Empty State ─── */
619
+ .empty-state {
620
+ text-align: center;
621
+ padding: 4rem 2rem;
622
+ color: var(--text-muted);
623
+ }
624
+
625
+ .empty-icon {
626
+ font-size: 3rem;
627
+ margin-bottom: 1rem;
628
+ opacity: 0.3;
629
+ animation: float 3s ease-in-out infinite;
630
+ }
631
+
632
+ @keyframes float {
633
+
634
+ 0%,
635
+ 100% {
636
+ transform: translateY(0);
637
+ }
638
+
639
+ 50% {
640
+ transform: translateY(-6px);
641
+ }
642
+ }
643
+
644
+ .empty-state h3 {
645
+ font-size: 1rem;
646
+ color: var(--text-secondary);
647
+ margin-bottom: 0.375rem;
648
+ font-weight: 500;
649
+ }
650
+
651
+ .empty-state p {
652
+ font-size: 0.8125rem;
653
+ margin-bottom: 1.5rem;
654
+ }
655
+
656
+ /* ─── Modal ─── */
657
+ .modal-overlay {
658
+ position: fixed;
659
+ inset: 0;
660
+ background: rgba(0, 0, 0, 0.6);
661
+ backdrop-filter: blur(6px);
662
+ display: none;
663
+ align-items: center;
664
+ justify-content: center;
665
+ z-index: 1000;
666
+ }
667
+
668
+ .modal-overlay.active {
669
+ display: flex;
670
+ }
671
+
672
+ .modal {
673
+ background: var(--bg-secondary);
674
+ border: 1px solid var(--border-glass);
675
+ border-radius: var(--radius-xl);
676
+ width: 100%;
677
+ max-width: 480px;
678
+ max-height: 90vh;
679
+ overflow: auto;
680
+ animation: modalIn 0.2s ease;
681
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);
682
+ }
683
+
684
+ @keyframes modalIn {
685
+ from {
686
+ opacity: 0;
687
+ transform: scale(0.96) translateY(8px);
688
+ }
689
+
690
+ to {
691
+ opacity: 1;
692
+ transform: scale(1) translateY(0);
693
+ }
694
+ }
695
+
696
+ .modal-header {
697
+ display: flex;
698
+ justify-content: space-between;
699
+ align-items: center;
700
+ padding: 1.25rem 1.5rem;
701
+ border-bottom: 1px solid var(--border-glass);
702
+ }
703
+
704
+ .modal-header h3 {
705
+ font-size: 1rem;
706
+ font-weight: 600;
707
+ }
708
+
709
+ .modal-close {
710
+ width: 30px;
711
+ height: 30px;
712
+ border: none;
713
+ background: var(--bg-glass);
714
+ border-radius: var(--radius-sm);
715
+ cursor: pointer;
716
+ color: var(--text-muted);
717
+ font-size: 1.125rem;
718
+ display: flex;
719
+ align-items: center;
720
+ justify-content: center;
721
+ transition: all var(--transition-fast);
722
+ }
723
+
724
+ .modal-close:hover {
725
+ color: var(--text-primary);
726
+ background: var(--bg-hover);
727
+ }
728
+
729
+ .modal-body {
730
+ padding: 1.25rem 1.5rem;
731
+ }
732
+
733
+ .form-group {
734
+ margin-bottom: 1rem;
735
+ }
736
+
737
+ .form-group label {
738
+ display: block;
739
+ font-size: 0.8125rem;
740
+ font-weight: 500;
741
+ color: var(--text-secondary);
742
+ margin-bottom: 0.375rem;
743
+ }
744
+
745
+ .form-group input {
746
+ width: 100%;
747
+ padding: 0.625rem 0.875rem;
748
+ background: var(--bg-glass);
749
+ border: 1px solid var(--border-glass);
750
+ border-radius: var(--radius-sm);
751
+ color: var(--text-primary);
752
+ font-size: 0.875rem;
753
+ font-family: inherit;
754
+ transition: all var(--transition-fast);
755
+ outline: none;
756
+ }
757
+
758
+ .form-group input:focus {
759
+ border-color: var(--accent-primary);
760
+ box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1);
761
+ }
762
+
763
+ .form-group input::placeholder {
764
+ color: var(--text-muted);
765
+ }
766
+
767
+ .modal-footer {
768
+ padding: 1rem 1.5rem;
769
+ border-top: 1px solid var(--border-glass);
770
+ display: flex;
771
+ justify-content: flex-end;
772
+ gap: 0.5rem;
773
+ }
774
+
775
+ /* ─── Detail Drawer ─── */
776
+ .detail-drawer {
777
+ position: fixed;
778
+ top: 0;
779
+ right: 0;
780
+ width: 480px;
781
+ height: 100vh;
782
+ background: var(--bg-secondary);
783
+ border-left: 1px solid var(--border-glass);
784
+ z-index: 900;
785
+ display: flex;
786
+ flex-direction: column;
787
+ transform: translateX(100%);
788
+ transition: transform var(--transition-smooth);
789
+ box-shadow: -8px 0 40px rgba(0, 0, 0, 0.3);
790
+ }
791
+
792
+ .detail-drawer.open {
793
+ transform: translateX(0);
794
+ }
795
+
796
+ .drawer-header {
797
+ display: flex;
798
+ justify-content: space-between;
799
+ align-items: center;
800
+ padding: 1.25rem 1.5rem;
801
+ border-bottom: 1px solid var(--border-glass);
802
+ flex-shrink: 0;
803
+ }
804
+
805
+ .drawer-header h3 {
806
+ font-size: 1rem;
807
+ font-weight: 600;
808
+ display: flex;
809
+ align-items: center;
810
+ gap: 0.5rem;
811
+ }
812
+
813
+ .drawer-header .process-icon {
814
+ width: 28px;
815
+ height: 28px;
816
+ font-size: 0.7rem;
817
+ }
818
+
819
+ .drawer-close {
820
+ width: 30px;
821
+ height: 30px;
822
+ border: none;
823
+ background: var(--bg-glass);
824
+ border-radius: var(--radius-sm);
825
+ cursor: pointer;
826
+ color: var(--text-muted);
827
+ font-size: 0.875rem;
828
+ display: flex;
829
+ align-items: center;
830
+ justify-content: center;
831
+ transition: all var(--transition-fast);
832
+ }
833
+
834
+ .drawer-close:hover {
835
+ color: var(--text-primary);
836
+ background: var(--bg-hover);
837
+ }
838
+
839
+ .drawer-meta {
840
+ padding: 1rem 1.5rem;
841
+ border-bottom: 1px solid var(--border-glass);
842
+ display: grid;
843
+ grid-template-columns: 1fr 1fr;
844
+ gap: 0.75rem;
845
+ flex-shrink: 0;
846
+ }
847
+
848
+ .meta-item {
849
+ display: flex;
850
+ flex-direction: column;
851
+ gap: 0.125rem;
852
+ }
853
+
854
+ .meta-label {
855
+ font-size: 0.625rem;
856
+ text-transform: uppercase;
857
+ letter-spacing: 0.08em;
858
+ color: var(--text-muted);
859
+ font-weight: 600;
860
+ }
861
+
862
+ .meta-value {
863
+ font-size: 0.8125rem;
864
+ color: var(--text-primary);
865
+ font-family: var(--font-mono);
866
+ }
867
+
868
+ .drawer-tabs {
869
+ display: flex;
870
+ border-bottom: 1px solid var(--border-glass);
871
+ flex-shrink: 0;
872
+ }
873
+
874
+ .drawer-tab {
875
+ flex: 1;
876
+ padding: 0.625rem;
877
+ background: none;
878
+ border: none;
879
+ color: var(--text-muted);
880
+ font-size: 0.75rem;
881
+ font-weight: 500;
882
+ cursor: pointer;
883
+ border-bottom: 2px solid transparent;
884
+ transition: all var(--transition-fast);
885
+ font-family: inherit;
886
+ }
887
+
888
+ .drawer-tab:hover {
889
+ color: var(--text-secondary);
890
+ }
891
+
892
+ .drawer-tab.active {
893
+ color: var(--accent-primary);
894
+ border-bottom-color: var(--accent-primary);
895
+ }
896
+
897
+ .drawer-content {
898
+ flex: 1;
899
+ overflow: hidden;
900
+ padding: 0;
901
+ display: flex;
902
+ flex-direction: column;
903
+ min-height: 0;
904
+ }
905
+
906
+ .drawer-logs {
907
+ font-family: var(--font-mono);
908
+ font-size: 0.75rem;
909
+ line-height: 1.7;
910
+ color: var(--text-secondary);
911
+ white-space: pre;
912
+ overflow-x: auto;
913
+ overflow-y: auto;
914
+ flex: 1;
915
+ padding: 1rem 1.5rem;
916
+ min-height: 0;
917
+ }
918
+
919
+ .drawer-backdrop {
920
+ position: fixed;
921
+ inset: 0;
922
+ background: rgba(0, 0, 0, 0.3);
923
+ z-index: 899;
924
+ opacity: 0;
925
+ pointer-events: none;
926
+ transition: opacity var(--transition-smooth);
927
+ }
928
+
929
+ .drawer-backdrop.active {
930
+ opacity: 1;
931
+ pointer-events: auto;
932
+ }
933
+
934
+ /* ─── Toast Notifications ─── */
935
+ .toast-container {
936
+ position: fixed;
937
+ top: 1rem;
938
+ right: 1rem;
939
+ z-index: 2000;
940
+ display: flex;
941
+ flex-direction: column;
942
+ gap: 0.5rem;
943
+ pointer-events: none;
944
+ }
945
+
946
+ .toast {
947
+ display: flex;
948
+ align-items: center;
949
+ gap: 0.625rem;
950
+ padding: 0.75rem 1.125rem;
951
+ background: var(--bg-secondary);
952
+ border: 1px solid var(--border-glass);
953
+ border-radius: var(--radius-md);
954
+ font-size: 0.8125rem;
955
+ color: var(--text-primary);
956
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);
957
+ pointer-events: auto;
958
+ animation: toastIn 0.3s ease forwards;
959
+ min-width: 260px;
960
+ max-width: 400px;
961
+ backdrop-filter: blur(12px);
962
+ }
963
+
964
+ .toast.removing {
965
+ animation: toastOut 0.25s ease forwards;
966
+ }
967
+
968
+ .toast-icon {
969
+ flex-shrink: 0;
970
+ width: 18px;
971
+ height: 18px;
972
+ border-radius: 50%;
973
+ display: flex;
974
+ align-items: center;
975
+ justify-content: center;
976
+ font-size: 0.625rem;
977
+ font-weight: 700;
978
+ }
979
+
980
+ .toast.success {
981
+ border-left: 3px solid var(--success);
982
+ }
983
+
984
+ .toast.success .toast-icon {
985
+ background: var(--success-bg);
986
+ color: var(--success);
987
+ }
988
+
989
+ .toast.error {
990
+ border-left: 3px solid var(--danger);
991
+ }
992
+
993
+ .toast.error .toast-icon {
994
+ background: var(--danger-bg);
995
+ color: var(--danger);
996
+ }
997
+
998
+ .toast.info {
999
+ border-left: 3px solid var(--info);
1000
+ }
1001
+
1002
+ .toast.info .toast-icon {
1003
+ background: var(--info-bg);
1004
+ color: var(--info);
1005
+ }
1006
+
1007
+ @keyframes toastIn {
1008
+ from {
1009
+ opacity: 0;
1010
+ transform: translateX(40px);
1011
+ }
1012
+
1013
+ to {
1014
+ opacity: 1;
1015
+ transform: translateX(0);
1016
+ }
1017
+ }
1018
+
1019
+ @keyframes toastOut {
1020
+ from {
1021
+ opacity: 1;
1022
+ transform: translateX(0);
1023
+ }
1024
+
1025
+ to {
1026
+ opacity: 0;
1027
+ transform: translateX(40px);
1028
+ }
1029
+ }
1030
+
1031
+ /* ─── Log Lines ─── */
1032
+ .log-line {
1033
+ padding: 0.0625rem 0;
1034
+ transition: background var(--transition-fast);
1035
+ border-radius: 2px;
1036
+ }
1037
+
1038
+ .log-line:hover {
1039
+ background: rgba(255, 255, 255, 0.03);
1040
+ }
1041
+
1042
+ /* ─── Scrollbar ─── */
1043
+ ::-webkit-scrollbar {
1044
+ width: 5px;
1045
+ }
1046
+
1047
+ ::-webkit-scrollbar-track {
1048
+ background: transparent;
1049
+ }
1050
+
1051
+ ::-webkit-scrollbar-thumb {
1052
+ background: rgba(255, 255, 255, 0.06);
1053
+ border-radius: 3px;
1054
+ }
1055
+
1056
+ ::-webkit-scrollbar-thumb:hover {
1057
+ background: rgba(255, 255, 255, 0.12);
1058
+ }
1059
+
1060
+ /* ─── Legacy logs panel (kept for backwards compat) ─── */
1061
+ .logs-panel {
1062
+ margin-top: 2rem;
1063
+ }
1064
+
1065
+ .logs-header {
1066
+ display: flex;
1067
+ justify-content: space-between;
1068
+ align-items: center;
1069
+ margin-bottom: 0.75rem;
1070
+ }
1071
+
1072
+ .logs-content {
1073
+ background: var(--bg-card);
1074
+ border: 1px solid var(--border-glass);
1075
+ border-radius: var(--radius-lg);
1076
+ padding: 1.25rem;
1077
+ max-height: 400px;
1078
+ overflow: auto;
1079
+ font-family: var(--font-mono);
1080
+ font-size: 0.75rem;
1081
+ line-height: 1.7;
1082
+ color: var(--text-secondary);
1083
+ white-space: pre-wrap;
1084
+ word-break: break-all;
1085
+ }
1086
+
1087
+ /* ─── Responsive ─── */
1088
+ @media (max-width: 1024px) {
1089
+ .detail-drawer {
1090
+ width: 100%;
1091
+ max-width: 420px;
1092
+ }
1093
+ }
1094
+
1095
+ @media (max-width: 768px) {
1096
+ .container {
1097
+ padding: 1rem;
1098
+ }
1099
+
1100
+ .header {
1101
+ flex-direction: column;
1102
+ gap: 0.75rem;
1103
+ text-align: center;
1104
+ }
1105
+
1106
+ .stats-grid {
1107
+ grid-template-columns: 1fr;
1108
+ }
1109
+
1110
+ .toolbar {
1111
+ flex-direction: column;
1112
+ }
1113
+
1114
+ .toolbar-left {
1115
+ flex-direction: column;
1116
+ width: 100%;
1117
+ }
1118
+
1119
+ .search-wrapper {
1120
+ max-width: 100%;
1121
+ }
1122
+
1123
+ .table-container {
1124
+ overflow-x: auto;
1125
+ }
1126
+
1127
+ table {
1128
+ min-width: 700px;
1129
+ }
1130
+
1131
+ .detail-drawer {
1132
+ width: 100%;
1133
+ max-width: 100%;
1134
+ }
1135
+ }