bgrun 3.10.1 → 3.11.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;
@@ -611,6 +749,57 @@ body::after {
611
749
  transform: scale(0.98);
612
750
  }
613
751
 
752
+ /* Guard All button */
753
+ .btn-guard-all {
754
+ display: inline-flex;
755
+ align-items: center;
756
+ gap: 0.4rem;
757
+ font-size: 0.78rem;
758
+ font-weight: 600;
759
+ letter-spacing: 0.02em;
760
+ transition: all 0.25s ease;
761
+ }
762
+
763
+ .btn-guard-all svg {
764
+ width: 16px;
765
+ height: 16px;
766
+ transition: all 0.25s ease;
767
+ }
768
+
769
+ .btn-guard-all:hover svg {
770
+ stroke: #14b8a6;
771
+ filter: drop-shadow(0 0 4px rgba(20, 184, 166, 0.4));
772
+ }
773
+
774
+ .btn-guard-all.all-guarded {
775
+ background: rgba(20, 184, 166, 0.1);
776
+ border-color: rgba(20, 184, 166, 0.3);
777
+ color: #14b8a6;
778
+ }
779
+
780
+ .btn-guard-all.all-guarded svg {
781
+ stroke: #14b8a6;
782
+ fill: rgba(20, 184, 166, 0.15);
783
+ filter: drop-shadow(0 0 6px rgba(20, 184, 166, 0.5));
784
+ }
785
+
786
+ .btn-guard-all.all-guarded:hover {
787
+ background: rgba(239, 68, 68, 0.08);
788
+ border-color: rgba(239, 68, 68, 0.3);
789
+ color: #ef4444;
790
+ }
791
+
792
+ .btn-guard-all.all-guarded:hover svg {
793
+ stroke: #ef4444;
794
+ fill: rgba(239, 68, 68, 0.15);
795
+ filter: drop-shadow(0 0 4px rgba(239, 68, 68, 0.4));
796
+ }
797
+
798
+ .btn-guard-all:disabled {
799
+ opacity: 0.5;
800
+ cursor: not-allowed;
801
+ }
802
+
614
803
  .btn-danger {
615
804
  background: var(--danger-bg);
616
805
  color: var(--danger);
@@ -1496,6 +1685,137 @@ a.port-link:hover {
1496
1685
  font-family: var(--font-mono);
1497
1686
  }
1498
1687
 
1688
+ /* ─── Guard Toggle (inside drawer meta) ─── */
1689
+ .meta-guard {
1690
+ grid-column: 1 / -1;
1691
+ flex-direction: row;
1692
+ align-items: center;
1693
+ justify-content: space-between;
1694
+ padding: 0.625rem 0.75rem;
1695
+ background: rgba(255, 255, 255, 0.02);
1696
+ border: 1px solid var(--border-glass);
1697
+ border-radius: var(--radius-sm);
1698
+ transition: all 0.25s ease;
1699
+ }
1700
+
1701
+ .meta-guard .meta-label {
1702
+ display: flex;
1703
+ align-items: center;
1704
+ gap: 0.4rem;
1705
+ }
1706
+
1707
+ .meta-guard .meta-label svg {
1708
+ width: 14px;
1709
+ height: 14px;
1710
+ stroke: var(--text-dim);
1711
+ transition: all 0.25s ease;
1712
+ }
1713
+
1714
+ .meta-guard.guarded {
1715
+ background: rgba(20, 184, 166, 0.06);
1716
+ border-color: rgba(20, 184, 166, 0.2);
1717
+ }
1718
+
1719
+ .meta-guard.guarded .meta-label svg {
1720
+ stroke: #14b8a6;
1721
+ filter: drop-shadow(0 0 4px rgba(20, 184, 166, 0.4));
1722
+ }
1723
+
1724
+ .guard-toggle {
1725
+ display: flex;
1726
+ align-items: center;
1727
+ gap: 0.5rem;
1728
+ cursor: pointer;
1729
+ user-select: none;
1730
+ }
1731
+
1732
+ .guard-toggle-input {
1733
+ position: absolute;
1734
+ opacity: 0;
1735
+ width: 0;
1736
+ height: 0;
1737
+ }
1738
+
1739
+ .guard-toggle-track {
1740
+ position: relative;
1741
+ width: 32px;
1742
+ height: 18px;
1743
+ background: rgba(255, 255, 255, 0.08);
1744
+ border-radius: 9px;
1745
+ border: 1px solid rgba(255, 255, 255, 0.1);
1746
+ transition: all 0.25s ease;
1747
+ flex-shrink: 0;
1748
+ }
1749
+
1750
+ .guard-toggle-thumb {
1751
+ position: absolute;
1752
+ top: 2px;
1753
+ left: 2px;
1754
+ width: 12px;
1755
+ height: 12px;
1756
+ border-radius: 50%;
1757
+ background: var(--text-muted);
1758
+ transition: all 0.25s ease;
1759
+ }
1760
+
1761
+ .guard-toggle-input:checked~.guard-toggle-track {
1762
+ background: rgba(20, 184, 166, 0.2);
1763
+ border-color: rgba(20, 184, 166, 0.4);
1764
+ }
1765
+
1766
+ .guard-toggle-input:checked~.guard-toggle-track .guard-toggle-thumb {
1767
+ left: 16px;
1768
+ background: #14b8a6;
1769
+ box-shadow: 0 0 6px rgba(20, 184, 166, 0.5);
1770
+ }
1771
+
1772
+ .guard-toggle-label {
1773
+ font-size: 0.72rem;
1774
+ font-weight: 600;
1775
+ color: var(--text-muted);
1776
+ font-family: var(--font-mono);
1777
+ transition: color 0.25s ease;
1778
+ min-width: 60px;
1779
+ }
1780
+
1781
+ .meta-guard.guarded .guard-toggle-label {
1782
+ color: #14b8a6;
1783
+ }
1784
+
1785
+ /* Guard restart counter */
1786
+ .meta-restarts {
1787
+ grid-column: 1 / -1;
1788
+ border-top: 1px solid var(--border-glass);
1789
+ padding-top: 0.6rem;
1790
+ }
1791
+
1792
+ .meta-restarts .meta-value {
1793
+ display: flex;
1794
+ align-items: center;
1795
+ gap: 0.5rem;
1796
+ }
1797
+
1798
+ .restart-count-badge {
1799
+ display: inline-flex;
1800
+ align-items: center;
1801
+ justify-content: center;
1802
+ min-width: 22px;
1803
+ height: 22px;
1804
+ padding: 0 6px;
1805
+ border-radius: 6px;
1806
+ font-size: 0.75rem;
1807
+ font-weight: 700;
1808
+ background: rgba(245, 158, 11, 0.15);
1809
+ color: #f59e0b;
1810
+ border: 1px solid rgba(245, 158, 11, 0.25);
1811
+ }
1812
+
1813
+ .restart-count-text {
1814
+ font-size: 0.72rem;
1815
+ color: var(--text-muted);
1816
+ font-style: italic;
1817
+ }
1818
+
1499
1819
  .drawer-logs {
1500
1820
  font-family: var(--font-mono);
1501
1821
  font-size: 0.75rem;
@@ -1956,7 +2276,7 @@ a.port-link:hover {
1956
2276
  }
1957
2277
 
1958
2278
  .stats-grid {
1959
- grid-template-columns: repeat(2, 1fr);
2279
+ grid-template-columns: repeat(3, 1fr);
1960
2280
  }
1961
2281
 
1962
2282
  .toolbar {
@@ -2052,18 +2372,78 @@ a.port-link:hover {
2052
2372
  }
2053
2373
 
2054
2374
  .card-actions {
2055
- display: flex;
2375
+ display: grid;
2376
+ grid-template-columns: repeat(3, 1fr);
2056
2377
  gap: 0.5rem;
2057
2378
  }
2058
2379
 
2059
2380
  .card-actions .action-btn {
2060
- flex: 1;
2061
2381
  display: flex;
2062
2382
  align-items: center;
2063
2383
  justify-content: center;
2064
2384
  gap: 0.35rem;
2065
- padding: 0.5rem;
2385
+ padding: 0.6rem;
2066
2386
  font-size: 0.75rem;
2067
2387
  border-radius: var(--radius-md);
2388
+ background: rgba(255, 255, 255, 0.03);
2389
+ border: 1px solid var(--border-glass);
2068
2390
  }
2391
+ }
2392
+
2393
+ .metrics-cell {
2394
+ display: flex;
2395
+ align-items: center;
2396
+ justify-content: flex-start;
2397
+ gap: 4px;
2398
+ }
2399
+
2400
+ .metrics-cell span {
2401
+ min-width: 48px;
2402
+ }
2403
+
2404
+
2405
+ /* Guard Sentinel Pill (standalone guard status) */
2406
+ .guard-sentinel-pill {
2407
+ display: inline-flex;
2408
+ align-items: center;
2409
+ gap: 6px;
2410
+ padding: 4px 10px;
2411
+ border-radius: 9999px;
2412
+ font-size: 0.7rem;
2413
+ font-family: var(--font-mono);
2414
+ color: var(--text-muted);
2415
+ background: var(--bg-glass);
2416
+ border: 1px solid var(--border-glass);
2417
+ letter-spacing: 0.02em;
2418
+ transition: all var(--transition-fast);
2419
+ cursor: default;
2420
+ }
2421
+
2422
+ .guard-sentinel-dot {
2423
+ width: 7px;
2424
+ height: 7px;
2425
+ border-radius: 50%;
2426
+ background: var(--text-dim);
2427
+ transition: all var(--transition-fast);
2428
+ }
2429
+
2430
+ .guard-sentinel-pill.active {
2431
+ border-color: rgba(20, 184, 166, 0.25);
2432
+ color: #14b8a6;
2433
+ }
2434
+
2435
+ .guard-sentinel-pill.active .guard-sentinel-dot {
2436
+ background: #14b8a6;
2437
+ box-shadow: 0 0 6px rgba(20, 184, 166, 0.6);
2438
+ animation: statusPulse 2s infinite;
2439
+ }
2440
+
2441
+ .guard-sentinel-pill.stopped {
2442
+ border-color: rgba(239, 68, 68, 0.2);
2443
+ color: var(--text-dim);
2444
+ }
2445
+
2446
+ .guard-sentinel-pill.stopped .guard-sentinel-dot {
2447
+ background: var(--danger);
2448
+ box-shadow: 0 0 4px rgba(239, 68, 68, 0.3);
2069
2449
  }