bgrun 3.4.0 → 3.7.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.
@@ -1,6 +1,11 @@
1
1
  /* BGR Dashboard — Design System v3 */
2
2
  /* Inspired by agent-interface premium dark theme */
3
3
 
4
+ .antialiased {
5
+ -webkit-font-smoothing: antialiased;
6
+ -moz-osx-font-smoothing: grayscale;
7
+ }
8
+
4
9
  /* ─── Design Tokens ─── */
5
10
  :root {
6
11
  --bg-primary: #07070d;
@@ -26,6 +31,7 @@
26
31
  --danger-border: rgba(239, 68, 68, 0.2);
27
32
  --warning: #f59e0b;
28
33
  --warning-bg: rgba(245, 158, 11, 0.12);
34
+ --warning-border: rgba(245, 158, 11, 0.3);
29
35
  --info: #38bdf8;
30
36
  --info-bg: rgba(56, 189, 248, 0.12);
31
37
  --info-border: rgba(56, 189, 248, 0.2);
@@ -202,7 +208,7 @@ body::after {
202
208
  .container {
203
209
  max-width: 1400px;
204
210
  margin: 0 auto;
205
- padding: 1.75rem 2rem;
211
+ padding: 1rem 2rem;
206
212
  position: relative;
207
213
  z-index: 1;
208
214
  animation: fadeIn 0.4s ease;
@@ -294,7 +300,7 @@ body::after {
294
300
  /* ─── Stats Grid ─── */
295
301
  .stats-grid {
296
302
  display: grid;
297
- grid-template-columns: repeat(3, 1fr);
303
+ grid-template-columns: repeat(4, 1fr);
298
304
  gap: 1rem;
299
305
  margin-bottom: 2rem;
300
306
  }
@@ -389,7 +395,7 @@ body::after {
389
395
  letter-spacing: -0.02em;
390
396
  }
391
397
 
392
- .stat-card:not(.running):not(.stopped) .stat-value {
398
+ .stat-card:not(.running):not(.stopped):not(.memory) .stat-value {
393
399
  background: var(--accent-gradient);
394
400
  -webkit-background-clip: text;
395
401
  -webkit-text-fill-color: transparent;
@@ -404,7 +410,23 @@ body::after {
404
410
  color: var(--danger);
405
411
  }
406
412
 
407
- /* ─── Toolbar ─── */
413
+ .stat-card.memory {
414
+ border-left: 3px solid var(--info);
415
+ }
416
+
417
+ .stat-card.memory::before {
418
+ background: var(--info);
419
+ opacity: 0.08;
420
+ }
421
+
422
+ .stat-card.memory:hover::before {
423
+ opacity: 0.12;
424
+ }
425
+
426
+ .stat-card.memory .stat-value {
427
+ color: var(--info);
428
+ }
429
+
408
430
  .toolbar {
409
431
  display: flex;
410
432
  justify-content: space-between;
@@ -420,11 +442,33 @@ body::after {
420
442
  flex: 1;
421
443
  }
422
444
 
445
+ .toolbar-right {
446
+ display: flex;
447
+ align-items: center;
448
+ gap: 0.5rem;
449
+ }
450
+
451
+ .toolbar-brand {
452
+ display: flex;
453
+ align-items: center;
454
+ gap: 0.5rem;
455
+ white-space: nowrap;
456
+ }
457
+
458
+ .toolbar-logo {
459
+ font-size: 1.1rem;
460
+ }
461
+
423
462
  .toolbar h2 {
424
463
  font-size: 1.125rem;
425
- font-weight: 600;
426
- color: var(--text-primary);
464
+ font-weight: 700;
465
+ background: var(--accent-gradient);
466
+ -webkit-background-clip: text;
467
+ -webkit-text-fill-color: transparent;
468
+ background-clip: text;
469
+ letter-spacing: -0.02em;
427
470
  white-space: nowrap;
471
+ margin-right: 0.25rem;
428
472
  }
429
473
 
430
474
  /* ─── Search ─── */
@@ -587,39 +631,96 @@ body::after {
587
631
  background: var(--bg-card);
588
632
  border: 1px solid var(--border-glass);
589
633
  border-radius: var(--radius-2xl);
590
- overflow: hidden;
634
+ overflow-x: auto;
635
+ overflow-y: hidden;
591
636
  backdrop-filter: blur(20px);
592
637
  box-shadow: var(--shadow-card);
593
638
  }
594
639
 
595
640
  table {
596
641
  width: 100%;
642
+ min-width: 900px;
597
643
  border-collapse: separate;
598
644
  border-spacing: 0;
645
+ table-layout: fixed;
599
646
  }
600
647
 
601
648
  /* ─── Group Header ─── */
649
+ .group-header {
650
+ cursor: pointer;
651
+ user-select: none;
652
+ }
653
+
602
654
  .group-header td {
603
- padding: 1.5rem 0.5rem 0.5rem 1.25rem !important;
604
- background: transparent !important;
605
- border: none !important;
655
+ padding: 0.625rem 1.25rem 0.375rem 1.25rem !important;
656
+ background: rgba(255, 255, 255, 0.015) !important;
657
+ border-bottom: 1px solid var(--border-subtle) !important;
658
+ border-top: 1px solid var(--border-glass) !important;
659
+ }
660
+
661
+ .group-header:first-child td {
662
+ border-top: none !important;
663
+ }
664
+
665
+ .group-header:hover td {
666
+ background: var(--bg-hover) !important;
606
667
  }
607
668
 
608
669
  .group-label {
609
670
  display: flex;
610
671
  align-items: center;
611
- gap: 0.5rem;
612
- font-size: 0.75rem;
613
- font-weight: 700;
614
- text-transform: uppercase;
615
- letter-spacing: 0.05em;
672
+ gap: 0.375rem;
673
+ font-size: 0.6875rem;
674
+ font-weight: 600;
675
+ color: var(--text-dim);
676
+ }
677
+
678
+ .group-chevron {
679
+ width: 12px;
680
+ height: 12px;
681
+ stroke: var(--text-dim);
682
+ fill: none;
683
+ stroke-width: 2.5;
684
+ transition: transform var(--transition-fast);
685
+ transform: rotate(90deg);
686
+ flex-shrink: 0;
687
+ }
688
+
689
+ .group-header.collapsed .group-chevron {
690
+ transform: rotate(0deg);
691
+ }
692
+
693
+ .group-name {
616
694
  color: var(--text-muted);
617
- opacity: 0.8;
695
+ font-size: 0.6875rem;
696
+ font-family: var(--font-mono);
697
+ letter-spacing: 0.01em;
698
+ font-weight: 500;
618
699
  }
619
700
 
620
- .group-icon {
621
- font-size: 1rem;
622
- opacity: 0.7;
701
+ .group-counts {
702
+ display: flex;
703
+ align-items: center;
704
+ gap: 0.25rem;
705
+ margin-left: auto;
706
+ font-size: 0.625rem;
707
+ font-weight: 500;
708
+ }
709
+
710
+ .group-count-running {
711
+ color: var(--text-dim);
712
+ }
713
+
714
+ .group-count-running.has-running {
715
+ color: var(--success-soft);
716
+ }
717
+
718
+ .group-count-sep {
719
+ color: var(--border-hover);
720
+ }
721
+
722
+ .group-count-total {
723
+ color: var(--text-dim);
623
724
  }
624
725
 
625
726
  th {
@@ -710,28 +811,16 @@ tr.animate-in:nth-child(10) {
710
811
  align-items: center;
711
812
  gap: 0.75rem;
712
813
  font-size: 0.875rem;
814
+ overflow: hidden;
713
815
  }
714
816
 
715
- .process-icon {
716
- width: 34px;
717
- height: 34px;
718
- background: var(--accent-gradient);
719
- border-radius: 10px;
720
- display: flex;
721
- align-items: center;
722
- justify-content: center;
723
- font-size: 0.75rem;
724
- color: white;
725
- font-weight: 700;
726
- flex-shrink: 0;
727
- box-shadow: 0 2px 8px rgba(99, 102, 241, 0.2);
728
- transition: transform var(--transition-fast), box-shadow var(--transition-fast);
817
+ .process-name span {
818
+ overflow: hidden;
819
+ text-overflow: ellipsis;
820
+ white-space: nowrap;
729
821
  }
730
822
 
731
- tr[data-process-name]:hover .process-icon {
732
- transform: scale(1.05);
733
- box-shadow: 0 4px 16px rgba(99, 102, 241, 0.3);
734
- }
823
+
735
824
 
736
825
  /* ─── Status Badge ─── */
737
826
  .status-badge {
@@ -823,12 +912,15 @@ tr[data-process-name]:hover .process-icon {
823
912
  color: var(--text-muted);
824
913
  font-size: 0.8125rem;
825
914
  font-family: var(--font-mono);
915
+ white-space: nowrap;
826
916
  }
827
917
 
828
918
  /* ─── Action Buttons (SVG-based) ─── */
829
919
  .actions {
830
920
  display: flex;
831
921
  gap: 0.25rem;
922
+ flex-shrink: 0;
923
+ white-space: nowrap;
832
924
  }
833
925
 
834
926
  .action-btn {
@@ -885,6 +977,12 @@ tr[data-process-name]:hover .process-icon {
885
977
  border-color: var(--info-border);
886
978
  }
887
979
 
980
+ .action-btn.warning:hover {
981
+ background: var(--warning-bg);
982
+ color: var(--warning);
983
+ border-color: var(--warning-border);
984
+ }
985
+
888
986
  /* ─── Empty State ─── */
889
987
  .empty-state {
890
988
  text-align: center;
@@ -1024,6 +1122,8 @@ tr[data-process-name]:hover .process-icon {
1024
1122
  top: 0;
1025
1123
  right: 0;
1026
1124
  width: 520px;
1125
+ min-width: 360px;
1126
+ max-width: 85vw;
1027
1127
  height: 100vh;
1028
1128
  background: var(--bg-secondary);
1029
1129
  border-left: 1px solid var(--border-glass);
@@ -1035,6 +1135,28 @@ tr[data-process-name]:hover .process-icon {
1035
1135
  box-shadow: -8px 0 40px rgba(0, 0, 0, 0.3), -2px 0 20px rgba(0, 0, 0, 0.2);
1036
1136
  }
1037
1137
 
1138
+ .detail-drawer.resizing {
1139
+ transition: none;
1140
+ user-select: none;
1141
+ }
1142
+
1143
+ .drawer-resize-handle {
1144
+ position: absolute;
1145
+ left: -3px;
1146
+ top: 0;
1147
+ width: 6px;
1148
+ height: 100%;
1149
+ cursor: col-resize;
1150
+ z-index: 10;
1151
+ transition: background 0.15s;
1152
+ }
1153
+
1154
+ .drawer-resize-handle:hover,
1155
+ .drawer-resize-handle:active {
1156
+ background: var(--accent-primary);
1157
+ opacity: 0.5;
1158
+ }
1159
+
1038
1160
  .detail-drawer.open {
1039
1161
  transform: translateX(0);
1040
1162
  }
@@ -1057,12 +1179,7 @@ tr[data-process-name]:hover .process-icon {
1057
1179
  gap: 0.75rem;
1058
1180
  }
1059
1181
 
1060
- .drawer-header .process-icon {
1061
- width: 32px;
1062
- height: 32px;
1063
- font-size: 0.7rem;
1064
- border-radius: var(--radius-sm);
1065
- }
1182
+
1066
1183
 
1067
1184
  .drawer-close {
1068
1185
  width: 30px;
@@ -1084,76 +1201,167 @@ tr[data-process-name]:hover .process-icon {
1084
1201
  background: var(--bg-hover);
1085
1202
  }
1086
1203
 
1087
- .drawer-meta {
1088
- padding: 1.125rem 1.5rem;
1089
- border-bottom: 1px solid var(--border-glass);
1090
- display: grid;
1091
- grid-template-columns: 1fr 1fr;
1092
- gap: 0.875rem;
1093
- flex-shrink: 0;
1094
- background: rgba(0, 0, 0, 0.08);
1204
+ /* ─── Accordion ─── */
1205
+ .drawer-accordion {
1206
+ flex: 1;
1207
+ display: flex;
1208
+ flex-direction: column;
1209
+ min-height: 0;
1210
+ overflow: hidden;
1095
1211
  }
1096
1212
 
1097
- .meta-item {
1213
+ .accordion-section {
1098
1214
  display: flex;
1099
1215
  flex-direction: column;
1100
- gap: 0.25rem;
1216
+ min-height: 0;
1217
+ border-bottom: 1px solid var(--border-glass);
1101
1218
  }
1102
1219
 
1103
- .meta-label {
1104
- font-size: 0.625rem;
1105
- text-transform: uppercase;
1106
- letter-spacing: 0.08em;
1107
- color: var(--text-dim);
1220
+ .accordion-section.open {
1221
+ flex: 1;
1222
+ }
1223
+
1224
+ .accordion-trigger {
1225
+ display: flex;
1226
+ align-items: center;
1227
+ gap: 0.5rem;
1228
+ padding: 0.625rem 1rem;
1229
+ background: rgba(0, 0, 0, 0.12);
1230
+ border: none;
1231
+ color: var(--text-muted);
1232
+ font-size: 0.7rem;
1108
1233
  font-weight: 600;
1234
+ text-transform: uppercase;
1235
+ letter-spacing: 0.06em;
1236
+ cursor: pointer;
1237
+ transition: all var(--transition-fast);
1238
+ font-family: inherit;
1239
+ width: 100%;
1240
+ text-align: left;
1109
1241
  }
1110
1242
 
1111
- .meta-value {
1112
- font-size: 0.8125rem;
1113
- color: var(--text-primary);
1114
- font-family: var(--font-mono);
1243
+ .accordion-trigger:hover {
1244
+ background: rgba(0, 0, 0, 0.18);
1245
+ color: var(--text-secondary);
1246
+ }
1247
+
1248
+ .accordion-section.open>.accordion-trigger {
1249
+ color: var(--accent-primary);
1250
+ background: rgba(99, 102, 241, 0.08);
1251
+ }
1252
+
1253
+ .accordion-chevron {
1254
+ width: 14px;
1255
+ height: 14px;
1256
+ fill: none;
1257
+ stroke: currentColor;
1258
+ stroke-width: 2;
1259
+ stroke-linecap: round;
1260
+ stroke-linejoin: round;
1261
+ transition: transform var(--transition-fast);
1262
+ flex-shrink: 0;
1263
+ }
1264
+
1265
+ .accordion-section.open>.accordion-trigger .accordion-chevron {
1266
+ transform: rotate(90deg);
1267
+ }
1268
+
1269
+ .accordion-body {
1270
+ display: none;
1271
+ flex-direction: column;
1272
+ min-height: 0;
1273
+ flex: 1;
1274
+ overflow: hidden;
1275
+ }
1276
+
1277
+ .accordion-section.open>.accordion-body {
1278
+ display: flex;
1115
1279
  }
1116
1280
 
1117
- .drawer-tabs {
1281
+
1282
+ /* ─── Accordion Sub-tabs ─── */
1283
+ .accordion-subtabs {
1118
1284
  display: flex;
1119
1285
  border-bottom: 1px solid var(--border-glass);
1120
1286
  flex-shrink: 0;
1121
- background: rgba(0, 0, 0, 0.08);
1287
+ background: rgba(0, 0, 0, 0.06);
1288
+ padding: 0 0.5rem;
1289
+ gap: 0;
1122
1290
  }
1123
1291
 
1124
- .drawer-tab {
1125
- flex: 1;
1126
- padding: 0.75rem;
1292
+ .accordion-subtab {
1293
+ padding: 0.5rem 0.75rem;
1127
1294
  background: none;
1128
1295
  border: none;
1296
+ border-bottom: 2px solid transparent;
1129
1297
  color: var(--text-muted);
1130
- font-size: 0.75rem;
1298
+ font-size: 0.68rem;
1131
1299
  font-weight: 500;
1132
1300
  cursor: pointer;
1133
- border-bottom: 2px solid transparent;
1134
1301
  transition: all var(--transition-fast);
1135
- font-family: inherit;
1136
- text-transform: uppercase;
1137
- letter-spacing: 0.04em;
1302
+ font-family: var(--font-mono);
1303
+ display: flex;
1304
+ align-items: center;
1305
+ gap: 0.4rem;
1138
1306
  }
1139
1307
 
1140
- .drawer-tab:hover {
1308
+ .accordion-subtab:hover {
1141
1309
  color: var(--text-secondary);
1142
- background: var(--bg-hover);
1143
1310
  }
1144
1311
 
1145
- .drawer-tab.active {
1312
+ .accordion-subtab.active {
1146
1313
  color: var(--accent-primary);
1147
1314
  border-bottom-color: var(--accent-primary);
1148
1315
  }
1149
1316
 
1150
- .drawer-content {
1317
+ .accordion-sub-content {
1151
1318
  flex: 1;
1152
- overflow: hidden;
1153
- padding: 0;
1154
1319
  display: flex;
1155
1320
  flex-direction: column;
1156
1321
  min-height: 0;
1322
+ overflow: hidden;
1323
+ }
1324
+
1325
+ /* ─── Stderr Badge ─── */
1326
+ .stderr-badge {
1327
+ font-size: 0.55rem;
1328
+ font-weight: 700;
1329
+ background: var(--error);
1330
+ color: #fff;
1331
+ padding: 1px 5px;
1332
+ border-radius: 8px;
1333
+ line-height: 1.3;
1334
+ min-width: 16px;
1335
+ text-align: center;
1336
+ font-family: var(--font-mono);
1337
+ }
1338
+
1339
+ /* ─── Meta (inside accordion) ─── */
1340
+ .drawer-meta {
1341
+ padding: 1rem 1.25rem;
1342
+ display: grid;
1343
+ grid-template-columns: 1fr 1fr;
1344
+ gap: 0.75rem;
1345
+ }
1346
+
1347
+ .meta-item {
1348
+ display: flex;
1349
+ flex-direction: column;
1350
+ gap: 0.2rem;
1351
+ }
1352
+
1353
+ .meta-label {
1354
+ font-size: 0.6rem;
1355
+ text-transform: uppercase;
1356
+ letter-spacing: 0.08em;
1357
+ color: var(--text-dim);
1358
+ font-weight: 600;
1359
+ }
1360
+
1361
+ .meta-value {
1362
+ font-size: 0.78rem;
1363
+ color: var(--text-primary);
1364
+ font-family: var(--font-mono);
1157
1365
  }
1158
1366
 
1159
1367
  .drawer-logs {
@@ -1168,17 +1376,17 @@ tr[data-process-name]:hover .process-icon {
1168
1376
  padding: 1rem 1.5rem;
1169
1377
  min-height: 0;
1170
1378
  background: rgba(0, 0, 0, 0.2);
1379
+ contain: strict;
1171
1380
  }
1172
1381
 
1173
1382
  .drawer-backdrop {
1174
1383
  position: fixed;
1175
1384
  inset: 0;
1176
- background: rgba(0, 0, 0, 0.4);
1385
+ background: rgba(0, 0, 0, 0.5);
1177
1386
  z-index: 899;
1178
1387
  opacity: 0;
1179
1388
  pointer-events: none;
1180
1389
  transition: opacity var(--transition-smooth);
1181
- backdrop-filter: blur(2px);
1182
1390
  }
1183
1391
 
1184
1392
  .drawer-backdrop.active {
@@ -1259,15 +1467,194 @@ tr[data-process-name]:hover .process-icon {
1259
1467
  color: var(--info);
1260
1468
  }
1261
1469
 
1470
+ /* ─── Log File Info ─── */
1471
+ .log-file-info {
1472
+ padding: 0.375rem 1.5rem;
1473
+ font-size: 0.6875rem;
1474
+ color: var(--text-dim);
1475
+ font-family: var(--font-mono);
1476
+ border-bottom: 1px solid var(--border-subtle);
1477
+ background: rgba(0, 0, 0, 0.12);
1478
+ display: flex;
1479
+ align-items: center;
1480
+ gap: 0.5rem;
1481
+ flex-shrink: 0;
1482
+ min-height: 28px;
1483
+ }
1484
+
1485
+ .log-file-info:empty {
1486
+ display: none;
1487
+ }
1488
+
1489
+ /* ─── Env Variables Panel ─── */
1490
+ .drawer-env {
1491
+ flex: 1;
1492
+ overflow-y: auto;
1493
+ padding: 1rem 1.5rem;
1494
+ min-height: 0;
1495
+ background: rgba(0, 0, 0, 0.2);
1496
+ }
1497
+
1498
+ .env-row {
1499
+ display: flex;
1500
+ gap: 0.5rem;
1501
+ padding: 0.35rem 0;
1502
+ border-bottom: 1px solid rgba(255, 255, 255, 0.04);
1503
+ font-family: var(--font-mono);
1504
+ font-size: 0.75rem;
1505
+ line-height: 1.5;
1506
+ }
1507
+
1508
+ .env-row:last-child {
1509
+ border-bottom: none;
1510
+ }
1511
+
1512
+ .env-key {
1513
+ color: var(--accent-primary);
1514
+ font-weight: 600;
1515
+ flex-shrink: 0;
1516
+ min-width: 120px;
1517
+ max-width: 200px;
1518
+ overflow: hidden;
1519
+ text-overflow: ellipsis;
1520
+ white-space: nowrap;
1521
+ }
1522
+
1523
+ .env-value {
1524
+ color: var(--text-secondary);
1525
+ word-break: break-all;
1526
+ }
1527
+
1528
+ .env-empty {
1529
+ color: var(--text-muted);
1530
+ font-style: italic;
1531
+ padding: 2rem 0;
1532
+ text-align: center;
1533
+ }
1534
+
1535
+ /* ─── Config Editor Panel ─── */
1536
+ .drawer-config {
1537
+ flex: 1;
1538
+ display: flex;
1539
+ flex-direction: column;
1540
+ min-height: 0;
1541
+ }
1542
+
1543
+ .config-toolbar {
1544
+ display: flex;
1545
+ align-items: center;
1546
+ justify-content: space-between;
1547
+ padding: 0.5rem 1rem;
1548
+ border-bottom: 1px solid var(--border-glass);
1549
+ background: rgba(0, 0, 0, 0.12);
1550
+ flex-shrink: 0;
1551
+ gap: 0.75rem;
1552
+ }
1553
+
1554
+ .config-path {
1555
+ font-family: var(--font-mono);
1556
+ font-size: 0.6875rem;
1557
+ color: var(--text-dim);
1558
+ overflow: hidden;
1559
+ text-overflow: ellipsis;
1560
+ white-space: nowrap;
1561
+ flex: 1;
1562
+ min-width: 0;
1563
+ }
1564
+
1565
+ .config-editor {
1566
+ flex: 1;
1567
+ width: 100%;
1568
+ resize: none;
1569
+ background: rgba(0, 0, 0, 0.25);
1570
+ color: var(--text-primary);
1571
+ font-family: var(--font-mono);
1572
+ font-size: 0.78rem;
1573
+ line-height: 1.7;
1574
+ padding: 1rem 1.5rem;
1575
+ border: none;
1576
+ outline: none;
1577
+ min-height: 0;
1578
+ tab-size: 4;
1579
+ }
1580
+
1581
+ .config-editor:focus {
1582
+ background: rgba(0, 0, 0, 0.3);
1583
+ }
1584
+
1585
+ .btn-sm {
1586
+ padding: 0.35rem 0.75rem;
1587
+ font-size: 0.72rem;
1588
+ white-space: nowrap;
1589
+ }
1590
+
1262
1591
  /* ─── Log Lines ─── */
1263
1592
  .log-line {
1264
- padding: 0.125rem 0;
1265
- transition: background var(--transition-fast);
1593
+ padding: 0.1rem 0.5rem 0.1rem 0;
1266
1594
  border-radius: 3px;
1595
+ cursor: pointer;
1596
+ position: relative;
1597
+ display: flex;
1598
+ align-items: baseline;
1599
+ gap: 0;
1600
+ content-visibility: auto;
1601
+ contain-intrinsic-size: auto 1.7em;
1267
1602
  }
1268
1603
 
1269
1604
  .log-line:hover {
1270
- background: rgba(255, 255, 255, 0.04);
1605
+ background: rgba(255, 255, 255, 0.06);
1606
+ }
1607
+
1608
+ .log-line-num {
1609
+ color: var(--text-dim);
1610
+ min-width: 3ch;
1611
+ text-align: right;
1612
+ padding-right: 0.75rem;
1613
+ user-select: none;
1614
+ flex-shrink: 0;
1615
+ opacity: 0.5;
1616
+ font-size: 0.65rem;
1617
+ }
1618
+
1619
+ .log-line:hover .log-line-num {
1620
+ opacity: 0.8;
1621
+ }
1622
+
1623
+ .log-line-content {
1624
+ flex: 1;
1625
+ min-width: 0;
1626
+ overflow: hidden;
1627
+ text-overflow: ellipsis;
1628
+ }
1629
+
1630
+ /* Expanded line: word-wrap enabled */
1631
+ .log-line.expanded .log-line-content {
1632
+ white-space: pre-wrap;
1633
+ word-break: break-all;
1634
+ overflow: visible;
1635
+ text-overflow: unset;
1636
+ }
1637
+
1638
+ .log-line.expanded {
1639
+ background: rgba(99, 102, 241, 0.06);
1640
+ border-left: 2px solid var(--accent-primary);
1641
+ margin-left: -2px;
1642
+ }
1643
+
1644
+ /* Copy feedback animation */
1645
+ .log-line.copied::after {
1646
+ content: 'Copied!';
1647
+ position: absolute;
1648
+ right: 0.5rem;
1649
+ top: 50%;
1650
+ transform: translateY(-50%);
1651
+ font-size: 0.6rem;
1652
+ color: var(--success);
1653
+ background: var(--bg-secondary);
1654
+ padding: 2px 6px;
1655
+ border-radius: 4px;
1656
+ animation: fadeIn 0.2s ease;
1657
+ pointer-events: none;
1271
1658
  }
1272
1659
 
1273
1660
  /* ─── Scrollbar ─── */
@@ -1289,6 +1676,98 @@ tr[data-process-name]:hover .process-icon {
1289
1676
  background: rgba(255, 255, 255, 0.12);
1290
1677
  }
1291
1678
 
1679
+ /* ─── Log Viewer Toolbar ─── */
1680
+ .drawer-log-toolbar {
1681
+ display: flex;
1682
+ gap: 0.5rem;
1683
+ padding: 0.5rem 1rem;
1684
+ align-items: center;
1685
+ border-bottom: 1px solid var(--border-subtle);
1686
+ background: rgba(0, 0, 0, 0.08);
1687
+ flex-shrink: 0;
1688
+ }
1689
+
1690
+ .log-search {
1691
+ flex: 1;
1692
+ background: var(--bg-deeper);
1693
+ border: 1px solid var(--border-glass);
1694
+ border-radius: var(--radius-sm);
1695
+ padding: 0.35rem 0.6rem;
1696
+ color: var(--text-primary);
1697
+ font-size: 0.75rem;
1698
+ font-family: var(--font-mono);
1699
+ outline: none;
1700
+ transition: border-color 0.2s;
1701
+ }
1702
+
1703
+ .log-search:focus {
1704
+ border-color: var(--accent);
1705
+ }
1706
+
1707
+ .log-search::placeholder {
1708
+ color: var(--text-muted);
1709
+ }
1710
+
1711
+ .log-autoscroll {
1712
+ background: var(--bg-deeper);
1713
+ border: 1px solid var(--border-glass);
1714
+ border-radius: 9999px;
1715
+ color: var(--text-muted);
1716
+ height: 28px;
1717
+ padding: 0 0.625rem;
1718
+ display: flex;
1719
+ align-items: center;
1720
+ justify-content: center;
1721
+ gap: 0.35rem;
1722
+ cursor: pointer;
1723
+ font-size: 0.65rem;
1724
+ font-weight: 600;
1725
+ text-transform: uppercase;
1726
+ letter-spacing: 0.04em;
1727
+ transition: all 0.2s;
1728
+ white-space: nowrap;
1729
+ flex-shrink: 0;
1730
+ font-family: inherit;
1731
+ }
1732
+
1733
+ .log-autoscroll svg {
1734
+ width: 12px;
1735
+ height: 12px;
1736
+ stroke: currentColor;
1737
+ fill: none;
1738
+ stroke-width: 2;
1739
+ stroke-linecap: round;
1740
+ stroke-linejoin: round;
1741
+ flex-shrink: 0;
1742
+ }
1743
+
1744
+ .log-autoscroll.active {
1745
+ color: var(--success);
1746
+ border-color: var(--success-border);
1747
+ background: var(--success-bg);
1748
+ }
1749
+
1750
+ .log-autoscroll:hover {
1751
+ background: rgba(255, 255, 255, 0.06);
1752
+ color: var(--text-secondary);
1753
+ }
1754
+
1755
+ .log-autoscroll.active:hover {
1756
+ background: var(--success-bg);
1757
+ color: var(--success);
1758
+ }
1759
+
1760
+ /* Line count indicator */
1761
+ .log-line-count {
1762
+ font-size: 0.65rem;
1763
+ color: var(--text-dim);
1764
+ font-family: var(--font-mono);
1765
+ flex-shrink: 0;
1766
+ white-space: nowrap;
1767
+ }
1768
+
1769
+
1770
+
1292
1771
  /* ─── Legacy logs panel (kept for backwards compat) ─── */
1293
1772
  .logs-panel {
1294
1773
  margin-top: 2rem;
@@ -1322,6 +1801,15 @@ tr[data-process-name]:hover .process-icon {
1322
1801
  width: 100%;
1323
1802
  max-width: 420px;
1324
1803
  }
1804
+
1805
+ .command {
1806
+ max-width: 160px;
1807
+ }
1808
+ }
1809
+
1810
+ /* ─── Mobile Cards (hidden by default, shown on ≤768px) ─── */
1811
+ .mobile-cards {
1812
+ display: none;
1325
1813
  }
1326
1814
 
1327
1815
  @media (max-width: 768px) {
@@ -1336,7 +1824,7 @@ tr[data-process-name]:hover .process-icon {
1336
1824
  }
1337
1825
 
1338
1826
  .stats-grid {
1339
- grid-template-columns: 1fr;
1827
+ grid-template-columns: repeat(2, 1fr);
1340
1828
  }
1341
1829
 
1342
1830
  .toolbar {
@@ -1352,16 +1840,98 @@ tr[data-process-name]:hover .process-icon {
1352
1840
  max-width: 100%;
1353
1841
  }
1354
1842
 
1843
+ /* Hide table, show cards */
1355
1844
  .table-container {
1356
- overflow-x: auto;
1845
+ display: none;
1357
1846
  }
1358
1847
 
1359
- table {
1360
- min-width: 700px;
1848
+ .mobile-cards {
1849
+ display: flex;
1850
+ flex-direction: column;
1851
+ gap: 0.75rem;
1361
1852
  }
1362
1853
 
1363
1854
  .detail-drawer {
1364
1855
  width: 100%;
1365
1856
  max-width: 100%;
1366
1857
  }
1858
+
1859
+ /* ─── Process Card ─── */
1860
+ .process-card {
1861
+ background: var(--bg-card);
1862
+ border: 1px solid var(--border-glass);
1863
+ border-radius: var(--radius-lg);
1864
+ padding: 1rem;
1865
+ cursor: pointer;
1866
+ transition: all 0.2s ease;
1867
+ }
1868
+
1869
+ .process-card:hover {
1870
+ border-color: var(--accent-primary);
1871
+ box-shadow: 0 0 20px rgba(168, 85, 247, 0.15);
1872
+ transform: translateY(-1px);
1873
+ }
1874
+
1875
+ .card-header {
1876
+ display: flex;
1877
+ align-items: center;
1878
+ justify-content: space-between;
1879
+ margin-bottom: 0.75rem;
1880
+ }
1881
+
1882
+ .card-header .process-name {
1883
+ font-size: 0.95rem;
1884
+ font-weight: 600;
1885
+ }
1886
+
1887
+ .card-details {
1888
+ display: grid;
1889
+ grid-template-columns: 1fr 1fr;
1890
+ gap: 0.4rem 1rem;
1891
+ margin-bottom: 0.6rem;
1892
+ }
1893
+
1894
+ .card-detail {
1895
+ display: flex;
1896
+ justify-content: space-between;
1897
+ font-size: 0.78rem;
1898
+ color: var(--text-secondary);
1899
+ }
1900
+
1901
+ .card-label {
1902
+ color: var(--text-muted);
1903
+ text-transform: uppercase;
1904
+ font-size: 0.65rem;
1905
+ letter-spacing: 0.05em;
1906
+ font-weight: 500;
1907
+ }
1908
+
1909
+ .card-command {
1910
+ font-family: var(--font-mono);
1911
+ font-size: 0.72rem;
1912
+ color: var(--text-muted);
1913
+ background: rgba(255, 255, 255, 0.03);
1914
+ border-radius: var(--radius-sm);
1915
+ padding: 0.35rem 0.5rem;
1916
+ margin-bottom: 0.75rem;
1917
+ overflow: hidden;
1918
+ text-overflow: ellipsis;
1919
+ white-space: nowrap;
1920
+ }
1921
+
1922
+ .card-actions {
1923
+ display: flex;
1924
+ gap: 0.5rem;
1925
+ }
1926
+
1927
+ .card-actions .action-btn {
1928
+ flex: 1;
1929
+ display: flex;
1930
+ align-items: center;
1931
+ justify-content: center;
1932
+ gap: 0.35rem;
1933
+ padding: 0.5rem;
1934
+ font-size: 0.75rem;
1935
+ border-radius: var(--radius-md);
1936
+ }
1367
1937
  }