@railtownai/railtracks-visualizer 0.0.67 → 0.0.69

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.
package/dist/esm/index.js CHANGED
@@ -12919,7 +12919,7 @@ const createLucideIcon = (iconName, iconNode)=>{
12919
12919
  return Component;
12920
12920
  };
12921
12921
 
12922
- const __iconNode$z = [
12922
+ const __iconNode$A = [
12923
12923
  [
12924
12924
  "path",
12925
12925
  {
@@ -12935,9 +12935,9 @@ const __iconNode$z = [
12935
12935
  }
12936
12936
  ]
12937
12937
  ];
12938
- const ArrowLeft = createLucideIcon("arrow-left", __iconNode$z);
12938
+ const ArrowLeft = createLucideIcon("arrow-left", __iconNode$A);
12939
12939
 
12940
- const __iconNode$y = [
12940
+ const __iconNode$z = [
12941
12941
  [
12942
12942
  "path",
12943
12943
  {
@@ -12953,9 +12953,9 @@ const __iconNode$y = [
12953
12953
  }
12954
12954
  ]
12955
12955
  ];
12956
- const ArrowRight = createLucideIcon("arrow-right", __iconNode$y);
12956
+ const ArrowRight = createLucideIcon("arrow-right", __iconNode$z);
12957
12957
 
12958
- const __iconNode$x = [
12958
+ const __iconNode$y = [
12959
12959
  [
12960
12960
  "path",
12961
12961
  {
@@ -13003,9 +13003,9 @@ const __iconNode$x = [
13003
13003
  }
13004
13004
  ]
13005
13005
  ];
13006
- const Bot = createLucideIcon("bot", __iconNode$x);
13006
+ const Bot = createLucideIcon("bot", __iconNode$y);
13007
13007
 
13008
- const __iconNode$w = [
13008
+ const __iconNode$x = [
13009
13009
  [
13010
13010
  "path",
13011
13011
  {
@@ -13039,9 +13039,9 @@ const __iconNode$w = [
13039
13039
  }
13040
13040
  ]
13041
13041
  ];
13042
- const Calendar = createLucideIcon("calendar", __iconNode$w);
13042
+ const Calendar = createLucideIcon("calendar", __iconNode$x);
13043
13043
 
13044
- const __iconNode$v = [
13044
+ const __iconNode$w = [
13045
13045
  [
13046
13046
  "path",
13047
13047
  {
@@ -13098,9 +13098,9 @@ const __iconNode$v = [
13098
13098
  }
13099
13099
  ]
13100
13100
  ];
13101
- const ChartNetwork = createLucideIcon("chart-network", __iconNode$v);
13101
+ const ChartNetwork = createLucideIcon("chart-network", __iconNode$w);
13102
13102
 
13103
- const __iconNode$u = [
13103
+ const __iconNode$v = [
13104
13104
  [
13105
13105
  "path",
13106
13106
  {
@@ -13109,9 +13109,9 @@ const __iconNode$u = [
13109
13109
  }
13110
13110
  ]
13111
13111
  ];
13112
- const ChevronDown = createLucideIcon("chevron-down", __iconNode$u);
13112
+ const ChevronDown = createLucideIcon("chevron-down", __iconNode$v);
13113
13113
 
13114
- const __iconNode$t = [
13114
+ const __iconNode$u = [
13115
13115
  [
13116
13116
  "path",
13117
13117
  {
@@ -13120,9 +13120,9 @@ const __iconNode$t = [
13120
13120
  }
13121
13121
  ]
13122
13122
  ];
13123
- const ChevronRight = createLucideIcon("chevron-right", __iconNode$t);
13123
+ const ChevronRight = createLucideIcon("chevron-right", __iconNode$u);
13124
13124
 
13125
- const __iconNode$s = [
13125
+ const __iconNode$t = [
13126
13126
  [
13127
13127
  "path",
13128
13128
  {
@@ -13138,9 +13138,9 @@ const __iconNode$s = [
13138
13138
  }
13139
13139
  ]
13140
13140
  ];
13141
- const ChevronsDown = createLucideIcon("chevrons-down", __iconNode$s);
13141
+ const ChevronsDown = createLucideIcon("chevrons-down", __iconNode$t);
13142
13142
 
13143
- const __iconNode$r = [
13143
+ const __iconNode$s = [
13144
13144
  [
13145
13145
  "path",
13146
13146
  {
@@ -13156,9 +13156,9 @@ const __iconNode$r = [
13156
13156
  }
13157
13157
  ]
13158
13158
  ];
13159
- const ChevronsUp = createLucideIcon("chevrons-up", __iconNode$r);
13159
+ const ChevronsUp = createLucideIcon("chevrons-up", __iconNode$s);
13160
13160
 
13161
- const __iconNode$q = [
13161
+ const __iconNode$r = [
13162
13162
  [
13163
13163
  "circle",
13164
13164
  {
@@ -13189,9 +13189,9 @@ const __iconNode$q = [
13189
13189
  }
13190
13190
  ]
13191
13191
  ];
13192
- const CircleAlert = createLucideIcon("circle-alert", __iconNode$q);
13192
+ const CircleAlert = createLucideIcon("circle-alert", __iconNode$r);
13193
13193
 
13194
- const __iconNode$p = [
13194
+ const __iconNode$q = [
13195
13195
  [
13196
13196
  "path",
13197
13197
  {
@@ -13207,9 +13207,9 @@ const __iconNode$p = [
13207
13207
  }
13208
13208
  ]
13209
13209
  ];
13210
- const CircleCheckBig = createLucideIcon("circle-check-big", __iconNode$p);
13210
+ const CircleCheckBig = createLucideIcon("circle-check-big", __iconNode$q);
13211
13211
 
13212
- const __iconNode$o = [
13212
+ const __iconNode$p = [
13213
13213
  [
13214
13214
  "circle",
13215
13215
  {
@@ -13234,9 +13234,9 @@ const __iconNode$o = [
13234
13234
  }
13235
13235
  ]
13236
13236
  ];
13237
- const CircleDollarSign = createLucideIcon("circle-dollar-sign", __iconNode$o);
13237
+ const CircleDollarSign = createLucideIcon("circle-dollar-sign", __iconNode$p);
13238
13238
 
13239
- const __iconNode$n = [
13239
+ const __iconNode$o = [
13240
13240
  [
13241
13241
  "circle",
13242
13242
  {
@@ -13254,9 +13254,9 @@ const __iconNode$n = [
13254
13254
  }
13255
13255
  ]
13256
13256
  ];
13257
- const Clock = createLucideIcon("clock", __iconNode$n);
13257
+ const Clock = createLucideIcon("clock", __iconNode$o);
13258
13258
 
13259
- const __iconNode$m = [
13259
+ const __iconNode$n = [
13260
13260
  [
13261
13261
  "rect",
13262
13262
  {
@@ -13277,9 +13277,9 @@ const __iconNode$m = [
13277
13277
  }
13278
13278
  ]
13279
13279
  ];
13280
- const Copy = createLucideIcon("copy", __iconNode$m);
13280
+ const Copy = createLucideIcon("copy", __iconNode$n);
13281
13281
 
13282
- const __iconNode$l = [
13282
+ const __iconNode$m = [
13283
13283
  [
13284
13284
  "path",
13285
13285
  {
@@ -13387,9 +13387,9 @@ const __iconNode$l = [
13387
13387
  }
13388
13388
  ]
13389
13389
  ];
13390
- const Cpu = createLucideIcon("cpu", __iconNode$l);
13390
+ const Cpu = createLucideIcon("cpu", __iconNode$m);
13391
13391
 
13392
- const __iconNode$k = [
13392
+ const __iconNode$l = [
13393
13393
  [
13394
13394
  "line",
13395
13395
  {
@@ -13408,9 +13408,9 @@ const __iconNode$k = [
13408
13408
  }
13409
13409
  ]
13410
13410
  ];
13411
- const DollarSign = createLucideIcon("dollar-sign", __iconNode$k);
13411
+ const DollarSign = createLucideIcon("dollar-sign", __iconNode$l);
13412
13412
 
13413
- const __iconNode$j = [
13413
+ const __iconNode$k = [
13414
13414
  [
13415
13415
  "path",
13416
13416
  {
@@ -13440,9 +13440,9 @@ const __iconNode$j = [
13440
13440
  }
13441
13441
  ]
13442
13442
  ];
13443
- const FileInput = createLucideIcon("file-input", __iconNode$j);
13443
+ const FileInput = createLucideIcon("file-input", __iconNode$k);
13444
13444
 
13445
- const __iconNode$i = [
13445
+ const __iconNode$j = [
13446
13446
  [
13447
13447
  "path",
13448
13448
  {
@@ -13472,9 +13472,9 @@ const __iconNode$i = [
13472
13472
  }
13473
13473
  ]
13474
13474
  ];
13475
- const FileOutput = createLucideIcon("file-output", __iconNode$i);
13475
+ const FileOutput = createLucideIcon("file-output", __iconNode$j);
13476
13476
 
13477
- const __iconNode$h = [
13477
+ const __iconNode$i = [
13478
13478
  [
13479
13479
  "path",
13480
13480
  {
@@ -13532,9 +13532,9 @@ const __iconNode$h = [
13532
13532
  }
13533
13533
  ]
13534
13534
  ];
13535
- const FoldVertical = createLucideIcon("fold-vertical", __iconNode$h);
13535
+ const FoldVertical = createLucideIcon("fold-vertical", __iconNode$i);
13536
13536
 
13537
- const __iconNode$g = [
13537
+ const __iconNode$h = [
13538
13538
  [
13539
13539
  "line",
13540
13540
  {
@@ -13576,9 +13576,9 @@ const __iconNode$g = [
13576
13576
  }
13577
13577
  ]
13578
13578
  ];
13579
- const Hash = createLucideIcon("hash", __iconNode$g);
13579
+ const Hash = createLucideIcon("hash", __iconNode$h);
13580
13580
 
13581
- const __iconNode$f = [
13581
+ const __iconNode$g = [
13582
13582
  [
13583
13583
  "circle",
13584
13584
  {
@@ -13603,9 +13603,9 @@ const __iconNode$f = [
13603
13603
  }
13604
13604
  ]
13605
13605
  ];
13606
- const Info = createLucideIcon("info", __iconNode$f);
13606
+ const Info = createLucideIcon("info", __iconNode$g);
13607
13607
 
13608
- const __iconNode$e = [
13608
+ const __iconNode$f = [
13609
13609
  [
13610
13610
  "path",
13611
13611
  {
@@ -13642,9 +13642,9 @@ const __iconNode$e = [
13642
13642
  }
13643
13643
  ]
13644
13644
  ];
13645
- const ListChecks = createLucideIcon("list-checks", __iconNode$e);
13645
+ const ListChecks = createLucideIcon("list-checks", __iconNode$f);
13646
13646
 
13647
- const __iconNode$d = [
13647
+ const __iconNode$e = [
13648
13648
  [
13649
13649
  "path",
13650
13650
  {
@@ -13674,9 +13674,9 @@ const __iconNode$d = [
13674
13674
  }
13675
13675
  ]
13676
13676
  ];
13677
- const MessageSquareText = createLucideIcon("message-square-text", __iconNode$d);
13677
+ const MessageSquareText = createLucideIcon("message-square-text", __iconNode$e);
13678
13678
 
13679
- const __iconNode$c = [
13679
+ const __iconNode$d = [
13680
13680
  [
13681
13681
  "path",
13682
13682
  {
@@ -13692,9 +13692,9 @@ const __iconNode$c = [
13692
13692
  }
13693
13693
  ]
13694
13694
  ];
13695
- const MessagesSquare = createLucideIcon("messages-square", __iconNode$c);
13695
+ const MessagesSquare = createLucideIcon("messages-square", __iconNode$d);
13696
13696
 
13697
- const __iconNode$b = [
13697
+ const __iconNode$c = [
13698
13698
  [
13699
13699
  "rect",
13700
13700
  {
@@ -13714,7 +13714,36 @@ const __iconNode$b = [
13714
13714
  }
13715
13715
  ]
13716
13716
  ];
13717
- const PanelLeft = createLucideIcon("panel-left", __iconNode$b);
13717
+ const PanelLeft = createLucideIcon("panel-left", __iconNode$c);
13718
+
13719
+ const __iconNode$b = [
13720
+ [
13721
+ "rect",
13722
+ {
13723
+ width: "18",
13724
+ height: "18",
13725
+ x: "3",
13726
+ y: "3",
13727
+ rx: "2",
13728
+ key: "afitv7"
13729
+ }
13730
+ ],
13731
+ [
13732
+ "path",
13733
+ {
13734
+ d: "M15 3v18",
13735
+ key: "14nvp0"
13736
+ }
13737
+ ],
13738
+ [
13739
+ "path",
13740
+ {
13741
+ d: "m10 15-3-3 3-3",
13742
+ key: "1pgupc"
13743
+ }
13744
+ ]
13745
+ ];
13746
+ const PanelRightOpen = createLucideIcon("panel-right-open", __iconNode$b);
13718
13747
 
13719
13748
  const __iconNode$a = [
13720
13749
  [
@@ -16030,6 +16059,137 @@ const lightTheme = {
16030
16059
  slow: "0.3s ease-in-out"
16031
16060
  }
16032
16061
  };
16062
+ /** Light “Liquid Glass”–inspired palette (web approximation). */ const liquidGlassLightTheme = {
16063
+ colors: {
16064
+ background: "hsl(210 35% 92%)",
16065
+ foreground: "hsl(222 47% 11%)",
16066
+ card: "hsla(0 0% 100% / 0.88)",
16067
+ cardForeground: "hsl(222 47% 11%)",
16068
+ popover: "hsla(0 0% 100% / 0.94)",
16069
+ popoverForeground: "hsl(222 47% 11%)",
16070
+ primary: "hsl(211 92% 45%)",
16071
+ primaryForeground: "hsl(210 40% 98%)",
16072
+ secondary: "hsla(210 40% 98% / 0.45)",
16073
+ secondaryForeground: "hsl(222 47% 18%)",
16074
+ muted: "hsla(210 25% 98% / 0.35)",
16075
+ mutedForeground: "hsl(215 16% 40%)",
16076
+ accent: "hsla(210 60% 96% / 0.55)",
16077
+ accentForeground: "hsl(222 47% 18%)",
16078
+ destructive: "hsl(0 72% 51%)",
16079
+ destructiveForeground: "hsl(210 40% 98%)",
16080
+ success: "hsl(142.1 76.2% 32%)",
16081
+ successForeground: "hsl(210 40% 98%)",
16082
+ border: "hsla(210 28% 72% / 0.55)",
16083
+ mutedBorder: "hsla(210 22% 80% / 0.45)",
16084
+ input: "hsla(210 28% 88% / 0.65)",
16085
+ ring: "hsl(211 92% 45%)",
16086
+ tagTooluse: {
16087
+ bg: "hsla(199 89% 48% / 0.14)",
16088
+ border: "hsla(199 89% 48% / 0.35)",
16089
+ color: "hsl(200 98% 32%)"
16090
+ },
16091
+ tagLlminference: {
16092
+ bg: "hsla(271 91% 56% / 0.12)",
16093
+ border: "hsla(271 91% 56% / 0.35)",
16094
+ color: "hsl(271 81% 38%)"
16095
+ },
16096
+ tagJudge: {
16097
+ bg: "hsla(0 84% 60% / 0.12)",
16098
+ border: "hsla(0 84% 55% / 0.35)",
16099
+ color: "hsl(0 72% 40%)"
16100
+ },
16101
+ tagToolLevel1: {
16102
+ bg: "hsla(142 70% 42% / 0.15)",
16103
+ color: "hsl(142 71% 28%)"
16104
+ },
16105
+ tagToolLevel2: {
16106
+ bg: "hsla(217 91% 52% / 0.12)",
16107
+ color: "hsl(217 91% 38%)"
16108
+ },
16109
+ tagToolLevel3: {
16110
+ bg: "hsla(271 91% 56% / 0.12)",
16111
+ color: "hsl(271 81% 38%)"
16112
+ }
16113
+ },
16114
+ spacing: lightTheme.spacing,
16115
+ borderRadius: {
16116
+ sm: "calc(var(--radius) - 4px)",
16117
+ md: "calc(var(--radius) - 2px)",
16118
+ lg: "var(--radius)",
16119
+ xl: "1rem"
16120
+ },
16121
+ fontSize: lightTheme.fontSize,
16122
+ fontWeight: lightTheme.fontWeight,
16123
+ shadows: {
16124
+ sm: "0 1px 2px hsla(210 22% 25% / 0.06)",
16125
+ md: "0 8px 24px hsla(210 28% 18% / 0.08)",
16126
+ lg: "0 18px 48px hsla(210 28% 15% / 0.1)"
16127
+ },
16128
+ transitions: lightTheme.transitions
16129
+ };
16130
+ /** Dark “Liquid Glass”–inspired palette — translucent panels on a deep mesh-like base. */ const liquidGlassDarkTheme = {
16131
+ colors: {
16132
+ background: "hsl(222 28% 9%)",
16133
+ foreground: "hsl(210 36% 96%)",
16134
+ card: "hsla(222 22% 14% / 0.88)",
16135
+ cardForeground: "hsl(210 36% 96%)",
16136
+ popover: "hsla(222 24% 12% / 0.94)",
16137
+ popoverForeground: "hsl(210 36% 96%)",
16138
+ primary: "hsl(212 92% 62%)",
16139
+ primaryForeground: "hsl(222 47% 8%)",
16140
+ secondary: "hsla(217 28% 22% / 0.55)",
16141
+ secondaryForeground: "hsl(210 36% 94%)",
16142
+ muted: "hsla(217 22% 18% / 0.45)",
16143
+ mutedForeground: "hsl(215 18% 72%)",
16144
+ accent: "hsla(217 26% 22% / 0.55)",
16145
+ accentForeground: "hsl(210 36% 96%)",
16146
+ destructive: "hsl(0 72% 58%)",
16147
+ destructiveForeground: "hsl(210 40% 98%)",
16148
+ success: "hsl(142 76% 45%)",
16149
+ successForeground: "hsl(222 47% 8%)",
16150
+ border: "hsla(215 22% 42% / 0.45)",
16151
+ mutedBorder: "hsla(222 18% 28% / 0.5)",
16152
+ input: "hsla(217 22% 22% / 0.65)",
16153
+ ring: "hsl(212 92% 62%)",
16154
+ tagTooluse: {
16155
+ bg: "hsla(217 91% 55% / 0.18)",
16156
+ border: "hsla(217 91% 45% / 0.35)",
16157
+ color: "hsl(199 89% 72%)"
16158
+ },
16159
+ tagLlminference: {
16160
+ bg: "hsla(271 91% 58% / 0.15)",
16161
+ border: "hsla(271 91% 48% / 0.35)",
16162
+ color: "hsl(271 91% 78%)"
16163
+ },
16164
+ tagJudge: {
16165
+ bg: "hsla(0 72% 48% / 0.18)",
16166
+ border: "hsla(0 72% 42% / 0.35)",
16167
+ color: "hsl(0 84% 72%)"
16168
+ },
16169
+ tagToolLevel1: {
16170
+ bg: "hsla(142 70% 42% / 0.22)",
16171
+ color: "hsl(142 70% 72%)"
16172
+ },
16173
+ tagToolLevel2: {
16174
+ bg: "hsla(217 91% 52% / 0.2)",
16175
+ color: "hsl(217 91% 76%)"
16176
+ },
16177
+ tagToolLevel3: {
16178
+ bg: "hsla(271 91% 56% / 0.2)",
16179
+ color: "hsl(271 91% 76%)"
16180
+ }
16181
+ },
16182
+ spacing: lightTheme.spacing,
16183
+ borderRadius: liquidGlassLightTheme.borderRadius,
16184
+ fontSize: lightTheme.fontSize,
16185
+ fontWeight: lightTheme.fontWeight,
16186
+ shadows: {
16187
+ sm: "0 1px 2px hsla(0 0% 0% / 0.35)",
16188
+ md: "0 10px 28px hsla(0 0% 0% / 0.35)",
16189
+ lg: "0 22px 52px hsla(0 0% 0% / 0.45)"
16190
+ },
16191
+ transitions: lightTheme.transitions
16192
+ };
16033
16193
  const darkTheme = {
16034
16194
  colors: {
16035
16195
  background: "hsl(222.2 84% 4.9%)",
@@ -16091,81 +16251,124 @@ const darkTheme = {
16091
16251
  };
16092
16252
  const defaultTheme$1 = lightTheme;
16093
16253
 
16254
+ function normalizeStoredTheme(raw) {
16255
+ if (raw === "dark") return "dark";
16256
+ if (raw === "liquidGlassDark") return "liquidGlassDark";
16257
+ if (raw === "liquidGlassLight") return "liquidGlassLight";
16258
+ /* Migrate legacy single “Liquid Glass” preset */ if (raw === "liquidGlass") return "liquidGlassLight";
16259
+ return "light";
16260
+ }
16261
+ function themeForMode(mode) {
16262
+ switch(mode){
16263
+ case "dark":
16264
+ return darkTheme;
16265
+ case "liquidGlassLight":
16266
+ return liquidGlassLightTheme;
16267
+ case "liquidGlassDark":
16268
+ return liquidGlassDarkTheme;
16269
+ default:
16270
+ return lightTheme;
16271
+ }
16272
+ }
16273
+ function themeToMode(theme) {
16274
+ if (theme === darkTheme) return "dark";
16275
+ if (theme === liquidGlassDarkTheme) return "liquidGlassDark";
16276
+ if (theme === liquidGlassLightTheme) return "liquidGlassLight";
16277
+ return "light";
16278
+ }
16094
16279
  const ThemeContext = /*#__PURE__*/ createContext(undefined);
16095
16280
  const ThemeProvider = ({ children, theme: propTheme })=>{
16096
- const [currentTheme, setCurrentTheme] = React__default.useState(()=>{
16097
- // If a theme prop is provided, use it immediately
16281
+ const [themeMode, setThemeModeState] = React__default.useState(()=>{
16098
16282
  if (propTheme) {
16099
- return propTheme;
16283
+ return themeToMode(propTheme);
16100
16284
  }
16101
- // Only check localStorage if no theme prop is provided
16102
- // Handle cases where localStorage might not be available (e.g., test environments)
16103
16285
  try {
16104
- const savedTheme = localStorage.getItem("theme");
16105
- if (savedTheme === "dark") {
16106
- return darkTheme;
16107
- }
16108
- } catch (e) {
16109
- // localStorage not available, fall back to light theme
16110
- // This can happen in test environments or when localStorage is disabled
16111
- }
16112
- return lightTheme;
16286
+ return normalizeStoredTheme(localStorage.getItem("theme"));
16287
+ } catch {
16288
+ /* localStorage unavailable */ }
16289
+ return "light";
16113
16290
  });
16114
- // Update theme when propTheme changes
16291
+ const currentTheme = useMemo(()=>themeForMode(themeMode), [
16292
+ themeMode
16293
+ ]);
16115
16294
  useEffect(()=>{
16116
16295
  if (propTheme) {
16117
- setCurrentTheme(propTheme);
16296
+ setThemeModeState(themeToMode(propTheme));
16118
16297
  }
16119
16298
  }, [
16120
16299
  propTheme
16121
16300
  ]);
16122
- // Sync html.dark class for GlobalStyles and other CSS that uses html.dark
16123
16301
  useEffect(()=>{
16124
- const isDark = currentTheme === darkTheme;
16125
16302
  try {
16126
- if (isDark) {
16127
- document.documentElement.classList.add("dark");
16128
- } else {
16129
- document.documentElement.classList.remove("dark");
16130
- }
16131
- } catch (e) {
16132
- // document might not be available (e.g. SSR)
16133
- }
16303
+ const isClassicDark = themeMode === "dark";
16304
+ const isGlassLight = themeMode === "liquidGlassLight";
16305
+ const isGlassDark = themeMode === "liquidGlassDark";
16306
+ document.documentElement.classList.toggle("dark", isClassicDark);
16307
+ document.documentElement.classList.toggle("liquid-glass-light", isGlassLight);
16308
+ document.documentElement.classList.toggle("liquid-glass-dark", isGlassDark);
16309
+ /* Remove legacy class if present */ document.documentElement.classList.remove("liquid-glass");
16310
+ document.documentElement.dataset.theme = isClassicDark ? "dark" : isGlassLight ? "liquid-glass-light" : isGlassDark ? "liquid-glass-dark" : "light";
16311
+ } catch {
16312
+ /* document unavailable */ }
16313
+ }, [
16314
+ themeMode
16315
+ ]);
16316
+ useEffect(()=>{
16317
+ if (propTheme) return;
16318
+ try {
16319
+ localStorage.setItem("theme", themeMode);
16320
+ } catch {
16321
+ /* ignore */ }
16134
16322
  }, [
16135
- currentTheme
16323
+ themeMode,
16324
+ propTheme
16136
16325
  ]);
16137
- // Only listen for storage events if no theme prop is provided
16138
16326
  useEffect(()=>{
16139
16327
  if (propTheme) {
16140
- // If a theme prop is provided, don't listen for localStorage changes
16141
16328
  return;
16142
16329
  }
16143
16330
  const handleStorageChange = ()=>{
16144
16331
  try {
16145
- const savedTheme = localStorage.getItem("theme");
16146
- if (savedTheme === "dark") {
16147
- setCurrentTheme(darkTheme);
16148
- } else {
16149
- setCurrentTheme(lightTheme);
16150
- }
16151
- } catch (e) {
16152
- // localStorage not available, ignore storage changes
16153
- }
16332
+ setThemeModeState(normalizeStoredTheme(localStorage.getItem("theme")));
16333
+ } catch {
16334
+ /* ignore */ }
16154
16335
  };
16155
- // Listen for storage events (when localStorage changes in other tabs)
16156
16336
  window.addEventListener("storage", handleStorageChange);
16157
- return ()=>{
16158
- window.removeEventListener("storage", handleStorageChange);
16159
- };
16337
+ return ()=>window.removeEventListener("storage", handleStorageChange);
16160
16338
  }, [
16161
16339
  propTheme
16162
16340
  ]);
16163
- const value = React__default.useMemo(()=>({
16341
+ const setThemeMode = useCallback((mode)=>{
16342
+ setThemeModeState(mode);
16343
+ }, []);
16344
+ const setTheme = useCallback((next)=>{
16345
+ setThemeModeState(themeToMode(next));
16346
+ }, []);
16347
+ const isLiquidGlassLight = themeMode === "liquidGlassLight";
16348
+ const isLiquidGlassDark = themeMode === "liquidGlassDark";
16349
+ const isLiquidGlass = isLiquidGlassLight || isLiquidGlassDark;
16350
+ const isClassicDarkTheme = themeMode === "dark";
16351
+ const isDarkMode = isClassicDarkTheme || isLiquidGlassDark;
16352
+ const value = useMemo(()=>({
16164
16353
  theme: currentTheme,
16165
- setTheme: setCurrentTheme,
16166
- isDarkMode: currentTheme === darkTheme
16354
+ themeMode,
16355
+ setTheme,
16356
+ setThemeMode,
16357
+ isDarkMode,
16358
+ isClassicDarkTheme,
16359
+ isLiquidGlass,
16360
+ isLiquidGlassLight,
16361
+ isLiquidGlassDark
16167
16362
  }), [
16168
- currentTheme
16363
+ currentTheme,
16364
+ themeMode,
16365
+ setTheme,
16366
+ setThemeMode,
16367
+ isDarkMode,
16368
+ isClassicDarkTheme,
16369
+ isLiquidGlass,
16370
+ isLiquidGlassLight,
16371
+ isLiquidGlassDark
16169
16372
  ]);
16170
16373
  return /*#__PURE__*/ React__default.createElement(ThemeContext.Provider, {
16171
16374
  value: value
@@ -16176,14 +16379,20 @@ const ThemeProvider = ({ children, theme: propTheme })=>{
16176
16379
  const useTheme$1 = ()=>{
16177
16380
  const context = useContext(ThemeContext);
16178
16381
  if (context === undefined) {
16179
- // Return a graceful fallback instead of throwing an error
16180
16382
  return {
16181
16383
  theme: lightTheme,
16384
+ themeMode: "light",
16182
16385
  setTheme: ()=>{
16183
- // No-op function when context is not available
16184
16386
  console.warn("Theme context not available. setTheme called but ignored.");
16185
16387
  },
16186
- isDarkMode: false // Default to light mode when no context
16388
+ setThemeMode: ()=>{
16389
+ console.warn("Theme context not available. setThemeMode called but ignored.");
16390
+ },
16391
+ isDarkMode: false,
16392
+ isClassicDarkTheme: false,
16393
+ isLiquidGlass: false,
16394
+ isLiquidGlassLight: false,
16395
+ isLiquidGlassDark: false
16187
16396
  };
16188
16397
  }
16189
16398
  return context;
@@ -16192,7 +16401,6 @@ const useThemeValue = ()=>{
16192
16401
  const { theme } = useTheme$1();
16193
16402
  return theme;
16194
16403
  };
16195
- // Helper hook for components that can accept a theme prop
16196
16404
  const useComponentTheme = (themeProp)=>{
16197
16405
  const { theme: contextTheme } = useTheme$1();
16198
16406
  return themeProp || contextTheme;
@@ -48598,7 +48806,7 @@ const CountUpLatency = ({ value })=>{
48598
48806
  };
48599
48807
  }
48600
48808
  const NodeDetailsDrawer = ({ isVisible, onClose, nodeData })=>{
48601
- const { theme } = useTheme$1();
48809
+ const { theme, isLiquidGlass } = useTheme$1();
48602
48810
  const [selectedRowIndex, setSelectedRowIndex] = useState(null);
48603
48811
  const [selectedLlmDetails, setSelectedLlmDetails] = useState(null);
48604
48812
  // Default to last row (total/aggregate) when drawer opens (only on first open)
@@ -48672,11 +48880,11 @@ const NodeDetailsDrawer = ({ isVisible, onClose, nodeData })=>{
48672
48880
  "data-testid": "node-details-drawer",
48673
48881
  styles: {
48674
48882
  body: {
48675
- background: theme.colors.background,
48883
+ background: isLiquidGlass ? theme.colors.popover : theme.colors.background,
48676
48884
  color: theme.colors.foreground
48677
48885
  },
48678
48886
  header: {
48679
- background: theme.colors.card,
48887
+ background: isLiquidGlass ? theme.colors.popover : theme.colors.card,
48680
48888
  borderBottom: `1px solid ${theme.colors.border}`
48681
48889
  }
48682
48890
  }
@@ -52037,8 +52245,7 @@ const SheetOverlay = /*#__PURE__*/ React.forwardRef(({ className, ...props }, re
52037
52245
  bottom: 0,
52038
52246
  left: 0,
52039
52247
  zIndex: 50,
52040
- backgroundColor: "hsla(var(--background), 0.8)",
52041
- backdropFilter: "blur(4px)"
52248
+ backgroundColor: "rgba(0, 0, 0, 0.45)"
52042
52249
  },
52043
52250
  className: className,
52044
52251
  ...props,
@@ -52050,7 +52257,7 @@ const getSheetStyles = (side = "right")=>{
52050
52257
  position: "fixed",
52051
52258
  zIndex: 50,
52052
52259
  gap: "16px",
52053
- backgroundColor: "hsl(var(--background))",
52260
+ backgroundColor: "var(--background)",
52054
52261
  padding: "24px",
52055
52262
  boxShadow: "0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)",
52056
52263
  transition: "all 0.3s ease-in-out"
@@ -52062,7 +52269,7 @@ const getSheetStyles = (side = "right")=>{
52062
52269
  left: 0,
52063
52270
  right: 0,
52064
52271
  top: 0,
52065
- borderBottom: "1px solid hsl(var(--border))"
52272
+ borderBottom: "1px solid var(--border)"
52066
52273
  };
52067
52274
  case "bottom":
52068
52275
  return {
@@ -52070,7 +52277,7 @@ const getSheetStyles = (side = "right")=>{
52070
52277
  left: 0,
52071
52278
  right: 0,
52072
52279
  bottom: 0,
52073
- borderTop: "1px solid hsl(var(--border))"
52280
+ borderTop: "1px solid var(--border)"
52074
52281
  };
52075
52282
  case "left":
52076
52283
  return {
@@ -52080,7 +52287,7 @@ const getSheetStyles = (side = "right")=>{
52080
52287
  left: 0,
52081
52288
  height: "100%",
52082
52289
  width: "75%",
52083
- borderRight: "1px solid hsl(var(--border))",
52290
+ borderRight: "1px solid var(--border)",
52084
52291
  maxWidth: "384px"
52085
52292
  };
52086
52293
  case "right":
@@ -52092,7 +52299,7 @@ const getSheetStyles = (side = "right")=>{
52092
52299
  right: 0,
52093
52300
  height: "100%",
52094
52301
  width: "75%",
52095
- borderLeft: "1px solid hsl(var(--border))",
52302
+ borderLeft: "1px solid var(--border)",
52096
52303
  maxWidth: "384px"
52097
52304
  };
52098
52305
  }
@@ -52153,7 +52360,7 @@ const SheetTitle = /*#__PURE__*/ React.forwardRef(({ className, ...props }, ref)
52153
52360
  style: {
52154
52361
  fontSize: "18px",
52155
52362
  fontWeight: 600,
52156
- color: "hsl(var(--foreground))"
52363
+ color: "var(--foreground)"
52157
52364
  },
52158
52365
  className: className,
52159
52366
  ...props
@@ -52163,7 +52370,7 @@ const SheetDescription = /*#__PURE__*/ React.forwardRef(({ className, ...props }
52163
52370
  ref: ref,
52164
52371
  style: {
52165
52372
  fontSize: "14px",
52166
- color: "hsl(var(--muted-foreground))"
52373
+ color: "var(--muted-foreground)"
52167
52374
  },
52168
52375
  className: className,
52169
52376
  ...props
@@ -116330,7 +116537,18 @@ const useEvaluationsMock = ()=>{
116330
116537
  return useContext(EvaluationsMockContext);
116331
116538
  };
116332
116539
 
116333
- const API_BASE = "/api";
116540
+ /**
116541
+ * Railtracks HTTP API prefix. Same-origin `/api` by default (browser + viz proxy).
116542
+ * Set `VITE_API_ORIGIN` (e.g. `http://localhost:3030`) when the UI is served elsewhere (Electron, etc.).
116543
+ */ function resolveApiBase() {
116544
+ const origin = import.meta.env.VITE_API_ORIGIN?.trim().replace(/\/$/, "") ?? "";
116545
+ if (!origin) {
116546
+ return "/api";
116547
+ }
116548
+ return `${origin}/api`;
116549
+ }
116550
+ const API_BASE = resolveApiBase();
116551
+
116334
116552
  const useEvaluations = ()=>{
116335
116553
  const mockContext = useEvaluationsMock();
116336
116554
  const [evaluations, setEvaluations] = useState([]);
@@ -116944,13 +117162,70 @@ function metricNameOf(agg) {
116944
117162
  });
116945
117163
  }
116946
117164
 
116947
- const SHORT_ID_LENGTH = 8;
116948
- const shortenId = (id)=>id.length > SHORT_ID_LENGTH ? id.slice(0, SHORT_ID_LENGTH) : id;
116949
- const NodeRow = ({ node, metricName, onAgentNodeClick })=>{
117165
+ const NodeActions = ({ sessionId, nodeId, onAgentNodeClick, onOpenVisualizer })=>{
117166
+ const { theme } = useTheme$1();
117167
+ const baseStyle = {
117168
+ display: "inline-flex",
117169
+ alignItems: "center",
117170
+ gap: 5,
117171
+ padding: "3px 9px",
117172
+ borderRadius: 6,
117173
+ fontSize: 12,
117174
+ fontWeight: 500,
117175
+ cursor: "pointer",
117176
+ background: "transparent",
117177
+ color: theme.colors.primary,
117178
+ border: `1px solid ${theme.colors.primary}`,
117179
+ whiteSpace: "nowrap",
117180
+ lineHeight: 1.4
117181
+ };
117182
+ if (!onAgentNodeClick && !onOpenVisualizer) {
117183
+ // No handlers: fall back to surfacing the (shortened) id so context isn't lost.
117184
+ return /*#__PURE__*/ React__default.createElement(Tooltip, {
117185
+ title: nodeId
117186
+ }, /*#__PURE__*/ React__default.createElement("span", {
117187
+ style: {
117188
+ fontFamily: "monospace",
117189
+ fontSize: 12,
117190
+ color: theme.colors.mutedForeground
117191
+ }
117192
+ }, nodeId.length > 8 ? nodeId.slice(0, 8) : nodeId));
117193
+ }
117194
+ return /*#__PURE__*/ React__default.createElement("span", {
117195
+ style: {
117196
+ display: "inline-flex",
117197
+ alignItems: "center",
117198
+ gap: 8
117199
+ },
117200
+ onClick: (e)=>e.stopPropagation()
117201
+ }, onAgentNodeClick && /*#__PURE__*/ React__default.createElement(Tooltip, {
117202
+ title: `Open Flow Details · ${nodeId}`
117203
+ }, /*#__PURE__*/ React__default.createElement("button", {
117204
+ type: "button",
117205
+ style: baseStyle,
117206
+ onClick: ()=>onAgentNodeClick(sessionId, nodeId)
117207
+ }, /*#__PURE__*/ React__default.createElement(PanelRightOpen, {
117208
+ size: 13,
117209
+ style: {
117210
+ flexShrink: 0
117211
+ }
117212
+ }), "Flow Details")), onOpenVisualizer && /*#__PURE__*/ React__default.createElement(Tooltip, {
117213
+ title: `Open in Visualizer · ${nodeId}`
117214
+ }, /*#__PURE__*/ React__default.createElement("button", {
117215
+ type: "button",
117216
+ style: baseStyle,
117217
+ onClick: ()=>onOpenVisualizer(sessionId, nodeId)
117218
+ }, /*#__PURE__*/ React__default.createElement(ChartNetwork, {
117219
+ size: 13,
117220
+ style: {
117221
+ flexShrink: 0
117222
+ }
117223
+ }), "Visualizer")));
117224
+ };
117225
+
117226
+ const NodeRow = ({ node, metricName, onAgentNodeClick, onOpenVisualizer })=>{
116950
117227
  const { theme } = useTheme$1();
116951
117228
  const [showReasoning, setShowReasoning] = useState(false);
116952
- const clickable = !!onAgentNodeClick;
116953
- const open = ()=>onAgentNodeClick?.(node.sessionId, node.nodeId);
116954
117229
  return /*#__PURE__*/ React__default.createElement("div", {
116955
117230
  style: {
116956
117231
  display: "flex",
@@ -116964,38 +117239,27 @@ const NodeRow = ({ node, metricName, onAgentNodeClick })=>{
116964
117239
  gap: 10,
116965
117240
  flexWrap: "wrap"
116966
117241
  }
116967
- }, /*#__PURE__*/ React__default.createElement(Tooltip, {
116968
- title: clickable ? `Inspect run · ${node.nodeId}` : node.nodeId
116969
- }, /*#__PURE__*/ React__default.createElement("span", {
116970
- role: clickable ? "button" : undefined,
116971
- tabIndex: clickable ? 0 : undefined,
116972
- onClick: clickable ? open : undefined,
116973
- onKeyDown: clickable ? (e)=>{
116974
- if (e.key === "Enter" || e.key === " ") {
116975
- e.preventDefault();
116976
- open();
116977
- }
116978
- } : undefined,
117242
+ }, /*#__PURE__*/ React__default.createElement(Tag, {
116979
117243
  style: {
117244
+ margin: 0,
116980
117245
  display: "inline-flex",
116981
117246
  alignItems: "center",
116982
117247
  gap: 6,
116983
- padding: "3px 10px",
116984
- borderRadius: 6,
116985
- fontFamily: "monospace",
116986
- fontSize: 12,
116987
- fontWeight: 500,
116988
- background: theme.colors.tagLlminference?.bg ?? theme.colors.muted,
116989
- color: theme.colors.tagLlminference?.color ?? theme.colors.foreground,
116990
- border: `1px solid ${theme.colors.tagLlminference?.border ?? theme.colors.border}`,
116991
- cursor: clickable ? "pointer" : "default"
117248
+ background: theme.colors.tagToolLevel2?.bg ?? theme.colors.primary,
117249
+ color: theme.colors.tagToolLevel2?.color ?? theme.colors.primaryForeground,
117250
+ border: "none"
116992
117251
  }
116993
117252
  }, /*#__PURE__*/ React__default.createElement(Bot, {
116994
- size: 13,
117253
+ size: 12,
116995
117254
  style: {
116996
117255
  flexShrink: 0
116997
117256
  }
116998
- }), shortenId(node.nodeId))), node.reasoning && /*#__PURE__*/ React__default.createElement("button", {
117257
+ }), "Agent Node"), /*#__PURE__*/ React__default.createElement(NodeActions, {
117258
+ sessionId: node.sessionId,
117259
+ nodeId: node.nodeId,
117260
+ onAgentNodeClick: onAgentNodeClick,
117261
+ onOpenVisualizer: onOpenVisualizer
117262
+ }), node.reasoning && /*#__PURE__*/ React__default.createElement("button", {
116999
117263
  type: "button",
117000
117264
  onClick: ()=>setShowReasoning((s)=>!s),
117001
117265
  style: {
@@ -117062,7 +117326,7 @@ const LabelPanelHeader = ({ label })=>{
117062
117326
  }
117063
117327
  }, label.count, " ", label.count === 1 ? "node" : "nodes"));
117064
117328
  };
117065
- const MetricCard = ({ metric, onAgentNodeClick })=>{
117329
+ const MetricCard = ({ metric, onAgentNodeClick, onOpenVisualizer })=>{
117066
117330
  const { theme } = useTheme$1();
117067
117331
  const items = metric.labels.map((label)=>({
117068
117332
  key: label.labelName,
@@ -117086,7 +117350,8 @@ const MetricCard = ({ metric, onAgentNodeClick })=>{
117086
117350
  key: node.nodeId,
117087
117351
  node: node,
117088
117352
  metricName: metric.metricName,
117089
- onAgentNodeClick: onAgentNodeClick
117353
+ onAgentNodeClick: onAgentNodeClick,
117354
+ onOpenVisualizer: onOpenVisualizer
117090
117355
  })))
117091
117356
  }));
117092
117357
  return /*#__PURE__*/ React__default.createElement("div", {
@@ -117196,7 +117461,7 @@ const Meta = ({ label, value })=>{
117196
117461
  }
117197
117462
  }, value ?? "—"));
117198
117463
  };
117199
- const JudgeAggregateView = ({ metrics, onAgentNodeClick })=>{
117464
+ const JudgeAggregateView = ({ metrics, onAgentNodeClick, onOpenVisualizer })=>{
117200
117465
  const { theme } = useTheme$1();
117201
117466
  if (!metrics.length) {
117202
117467
  return /*#__PURE__*/ React__default.createElement("div", {
@@ -117228,7 +117493,8 @@ const JudgeAggregateView = ({ metrics, onAgentNodeClick })=>{
117228
117493
  }, metrics.map((metric)=>/*#__PURE__*/ React__default.createElement(MetricCard, {
117229
117494
  key: metric.key,
117230
117495
  metric: metric,
117231
- onAgentNodeClick: onAgentNodeClick
117496
+ onAgentNodeClick: onAgentNodeClick,
117497
+ onOpenVisualizer: onOpenVisualizer
117232
117498
  }))));
117233
117499
  };
117234
117500
 
@@ -117280,7 +117546,7 @@ const DEFAULT_TITLES = {
117280
117546
  LLMInference: "LLM Inference Evaluator - Aggregate View",
117281
117547
  Judge: "Judge Evaluator - Aggregate View"
117282
117548
  };
117283
- const AggregateResultsTable = ({ rawResults = [], aggregateResults, agents, title, evaluatorName, onAgentNodeClick })=>{
117549
+ const AggregateResultsTable = ({ rawResults = [], aggregateResults, agents, title, evaluatorName, onAgentNodeClick, onOpenVisualizer })=>{
117284
117550
  const { theme } = useTheme$1();
117285
117551
  const [expandedRowKeys, setExpandedRowKeys] = useState([]);
117286
117552
  const { aggregateType, dataSource, llmIsTree, llmExpandableKeys } = useMemo(()=>{
@@ -117448,7 +117714,7 @@ const AggregateResultsTable = ({ rawResults = [], aggregateResults, agents, titl
117448
117714
  dataIndex: "name",
117449
117715
  key: "name",
117450
117716
  render: (name, row)=>{
117451
- const isClickable = row.level === 3 && row.agentNodeId && onAgentNodeClick;
117717
+ const showActions = row.level === 3 && row.agentNodeId && (onAgentNodeClick || onOpenVisualizer);
117452
117718
  return /*#__PURE__*/ React__default.createElement("span", {
117453
117719
  style: {
117454
117720
  display: "inline-flex",
@@ -117456,27 +117722,16 @@ const AggregateResultsTable = ({ rawResults = [], aggregateResults, agents, titl
117456
117722
  gap: 8,
117457
117723
  fontFamily: "monospace",
117458
117724
  fontSize: 13,
117459
- ...isClickable && {
117460
- cursor: "pointer",
117461
- color: theme.colors.primary
117462
- }
117463
- },
117464
- onClick: isClickable ? (e)=>{
117465
- e.stopPropagation();
117466
- onAgentNodeClick(row.sessionId, row.agentNodeId);
117467
- } : undefined,
117468
- onKeyDown: isClickable ? (e)=>{
117469
- if (e.key === "Enter" || e.key === " ") {
117470
- e.preventDefault();
117471
- e.stopPropagation();
117472
- onAgentNodeClick(row.sessionId, row.agentNodeId);
117473
- }
117474
- } : undefined,
117475
- role: isClickable ? "button" : undefined,
117476
- tabIndex: isClickable ? 0 : undefined
117725
+ flexWrap: "wrap"
117726
+ }
117477
117727
  }, /*#__PURE__*/ React__default.createElement(LLMTagForLevel, {
117478
117728
  level: row.level
117479
- }), name);
117729
+ }), showActions ? /*#__PURE__*/ React__default.createElement(NodeActions, {
117730
+ sessionId: row.sessionId,
117731
+ nodeId: row.agentNodeId,
117732
+ onAgentNodeClick: onAgentNodeClick,
117733
+ onOpenVisualizer: onOpenVisualizer
117734
+ }) : name);
117480
117735
  }
117481
117736
  },
117482
117737
  ...METRIC_COLUMNS.map(({ key, title, Icon })=>({
@@ -117663,7 +117918,8 @@ const AggregateResultsTable = ({ rawResults = [], aggregateResults, agents, titl
117663
117918
  if (aggregateType === "Judge") {
117664
117919
  return /*#__PURE__*/ React__default.createElement(JudgeAggregateView, {
117665
117920
  metrics: dataSource,
117666
- onAgentNodeClick: onAgentNodeClick
117921
+ onAgentNodeClick: onAgentNodeClick,
117922
+ onOpenVisualizer: onOpenVisualizer
117667
117923
  });
117668
117924
  }
117669
117925
  // ToolUse (tree table)
@@ -117732,7 +117988,7 @@ const AggregateResultsTable = ({ rawResults = [], aggregateResults, agents, titl
117732
117988
  dataIndex: "name",
117733
117989
  key: "name",
117734
117990
  render: (name, row)=>{
117735
- const isClickable = (row.level === 2 || row.level === 3) && row.nodeId && onAgentNodeClick;
117991
+ const showActions = (row.level === 2 || row.level === 3) && row.nodeId && (onAgentNodeClick || onOpenVisualizer);
117736
117992
  return /*#__PURE__*/ React__default.createElement("span", {
117737
117993
  style: {
117738
117994
  display: "inline-flex",
@@ -117740,27 +117996,16 @@ const AggregateResultsTable = ({ rawResults = [], aggregateResults, agents, titl
117740
117996
  gap: 8,
117741
117997
  fontFamily: "monospace",
117742
117998
  fontSize: 13,
117743
- ...isClickable && {
117744
- cursor: "pointer",
117745
- color: theme.colors.primary
117746
- }
117747
- },
117748
- onClick: isClickable ? (e)=>{
117749
- e.stopPropagation();
117750
- onAgentNodeClick(row.sessionId, row.nodeId);
117751
- } : undefined,
117752
- onKeyDown: isClickable ? (e)=>{
117753
- if (e.key === "Enter" || e.key === " ") {
117754
- e.preventDefault();
117755
- e.stopPropagation();
117756
- onAgentNodeClick(row.sessionId, row.nodeId);
117757
- }
117758
- } : undefined,
117759
- role: isClickable ? "button" : undefined,
117760
- tabIndex: isClickable ? 0 : undefined
117999
+ flexWrap: "wrap"
118000
+ }
117761
118001
  }, /*#__PURE__*/ React__default.createElement(TagForLevel, {
117762
118002
  level: row.level
117763
- }), name);
118003
+ }), showActions ? /*#__PURE__*/ React__default.createElement(NodeActions, {
118004
+ sessionId: row.sessionId,
118005
+ nodeId: row.nodeId,
118006
+ onAgentNodeClick: onAgentNodeClick,
118007
+ onOpenVisualizer: onOpenVisualizer
118008
+ }) : name);
117764
118009
  }
117765
118010
  },
117766
118011
  {
@@ -118078,7 +118323,7 @@ function isCategoricalMetric(def) {
118078
118323
  }, 0) ?? 0;
118079
118324
  }
118080
118325
 
118081
- const EvaluatorResult = ({ evaluation, evaluatorId, backHref, onAgentNodeClick })=>{
118326
+ const EvaluatorResult = ({ evaluation, evaluatorId, backHref, onAgentNodeClick, onOpenVisualizer })=>{
118082
118327
  const { theme } = useTheme$1();
118083
118328
  const labelColor = theme.colors.mutedForeground;
118084
118329
  const derived = evaluation ? deriveEvaluatorResultData(evaluation, evaluatorId) : null;
@@ -118221,7 +118466,8 @@ const EvaluatorResult = ({ evaluation, evaluatorId, backHref, onAgentNodeClick }
118221
118466
  aggregateResults: aggregateResults,
118222
118467
  agents: evaluation.agents,
118223
118468
  evaluatorName: evaluatorName,
118224
- onAgentNodeClick: onAgentNodeClick
118469
+ onAgentNodeClick: onAgentNodeClick,
118470
+ onOpenVisualizer: onOpenVisualizer
118225
118471
  }))));
118226
118472
  };
118227
118473
 
@@ -120076,6 +120322,166 @@ const GlobalStyles = ()=>{
120076
120322
  --ring: #6366f1;
120077
120323
  --radius: 0.5rem;
120078
120324
  }
120325
+
120326
+ html.liquid-glass-light {
120327
+ color: hsl(222 47% 11%);
120328
+ }
120329
+
120330
+ html.liquid-glass-light::before {
120331
+ content: "";
120332
+ position: fixed;
120333
+ inset: 0;
120334
+ z-index: -1;
120335
+ pointer-events: none;
120336
+ background:
120337
+ radial-gradient(120% 90% at 10% 10%, hsl(210 55% 92%) 0%, transparent 52%),
120338
+ radial-gradient(90% 70% at 90% 20%, hsl(220 45% 88%) 0%, transparent 45%),
120339
+ radial-gradient(70% 60% at 50% 100%, hsl(200 35% 88%) 0%, transparent 50%), hsl(210 30% 91%);
120340
+ }
120341
+
120342
+ html.liquid-glass-light body {
120343
+ background-color: hsl(210 30% 91%);
120344
+ color: hsl(222 47% 11%);
120345
+ }
120346
+
120347
+ html.liquid-glass-light .react-flow {
120348
+ contain: paint;
120349
+ }
120350
+
120351
+ html.liquid-glass-light .react-flow__edge-label {
120352
+ background: hsla(0 0% 100% / 0.92);
120353
+ border: 1px solid hsla(210 28% 72% / 0.55);
120354
+ color: hsl(222 47% 11%);
120355
+ }
120356
+
120357
+ html.liquid-glass-light .file-selector-refresh-btn {
120358
+ border: 1px solid hsla(210 28% 72% / 0.55);
120359
+ background-color: hsla(0 0% 100% / 0.88);
120360
+ color: hsl(222 47% 11%);
120361
+ }
120362
+
120363
+ html.liquid-glass-light .file-selector-refresh-btn:hover {
120364
+ background-color: hsla(0 0% 100% / 0.96);
120365
+ color: hsl(222 47% 14%);
120366
+ }
120367
+
120368
+ html.liquid-glass-light .ant-table-tbody > tr.evaluations-compare-diff-row > td {
120369
+ background-color: hsla(48 96% 53% / 0.22) !important;
120370
+ }
120371
+
120372
+ html.liquid-glass-light {
120373
+ --background: hsl(210 30% 91%);
120374
+ --foreground: hsl(222 47% 11%);
120375
+ --card: hsla(0 0% 100% / 0.88);
120376
+ --card-foreground: hsl(222 47% 11%);
120377
+ --popover: hsla(0 0% 100% / 0.94);
120378
+ --popover-foreground: hsl(222 47% 11%);
120379
+ --primary: hsl(211 92% 45%);
120380
+ --primary-foreground: hsl(210 40% 98%);
120381
+ --secondary: hsla(210 40% 98% / 0.45);
120382
+ --secondary-foreground: hsl(222 47% 18%);
120383
+ --muted: hsla(210 25% 98% / 0.35);
120384
+ --muted-foreground: hsl(215 16% 40%);
120385
+ --accent: hsla(210 60% 96% / 0.55);
120386
+ --accent-foreground: hsl(222 47% 18%);
120387
+ --destructive: hsl(0 72% 51%);
120388
+ --destructive-foreground: hsl(210 40% 98%);
120389
+ --border: hsla(210 28% 72% / 0.55);
120390
+ --input: hsla(210 28% 88% / 0.65);
120391
+ --ring: hsl(211 92% 45%);
120392
+ --radius: 0.75rem;
120393
+ }
120394
+
120395
+ html.liquid-glass-dark {
120396
+ color: hsl(210 36% 96%);
120397
+ }
120398
+
120399
+ html.liquid-glass-dark::before {
120400
+ content: "";
120401
+ position: fixed;
120402
+ inset: 0;
120403
+ z-index: -1;
120404
+ pointer-events: none;
120405
+ background:
120406
+ radial-gradient(130% 100% at 20% 0%, hsl(222 42% 14%) 0%, transparent 55%),
120407
+ radial-gradient(90% 80% at 95% 30%, hsl(232 38% 18%) 0%, transparent 45%),
120408
+ radial-gradient(80% 70% at 50% 100%, hsl(215 36% 12%) 0%, transparent 50%), hsl(222 28% 9%);
120409
+ }
120410
+
120411
+ html.liquid-glass-dark body {
120412
+ background-color: hsl(222 28% 9%);
120413
+ color: hsl(210 36% 96%);
120414
+ }
120415
+
120416
+ html.liquid-glass-dark .react-flow {
120417
+ contain: paint;
120418
+ }
120419
+
120420
+ html.liquid-glass-dark .react-flow__edge-label {
120421
+ background: hsla(222 22% 18% / 0.92);
120422
+ border: 1px solid hsla(215 22% 42% / 0.45);
120423
+ color: hsl(210 36% 96%);
120424
+ }
120425
+
120426
+ html.liquid-glass-dark .file-selector-refresh-btn {
120427
+ border: 1px solid hsla(215 22% 42% / 0.45);
120428
+ background-color: hsla(222 22% 14% / 0.88);
120429
+ color: hsl(210 36% 96%);
120430
+ }
120431
+
120432
+ html.liquid-glass-dark .file-selector-refresh-btn:hover {
120433
+ background-color: hsla(222 22% 18% / 0.96);
120434
+ color: hsl(210 40% 98%);
120435
+ }
120436
+
120437
+ html.liquid-glass-dark .ant-table-tbody > tr.evaluations-compare-diff-row > td {
120438
+ background-color: hsla(217 32% 28% / 0.55) !important;
120439
+ }
120440
+
120441
+ html.liquid-glass-dark {
120442
+ --background: hsl(222 28% 9%);
120443
+ --foreground: hsl(210 36% 96%);
120444
+ --card: hsla(222 22% 14% / 0.88);
120445
+ --card-foreground: hsl(210 36% 96%);
120446
+ --popover: hsla(222 24% 12% / 0.94);
120447
+ --popover-foreground: hsl(210 36% 96%);
120448
+ --primary: hsl(212 92% 62%);
120449
+ --primary-foreground: hsl(222 47% 8%);
120450
+ --secondary: hsla(217 28% 22% / 0.55);
120451
+ --secondary-foreground: hsl(210 36% 94%);
120452
+ --muted: hsla(217 22% 18% / 0.45);
120453
+ --muted-foreground: hsl(215 18% 72%);
120454
+ --accent: hsla(217 26% 22% / 0.55);
120455
+ --accent-foreground: hsl(210 36% 96%);
120456
+ --destructive: hsl(0 72% 58%);
120457
+ --destructive-foreground: hsl(210 40% 98%);
120458
+ --border: hsla(215 22% 42% / 0.45);
120459
+ --input: hsla(217 22% 22% / 0.65);
120460
+ --ring: hsl(212 92% 62%);
120461
+ --radius: 0.75rem;
120462
+ }
120463
+
120464
+ @media (prefers-reduced-transparency: reduce) {
120465
+ html.liquid-glass-light::before,
120466
+ html.liquid-glass-dark::before {
120467
+ display: none;
120468
+ }
120469
+
120470
+ html.liquid-glass-light body {
120471
+ background-color: hsl(210 30% 91%);
120472
+ }
120473
+
120474
+ html.liquid-glass-dark body {
120475
+ background-color: hsl(222 28% 9%);
120476
+ }
120477
+
120478
+ html.liquid-glass-light .react-flow__edge-label,
120479
+ html.liquid-glass-dark .react-flow__edge-label,
120480
+ html.liquid-glass-light .file-selector-refresh-btn,
120481
+ html.liquid-glass-dark .file-selector-refresh-btn {
120482
+ background-color: var(--card);
120483
+ }
120484
+ }
120079
120485
  `
120080
120486
  });
120081
120487
  };
@@ -120216,4 +120622,4 @@ const GlobalStyles = ()=>{
120216
120622
  return getSafeColor(props.theme, path, fallback);
120217
120623
  };
120218
120624
 
120219
- export { AgenticFlowVisualizer, AnthropicIcon, AppleIcon, Badge, Drawer, Edge, EvaluationDetailsDrawer, EvaluationsCompareDrawer, EvaluationsComparePage, EvaluationsCompareView, EvaluationsErrorCard, EvaluationsTable, EvaluatorResult, GlobalStyles, GoogleIcon, JsonTreeViewer, Node$1 as Node, OllamaIcon, OpenAIIcon, SafeThemeProvider, SessionDetails, Sheet, ThemeProvider, Timeline, Visualizer, calculateAutoLayout, cn, conditionalStyle, createSafeTheme, darkTheme, defaultTheme$1 as defaultTheme, detectContentType, escapeDotPathSegment, evaluationsHaveSameMetrics, formatCurrency, formatDateFriendly, formatDateRelative, formatDateShort, formatDuration, formatJsonTreePrimitive, formatLatency, formatMetricValue$1 as formatMetricValue, formatNumberWithCommas, formatToolCalls, getColor, getDefaultTimelineStepForRun, getSafeColor, getSafeSpacing, getSafeThemeValue, getSpacing, getStatusColor, isEvaluationDto, isPlainObject, lightTheme, safeStyled, safeThemeColor, safeThemeSpacing, safeThemeValue, toTitleCase, transformEvaluation, truncateText, useComponentTheme, useSafeTheme, useTheme$1 as useTheme, useThemeValue };
120625
+ export { AgenticFlowVisualizer, AnthropicIcon, AppleIcon, Badge, Drawer, Edge, EvaluationDetailsDrawer, EvaluationsCompareDrawer, EvaluationsComparePage, EvaluationsCompareView, EvaluationsErrorCard, EvaluationsTable, EvaluatorResult, GlobalStyles, GoogleIcon, JsonTreeViewer, Node$1 as Node, OllamaIcon, OpenAIIcon, SafeThemeProvider, SessionDetails, Sheet, ThemeProvider, Timeline, Visualizer, calculateAutoLayout, cn, conditionalStyle, createSafeTheme, darkTheme, defaultTheme$1 as defaultTheme, detectContentType, escapeDotPathSegment, evaluationsHaveSameMetrics, formatCurrency, formatDateFriendly, formatDateRelative, formatDateShort, formatDuration, formatJsonTreePrimitive, formatLatency, formatMetricValue$1 as formatMetricValue, formatNumberWithCommas, formatToolCalls, getColor, getDefaultTimelineStepForRun, getSafeColor, getSafeSpacing, getSafeThemeValue, getSpacing, getStatusColor, isEvaluationDto, isPlainObject, lightTheme, liquidGlassDarkTheme, liquidGlassLightTheme, safeStyled, safeThemeColor, safeThemeSpacing, safeThemeValue, themeForMode, themeToMode, toTitleCase, transformEvaluation, truncateText, useComponentTheme, useSafeTheme, useTheme$1 as useTheme, useThemeValue };