bgrun 3.10.2 → 3.12.0

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.
@@ -300,7 +300,7 @@ body::after {
300
300
  /* ─── Stats Grid ─── */
301
301
  .stats-grid {
302
302
  display: grid;
303
- grid-template-columns: repeat(4, 1fr);
303
+ grid-template-columns: repeat(6, 1fr);
304
304
  gap: 1rem;
305
305
  margin-bottom: 2rem;
306
306
  }
@@ -395,7 +395,7 @@ body::after {
395
395
  letter-spacing: -0.02em;
396
396
  }
397
397
 
398
- .stat-card:not(.running):not(.stopped):not(.memory) .stat-value {
398
+ .stat-card:not(.running):not(.stopped):not(.memory):not(.restarts) .stat-value {
399
399
  background: var(--accent-gradient);
400
400
  -webkit-background-clip: text;
401
401
  -webkit-text-fill-color: transparent;
@@ -427,6 +427,144 @@ body::after {
427
427
  color: var(--info);
428
428
  }
429
429
 
430
+ /* ─── Guard Stat Card ─── */
431
+ .stat-card.guarded {
432
+ border-left: 3px solid #14b8a6;
433
+ }
434
+
435
+ .stat-card.guarded::before {
436
+ background: #14b8a6;
437
+ opacity: 0.08;
438
+ }
439
+
440
+ .stat-card.guarded:hover::before {
441
+ opacity: 0.12;
442
+ }
443
+
444
+ .stat-card.guarded .stat-value {
445
+ color: #14b8a6;
446
+ }
447
+
448
+ /* ─── Restarts Stat Card ─── */
449
+ .stat-card.restarts {
450
+ border-left: 3px solid var(--warning);
451
+ }
452
+
453
+ .stat-card.restarts::before {
454
+ background: var(--warning);
455
+ opacity: 0.08;
456
+ }
457
+
458
+ .stat-card.restarts:hover::before {
459
+ opacity: 0.12;
460
+ }
461
+
462
+ .stat-card.restarts .stat-value {
463
+ color: var(--warning);
464
+ }
465
+
466
+ /* ─── Guard Toggle (inline shield icon in process name) ─── */
467
+ .guard-toggle {
468
+ display: inline-flex;
469
+ align-items: center;
470
+ justify-content: center;
471
+ width: 22px;
472
+ height: 22px;
473
+ padding: 0;
474
+ border: none;
475
+ border-radius: 6px;
476
+ background: transparent;
477
+ color: var(--text-dim);
478
+ cursor: pointer;
479
+ transition: all var(--transition-fast);
480
+ flex-shrink: 0;
481
+ opacity: 0.35;
482
+ }
483
+
484
+ .guard-toggle svg {
485
+ width: 14px;
486
+ height: 14px;
487
+ }
488
+
489
+ .guard-toggle:hover {
490
+ opacity: 1;
491
+ color: var(--text-muted);
492
+ background: var(--bg-hover);
493
+ transform: scale(1.15);
494
+ }
495
+
496
+ .guard-toggle.guarded {
497
+ opacity: 1;
498
+ color: #14b8a6;
499
+ filter: drop-shadow(0 0 6px rgba(20, 184, 166, 0.5));
500
+ }
501
+
502
+ .guard-toggle.guarded svg {
503
+ fill: rgba(20, 184, 166, 0.15);
504
+ }
505
+
506
+ .guard-toggle.guarded:hover {
507
+ color: #99f6e4;
508
+ filter: drop-shadow(0 0 10px rgba(20, 184, 166, 0.7));
509
+ background: rgba(20, 184, 166, 0.1);
510
+ }
511
+
512
+ /* Guard badge for mobile cards */
513
+ .guard-badge {
514
+ font-size: 0.75rem;
515
+ margin-left: 0.25rem;
516
+ }
517
+
518
+ /* Guard action button styling */
519
+ .action-btn.guard {
520
+ color: var(--text-muted);
521
+ }
522
+
523
+ .action-btn.guard:hover {
524
+ background: rgba(20, 184, 166, 0.1);
525
+ color: #14b8a6;
526
+ border-color: rgba(20, 184, 166, 0.3);
527
+ }
528
+
529
+ .action-btn.guard.active {
530
+ color: #14b8a6;
531
+ background: rgba(20, 184, 166, 0.08);
532
+ border-color: rgba(20, 184, 166, 0.2);
533
+ }
534
+
535
+ .action-btn.guard.active:hover {
536
+ background: rgba(20, 184, 166, 0.15);
537
+ color: #99f6e4;
538
+ }
539
+
540
+ /* Context menu guard item */
541
+ .context-item.guard:hover {
542
+ background: rgba(20, 184, 166, 0.1);
543
+ color: #14b8a6;
544
+ }
545
+
546
+ .context-item.guard:hover svg {
547
+ color: #14b8a6;
548
+ }
549
+
550
+ .context-item.guard-active {
551
+ color: #14b8a6;
552
+ }
553
+
554
+ .context-item.guard-active svg {
555
+ color: #14b8a6;
556
+ fill: rgba(20, 184, 166, 0.15);
557
+ }
558
+
559
+ .context-item.guard-active:hover {
560
+ background: rgba(20, 184, 166, 0.1);
561
+ color: #99f6e4;
562
+ }
563
+
564
+ .context-item.guard-active:hover svg {
565
+ color: #99f6e4;
566
+ }
567
+
430
568
  .toolbar {
431
569
  display: flex;
432
570
  justify-content: space-between;
@@ -537,6 +675,22 @@ body::after {
537
675
  opacity: 0;
538
676
  }
539
677
 
678
+ .search-count {
679
+ position: absolute;
680
+ right: 2rem;
681
+ top: 50%;
682
+ transform: translateY(-50%);
683
+ padding: 1px 6px;
684
+ font-size: 0.6rem;
685
+ font-family: var(--font-mono);
686
+ color: var(--accent);
687
+ border: 1px solid color-mix(in srgb, var(--accent) 30%, transparent);
688
+ border-radius: 8px;
689
+ background: color-mix(in srgb, var(--accent) 8%, transparent);
690
+ pointer-events: none;
691
+ letter-spacing: 0.3px;
692
+ }
693
+
540
694
  /* ─── Buttons ─── */
541
695
  .btn {
542
696
  display: inline-flex;
@@ -611,6 +765,57 @@ body::after {
611
765
  transform: scale(0.98);
612
766
  }
613
767
 
768
+ /* Guard All button */
769
+ .btn-guard-all {
770
+ display: inline-flex;
771
+ align-items: center;
772
+ gap: 0.4rem;
773
+ font-size: 0.78rem;
774
+ font-weight: 600;
775
+ letter-spacing: 0.02em;
776
+ transition: all 0.25s ease;
777
+ }
778
+
779
+ .btn-guard-all svg {
780
+ width: 16px;
781
+ height: 16px;
782
+ transition: all 0.25s ease;
783
+ }
784
+
785
+ .btn-guard-all:hover svg {
786
+ stroke: #14b8a6;
787
+ filter: drop-shadow(0 0 4px rgba(20, 184, 166, 0.4));
788
+ }
789
+
790
+ .btn-guard-all.all-guarded {
791
+ background: rgba(20, 184, 166, 0.1);
792
+ border-color: rgba(20, 184, 166, 0.3);
793
+ color: #14b8a6;
794
+ }
795
+
796
+ .btn-guard-all.all-guarded svg {
797
+ stroke: #14b8a6;
798
+ fill: rgba(20, 184, 166, 0.15);
799
+ filter: drop-shadow(0 0 6px rgba(20, 184, 166, 0.5));
800
+ }
801
+
802
+ .btn-guard-all.all-guarded:hover {
803
+ background: rgba(239, 68, 68, 0.08);
804
+ border-color: rgba(239, 68, 68, 0.3);
805
+ color: #ef4444;
806
+ }
807
+
808
+ .btn-guard-all.all-guarded:hover svg {
809
+ stroke: #ef4444;
810
+ fill: rgba(239, 68, 68, 0.15);
811
+ filter: drop-shadow(0 0 4px rgba(239, 68, 68, 0.4));
812
+ }
813
+
814
+ .btn-guard-all:disabled {
815
+ opacity: 0.5;
816
+ cursor: not-allowed;
817
+ }
818
+
614
819
  .btn-danger {
615
820
  background: var(--danger-bg);
616
821
  color: var(--danger);
@@ -1496,6 +1701,137 @@ a.port-link:hover {
1496
1701
  font-family: var(--font-mono);
1497
1702
  }
1498
1703
 
1704
+ /* ─── Guard Toggle (inside drawer meta) ─── */
1705
+ .meta-guard {
1706
+ grid-column: 1 / -1;
1707
+ flex-direction: row;
1708
+ align-items: center;
1709
+ justify-content: space-between;
1710
+ padding: 0.625rem 0.75rem;
1711
+ background: rgba(255, 255, 255, 0.02);
1712
+ border: 1px solid var(--border-glass);
1713
+ border-radius: var(--radius-sm);
1714
+ transition: all 0.25s ease;
1715
+ }
1716
+
1717
+ .meta-guard .meta-label {
1718
+ display: flex;
1719
+ align-items: center;
1720
+ gap: 0.4rem;
1721
+ }
1722
+
1723
+ .meta-guard .meta-label svg {
1724
+ width: 14px;
1725
+ height: 14px;
1726
+ stroke: var(--text-dim);
1727
+ transition: all 0.25s ease;
1728
+ }
1729
+
1730
+ .meta-guard.guarded {
1731
+ background: rgba(20, 184, 166, 0.06);
1732
+ border-color: rgba(20, 184, 166, 0.2);
1733
+ }
1734
+
1735
+ .meta-guard.guarded .meta-label svg {
1736
+ stroke: #14b8a6;
1737
+ filter: drop-shadow(0 0 4px rgba(20, 184, 166, 0.4));
1738
+ }
1739
+
1740
+ .guard-toggle {
1741
+ display: flex;
1742
+ align-items: center;
1743
+ gap: 0.5rem;
1744
+ cursor: pointer;
1745
+ user-select: none;
1746
+ }
1747
+
1748
+ .guard-toggle-input {
1749
+ position: absolute;
1750
+ opacity: 0;
1751
+ width: 0;
1752
+ height: 0;
1753
+ }
1754
+
1755
+ .guard-toggle-track {
1756
+ position: relative;
1757
+ width: 32px;
1758
+ height: 18px;
1759
+ background: rgba(255, 255, 255, 0.08);
1760
+ border-radius: 9px;
1761
+ border: 1px solid rgba(255, 255, 255, 0.1);
1762
+ transition: all 0.25s ease;
1763
+ flex-shrink: 0;
1764
+ }
1765
+
1766
+ .guard-toggle-thumb {
1767
+ position: absolute;
1768
+ top: 2px;
1769
+ left: 2px;
1770
+ width: 12px;
1771
+ height: 12px;
1772
+ border-radius: 50%;
1773
+ background: var(--text-muted);
1774
+ transition: all 0.25s ease;
1775
+ }
1776
+
1777
+ .guard-toggle-input:checked~.guard-toggle-track {
1778
+ background: rgba(20, 184, 166, 0.2);
1779
+ border-color: rgba(20, 184, 166, 0.4);
1780
+ }
1781
+
1782
+ .guard-toggle-input:checked~.guard-toggle-track .guard-toggle-thumb {
1783
+ left: 16px;
1784
+ background: #14b8a6;
1785
+ box-shadow: 0 0 6px rgba(20, 184, 166, 0.5);
1786
+ }
1787
+
1788
+ .guard-toggle-label {
1789
+ font-size: 0.72rem;
1790
+ font-weight: 600;
1791
+ color: var(--text-muted);
1792
+ font-family: var(--font-mono);
1793
+ transition: color 0.25s ease;
1794
+ min-width: 60px;
1795
+ }
1796
+
1797
+ .meta-guard.guarded .guard-toggle-label {
1798
+ color: #14b8a6;
1799
+ }
1800
+
1801
+ /* Guard restart counter */
1802
+ .meta-restarts {
1803
+ grid-column: 1 / -1;
1804
+ border-top: 1px solid var(--border-glass);
1805
+ padding-top: 0.6rem;
1806
+ }
1807
+
1808
+ .meta-restarts .meta-value {
1809
+ display: flex;
1810
+ align-items: center;
1811
+ gap: 0.5rem;
1812
+ }
1813
+
1814
+ .restart-count-badge {
1815
+ display: inline-flex;
1816
+ align-items: center;
1817
+ justify-content: center;
1818
+ min-width: 22px;
1819
+ height: 22px;
1820
+ padding: 0 6px;
1821
+ border-radius: 6px;
1822
+ font-size: 0.75rem;
1823
+ font-weight: 700;
1824
+ background: rgba(245, 158, 11, 0.15);
1825
+ color: #f59e0b;
1826
+ border: 1px solid rgba(245, 158, 11, 0.25);
1827
+ }
1828
+
1829
+ .restart-count-text {
1830
+ font-size: 0.72rem;
1831
+ color: var(--text-muted);
1832
+ font-style: italic;
1833
+ }
1834
+
1499
1835
  .drawer-logs {
1500
1836
  font-family: var(--font-mono);
1501
1837
  font-size: 0.75rem;
@@ -1720,6 +2056,14 @@ a.port-link:hover {
1720
2056
  white-space: nowrap;
1721
2057
  }
1722
2058
 
2059
+ /* ─── Virtual Scroll Spacers ─── */
2060
+ .log-virtual-top,
2061
+ .log-virtual-bottom {
2062
+ display: block;
2063
+ width: 100%;
2064
+ pointer-events: none;
2065
+ }
2066
+
1723
2067
  /* ─── Log Lines ─── */
1724
2068
  .log-line {
1725
2069
  padding: 0.1rem 0.5rem 0.1rem 0;
@@ -1956,7 +2300,7 @@ a.port-link:hover {
1956
2300
  }
1957
2301
 
1958
2302
  .stats-grid {
1959
- grid-template-columns: repeat(2, 1fr);
2303
+ grid-template-columns: repeat(3, 1fr);
1960
2304
  }
1961
2305
 
1962
2306
  .toolbar {
@@ -2052,18 +2396,215 @@ a.port-link:hover {
2052
2396
  }
2053
2397
 
2054
2398
  .card-actions {
2055
- display: flex;
2399
+ display: grid;
2400
+ grid-template-columns: repeat(3, 1fr);
2056
2401
  gap: 0.5rem;
2057
2402
  }
2058
2403
 
2059
2404
  .card-actions .action-btn {
2060
- flex: 1;
2061
2405
  display: flex;
2062
2406
  align-items: center;
2063
2407
  justify-content: center;
2064
2408
  gap: 0.35rem;
2065
- padding: 0.5rem;
2409
+ padding: 0.6rem;
2066
2410
  font-size: 0.75rem;
2067
2411
  border-radius: var(--radius-md);
2412
+ background: rgba(255, 255, 255, 0.03);
2413
+ border: 1px solid var(--border-glass);
2068
2414
  }
2415
+ }
2416
+
2417
+ .metrics-cell {
2418
+ display: flex;
2419
+ align-items: center;
2420
+ justify-content: flex-start;
2421
+ gap: 4px;
2422
+ }
2423
+
2424
+ .metrics-cell span {
2425
+ min-width: 48px;
2426
+ }
2427
+
2428
+
2429
+ /* Guard Sentinel Pill (standalone guard status) */
2430
+ .guard-sentinel-pill {
2431
+ display: inline-flex;
2432
+ align-items: center;
2433
+ gap: 6px;
2434
+ padding: 4px 10px;
2435
+ border-radius: 9999px;
2436
+ font-size: 0.7rem;
2437
+ font-family: var(--font-mono);
2438
+ color: var(--text-muted);
2439
+ background: var(--bg-glass);
2440
+ border: 1px solid var(--border-glass);
2441
+ letter-spacing: 0.02em;
2442
+ transition: all var(--transition-fast);
2443
+ cursor: default;
2444
+ }
2445
+
2446
+ .guard-sentinel-dot {
2447
+ width: 7px;
2448
+ height: 7px;
2449
+ border-radius: 50%;
2450
+ background: var(--text-dim);
2451
+ transition: all var(--transition-fast);
2452
+ }
2453
+
2454
+ .guard-sentinel-pill.active {
2455
+ border-color: rgba(20, 184, 166, 0.25);
2456
+ color: #14b8a6;
2457
+ }
2458
+
2459
+ .guard-sentinel-pill.active .guard-sentinel-dot {
2460
+ background: #14b8a6;
2461
+ box-shadow: 0 0 6px rgba(20, 184, 166, 0.6);
2462
+ animation: statusPulse 2s infinite;
2463
+ }
2464
+
2465
+ .guard-sentinel-pill.stopped {
2466
+ border-color: rgba(239, 68, 68, 0.2);
2467
+ color: var(--text-dim);
2468
+ }
2469
+
2470
+ .guard-sentinel-pill.stopped .guard-sentinel-dot {
2471
+ background: var(--danger);
2472
+ box-shadow: 0 0 4px rgba(239, 68, 68, 0.3);
2473
+ }
2474
+
2475
+ /* ─── Keyboard Navigation Focus ─── */
2476
+ tr.keyboard-focus {
2477
+ outline: 2px solid var(--accent-primary);
2478
+ outline-offset: -2px;
2479
+ background: rgba(168, 85, 247, 0.08) !important;
2480
+ border-radius: var(--radius-sm);
2481
+ }
2482
+
2483
+ tr.keyboard-focus td:first-child .process-name span {
2484
+ color: var(--accent-primary);
2485
+ }
2486
+
2487
+ /* ─── Keyboard Shortcuts Overlay ─── */
2488
+ .shortcuts-overlay {
2489
+ position: fixed;
2490
+ inset: 0;
2491
+ z-index: 2000;
2492
+ background: rgba(0, 0, 0, 0.6);
2493
+ backdrop-filter: blur(4px);
2494
+ display: flex;
2495
+ align-items: center;
2496
+ justify-content: center;
2497
+ opacity: 0;
2498
+ pointer-events: none;
2499
+ transition: opacity 0.2s ease;
2500
+ }
2501
+
2502
+ .shortcuts-overlay.active {
2503
+ opacity: 1;
2504
+ pointer-events: auto;
2505
+ }
2506
+
2507
+ .shortcuts-panel {
2508
+ background: var(--bg-secondary);
2509
+ border: 1px solid var(--border-glass);
2510
+ border-radius: var(--radius-lg);
2511
+ box-shadow: 0 24px 80px rgba(0, 0, 0, 0.5), 0 0 60px rgba(0, 0, 0, 0.3);
2512
+ padding: 1.5rem;
2513
+ min-width: 440px;
2514
+ max-width: 520px;
2515
+ animation: scaleIn 0.2s ease;
2516
+ }
2517
+
2518
+ .shortcuts-overlay.active .shortcuts-panel {
2519
+ animation: scaleIn 0.2s ease;
2520
+ }
2521
+
2522
+ @keyframes scaleIn {
2523
+ from {
2524
+ transform: scale(0.95);
2525
+ opacity: 0;
2526
+ }
2527
+
2528
+ to {
2529
+ transform: scale(1);
2530
+ opacity: 1;
2531
+ }
2532
+ }
2533
+
2534
+ .shortcuts-header {
2535
+ display: flex;
2536
+ align-items: center;
2537
+ justify-content: space-between;
2538
+ margin-bottom: 1.25rem;
2539
+ padding-bottom: 0.75rem;
2540
+ border-bottom: 1px solid var(--border-glass);
2541
+ }
2542
+
2543
+ .shortcuts-header h3 {
2544
+ font-size: 1rem;
2545
+ font-weight: 600;
2546
+ color: var(--text-primary);
2547
+ margin: 0;
2548
+ }
2549
+
2550
+ .shortcuts-close {
2551
+ background: none;
2552
+ border: none;
2553
+ color: var(--text-muted);
2554
+ font-size: 1.1rem;
2555
+ cursor: pointer;
2556
+ padding: 0.25rem;
2557
+ line-height: 1;
2558
+ transition: color 0.15s;
2559
+ }
2560
+
2561
+ .shortcuts-close:hover {
2562
+ color: var(--text-primary);
2563
+ }
2564
+
2565
+ .shortcuts-grid {
2566
+ display: grid;
2567
+ grid-template-columns: 1fr 1fr;
2568
+ gap: 1.5rem;
2569
+ }
2570
+
2571
+ .shortcut-section h4 {
2572
+ font-size: 0.7rem;
2573
+ text-transform: uppercase;
2574
+ letter-spacing: 0.08em;
2575
+ color: var(--text-dim);
2576
+ font-weight: 600;
2577
+ margin: 0 0 0.6rem 0;
2578
+ }
2579
+
2580
+ .shortcut-row {
2581
+ display: flex;
2582
+ align-items: center;
2583
+ gap: 0.4rem;
2584
+ padding: 0.3rem 0;
2585
+ font-size: 0.8rem;
2586
+ color: var(--text-secondary);
2587
+ }
2588
+
2589
+ .shortcut-row span {
2590
+ flex: 1;
2591
+ }
2592
+
2593
+ .shortcut-row kbd {
2594
+ display: inline-flex;
2595
+ align-items: center;
2596
+ justify-content: center;
2597
+ min-width: 24px;
2598
+ height: 24px;
2599
+ padding: 0 6px;
2600
+ background: rgba(255, 255, 255, 0.06);
2601
+ border: 1px solid rgba(255, 255, 255, 0.12);
2602
+ border-radius: 5px;
2603
+ font-family: var(--font-mono);
2604
+ font-size: 0.68rem;
2605
+ font-weight: 600;
2606
+ color: var(--text-primary);
2607
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.06);
2608
+ line-height: 1;
2609
+ flex-shrink: 0;
2069
2610
  }