simvyn 2.3.0 → 2.5.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.
@@ -75,6 +75,7 @@
75
75
  --color-green-500: oklch(72.3% .219 149.579);
76
76
  --color-cyan-400: oklch(78.9% .154 211.53);
77
77
  --color-cyan-500: oklch(71.5% .143 215.221);
78
+ --color-blue-300: oklch(80.9% .105 251.813);
78
79
  --color-blue-400: oklch(70.7% .165 254.624);
79
80
  --color-purple-400: oklch(71.4% .203 305.504);
80
81
  --color-purple-500: oklch(62.7% .265 303.9);
@@ -1926,6 +1927,10 @@
1926
1927
  font-variant-numeric: var(--tw-ordinal, ) var(--tw-slashed-zero, ) var(--tw-numeric-figure, ) var(--tw-numeric-spacing, ) var(--tw-numeric-fraction, );
1927
1928
  }
1928
1929
 
1930
+ .underline {
1931
+ text-decoration-line: underline;
1932
+ }
1933
+
1929
1934
  .accent-\[\#F97316\] {
1930
1935
  accent-color: #f97316;
1931
1936
  }
@@ -2151,6 +2156,10 @@
2151
2156
  }
2152
2157
  }
2153
2158
 
2159
+ .hover\:text-blue-300:hover {
2160
+ color: var(--color-blue-300);
2161
+ }
2162
+
2154
2163
  .hover\:text-red-200:hover {
2155
2164
  color: var(--color-red-200);
2156
2165
  }
@@ -2313,6 +2322,11 @@ body {
2313
2322
  scrollbar-color: oklch(45% .015 260 / .35) transparent;
2314
2323
  }
2315
2324
 
2325
+ .dock-sidebar-hitarea {
2326
+ align-self: center;
2327
+ padding: 12px 0 12px 12px;
2328
+ }
2329
+
2316
2330
  .dock-sidebar {
2317
2331
  z-index: 20;
2318
2332
  -webkit-backdrop-filter: blur(24px) saturate(1.5);
@@ -2323,7 +2337,6 @@ body {
2323
2337
  align-self: center;
2324
2338
  align-items: stretch;
2325
2339
  gap: 2px;
2326
- margin: 12px 0 12px 12px;
2327
2340
  padding: 8px 6px;
2328
2341
  display: flex;
2329
2342
  position: relative;
@@ -18544,27 +18544,27 @@ const createLucideIcon = (iconName, iconNode) => {
18544
18544
  Component.displayName = toPascalCase(iconName);
18545
18545
  return Component;
18546
18546
  };
18547
- const __iconNode$U = [
18547
+ const __iconNode$V = [
18548
18548
  ["path", { d: "M12 5v14", key: "s699le" }],
18549
18549
  ["path", { d: "m19 12-7 7-7-7", key: "1idqje" }]
18550
18550
  ];
18551
- const ArrowDown = createLucideIcon("arrow-down", __iconNode$U);
18552
- const __iconNode$T = [
18551
+ const ArrowDown = createLucideIcon("arrow-down", __iconNode$V);
18552
+ const __iconNode$U = [
18553
18553
  ["path", { d: "m12 19-7-7 7-7", key: "1l729n" }],
18554
18554
  ["path", { d: "M19 12H5", key: "x3x0zl" }]
18555
18555
  ];
18556
- const ArrowLeft = createLucideIcon("arrow-left", __iconNode$T);
18557
- const __iconNode$S = [
18556
+ const ArrowLeft = createLucideIcon("arrow-left", __iconNode$U);
18557
+ const __iconNode$T = [
18558
18558
  ["path", { d: "m5 12 7-7 7 7", key: "hav0vg" }],
18559
18559
  ["path", { d: "M12 19V5", key: "x0mq9r" }]
18560
18560
  ];
18561
- const ArrowUp = createLucideIcon("arrow-up", __iconNode$S);
18562
- const __iconNode$R = [
18561
+ const ArrowUp = createLucideIcon("arrow-up", __iconNode$T);
18562
+ const __iconNode$S = [
18563
18563
  ["path", { d: "M 22 14 L 22 10", key: "nqc4tb" }],
18564
18564
  ["rect", { x: "2", y: "6", width: "16", height: "12", rx: "2", key: "13zb55" }]
18565
18565
  ];
18566
- const Battery = createLucideIcon("battery", __iconNode$R);
18567
- const __iconNode$Q = [
18566
+ const Battery = createLucideIcon("battery", __iconNode$S);
18567
+ const __iconNode$R = [
18568
18568
  ["path", { d: "M12 20v-9", key: "1qisl0" }],
18569
18569
  ["path", { d: "M14 7a4 4 0 0 1 4 4v3a6 6 0 0 1-12 0v-3a4 4 0 0 1 4-4z", key: "uouzyp" }],
18570
18570
  ["path", { d: "M14.12 3.88 16 2", key: "qol33r" }],
@@ -18577,8 +18577,8 @@ const __iconNode$Q = [
18577
18577
  ["path", { d: "m8 2 1.88 1.88", key: "fmnt4t" }],
18578
18578
  ["path", { d: "M9 7.13V6a3 3 0 1 1 6 0v1.13", key: "1vgav8" }]
18579
18579
  ];
18580
- const Bug = createLucideIcon("bug", __iconNode$Q);
18581
- const __iconNode$P = [
18580
+ const Bug = createLucideIcon("bug", __iconNode$R);
18581
+ const __iconNode$Q = [
18582
18582
  [
18583
18583
  "path",
18584
18584
  {
@@ -18588,47 +18588,47 @@ const __iconNode$P = [
18588
18588
  ],
18589
18589
  ["circle", { cx: "12", cy: "13", r: "3", key: "1vg3eu" }]
18590
18590
  ];
18591
- const Camera = createLucideIcon("camera", __iconNode$P);
18592
- const __iconNode$O = [["path", { d: "M20 6 9 17l-5-5", key: "1gmf2c" }]];
18593
- const Check = createLucideIcon("check", __iconNode$O);
18594
- const __iconNode$N = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
18595
- const ChevronDown = createLucideIcon("chevron-down", __iconNode$N);
18596
- const __iconNode$M = [["path", { d: "m15 18-6-6 6-6", key: "1wnfg3" }]];
18597
- const ChevronLeft = createLucideIcon("chevron-left", __iconNode$M);
18598
- const __iconNode$L = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
18599
- const ChevronRight = createLucideIcon("chevron-right", __iconNode$L);
18600
- const __iconNode$K = [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]];
18601
- const ChevronUp = createLucideIcon("chevron-up", __iconNode$K);
18602
- const __iconNode$J = [
18591
+ const Camera = createLucideIcon("camera", __iconNode$Q);
18592
+ const __iconNode$P = [["path", { d: "M20 6 9 17l-5-5", key: "1gmf2c" }]];
18593
+ const Check = createLucideIcon("check", __iconNode$P);
18594
+ const __iconNode$O = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
18595
+ const ChevronDown = createLucideIcon("chevron-down", __iconNode$O);
18596
+ const __iconNode$N = [["path", { d: "m15 18-6-6 6-6", key: "1wnfg3" }]];
18597
+ const ChevronLeft = createLucideIcon("chevron-left", __iconNode$N);
18598
+ const __iconNode$M = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
18599
+ const ChevronRight = createLucideIcon("chevron-right", __iconNode$M);
18600
+ const __iconNode$L = [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]];
18601
+ const ChevronUp = createLucideIcon("chevron-up", __iconNode$L);
18602
+ const __iconNode$K = [
18603
18603
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
18604
18604
  ["path", { d: "M12 6v6l4 2", key: "mmk7yg" }]
18605
18605
  ];
18606
- const Clock = createLucideIcon("clock", __iconNode$J);
18607
- const __iconNode$I = [
18606
+ const Clock = createLucideIcon("clock", __iconNode$K);
18607
+ const __iconNode$J = [
18608
18608
  ["line", { x1: "15", x2: "15", y1: "12", y2: "18", key: "1p7wdc" }],
18609
18609
  ["line", { x1: "12", x2: "18", y1: "15", y2: "15", key: "1nscbv" }],
18610
18610
  ["rect", { width: "14", height: "14", x: "8", y: "8", rx: "2", ry: "2", key: "17jyea" }],
18611
18611
  ["path", { d: "M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2", key: "zix9uf" }]
18612
18612
  ];
18613
- const CopyPlus = createLucideIcon("copy-plus", __iconNode$I);
18614
- const __iconNode$H = [
18613
+ const CopyPlus = createLucideIcon("copy-plus", __iconNode$J);
18614
+ const __iconNode$I = [
18615
18615
  ["rect", { width: "14", height: "14", x: "8", y: "8", rx: "2", ry: "2", key: "17jyea" }],
18616
18616
  ["path", { d: "M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2", key: "zix9uf" }]
18617
18617
  ];
18618
- const Copy = createLucideIcon("copy", __iconNode$H);
18619
- const __iconNode$G = [
18618
+ const Copy = createLucideIcon("copy", __iconNode$I);
18619
+ const __iconNode$H = [
18620
18620
  ["ellipse", { cx: "12", cy: "5", rx: "9", ry: "3", key: "msslwz" }],
18621
18621
  ["path", { d: "M3 5V19A9 3 0 0 0 21 19V5", key: "1wlel7" }],
18622
18622
  ["path", { d: "M3 12A9 3 0 0 0 21 12", key: "mv7ke4" }]
18623
18623
  ];
18624
- const Database = createLucideIcon("database", __iconNode$G);
18625
- const __iconNode$F = [
18624
+ const Database = createLucideIcon("database", __iconNode$H);
18625
+ const __iconNode$G = [
18626
18626
  ["path", { d: "M12 15V3", key: "m9g1x1" }],
18627
18627
  ["path", { d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4", key: "ih7n3h" }],
18628
18628
  ["path", { d: "m7 10 5 5 5-5", key: "brsn70" }]
18629
18629
  ];
18630
- const Download = createLucideIcon("download", __iconNode$F);
18631
- const __iconNode$E = [
18630
+ const Download = createLucideIcon("download", __iconNode$G);
18631
+ const __iconNode$F = [
18632
18632
  [
18633
18633
  "path",
18634
18634
  {
@@ -18638,14 +18638,14 @@ const __iconNode$E = [
18638
18638
  ],
18639
18639
  ["path", { d: "m5.082 11.09 8.828 8.828", key: "1wx5vj" }]
18640
18640
  ];
18641
- const Eraser = createLucideIcon("eraser", __iconNode$E);
18642
- const __iconNode$D = [
18641
+ const Eraser = createLucideIcon("eraser", __iconNode$F);
18642
+ const __iconNode$E = [
18643
18643
  ["path", { d: "M15 3h6v6", key: "1q9fwt" }],
18644
18644
  ["path", { d: "M10 14 21 3", key: "gplh6r" }],
18645
18645
  ["path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6", key: "a6xqqp" }]
18646
18646
  ];
18647
- const ExternalLink = createLucideIcon("external-link", __iconNode$D);
18648
- const __iconNode$C = [
18647
+ const ExternalLink = createLucideIcon("external-link", __iconNode$E);
18648
+ const __iconNode$D = [
18649
18649
  [
18650
18650
  "path",
18651
18651
  {
@@ -18657,8 +18657,8 @@ const __iconNode$C = [
18657
18657
  ["path", { d: "M12 18v-6", key: "17g6i2" }],
18658
18658
  ["path", { d: "m9 15 3 3 3-3", key: "1npd3o" }]
18659
18659
  ];
18660
- const FileDown = createLucideIcon("file-down", __iconNode$C);
18661
- const __iconNode$B = [
18660
+ const FileDown = createLucideIcon("file-down", __iconNode$D);
18661
+ const __iconNode$C = [
18662
18662
  [
18663
18663
  "path",
18664
18664
  {
@@ -18671,8 +18671,8 @@ const __iconNode$B = [
18671
18671
  ["path", { d: "M16 13H8", key: "t4e002" }],
18672
18672
  ["path", { d: "M16 17H8", key: "z1uh3a" }]
18673
18673
  ];
18674
- const FileText = createLucideIcon("file-text", __iconNode$B);
18675
- const __iconNode$A = [
18674
+ const FileText = createLucideIcon("file-text", __iconNode$C);
18675
+ const __iconNode$B = [
18676
18676
  [
18677
18677
  "path",
18678
18678
  {
@@ -18682,8 +18682,8 @@ const __iconNode$A = [
18682
18682
  ],
18683
18683
  ["path", { d: "M14 2v5a1 1 0 0 0 1 1h5", key: "wfsgrz" }]
18684
18684
  ];
18685
- const File = createLucideIcon("file", __iconNode$A);
18686
- const __iconNode$z = [
18685
+ const File = createLucideIcon("file", __iconNode$B);
18686
+ const __iconNode$A = [
18687
18687
  [
18688
18688
  "path",
18689
18689
  {
@@ -18692,8 +18692,8 @@ const __iconNode$z = [
18692
18692
  }
18693
18693
  ]
18694
18694
  ];
18695
- const Folder = createLucideIcon("folder", __iconNode$z);
18696
- const __iconNode$y = [
18695
+ const Folder = createLucideIcon("folder", __iconNode$A);
18696
+ const __iconNode$z = [
18697
18697
  [
18698
18698
  "path",
18699
18699
  {
@@ -18703,14 +18703,14 @@ const __iconNode$y = [
18703
18703
  ],
18704
18704
  ["path", { d: "M9 18c-4.51 2-5-2-7-2", key: "9comsn" }]
18705
18705
  ];
18706
- const Github = createLucideIcon("github", __iconNode$y);
18707
- const __iconNode$x = [
18706
+ const Github = createLucideIcon("github", __iconNode$z);
18707
+ const __iconNode$y = [
18708
18708
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
18709
18709
  ["path", { d: "M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20", key: "13o1zl" }],
18710
18710
  ["path", { d: "M2 12h20", key: "9i4pu4" }]
18711
18711
  ];
18712
- const Globe = createLucideIcon("globe", __iconNode$x);
18713
- const __iconNode$w = [
18712
+ const Globe = createLucideIcon("globe", __iconNode$y);
18713
+ const __iconNode$x = [
18714
18714
  ["circle", { cx: "9", cy: "12", r: "1", key: "1vctgf" }],
18715
18715
  ["circle", { cx: "9", cy: "5", r: "1", key: "hp0tcf" }],
18716
18716
  ["circle", { cx: "9", cy: "19", r: "1", key: "fkjjf6" }],
@@ -18718,8 +18718,8 @@ const __iconNode$w = [
18718
18718
  ["circle", { cx: "15", cy: "5", r: "1", key: "19l28e" }],
18719
18719
  ["circle", { cx: "15", cy: "19", r: "1", key: "f4zoj3" }]
18720
18720
  ];
18721
- const GripVertical = createLucideIcon("grip-vertical", __iconNode$w);
18722
- const __iconNode$v = [
18721
+ const GripVertical = createLucideIcon("grip-vertical", __iconNode$x);
18722
+ const __iconNode$w = [
18723
18723
  [
18724
18724
  "path",
18725
18725
  {
@@ -18728,8 +18728,8 @@ const __iconNode$v = [
18728
18728
  }
18729
18729
  ]
18730
18730
  ];
18731
- const Heart = createLucideIcon("heart", __iconNode$v);
18732
- const __iconNode$u = [
18731
+ const Heart = createLucideIcon("heart", __iconNode$w);
18732
+ const __iconNode$v = [
18733
18733
  ["path", { d: "M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8", key: "5wwlr5" }],
18734
18734
  [
18735
18735
  "path",
@@ -18739,8 +18739,8 @@ const __iconNode$u = [
18739
18739
  }
18740
18740
  ]
18741
18741
  ];
18742
- const House = createLucideIcon("house", __iconNode$u);
18743
- const __iconNode$t = [
18742
+ const House = createLucideIcon("house", __iconNode$v);
18743
+ const __iconNode$u = [
18744
18744
  [
18745
18745
  "path",
18746
18746
  {
@@ -18763,15 +18763,15 @@ const __iconNode$t = [
18763
18763
  }
18764
18764
  ]
18765
18765
  ];
18766
- const Layers = createLucideIcon("layers", __iconNode$t);
18767
- const __iconNode$s = [
18766
+ const Layers = createLucideIcon("layers", __iconNode$u);
18767
+ const __iconNode$t = [
18768
18768
  ["path", { d: "M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71", key: "1cjeqo" }],
18769
18769
  ["path", { d: "M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71", key: "19qd67" }]
18770
18770
  ];
18771
- const Link = createLucideIcon("link", __iconNode$s);
18772
- const __iconNode$r = [["path", { d: "M21 12a9 9 0 1 1-6.219-8.56", key: "13zald" }]];
18773
- const LoaderCircle = createLucideIcon("loader-circle", __iconNode$r);
18774
- const __iconNode$q = [
18771
+ const Link = createLucideIcon("link", __iconNode$t);
18772
+ const __iconNode$s = [["path", { d: "M21 12a9 9 0 1 1-6.219-8.56", key: "13zald" }]];
18773
+ const LoaderCircle = createLucideIcon("loader-circle", __iconNode$s);
18774
+ const __iconNode$r = [
18775
18775
  [
18776
18776
  "path",
18777
18777
  {
@@ -18781,14 +18781,14 @@ const __iconNode$q = [
18781
18781
  ],
18782
18782
  ["circle", { cx: "12", cy: "10", r: "3", key: "ilqhr7" }]
18783
18783
  ];
18784
- const MapPin = createLucideIcon("map-pin", __iconNode$q);
18785
- const __iconNode$p = [
18784
+ const MapPin = createLucideIcon("map-pin", __iconNode$r);
18785
+ const __iconNode$q = [
18786
18786
  ["rect", { width: "20", height: "14", x: "2", y: "3", rx: "2", key: "48i651" }],
18787
18787
  ["line", { x1: "8", x2: "16", y1: "21", y2: "21", key: "1svkeh" }],
18788
18788
  ["line", { x1: "12", x2: "12", y1: "17", y2: "21", key: "vw1qmm" }]
18789
18789
  ];
18790
- const Monitor = createLucideIcon("monitor", __iconNode$p);
18791
- const __iconNode$o = [
18790
+ const Monitor = createLucideIcon("monitor", __iconNode$q);
18791
+ const __iconNode$p = [
18792
18792
  [
18793
18793
  "path",
18794
18794
  {
@@ -18797,8 +18797,8 @@ const __iconNode$o = [
18797
18797
  }
18798
18798
  ]
18799
18799
  ];
18800
- const Moon = createLucideIcon("moon", __iconNode$o);
18801
- const __iconNode$n = [
18800
+ const Moon = createLucideIcon("moon", __iconNode$p);
18801
+ const __iconNode$o = [
18802
18802
  ["path", { d: "M12.586 12.586 19 19", key: "ea5xo7" }],
18803
18803
  [
18804
18804
  "path",
@@ -18808,15 +18808,20 @@ const __iconNode$n = [
18808
18808
  }
18809
18809
  ]
18810
18810
  ];
18811
- const MousePointer = createLucideIcon("mouse-pointer", __iconNode$n);
18812
- const __iconNode$m = [
18811
+ const MousePointer = createLucideIcon("mouse-pointer", __iconNode$o);
18812
+ const __iconNode$n = [
18813
18813
  ["rect", { x: "16", y: "16", width: "6", height: "6", rx: "1", key: "4q2zg0" }],
18814
18814
  ["rect", { x: "2", y: "16", width: "6", height: "6", rx: "1", key: "8cvhb9" }],
18815
18815
  ["rect", { x: "9", y: "2", width: "6", height: "6", rx: "1", key: "1egb70" }],
18816
18816
  ["path", { d: "M5 16v-3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v3", key: "1jsf9p" }],
18817
18817
  ["path", { d: "M12 12V8", key: "2874zd" }]
18818
18818
  ];
18819
- const Network = createLucideIcon("network", __iconNode$m);
18819
+ const Network = createLucideIcon("network", __iconNode$n);
18820
+ const __iconNode$m = [
18821
+ ["rect", { x: "14", y: "3", width: "5", height: "18", rx: "1", key: "kaeet6" }],
18822
+ ["rect", { x: "5", y: "3", width: "5", height: "18", rx: "1", key: "1wsw3u" }]
18823
+ ];
18824
+ const Pause = createLucideIcon("pause", __iconNode$m);
18820
18825
  const __iconNode$l = [
18821
18826
  [
18822
18827
  "path",
@@ -30284,45 +30289,51 @@ function Sidebar() {
30284
30289
  const activeModule = useModuleStore((s) => s.activeModule);
30285
30290
  const navigate = useNavigate();
30286
30291
  const [isHovered, setIsHovered] = reactExports.useState(false);
30287
- return /* @__PURE__ */ jsxRuntimeExports.jsxs(
30288
- motion.aside,
30292
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
30293
+ "div",
30289
30294
  {
30290
- className: "dock-sidebar",
30295
+ className: "dock-sidebar-hitarea",
30291
30296
  onMouseEnter: () => setIsHovered(true),
30292
30297
  onMouseLeave: () => setIsHovered(false),
30293
- animate: { width: isHovered ? EXPANDED_WIDTH : COLLAPSED_WIDTH },
30294
- transition: sidebarTransition,
30295
- children: [
30296
- modules.map((mod) => {
30297
- const isActive = activeModule === mod.name;
30298
- const Icon2 = moduleIconMap[mod.name];
30299
- const label = moduleLabelMap[mod.name] ?? mod.name;
30300
- return /* @__PURE__ */ jsxRuntimeExports.jsxs(
30301
- "button",
30302
- {
30303
- type: "button",
30304
- onClick: () => navigate(`/${mod.name}`),
30305
- className: `dock-icon ${isActive ? "active" : ""}`,
30306
- children: [
30307
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "dock-icon-svg", children: Icon2 ? /* @__PURE__ */ jsxRuntimeExports.jsx(Icon2, { size: 24 }) : /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-sm", children: mod.name[0]?.toUpperCase() }) }),
30308
- /* @__PURE__ */ jsxRuntimeExports.jsx(AnimatePresence, { children: isHovered && /* @__PURE__ */ jsxRuntimeExports.jsx(
30309
- motion.span,
30310
- {
30311
- className: "dock-label",
30312
- initial: { opacity: 0, width: 0 },
30313
- animate: { opacity: 1, width: "auto" },
30314
- exit: { opacity: 0, width: 0 },
30315
- transition: labelTransition,
30316
- children: label
30317
- }
30318
- ) })
30319
- ]
30320
- },
30321
- mod.name
30322
- );
30323
- }),
30324
- modules.length === 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-text-muted text-[10px] text-center px-1 py-4", children: "No modules" })
30325
- ]
30298
+ children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
30299
+ motion.aside,
30300
+ {
30301
+ className: "dock-sidebar",
30302
+ animate: { width: isHovered ? EXPANDED_WIDTH : COLLAPSED_WIDTH },
30303
+ transition: sidebarTransition,
30304
+ children: [
30305
+ modules.map((mod) => {
30306
+ const isActive = activeModule === mod.name;
30307
+ const Icon2 = moduleIconMap[mod.name];
30308
+ const label = moduleLabelMap[mod.name] ?? mod.name;
30309
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(
30310
+ "button",
30311
+ {
30312
+ type: "button",
30313
+ onClick: () => navigate(`/${mod.name}`),
30314
+ className: `dock-icon ${isActive ? "active" : ""}`,
30315
+ children: [
30316
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "dock-icon-svg", children: Icon2 ? /* @__PURE__ */ jsxRuntimeExports.jsx(Icon2, { size: 24 }) : /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-sm", children: mod.name[0]?.toUpperCase() }) }),
30317
+ /* @__PURE__ */ jsxRuntimeExports.jsx(AnimatePresence, { children: isHovered && /* @__PURE__ */ jsxRuntimeExports.jsx(
30318
+ motion.span,
30319
+ {
30320
+ className: "dock-label",
30321
+ initial: { opacity: 0, width: 0 },
30322
+ animate: { opacity: 1, width: "auto" },
30323
+ exit: { opacity: 0, width: 0 },
30324
+ transition: labelTransition,
30325
+ children: label
30326
+ }
30327
+ ) })
30328
+ ]
30329
+ },
30330
+ mod.name
30331
+ );
30332
+ }),
30333
+ modules.length === 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-text-muted text-[10px] text-center px-1 py-4", children: "No modules" })
30334
+ ]
30335
+ }
30336
+ )
30326
30337
  }
30327
30338
  );
30328
30339
  }
@@ -30739,6 +30750,63 @@ function TopBar() {
30739
30750
  ] })
30740
30751
  ] });
30741
30752
  }
30753
+ function UpdateBanner() {
30754
+ const [info, setInfo] = reactExports.useState(null);
30755
+ const [dismissed, setDismissed] = reactExports.useState(false);
30756
+ reactExports.useEffect(() => {
30757
+ if (sessionStorage.getItem("simvyn-update-dismissed")) return;
30758
+ fetch("/api/update-check").then((res) => res.json()).then((data) => {
30759
+ if (data.needsUpdate) setInfo(data);
30760
+ }).catch(() => {
30761
+ });
30762
+ }, []);
30763
+ if (!info || dismissed) return null;
30764
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(
30765
+ "div",
30766
+ {
30767
+ style: {
30768
+ background: "rgba(40, 40, 55, 0.50)",
30769
+ backdropFilter: "blur(20px) saturate(1.4)",
30770
+ WebkitBackdropFilter: "blur(20px) saturate(1.4)",
30771
+ border: "1px solid rgba(255, 255, 255, 0.08)",
30772
+ borderRadius: "12px"
30773
+ },
30774
+ className: "flex items-center justify-between px-4 py-2 mx-4 mt-2 text-sm",
30775
+ children: [
30776
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { children: [
30777
+ "Update available: ",
30778
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-green-400", children: info.current }),
30779
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-text-muted", children: " → " }),
30780
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-green-400", children: info.latest })
30781
+ ] }),
30782
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3", children: [
30783
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
30784
+ "a",
30785
+ {
30786
+ href: `https://github.com/pranshuchittora/simvyn/releases/tag/v${info.latest}`,
30787
+ target: "_blank",
30788
+ rel: "noopener noreferrer",
30789
+ className: "text-blue-400 hover:text-blue-300 underline",
30790
+ children: "View release →"
30791
+ }
30792
+ ),
30793
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
30794
+ "button",
30795
+ {
30796
+ type: "button",
30797
+ onClick: () => {
30798
+ setDismissed(true);
30799
+ sessionStorage.setItem("simvyn-update-dismissed", "true");
30800
+ },
30801
+ className: "text-text-muted hover:text-text-primary",
30802
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(X$1, { size: 14 })
30803
+ }
30804
+ )
30805
+ ] })
30806
+ ]
30807
+ }
30808
+ );
30809
+ }
30742
30810
  function DevicePanel() {
30743
30811
  const devices = useDeviceStore((s) => s.devices);
30744
30812
  const setDevices = useDeviceStore((s) => s.setDevices);
@@ -47425,6 +47493,7 @@ const initialState = {
47425
47493
  isLoadingHistory: false,
47426
47494
  isStreaming: false,
47427
47495
  streamDeviceId: null,
47496
+ isPaused: false,
47428
47497
  enabledLevels: [...ALL_LEVELS],
47429
47498
  searchPattern: "",
47430
47499
  processFilter: ""
@@ -47432,6 +47501,7 @@ const initialState = {
47432
47501
  const useLogStore = create((set) => ({
47433
47502
  ...initialState,
47434
47503
  addNewBatch: (batch) => set((s) => {
47504
+ if (s.isPaused) return s;
47435
47505
  const newEntries = [...batch].reverse();
47436
47506
  const combined = [...newEntries, ...s.entries];
47437
47507
  const trimmed = combined.length > MAX_ENTRIES ? combined.slice(0, MAX_ENTRIES) : combined;
@@ -47453,10 +47523,13 @@ const useLogStore = create((set) => ({
47453
47523
  entries: [],
47454
47524
  firstItemIndex: INITIAL_INDEX,
47455
47525
  cursor: null,
47456
- hasMore: true
47526
+ hasMore: true,
47527
+ isPaused: false
47457
47528
  }),
47458
47529
  reset: () => set({ ...initialState }),
47459
47530
  setStreaming: (deviceId) => set({ streamDeviceId: deviceId, isStreaming: deviceId !== null }),
47531
+ pause: () => set({ isPaused: true }),
47532
+ resume: () => set({ isPaused: false }),
47460
47533
  toggleLevel: (level) => set((s) => {
47461
47534
  const has = s.enabledLevels.includes(level);
47462
47535
  if (has && s.enabledLevels.length === 1) return s;
@@ -47650,6 +47723,9 @@ function LogToolbar({ selectedDeviceId }) {
47650
47723
  const setSearchPattern = useLogStore((s) => s.setSearchPattern);
47651
47724
  const setProcessFilter = useLogStore((s) => s.setProcessFilter);
47652
47725
  const clear = useLogStore((s) => s.clear);
47726
+ const isPaused = useLogStore((s) => s.isPaused);
47727
+ const pause = useLogStore((s) => s.pause);
47728
+ const resume = useLogStore((s) => s.resume);
47653
47729
  const entries2 = useLogStore((s) => s.entries);
47654
47730
  const totalCount = entries2.length;
47655
47731
  const filteredCount = reactExports.useMemo(
@@ -47736,6 +47812,21 @@ function LogToolbar({ selectedDeviceId }) {
47736
47812
  /* @__PURE__ */ jsxRuntimeExports.jsx("button", { type: "button", onClick: () => handleExport("json"), className: "glass-button", children: "JSON" }),
47737
47813
  /* @__PURE__ */ jsxRuntimeExports.jsx("button", { type: "button", onClick: () => handleExport("text"), className: "glass-button", children: "TXT" })
47738
47814
  ] }),
47815
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
47816
+ "button",
47817
+ {
47818
+ type: "button",
47819
+ onClick: isPaused ? resume : pause,
47820
+ className: "glass-button",
47821
+ style: isPaused ? {
47822
+ background: "rgba(234,179,8,0.2)",
47823
+ color: "#fde047",
47824
+ borderColor: "rgba(234,179,8,0.3)"
47825
+ } : void 0,
47826
+ title: isPaused ? "Resume log stream" : "Pause log stream",
47827
+ children: isPaused ? /* @__PURE__ */ jsxRuntimeExports.jsx(Play, { size: 14 }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Pause, { size: 14 })
47828
+ }
47829
+ ),
47739
47830
  /* @__PURE__ */ jsxRuntimeExports.jsx(
47740
47831
  "button",
47741
47832
  {
@@ -47756,7 +47847,7 @@ function LogToolbar({ selectedDeviceId }) {
47756
47847
  children: "Clear"
47757
47848
  }
47758
47849
  ),
47759
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-text-muted ml-auto", children: filteredCount === totalCount ? `${totalCount} entries` : `${filteredCount} / ${totalCount} entries` })
47850
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: `text-xs ml-auto ${isPaused ? "text-yellow-400" : "text-text-muted"}`, children: isPaused ? "Paused" : filteredCount === totalCount ? `${totalCount} entries` : `${filteredCount} / ${totalCount} entries` })
47760
47851
  ] });
47761
47852
  }
47762
47853
  function LogPanel() {
@@ -47769,6 +47860,7 @@ function LogPanel() {
47769
47860
  const clear = useLogStore((s) => s.clear);
47770
47861
  const reset = useLogStore((s) => s.reset);
47771
47862
  const setStreaming = useLogStore((s) => s.setStreaming);
47863
+ const isPaused = useLogStore((s) => s.isPaused);
47772
47864
  const hasMore = useLogStore((s) => s.hasMore);
47773
47865
  const isLoadingHistory = useLogStore((s) => s.isLoadingHistory);
47774
47866
  reactExports.useEffect(() => {
@@ -47798,6 +47890,7 @@ function LogPanel() {
47798
47890
  payload: { deviceId: prevDeviceRef.current }
47799
47891
  });
47800
47892
  clear();
47893
+ useLogStore.getState().resume();
47801
47894
  }
47802
47895
  if (selectedDeviceId) {
47803
47896
  send({
@@ -47822,6 +47915,19 @@ function LogPanel() {
47822
47915
  }
47823
47916
  };
47824
47917
  }, [selectedDeviceId, send, clear]);
47918
+ const wasPausedRef = reactExports.useRef(false);
47919
+ reactExports.useEffect(() => {
47920
+ const deviceId = selectedDeviceIdRef.current;
47921
+ if (!deviceId) return;
47922
+ if (isPaused) {
47923
+ send({ channel: "logs", type: "stop-stream", payload: { deviceId } });
47924
+ } else if (wasPausedRef.current) {
47925
+ clear();
47926
+ send({ channel: "logs", type: "start-stream", payload: { deviceId } });
47927
+ send({ channel: "logs", type: "get-history", payload: { deviceId, limit: 500 } });
47928
+ }
47929
+ wasPausedRef.current = isPaused;
47930
+ }, [isPaused, send, clear]);
47825
47931
  const loadMoreHistory = reactExports.useCallback(() => {
47826
47932
  if (!selectedDeviceId || !hasMore || isLoadingHistory) return;
47827
47933
  setLoadingHistory(true);
@@ -47857,7 +47963,9 @@ function LogPanel() {
47857
47963
  const handleStreamStarted = reactExports.useCallback(
47858
47964
  (payload) => {
47859
47965
  const data = payload;
47860
- setStreaming(data.deviceId);
47966
+ if (!useLogStore.getState().isPaused) {
47967
+ setStreaming(data.deviceId);
47968
+ }
47861
47969
  },
47862
47970
  [setStreaming]
47863
47971
  );
@@ -51934,7 +52042,7 @@ function ToolSettingsPanel() {
51934
52042
  const [copied, setCopied] = reactExports.useState(false);
51935
52043
  const devices = useDeviceStore((s) => s.devices);
51936
52044
  const modules = useModuleStore((s) => s.modules);
51937
- const version = "2.3.0";
52045
+ const version = "2.5.1";
51938
52046
  const fetchStorage = reactExports.useCallback(() => {
51939
52047
  fetch("/api/tool-settings/storage").then((r) => r.json()).then((data) => setStorage(data)).catch(() => {
51940
52048
  });
@@ -53241,6 +53349,7 @@ function AppContent() {
53241
53349
  /* @__PURE__ */ jsxRuntimeExports.jsx(RouterSync, {}),
53242
53350
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex h-screen flex-col bg-bg-base", children: [
53243
53351
  /* @__PURE__ */ jsxRuntimeExports.jsx(TopBar, {}),
53352
+ /* @__PURE__ */ jsxRuntimeExports.jsx(UpdateBanner, {}),
53244
53353
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-1 overflow-hidden", children: [
53245
53354
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Sidebar, {}) }),
53246
53355
  /* @__PURE__ */ jsxRuntimeExports.jsx(ModuleShell, {})
@@ -53282,4 +53391,4 @@ function App() {
53282
53391
  clientExports.createRoot(document.getElementById("root")).render(
53283
53392
  /* @__PURE__ */ jsxRuntimeExports.jsx(reactExports.StrictMode, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(App, {}) })
53284
53393
  );
53285
- //# sourceMappingURL=index-BW2wglvQ.js.map
53394
+ //# sourceMappingURL=index-D67XE6HO.js.map