@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/cjs/index.js CHANGED
@@ -12939,7 +12939,7 @@ const createLucideIcon = (iconName, iconNode)=>{
12939
12939
  return Component;
12940
12940
  };
12941
12941
 
12942
- const __iconNode$z = [
12942
+ const __iconNode$A = [
12943
12943
  [
12944
12944
  "path",
12945
12945
  {
@@ -12955,9 +12955,9 @@ const __iconNode$z = [
12955
12955
  }
12956
12956
  ]
12957
12957
  ];
12958
- const ArrowLeft = createLucideIcon("arrow-left", __iconNode$z);
12958
+ const ArrowLeft = createLucideIcon("arrow-left", __iconNode$A);
12959
12959
 
12960
- const __iconNode$y = [
12960
+ const __iconNode$z = [
12961
12961
  [
12962
12962
  "path",
12963
12963
  {
@@ -12973,9 +12973,9 @@ const __iconNode$y = [
12973
12973
  }
12974
12974
  ]
12975
12975
  ];
12976
- const ArrowRight = createLucideIcon("arrow-right", __iconNode$y);
12976
+ const ArrowRight = createLucideIcon("arrow-right", __iconNode$z);
12977
12977
 
12978
- const __iconNode$x = [
12978
+ const __iconNode$y = [
12979
12979
  [
12980
12980
  "path",
12981
12981
  {
@@ -13023,9 +13023,9 @@ const __iconNode$x = [
13023
13023
  }
13024
13024
  ]
13025
13025
  ];
13026
- const Bot = createLucideIcon("bot", __iconNode$x);
13026
+ const Bot = createLucideIcon("bot", __iconNode$y);
13027
13027
 
13028
- const __iconNode$w = [
13028
+ const __iconNode$x = [
13029
13029
  [
13030
13030
  "path",
13031
13031
  {
@@ -13059,9 +13059,9 @@ const __iconNode$w = [
13059
13059
  }
13060
13060
  ]
13061
13061
  ];
13062
- const Calendar = createLucideIcon("calendar", __iconNode$w);
13062
+ const Calendar = createLucideIcon("calendar", __iconNode$x);
13063
13063
 
13064
- const __iconNode$v = [
13064
+ const __iconNode$w = [
13065
13065
  [
13066
13066
  "path",
13067
13067
  {
@@ -13118,9 +13118,9 @@ const __iconNode$v = [
13118
13118
  }
13119
13119
  ]
13120
13120
  ];
13121
- const ChartNetwork = createLucideIcon("chart-network", __iconNode$v);
13121
+ const ChartNetwork = createLucideIcon("chart-network", __iconNode$w);
13122
13122
 
13123
- const __iconNode$u = [
13123
+ const __iconNode$v = [
13124
13124
  [
13125
13125
  "path",
13126
13126
  {
@@ -13129,9 +13129,9 @@ const __iconNode$u = [
13129
13129
  }
13130
13130
  ]
13131
13131
  ];
13132
- const ChevronDown = createLucideIcon("chevron-down", __iconNode$u);
13132
+ const ChevronDown = createLucideIcon("chevron-down", __iconNode$v);
13133
13133
 
13134
- const __iconNode$t = [
13134
+ const __iconNode$u = [
13135
13135
  [
13136
13136
  "path",
13137
13137
  {
@@ -13140,9 +13140,9 @@ const __iconNode$t = [
13140
13140
  }
13141
13141
  ]
13142
13142
  ];
13143
- const ChevronRight = createLucideIcon("chevron-right", __iconNode$t);
13143
+ const ChevronRight = createLucideIcon("chevron-right", __iconNode$u);
13144
13144
 
13145
- const __iconNode$s = [
13145
+ const __iconNode$t = [
13146
13146
  [
13147
13147
  "path",
13148
13148
  {
@@ -13158,9 +13158,9 @@ const __iconNode$s = [
13158
13158
  }
13159
13159
  ]
13160
13160
  ];
13161
- const ChevronsDown = createLucideIcon("chevrons-down", __iconNode$s);
13161
+ const ChevronsDown = createLucideIcon("chevrons-down", __iconNode$t);
13162
13162
 
13163
- const __iconNode$r = [
13163
+ const __iconNode$s = [
13164
13164
  [
13165
13165
  "path",
13166
13166
  {
@@ -13176,9 +13176,9 @@ const __iconNode$r = [
13176
13176
  }
13177
13177
  ]
13178
13178
  ];
13179
- const ChevronsUp = createLucideIcon("chevrons-up", __iconNode$r);
13179
+ const ChevronsUp = createLucideIcon("chevrons-up", __iconNode$s);
13180
13180
 
13181
- const __iconNode$q = [
13181
+ const __iconNode$r = [
13182
13182
  [
13183
13183
  "circle",
13184
13184
  {
@@ -13209,9 +13209,9 @@ const __iconNode$q = [
13209
13209
  }
13210
13210
  ]
13211
13211
  ];
13212
- const CircleAlert = createLucideIcon("circle-alert", __iconNode$q);
13212
+ const CircleAlert = createLucideIcon("circle-alert", __iconNode$r);
13213
13213
 
13214
- const __iconNode$p = [
13214
+ const __iconNode$q = [
13215
13215
  [
13216
13216
  "path",
13217
13217
  {
@@ -13227,9 +13227,9 @@ const __iconNode$p = [
13227
13227
  }
13228
13228
  ]
13229
13229
  ];
13230
- const CircleCheckBig = createLucideIcon("circle-check-big", __iconNode$p);
13230
+ const CircleCheckBig = createLucideIcon("circle-check-big", __iconNode$q);
13231
13231
 
13232
- const __iconNode$o = [
13232
+ const __iconNode$p = [
13233
13233
  [
13234
13234
  "circle",
13235
13235
  {
@@ -13254,9 +13254,9 @@ const __iconNode$o = [
13254
13254
  }
13255
13255
  ]
13256
13256
  ];
13257
- const CircleDollarSign = createLucideIcon("circle-dollar-sign", __iconNode$o);
13257
+ const CircleDollarSign = createLucideIcon("circle-dollar-sign", __iconNode$p);
13258
13258
 
13259
- const __iconNode$n = [
13259
+ const __iconNode$o = [
13260
13260
  [
13261
13261
  "circle",
13262
13262
  {
@@ -13274,9 +13274,9 @@ const __iconNode$n = [
13274
13274
  }
13275
13275
  ]
13276
13276
  ];
13277
- const Clock = createLucideIcon("clock", __iconNode$n);
13277
+ const Clock = createLucideIcon("clock", __iconNode$o);
13278
13278
 
13279
- const __iconNode$m = [
13279
+ const __iconNode$n = [
13280
13280
  [
13281
13281
  "rect",
13282
13282
  {
@@ -13297,9 +13297,9 @@ const __iconNode$m = [
13297
13297
  }
13298
13298
  ]
13299
13299
  ];
13300
- const Copy = createLucideIcon("copy", __iconNode$m);
13300
+ const Copy = createLucideIcon("copy", __iconNode$n);
13301
13301
 
13302
- const __iconNode$l = [
13302
+ const __iconNode$m = [
13303
13303
  [
13304
13304
  "path",
13305
13305
  {
@@ -13407,9 +13407,9 @@ const __iconNode$l = [
13407
13407
  }
13408
13408
  ]
13409
13409
  ];
13410
- const Cpu = createLucideIcon("cpu", __iconNode$l);
13410
+ const Cpu = createLucideIcon("cpu", __iconNode$m);
13411
13411
 
13412
- const __iconNode$k = [
13412
+ const __iconNode$l = [
13413
13413
  [
13414
13414
  "line",
13415
13415
  {
@@ -13428,9 +13428,9 @@ const __iconNode$k = [
13428
13428
  }
13429
13429
  ]
13430
13430
  ];
13431
- const DollarSign = createLucideIcon("dollar-sign", __iconNode$k);
13431
+ const DollarSign = createLucideIcon("dollar-sign", __iconNode$l);
13432
13432
 
13433
- const __iconNode$j = [
13433
+ const __iconNode$k = [
13434
13434
  [
13435
13435
  "path",
13436
13436
  {
@@ -13460,9 +13460,9 @@ const __iconNode$j = [
13460
13460
  }
13461
13461
  ]
13462
13462
  ];
13463
- const FileInput = createLucideIcon("file-input", __iconNode$j);
13463
+ const FileInput = createLucideIcon("file-input", __iconNode$k);
13464
13464
 
13465
- const __iconNode$i = [
13465
+ const __iconNode$j = [
13466
13466
  [
13467
13467
  "path",
13468
13468
  {
@@ -13492,9 +13492,9 @@ const __iconNode$i = [
13492
13492
  }
13493
13493
  ]
13494
13494
  ];
13495
- const FileOutput = createLucideIcon("file-output", __iconNode$i);
13495
+ const FileOutput = createLucideIcon("file-output", __iconNode$j);
13496
13496
 
13497
- const __iconNode$h = [
13497
+ const __iconNode$i = [
13498
13498
  [
13499
13499
  "path",
13500
13500
  {
@@ -13552,9 +13552,9 @@ const __iconNode$h = [
13552
13552
  }
13553
13553
  ]
13554
13554
  ];
13555
- const FoldVertical = createLucideIcon("fold-vertical", __iconNode$h);
13555
+ const FoldVertical = createLucideIcon("fold-vertical", __iconNode$i);
13556
13556
 
13557
- const __iconNode$g = [
13557
+ const __iconNode$h = [
13558
13558
  [
13559
13559
  "line",
13560
13560
  {
@@ -13596,9 +13596,9 @@ const __iconNode$g = [
13596
13596
  }
13597
13597
  ]
13598
13598
  ];
13599
- const Hash = createLucideIcon("hash", __iconNode$g);
13599
+ const Hash = createLucideIcon("hash", __iconNode$h);
13600
13600
 
13601
- const __iconNode$f = [
13601
+ const __iconNode$g = [
13602
13602
  [
13603
13603
  "circle",
13604
13604
  {
@@ -13623,9 +13623,9 @@ const __iconNode$f = [
13623
13623
  }
13624
13624
  ]
13625
13625
  ];
13626
- const Info = createLucideIcon("info", __iconNode$f);
13626
+ const Info = createLucideIcon("info", __iconNode$g);
13627
13627
 
13628
- const __iconNode$e = [
13628
+ const __iconNode$f = [
13629
13629
  [
13630
13630
  "path",
13631
13631
  {
@@ -13662,9 +13662,9 @@ const __iconNode$e = [
13662
13662
  }
13663
13663
  ]
13664
13664
  ];
13665
- const ListChecks = createLucideIcon("list-checks", __iconNode$e);
13665
+ const ListChecks = createLucideIcon("list-checks", __iconNode$f);
13666
13666
 
13667
- const __iconNode$d = [
13667
+ const __iconNode$e = [
13668
13668
  [
13669
13669
  "path",
13670
13670
  {
@@ -13694,9 +13694,9 @@ const __iconNode$d = [
13694
13694
  }
13695
13695
  ]
13696
13696
  ];
13697
- const MessageSquareText = createLucideIcon("message-square-text", __iconNode$d);
13697
+ const MessageSquareText = createLucideIcon("message-square-text", __iconNode$e);
13698
13698
 
13699
- const __iconNode$c = [
13699
+ const __iconNode$d = [
13700
13700
  [
13701
13701
  "path",
13702
13702
  {
@@ -13712,9 +13712,9 @@ const __iconNode$c = [
13712
13712
  }
13713
13713
  ]
13714
13714
  ];
13715
- const MessagesSquare = createLucideIcon("messages-square", __iconNode$c);
13715
+ const MessagesSquare = createLucideIcon("messages-square", __iconNode$d);
13716
13716
 
13717
- const __iconNode$b = [
13717
+ const __iconNode$c = [
13718
13718
  [
13719
13719
  "rect",
13720
13720
  {
@@ -13734,7 +13734,36 @@ const __iconNode$b = [
13734
13734
  }
13735
13735
  ]
13736
13736
  ];
13737
- const PanelLeft = createLucideIcon("panel-left", __iconNode$b);
13737
+ const PanelLeft = createLucideIcon("panel-left", __iconNode$c);
13738
+
13739
+ const __iconNode$b = [
13740
+ [
13741
+ "rect",
13742
+ {
13743
+ width: "18",
13744
+ height: "18",
13745
+ x: "3",
13746
+ y: "3",
13747
+ rx: "2",
13748
+ key: "afitv7"
13749
+ }
13750
+ ],
13751
+ [
13752
+ "path",
13753
+ {
13754
+ d: "M15 3v18",
13755
+ key: "14nvp0"
13756
+ }
13757
+ ],
13758
+ [
13759
+ "path",
13760
+ {
13761
+ d: "m10 15-3-3 3-3",
13762
+ key: "1pgupc"
13763
+ }
13764
+ ]
13765
+ ];
13766
+ const PanelRightOpen = createLucideIcon("panel-right-open", __iconNode$b);
13738
13767
 
13739
13768
  const __iconNode$a = [
13740
13769
  [
@@ -16050,6 +16079,137 @@ const lightTheme = {
16050
16079
  slow: "0.3s ease-in-out"
16051
16080
  }
16052
16081
  };
16082
+ /** Light “Liquid Glass”–inspired palette (web approximation). */ const liquidGlassLightTheme = {
16083
+ colors: {
16084
+ background: "hsl(210 35% 92%)",
16085
+ foreground: "hsl(222 47% 11%)",
16086
+ card: "hsla(0 0% 100% / 0.88)",
16087
+ cardForeground: "hsl(222 47% 11%)",
16088
+ popover: "hsla(0 0% 100% / 0.94)",
16089
+ popoverForeground: "hsl(222 47% 11%)",
16090
+ primary: "hsl(211 92% 45%)",
16091
+ primaryForeground: "hsl(210 40% 98%)",
16092
+ secondary: "hsla(210 40% 98% / 0.45)",
16093
+ secondaryForeground: "hsl(222 47% 18%)",
16094
+ muted: "hsla(210 25% 98% / 0.35)",
16095
+ mutedForeground: "hsl(215 16% 40%)",
16096
+ accent: "hsla(210 60% 96% / 0.55)",
16097
+ accentForeground: "hsl(222 47% 18%)",
16098
+ destructive: "hsl(0 72% 51%)",
16099
+ destructiveForeground: "hsl(210 40% 98%)",
16100
+ success: "hsl(142.1 76.2% 32%)",
16101
+ successForeground: "hsl(210 40% 98%)",
16102
+ border: "hsla(210 28% 72% / 0.55)",
16103
+ mutedBorder: "hsla(210 22% 80% / 0.45)",
16104
+ input: "hsla(210 28% 88% / 0.65)",
16105
+ ring: "hsl(211 92% 45%)",
16106
+ tagTooluse: {
16107
+ bg: "hsla(199 89% 48% / 0.14)",
16108
+ border: "hsla(199 89% 48% / 0.35)",
16109
+ color: "hsl(200 98% 32%)"
16110
+ },
16111
+ tagLlminference: {
16112
+ bg: "hsla(271 91% 56% / 0.12)",
16113
+ border: "hsla(271 91% 56% / 0.35)",
16114
+ color: "hsl(271 81% 38%)"
16115
+ },
16116
+ tagJudge: {
16117
+ bg: "hsla(0 84% 60% / 0.12)",
16118
+ border: "hsla(0 84% 55% / 0.35)",
16119
+ color: "hsl(0 72% 40%)"
16120
+ },
16121
+ tagToolLevel1: {
16122
+ bg: "hsla(142 70% 42% / 0.15)",
16123
+ color: "hsl(142 71% 28%)"
16124
+ },
16125
+ tagToolLevel2: {
16126
+ bg: "hsla(217 91% 52% / 0.12)",
16127
+ color: "hsl(217 91% 38%)"
16128
+ },
16129
+ tagToolLevel3: {
16130
+ bg: "hsla(271 91% 56% / 0.12)",
16131
+ color: "hsl(271 81% 38%)"
16132
+ }
16133
+ },
16134
+ spacing: lightTheme.spacing,
16135
+ borderRadius: {
16136
+ sm: "calc(var(--radius) - 4px)",
16137
+ md: "calc(var(--radius) - 2px)",
16138
+ lg: "var(--radius)",
16139
+ xl: "1rem"
16140
+ },
16141
+ fontSize: lightTheme.fontSize,
16142
+ fontWeight: lightTheme.fontWeight,
16143
+ shadows: {
16144
+ sm: "0 1px 2px hsla(210 22% 25% / 0.06)",
16145
+ md: "0 8px 24px hsla(210 28% 18% / 0.08)",
16146
+ lg: "0 18px 48px hsla(210 28% 15% / 0.1)"
16147
+ },
16148
+ transitions: lightTheme.transitions
16149
+ };
16150
+ /** Dark “Liquid Glass”–inspired palette — translucent panels on a deep mesh-like base. */ const liquidGlassDarkTheme = {
16151
+ colors: {
16152
+ background: "hsl(222 28% 9%)",
16153
+ foreground: "hsl(210 36% 96%)",
16154
+ card: "hsla(222 22% 14% / 0.88)",
16155
+ cardForeground: "hsl(210 36% 96%)",
16156
+ popover: "hsla(222 24% 12% / 0.94)",
16157
+ popoverForeground: "hsl(210 36% 96%)",
16158
+ primary: "hsl(212 92% 62%)",
16159
+ primaryForeground: "hsl(222 47% 8%)",
16160
+ secondary: "hsla(217 28% 22% / 0.55)",
16161
+ secondaryForeground: "hsl(210 36% 94%)",
16162
+ muted: "hsla(217 22% 18% / 0.45)",
16163
+ mutedForeground: "hsl(215 18% 72%)",
16164
+ accent: "hsla(217 26% 22% / 0.55)",
16165
+ accentForeground: "hsl(210 36% 96%)",
16166
+ destructive: "hsl(0 72% 58%)",
16167
+ destructiveForeground: "hsl(210 40% 98%)",
16168
+ success: "hsl(142 76% 45%)",
16169
+ successForeground: "hsl(222 47% 8%)",
16170
+ border: "hsla(215 22% 42% / 0.45)",
16171
+ mutedBorder: "hsla(222 18% 28% / 0.5)",
16172
+ input: "hsla(217 22% 22% / 0.65)",
16173
+ ring: "hsl(212 92% 62%)",
16174
+ tagTooluse: {
16175
+ bg: "hsla(217 91% 55% / 0.18)",
16176
+ border: "hsla(217 91% 45% / 0.35)",
16177
+ color: "hsl(199 89% 72%)"
16178
+ },
16179
+ tagLlminference: {
16180
+ bg: "hsla(271 91% 58% / 0.15)",
16181
+ border: "hsla(271 91% 48% / 0.35)",
16182
+ color: "hsl(271 91% 78%)"
16183
+ },
16184
+ tagJudge: {
16185
+ bg: "hsla(0 72% 48% / 0.18)",
16186
+ border: "hsla(0 72% 42% / 0.35)",
16187
+ color: "hsl(0 84% 72%)"
16188
+ },
16189
+ tagToolLevel1: {
16190
+ bg: "hsla(142 70% 42% / 0.22)",
16191
+ color: "hsl(142 70% 72%)"
16192
+ },
16193
+ tagToolLevel2: {
16194
+ bg: "hsla(217 91% 52% / 0.2)",
16195
+ color: "hsl(217 91% 76%)"
16196
+ },
16197
+ tagToolLevel3: {
16198
+ bg: "hsla(271 91% 56% / 0.2)",
16199
+ color: "hsl(271 91% 76%)"
16200
+ }
16201
+ },
16202
+ spacing: lightTheme.spacing,
16203
+ borderRadius: liquidGlassLightTheme.borderRadius,
16204
+ fontSize: lightTheme.fontSize,
16205
+ fontWeight: lightTheme.fontWeight,
16206
+ shadows: {
16207
+ sm: "0 1px 2px hsla(0 0% 0% / 0.35)",
16208
+ md: "0 10px 28px hsla(0 0% 0% / 0.35)",
16209
+ lg: "0 22px 52px hsla(0 0% 0% / 0.45)"
16210
+ },
16211
+ transitions: lightTheme.transitions
16212
+ };
16053
16213
  const darkTheme = {
16054
16214
  colors: {
16055
16215
  background: "hsl(222.2 84% 4.9%)",
@@ -16111,81 +16271,124 @@ const darkTheme = {
16111
16271
  };
16112
16272
  const defaultTheme$1 = lightTheme;
16113
16273
 
16274
+ function normalizeStoredTheme(raw) {
16275
+ if (raw === "dark") return "dark";
16276
+ if (raw === "liquidGlassDark") return "liquidGlassDark";
16277
+ if (raw === "liquidGlassLight") return "liquidGlassLight";
16278
+ /* Migrate legacy single “Liquid Glass” preset */ if (raw === "liquidGlass") return "liquidGlassLight";
16279
+ return "light";
16280
+ }
16281
+ function themeForMode(mode) {
16282
+ switch(mode){
16283
+ case "dark":
16284
+ return darkTheme;
16285
+ case "liquidGlassLight":
16286
+ return liquidGlassLightTheme;
16287
+ case "liquidGlassDark":
16288
+ return liquidGlassDarkTheme;
16289
+ default:
16290
+ return lightTheme;
16291
+ }
16292
+ }
16293
+ function themeToMode(theme) {
16294
+ if (theme === darkTheme) return "dark";
16295
+ if (theme === liquidGlassDarkTheme) return "liquidGlassDark";
16296
+ if (theme === liquidGlassLightTheme) return "liquidGlassLight";
16297
+ return "light";
16298
+ }
16114
16299
  const ThemeContext = /*#__PURE__*/ React.createContext(undefined);
16115
16300
  const ThemeProvider = ({ children, theme: propTheme })=>{
16116
- const [currentTheme, setCurrentTheme] = React.useState(()=>{
16117
- // If a theme prop is provided, use it immediately
16301
+ const [themeMode, setThemeModeState] = React.useState(()=>{
16118
16302
  if (propTheme) {
16119
- return propTheme;
16303
+ return themeToMode(propTheme);
16120
16304
  }
16121
- // Only check localStorage if no theme prop is provided
16122
- // Handle cases where localStorage might not be available (e.g., test environments)
16123
16305
  try {
16124
- const savedTheme = localStorage.getItem("theme");
16125
- if (savedTheme === "dark") {
16126
- return darkTheme;
16127
- }
16128
- } catch (e) {
16129
- // localStorage not available, fall back to light theme
16130
- // This can happen in test environments or when localStorage is disabled
16131
- }
16132
- return lightTheme;
16306
+ return normalizeStoredTheme(localStorage.getItem("theme"));
16307
+ } catch {
16308
+ /* localStorage unavailable */ }
16309
+ return "light";
16133
16310
  });
16134
- // Update theme when propTheme changes
16311
+ const currentTheme = React.useMemo(()=>themeForMode(themeMode), [
16312
+ themeMode
16313
+ ]);
16135
16314
  React.useEffect(()=>{
16136
16315
  if (propTheme) {
16137
- setCurrentTheme(propTheme);
16316
+ setThemeModeState(themeToMode(propTheme));
16138
16317
  }
16139
16318
  }, [
16140
16319
  propTheme
16141
16320
  ]);
16142
- // Sync html.dark class for GlobalStyles and other CSS that uses html.dark
16143
16321
  React.useEffect(()=>{
16144
- const isDark = currentTheme === darkTheme;
16145
16322
  try {
16146
- if (isDark) {
16147
- document.documentElement.classList.add("dark");
16148
- } else {
16149
- document.documentElement.classList.remove("dark");
16150
- }
16151
- } catch (e) {
16152
- // document might not be available (e.g. SSR)
16153
- }
16323
+ const isClassicDark = themeMode === "dark";
16324
+ const isGlassLight = themeMode === "liquidGlassLight";
16325
+ const isGlassDark = themeMode === "liquidGlassDark";
16326
+ document.documentElement.classList.toggle("dark", isClassicDark);
16327
+ document.documentElement.classList.toggle("liquid-glass-light", isGlassLight);
16328
+ document.documentElement.classList.toggle("liquid-glass-dark", isGlassDark);
16329
+ /* Remove legacy class if present */ document.documentElement.classList.remove("liquid-glass");
16330
+ document.documentElement.dataset.theme = isClassicDark ? "dark" : isGlassLight ? "liquid-glass-light" : isGlassDark ? "liquid-glass-dark" : "light";
16331
+ } catch {
16332
+ /* document unavailable */ }
16333
+ }, [
16334
+ themeMode
16335
+ ]);
16336
+ React.useEffect(()=>{
16337
+ if (propTheme) return;
16338
+ try {
16339
+ localStorage.setItem("theme", themeMode);
16340
+ } catch {
16341
+ /* ignore */ }
16154
16342
  }, [
16155
- currentTheme
16343
+ themeMode,
16344
+ propTheme
16156
16345
  ]);
16157
- // Only listen for storage events if no theme prop is provided
16158
16346
  React.useEffect(()=>{
16159
16347
  if (propTheme) {
16160
- // If a theme prop is provided, don't listen for localStorage changes
16161
16348
  return;
16162
16349
  }
16163
16350
  const handleStorageChange = ()=>{
16164
16351
  try {
16165
- const savedTheme = localStorage.getItem("theme");
16166
- if (savedTheme === "dark") {
16167
- setCurrentTheme(darkTheme);
16168
- } else {
16169
- setCurrentTheme(lightTheme);
16170
- }
16171
- } catch (e) {
16172
- // localStorage not available, ignore storage changes
16173
- }
16352
+ setThemeModeState(normalizeStoredTheme(localStorage.getItem("theme")));
16353
+ } catch {
16354
+ /* ignore */ }
16174
16355
  };
16175
- // Listen for storage events (when localStorage changes in other tabs)
16176
16356
  window.addEventListener("storage", handleStorageChange);
16177
- return ()=>{
16178
- window.removeEventListener("storage", handleStorageChange);
16179
- };
16357
+ return ()=>window.removeEventListener("storage", handleStorageChange);
16180
16358
  }, [
16181
16359
  propTheme
16182
16360
  ]);
16361
+ const setThemeMode = React.useCallback((mode)=>{
16362
+ setThemeModeState(mode);
16363
+ }, []);
16364
+ const setTheme = React.useCallback((next)=>{
16365
+ setThemeModeState(themeToMode(next));
16366
+ }, []);
16367
+ const isLiquidGlassLight = themeMode === "liquidGlassLight";
16368
+ const isLiquidGlassDark = themeMode === "liquidGlassDark";
16369
+ const isLiquidGlass = isLiquidGlassLight || isLiquidGlassDark;
16370
+ const isClassicDarkTheme = themeMode === "dark";
16371
+ const isDarkMode = isClassicDarkTheme || isLiquidGlassDark;
16183
16372
  const value = React.useMemo(()=>({
16184
16373
  theme: currentTheme,
16185
- setTheme: setCurrentTheme,
16186
- isDarkMode: currentTheme === darkTheme
16374
+ themeMode,
16375
+ setTheme,
16376
+ setThemeMode,
16377
+ isDarkMode,
16378
+ isClassicDarkTheme,
16379
+ isLiquidGlass,
16380
+ isLiquidGlassLight,
16381
+ isLiquidGlassDark
16187
16382
  }), [
16188
- currentTheme
16383
+ currentTheme,
16384
+ themeMode,
16385
+ setTheme,
16386
+ setThemeMode,
16387
+ isDarkMode,
16388
+ isClassicDarkTheme,
16389
+ isLiquidGlass,
16390
+ isLiquidGlassLight,
16391
+ isLiquidGlassDark
16189
16392
  ]);
16190
16393
  return /*#__PURE__*/ React.createElement(ThemeContext.Provider, {
16191
16394
  value: value
@@ -16196,14 +16399,20 @@ const ThemeProvider = ({ children, theme: propTheme })=>{
16196
16399
  const useTheme$1 = ()=>{
16197
16400
  const context = React.useContext(ThemeContext);
16198
16401
  if (context === undefined) {
16199
- // Return a graceful fallback instead of throwing an error
16200
16402
  return {
16201
16403
  theme: lightTheme,
16404
+ themeMode: "light",
16202
16405
  setTheme: ()=>{
16203
- // No-op function when context is not available
16204
16406
  console.warn("Theme context not available. setTheme called but ignored.");
16205
16407
  },
16206
- isDarkMode: false // Default to light mode when no context
16408
+ setThemeMode: ()=>{
16409
+ console.warn("Theme context not available. setThemeMode called but ignored.");
16410
+ },
16411
+ isDarkMode: false,
16412
+ isClassicDarkTheme: false,
16413
+ isLiquidGlass: false,
16414
+ isLiquidGlassLight: false,
16415
+ isLiquidGlassDark: false
16207
16416
  };
16208
16417
  }
16209
16418
  return context;
@@ -16212,7 +16421,6 @@ const useThemeValue = ()=>{
16212
16421
  const { theme } = useTheme$1();
16213
16422
  return theme;
16214
16423
  };
16215
- // Helper hook for components that can accept a theme prop
16216
16424
  const useComponentTheme = (themeProp)=>{
16217
16425
  const { theme: contextTheme } = useTheme$1();
16218
16426
  return themeProp || contextTheme;
@@ -48618,7 +48826,7 @@ const CountUpLatency = ({ value })=>{
48618
48826
  };
48619
48827
  }
48620
48828
  const NodeDetailsDrawer = ({ isVisible, onClose, nodeData })=>{
48621
- const { theme } = useTheme$1();
48829
+ const { theme, isLiquidGlass } = useTheme$1();
48622
48830
  const [selectedRowIndex, setSelectedRowIndex] = React.useState(null);
48623
48831
  const [selectedLlmDetails, setSelectedLlmDetails] = React.useState(null);
48624
48832
  // Default to last row (total/aggregate) when drawer opens (only on first open)
@@ -48692,11 +48900,11 @@ const NodeDetailsDrawer = ({ isVisible, onClose, nodeData })=>{
48692
48900
  "data-testid": "node-details-drawer",
48693
48901
  styles: {
48694
48902
  body: {
48695
- background: theme.colors.background,
48903
+ background: isLiquidGlass ? theme.colors.popover : theme.colors.background,
48696
48904
  color: theme.colors.foreground
48697
48905
  },
48698
48906
  header: {
48699
- background: theme.colors.card,
48907
+ background: isLiquidGlass ? theme.colors.popover : theme.colors.card,
48700
48908
  borderBottom: `1px solid ${theme.colors.border}`
48701
48909
  }
48702
48910
  }
@@ -52057,8 +52265,7 @@ const SheetOverlay = /*#__PURE__*/ React__namespace.forwardRef(({ className, ...
52057
52265
  bottom: 0,
52058
52266
  left: 0,
52059
52267
  zIndex: 50,
52060
- backgroundColor: "hsla(var(--background), 0.8)",
52061
- backdropFilter: "blur(4px)"
52268
+ backgroundColor: "rgba(0, 0, 0, 0.45)"
52062
52269
  },
52063
52270
  className: className,
52064
52271
  ...props,
@@ -52070,7 +52277,7 @@ const getSheetStyles = (side = "right")=>{
52070
52277
  position: "fixed",
52071
52278
  zIndex: 50,
52072
52279
  gap: "16px",
52073
- backgroundColor: "hsl(var(--background))",
52280
+ backgroundColor: "var(--background)",
52074
52281
  padding: "24px",
52075
52282
  boxShadow: "0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)",
52076
52283
  transition: "all 0.3s ease-in-out"
@@ -52082,7 +52289,7 @@ const getSheetStyles = (side = "right")=>{
52082
52289
  left: 0,
52083
52290
  right: 0,
52084
52291
  top: 0,
52085
- borderBottom: "1px solid hsl(var(--border))"
52292
+ borderBottom: "1px solid var(--border)"
52086
52293
  };
52087
52294
  case "bottom":
52088
52295
  return {
@@ -52090,7 +52297,7 @@ const getSheetStyles = (side = "right")=>{
52090
52297
  left: 0,
52091
52298
  right: 0,
52092
52299
  bottom: 0,
52093
- borderTop: "1px solid hsl(var(--border))"
52300
+ borderTop: "1px solid var(--border)"
52094
52301
  };
52095
52302
  case "left":
52096
52303
  return {
@@ -52100,7 +52307,7 @@ const getSheetStyles = (side = "right")=>{
52100
52307
  left: 0,
52101
52308
  height: "100%",
52102
52309
  width: "75%",
52103
- borderRight: "1px solid hsl(var(--border))",
52310
+ borderRight: "1px solid var(--border)",
52104
52311
  maxWidth: "384px"
52105
52312
  };
52106
52313
  case "right":
@@ -52112,7 +52319,7 @@ const getSheetStyles = (side = "right")=>{
52112
52319
  right: 0,
52113
52320
  height: "100%",
52114
52321
  width: "75%",
52115
- borderLeft: "1px solid hsl(var(--border))",
52322
+ borderLeft: "1px solid var(--border)",
52116
52323
  maxWidth: "384px"
52117
52324
  };
52118
52325
  }
@@ -52173,7 +52380,7 @@ const SheetTitle = /*#__PURE__*/ React__namespace.forwardRef(({ className, ...pr
52173
52380
  style: {
52174
52381
  fontSize: "18px",
52175
52382
  fontWeight: 600,
52176
- color: "hsl(var(--foreground))"
52383
+ color: "var(--foreground)"
52177
52384
  },
52178
52385
  className: className,
52179
52386
  ...props
@@ -52183,7 +52390,7 @@ const SheetDescription = /*#__PURE__*/ React__namespace.forwardRef(({ className,
52183
52390
  ref: ref,
52184
52391
  style: {
52185
52392
  fontSize: "14px",
52186
- color: "hsl(var(--muted-foreground))"
52393
+ color: "var(--muted-foreground)"
52187
52394
  },
52188
52395
  className: className,
52189
52396
  ...props
@@ -116350,7 +116557,18 @@ const useEvaluationsMock = ()=>{
116350
116557
  return React.useContext(EvaluationsMockContext);
116351
116558
  };
116352
116559
 
116353
- const API_BASE = "/api";
116560
+ /**
116561
+ * Railtracks HTTP API prefix. Same-origin `/api` by default (browser + viz proxy).
116562
+ * Set `VITE_API_ORIGIN` (e.g. `http://localhost:3030`) when the UI is served elsewhere (Electron, etc.).
116563
+ */ function resolveApiBase() {
116564
+ const origin = undefined.VITE_API_ORIGIN?.trim().replace(/\/$/, "") ?? "";
116565
+ if (!origin) {
116566
+ return "/api";
116567
+ }
116568
+ return `${origin}/api`;
116569
+ }
116570
+ const API_BASE = resolveApiBase();
116571
+
116354
116572
  const useEvaluations = ()=>{
116355
116573
  const mockContext = useEvaluationsMock();
116356
116574
  const [evaluations, setEvaluations] = React.useState([]);
@@ -116964,13 +117182,70 @@ function metricNameOf(agg) {
116964
117182
  });
116965
117183
  }
116966
117184
 
116967
- const SHORT_ID_LENGTH = 8;
116968
- const shortenId = (id)=>id.length > SHORT_ID_LENGTH ? id.slice(0, SHORT_ID_LENGTH) : id;
116969
- const NodeRow = ({ node, metricName, onAgentNodeClick })=>{
117185
+ const NodeActions = ({ sessionId, nodeId, onAgentNodeClick, onOpenVisualizer })=>{
117186
+ const { theme } = useTheme$1();
117187
+ const baseStyle = {
117188
+ display: "inline-flex",
117189
+ alignItems: "center",
117190
+ gap: 5,
117191
+ padding: "3px 9px",
117192
+ borderRadius: 6,
117193
+ fontSize: 12,
117194
+ fontWeight: 500,
117195
+ cursor: "pointer",
117196
+ background: "transparent",
117197
+ color: theme.colors.primary,
117198
+ border: `1px solid ${theme.colors.primary}`,
117199
+ whiteSpace: "nowrap",
117200
+ lineHeight: 1.4
117201
+ };
117202
+ if (!onAgentNodeClick && !onOpenVisualizer) {
117203
+ // No handlers: fall back to surfacing the (shortened) id so context isn't lost.
117204
+ return /*#__PURE__*/ React.createElement(Tooltip, {
117205
+ title: nodeId
117206
+ }, /*#__PURE__*/ React.createElement("span", {
117207
+ style: {
117208
+ fontFamily: "monospace",
117209
+ fontSize: 12,
117210
+ color: theme.colors.mutedForeground
117211
+ }
117212
+ }, nodeId.length > 8 ? nodeId.slice(0, 8) : nodeId));
117213
+ }
117214
+ return /*#__PURE__*/ React.createElement("span", {
117215
+ style: {
117216
+ display: "inline-flex",
117217
+ alignItems: "center",
117218
+ gap: 8
117219
+ },
117220
+ onClick: (e)=>e.stopPropagation()
117221
+ }, onAgentNodeClick && /*#__PURE__*/ React.createElement(Tooltip, {
117222
+ title: `Open Flow Details · ${nodeId}`
117223
+ }, /*#__PURE__*/ React.createElement("button", {
117224
+ type: "button",
117225
+ style: baseStyle,
117226
+ onClick: ()=>onAgentNodeClick(sessionId, nodeId)
117227
+ }, /*#__PURE__*/ React.createElement(PanelRightOpen, {
117228
+ size: 13,
117229
+ style: {
117230
+ flexShrink: 0
117231
+ }
117232
+ }), "Flow Details")), onOpenVisualizer && /*#__PURE__*/ React.createElement(Tooltip, {
117233
+ title: `Open in Visualizer · ${nodeId}`
117234
+ }, /*#__PURE__*/ React.createElement("button", {
117235
+ type: "button",
117236
+ style: baseStyle,
117237
+ onClick: ()=>onOpenVisualizer(sessionId, nodeId)
117238
+ }, /*#__PURE__*/ React.createElement(ChartNetwork, {
117239
+ size: 13,
117240
+ style: {
117241
+ flexShrink: 0
117242
+ }
117243
+ }), "Visualizer")));
117244
+ };
117245
+
117246
+ const NodeRow = ({ node, metricName, onAgentNodeClick, onOpenVisualizer })=>{
116970
117247
  const { theme } = useTheme$1();
116971
117248
  const [showReasoning, setShowReasoning] = React.useState(false);
116972
- const clickable = !!onAgentNodeClick;
116973
- const open = ()=>onAgentNodeClick?.(node.sessionId, node.nodeId);
116974
117249
  return /*#__PURE__*/ React.createElement("div", {
116975
117250
  style: {
116976
117251
  display: "flex",
@@ -116984,38 +117259,27 @@ const NodeRow = ({ node, metricName, onAgentNodeClick })=>{
116984
117259
  gap: 10,
116985
117260
  flexWrap: "wrap"
116986
117261
  }
116987
- }, /*#__PURE__*/ React.createElement(Tooltip, {
116988
- title: clickable ? `Inspect run · ${node.nodeId}` : node.nodeId
116989
- }, /*#__PURE__*/ React.createElement("span", {
116990
- role: clickable ? "button" : undefined,
116991
- tabIndex: clickable ? 0 : undefined,
116992
- onClick: clickable ? open : undefined,
116993
- onKeyDown: clickable ? (e)=>{
116994
- if (e.key === "Enter" || e.key === " ") {
116995
- e.preventDefault();
116996
- open();
116997
- }
116998
- } : undefined,
117262
+ }, /*#__PURE__*/ React.createElement(Tag, {
116999
117263
  style: {
117264
+ margin: 0,
117000
117265
  display: "inline-flex",
117001
117266
  alignItems: "center",
117002
117267
  gap: 6,
117003
- padding: "3px 10px",
117004
- borderRadius: 6,
117005
- fontFamily: "monospace",
117006
- fontSize: 12,
117007
- fontWeight: 500,
117008
- background: theme.colors.tagLlminference?.bg ?? theme.colors.muted,
117009
- color: theme.colors.tagLlminference?.color ?? theme.colors.foreground,
117010
- border: `1px solid ${theme.colors.tagLlminference?.border ?? theme.colors.border}`,
117011
- cursor: clickable ? "pointer" : "default"
117268
+ background: theme.colors.tagToolLevel2?.bg ?? theme.colors.primary,
117269
+ color: theme.colors.tagToolLevel2?.color ?? theme.colors.primaryForeground,
117270
+ border: "none"
117012
117271
  }
117013
117272
  }, /*#__PURE__*/ React.createElement(Bot, {
117014
- size: 13,
117273
+ size: 12,
117015
117274
  style: {
117016
117275
  flexShrink: 0
117017
117276
  }
117018
- }), shortenId(node.nodeId))), node.reasoning && /*#__PURE__*/ React.createElement("button", {
117277
+ }), "Agent Node"), /*#__PURE__*/ React.createElement(NodeActions, {
117278
+ sessionId: node.sessionId,
117279
+ nodeId: node.nodeId,
117280
+ onAgentNodeClick: onAgentNodeClick,
117281
+ onOpenVisualizer: onOpenVisualizer
117282
+ }), node.reasoning && /*#__PURE__*/ React.createElement("button", {
117019
117283
  type: "button",
117020
117284
  onClick: ()=>setShowReasoning((s)=>!s),
117021
117285
  style: {
@@ -117082,7 +117346,7 @@ const LabelPanelHeader = ({ label })=>{
117082
117346
  }
117083
117347
  }, label.count, " ", label.count === 1 ? "node" : "nodes"));
117084
117348
  };
117085
- const MetricCard = ({ metric, onAgentNodeClick })=>{
117349
+ const MetricCard = ({ metric, onAgentNodeClick, onOpenVisualizer })=>{
117086
117350
  const { theme } = useTheme$1();
117087
117351
  const items = metric.labels.map((label)=>({
117088
117352
  key: label.labelName,
@@ -117106,7 +117370,8 @@ const MetricCard = ({ metric, onAgentNodeClick })=>{
117106
117370
  key: node.nodeId,
117107
117371
  node: node,
117108
117372
  metricName: metric.metricName,
117109
- onAgentNodeClick: onAgentNodeClick
117373
+ onAgentNodeClick: onAgentNodeClick,
117374
+ onOpenVisualizer: onOpenVisualizer
117110
117375
  })))
117111
117376
  }));
117112
117377
  return /*#__PURE__*/ React.createElement("div", {
@@ -117216,7 +117481,7 @@ const Meta = ({ label, value })=>{
117216
117481
  }
117217
117482
  }, value ?? "—"));
117218
117483
  };
117219
- const JudgeAggregateView = ({ metrics, onAgentNodeClick })=>{
117484
+ const JudgeAggregateView = ({ metrics, onAgentNodeClick, onOpenVisualizer })=>{
117220
117485
  const { theme } = useTheme$1();
117221
117486
  if (!metrics.length) {
117222
117487
  return /*#__PURE__*/ React.createElement("div", {
@@ -117248,7 +117513,8 @@ const JudgeAggregateView = ({ metrics, onAgentNodeClick })=>{
117248
117513
  }, metrics.map((metric)=>/*#__PURE__*/ React.createElement(MetricCard, {
117249
117514
  key: metric.key,
117250
117515
  metric: metric,
117251
- onAgentNodeClick: onAgentNodeClick
117516
+ onAgentNodeClick: onAgentNodeClick,
117517
+ onOpenVisualizer: onOpenVisualizer
117252
117518
  }))));
117253
117519
  };
117254
117520
 
@@ -117300,7 +117566,7 @@ const DEFAULT_TITLES = {
117300
117566
  LLMInference: "LLM Inference Evaluator - Aggregate View",
117301
117567
  Judge: "Judge Evaluator - Aggregate View"
117302
117568
  };
117303
- const AggregateResultsTable = ({ rawResults = [], aggregateResults, agents, title, evaluatorName, onAgentNodeClick })=>{
117569
+ const AggregateResultsTable = ({ rawResults = [], aggregateResults, agents, title, evaluatorName, onAgentNodeClick, onOpenVisualizer })=>{
117304
117570
  const { theme } = useTheme$1();
117305
117571
  const [expandedRowKeys, setExpandedRowKeys] = React.useState([]);
117306
117572
  const { aggregateType, dataSource, llmIsTree, llmExpandableKeys } = React.useMemo(()=>{
@@ -117468,7 +117734,7 @@ const AggregateResultsTable = ({ rawResults = [], aggregateResults, agents, titl
117468
117734
  dataIndex: "name",
117469
117735
  key: "name",
117470
117736
  render: (name, row)=>{
117471
- const isClickable = row.level === 3 && row.agentNodeId && onAgentNodeClick;
117737
+ const showActions = row.level === 3 && row.agentNodeId && (onAgentNodeClick || onOpenVisualizer);
117472
117738
  return /*#__PURE__*/ React.createElement("span", {
117473
117739
  style: {
117474
117740
  display: "inline-flex",
@@ -117476,27 +117742,16 @@ const AggregateResultsTable = ({ rawResults = [], aggregateResults, agents, titl
117476
117742
  gap: 8,
117477
117743
  fontFamily: "monospace",
117478
117744
  fontSize: 13,
117479
- ...isClickable && {
117480
- cursor: "pointer",
117481
- color: theme.colors.primary
117482
- }
117483
- },
117484
- onClick: isClickable ? (e)=>{
117485
- e.stopPropagation();
117486
- onAgentNodeClick(row.sessionId, row.agentNodeId);
117487
- } : undefined,
117488
- onKeyDown: isClickable ? (e)=>{
117489
- if (e.key === "Enter" || e.key === " ") {
117490
- e.preventDefault();
117491
- e.stopPropagation();
117492
- onAgentNodeClick(row.sessionId, row.agentNodeId);
117493
- }
117494
- } : undefined,
117495
- role: isClickable ? "button" : undefined,
117496
- tabIndex: isClickable ? 0 : undefined
117745
+ flexWrap: "wrap"
117746
+ }
117497
117747
  }, /*#__PURE__*/ React.createElement(LLMTagForLevel, {
117498
117748
  level: row.level
117499
- }), name);
117749
+ }), showActions ? /*#__PURE__*/ React.createElement(NodeActions, {
117750
+ sessionId: row.sessionId,
117751
+ nodeId: row.agentNodeId,
117752
+ onAgentNodeClick: onAgentNodeClick,
117753
+ onOpenVisualizer: onOpenVisualizer
117754
+ }) : name);
117500
117755
  }
117501
117756
  },
117502
117757
  ...METRIC_COLUMNS.map(({ key, title, Icon })=>({
@@ -117683,7 +117938,8 @@ const AggregateResultsTable = ({ rawResults = [], aggregateResults, agents, titl
117683
117938
  if (aggregateType === "Judge") {
117684
117939
  return /*#__PURE__*/ React.createElement(JudgeAggregateView, {
117685
117940
  metrics: dataSource,
117686
- onAgentNodeClick: onAgentNodeClick
117941
+ onAgentNodeClick: onAgentNodeClick,
117942
+ onOpenVisualizer: onOpenVisualizer
117687
117943
  });
117688
117944
  }
117689
117945
  // ToolUse (tree table)
@@ -117752,7 +118008,7 @@ const AggregateResultsTable = ({ rawResults = [], aggregateResults, agents, titl
117752
118008
  dataIndex: "name",
117753
118009
  key: "name",
117754
118010
  render: (name, row)=>{
117755
- const isClickable = (row.level === 2 || row.level === 3) && row.nodeId && onAgentNodeClick;
118011
+ const showActions = (row.level === 2 || row.level === 3) && row.nodeId && (onAgentNodeClick || onOpenVisualizer);
117756
118012
  return /*#__PURE__*/ React.createElement("span", {
117757
118013
  style: {
117758
118014
  display: "inline-flex",
@@ -117760,27 +118016,16 @@ const AggregateResultsTable = ({ rawResults = [], aggregateResults, agents, titl
117760
118016
  gap: 8,
117761
118017
  fontFamily: "monospace",
117762
118018
  fontSize: 13,
117763
- ...isClickable && {
117764
- cursor: "pointer",
117765
- color: theme.colors.primary
117766
- }
117767
- },
117768
- onClick: isClickable ? (e)=>{
117769
- e.stopPropagation();
117770
- onAgentNodeClick(row.sessionId, row.nodeId);
117771
- } : undefined,
117772
- onKeyDown: isClickable ? (e)=>{
117773
- if (e.key === "Enter" || e.key === " ") {
117774
- e.preventDefault();
117775
- e.stopPropagation();
117776
- onAgentNodeClick(row.sessionId, row.nodeId);
117777
- }
117778
- } : undefined,
117779
- role: isClickable ? "button" : undefined,
117780
- tabIndex: isClickable ? 0 : undefined
118019
+ flexWrap: "wrap"
118020
+ }
117781
118021
  }, /*#__PURE__*/ React.createElement(TagForLevel, {
117782
118022
  level: row.level
117783
- }), name);
118023
+ }), showActions ? /*#__PURE__*/ React.createElement(NodeActions, {
118024
+ sessionId: row.sessionId,
118025
+ nodeId: row.nodeId,
118026
+ onAgentNodeClick: onAgentNodeClick,
118027
+ onOpenVisualizer: onOpenVisualizer
118028
+ }) : name);
117784
118029
  }
117785
118030
  },
117786
118031
  {
@@ -118098,7 +118343,7 @@ function isCategoricalMetric(def) {
118098
118343
  }, 0) ?? 0;
118099
118344
  }
118100
118345
 
118101
- const EvaluatorResult = ({ evaluation, evaluatorId, backHref, onAgentNodeClick })=>{
118346
+ const EvaluatorResult = ({ evaluation, evaluatorId, backHref, onAgentNodeClick, onOpenVisualizer })=>{
118102
118347
  const { theme } = useTheme$1();
118103
118348
  const labelColor = theme.colors.mutedForeground;
118104
118349
  const derived = evaluation ? deriveEvaluatorResultData(evaluation, evaluatorId) : null;
@@ -118241,7 +118486,8 @@ const EvaluatorResult = ({ evaluation, evaluatorId, backHref, onAgentNodeClick }
118241
118486
  aggregateResults: aggregateResults,
118242
118487
  agents: evaluation.agents,
118243
118488
  evaluatorName: evaluatorName,
118244
- onAgentNodeClick: onAgentNodeClick
118489
+ onAgentNodeClick: onAgentNodeClick,
118490
+ onOpenVisualizer: onOpenVisualizer
118245
118491
  }))));
118246
118492
  };
118247
118493
 
@@ -120096,6 +120342,166 @@ const GlobalStyles = ()=>{
120096
120342
  --ring: #6366f1;
120097
120343
  --radius: 0.5rem;
120098
120344
  }
120345
+
120346
+ html.liquid-glass-light {
120347
+ color: hsl(222 47% 11%);
120348
+ }
120349
+
120350
+ html.liquid-glass-light::before {
120351
+ content: "";
120352
+ position: fixed;
120353
+ inset: 0;
120354
+ z-index: -1;
120355
+ pointer-events: none;
120356
+ background:
120357
+ radial-gradient(120% 90% at 10% 10%, hsl(210 55% 92%) 0%, transparent 52%),
120358
+ radial-gradient(90% 70% at 90% 20%, hsl(220 45% 88%) 0%, transparent 45%),
120359
+ radial-gradient(70% 60% at 50% 100%, hsl(200 35% 88%) 0%, transparent 50%), hsl(210 30% 91%);
120360
+ }
120361
+
120362
+ html.liquid-glass-light body {
120363
+ background-color: hsl(210 30% 91%);
120364
+ color: hsl(222 47% 11%);
120365
+ }
120366
+
120367
+ html.liquid-glass-light .react-flow {
120368
+ contain: paint;
120369
+ }
120370
+
120371
+ html.liquid-glass-light .react-flow__edge-label {
120372
+ background: hsla(0 0% 100% / 0.92);
120373
+ border: 1px solid hsla(210 28% 72% / 0.55);
120374
+ color: hsl(222 47% 11%);
120375
+ }
120376
+
120377
+ html.liquid-glass-light .file-selector-refresh-btn {
120378
+ border: 1px solid hsla(210 28% 72% / 0.55);
120379
+ background-color: hsla(0 0% 100% / 0.88);
120380
+ color: hsl(222 47% 11%);
120381
+ }
120382
+
120383
+ html.liquid-glass-light .file-selector-refresh-btn:hover {
120384
+ background-color: hsla(0 0% 100% / 0.96);
120385
+ color: hsl(222 47% 14%);
120386
+ }
120387
+
120388
+ html.liquid-glass-light .ant-table-tbody > tr.evaluations-compare-diff-row > td {
120389
+ background-color: hsla(48 96% 53% / 0.22) !important;
120390
+ }
120391
+
120392
+ html.liquid-glass-light {
120393
+ --background: hsl(210 30% 91%);
120394
+ --foreground: hsl(222 47% 11%);
120395
+ --card: hsla(0 0% 100% / 0.88);
120396
+ --card-foreground: hsl(222 47% 11%);
120397
+ --popover: hsla(0 0% 100% / 0.94);
120398
+ --popover-foreground: hsl(222 47% 11%);
120399
+ --primary: hsl(211 92% 45%);
120400
+ --primary-foreground: hsl(210 40% 98%);
120401
+ --secondary: hsla(210 40% 98% / 0.45);
120402
+ --secondary-foreground: hsl(222 47% 18%);
120403
+ --muted: hsla(210 25% 98% / 0.35);
120404
+ --muted-foreground: hsl(215 16% 40%);
120405
+ --accent: hsla(210 60% 96% / 0.55);
120406
+ --accent-foreground: hsl(222 47% 18%);
120407
+ --destructive: hsl(0 72% 51%);
120408
+ --destructive-foreground: hsl(210 40% 98%);
120409
+ --border: hsla(210 28% 72% / 0.55);
120410
+ --input: hsla(210 28% 88% / 0.65);
120411
+ --ring: hsl(211 92% 45%);
120412
+ --radius: 0.75rem;
120413
+ }
120414
+
120415
+ html.liquid-glass-dark {
120416
+ color: hsl(210 36% 96%);
120417
+ }
120418
+
120419
+ html.liquid-glass-dark::before {
120420
+ content: "";
120421
+ position: fixed;
120422
+ inset: 0;
120423
+ z-index: -1;
120424
+ pointer-events: none;
120425
+ background:
120426
+ radial-gradient(130% 100% at 20% 0%, hsl(222 42% 14%) 0%, transparent 55%),
120427
+ radial-gradient(90% 80% at 95% 30%, hsl(232 38% 18%) 0%, transparent 45%),
120428
+ radial-gradient(80% 70% at 50% 100%, hsl(215 36% 12%) 0%, transparent 50%), hsl(222 28% 9%);
120429
+ }
120430
+
120431
+ html.liquid-glass-dark body {
120432
+ background-color: hsl(222 28% 9%);
120433
+ color: hsl(210 36% 96%);
120434
+ }
120435
+
120436
+ html.liquid-glass-dark .react-flow {
120437
+ contain: paint;
120438
+ }
120439
+
120440
+ html.liquid-glass-dark .react-flow__edge-label {
120441
+ background: hsla(222 22% 18% / 0.92);
120442
+ border: 1px solid hsla(215 22% 42% / 0.45);
120443
+ color: hsl(210 36% 96%);
120444
+ }
120445
+
120446
+ html.liquid-glass-dark .file-selector-refresh-btn {
120447
+ border: 1px solid hsla(215 22% 42% / 0.45);
120448
+ background-color: hsla(222 22% 14% / 0.88);
120449
+ color: hsl(210 36% 96%);
120450
+ }
120451
+
120452
+ html.liquid-glass-dark .file-selector-refresh-btn:hover {
120453
+ background-color: hsla(222 22% 18% / 0.96);
120454
+ color: hsl(210 40% 98%);
120455
+ }
120456
+
120457
+ html.liquid-glass-dark .ant-table-tbody > tr.evaluations-compare-diff-row > td {
120458
+ background-color: hsla(217 32% 28% / 0.55) !important;
120459
+ }
120460
+
120461
+ html.liquid-glass-dark {
120462
+ --background: hsl(222 28% 9%);
120463
+ --foreground: hsl(210 36% 96%);
120464
+ --card: hsla(222 22% 14% / 0.88);
120465
+ --card-foreground: hsl(210 36% 96%);
120466
+ --popover: hsla(222 24% 12% / 0.94);
120467
+ --popover-foreground: hsl(210 36% 96%);
120468
+ --primary: hsl(212 92% 62%);
120469
+ --primary-foreground: hsl(222 47% 8%);
120470
+ --secondary: hsla(217 28% 22% / 0.55);
120471
+ --secondary-foreground: hsl(210 36% 94%);
120472
+ --muted: hsla(217 22% 18% / 0.45);
120473
+ --muted-foreground: hsl(215 18% 72%);
120474
+ --accent: hsla(217 26% 22% / 0.55);
120475
+ --accent-foreground: hsl(210 36% 96%);
120476
+ --destructive: hsl(0 72% 58%);
120477
+ --destructive-foreground: hsl(210 40% 98%);
120478
+ --border: hsla(215 22% 42% / 0.45);
120479
+ --input: hsla(217 22% 22% / 0.65);
120480
+ --ring: hsl(212 92% 62%);
120481
+ --radius: 0.75rem;
120482
+ }
120483
+
120484
+ @media (prefers-reduced-transparency: reduce) {
120485
+ html.liquid-glass-light::before,
120486
+ html.liquid-glass-dark::before {
120487
+ display: none;
120488
+ }
120489
+
120490
+ html.liquid-glass-light body {
120491
+ background-color: hsl(210 30% 91%);
120492
+ }
120493
+
120494
+ html.liquid-glass-dark body {
120495
+ background-color: hsl(222 28% 9%);
120496
+ }
120497
+
120498
+ html.liquid-glass-light .react-flow__edge-label,
120499
+ html.liquid-glass-dark .react-flow__edge-label,
120500
+ html.liquid-glass-light .file-selector-refresh-btn,
120501
+ html.liquid-glass-dark .file-selector-refresh-btn {
120502
+ background-color: var(--card);
120503
+ }
120504
+ }
120099
120505
  `
120100
120506
  });
120101
120507
  };
@@ -120290,10 +120696,14 @@ exports.getStatusColor = getStatusColor;
120290
120696
  exports.isEvaluationDto = isEvaluationDto;
120291
120697
  exports.isPlainObject = isPlainObject;
120292
120698
  exports.lightTheme = lightTheme;
120699
+ exports.liquidGlassDarkTheme = liquidGlassDarkTheme;
120700
+ exports.liquidGlassLightTheme = liquidGlassLightTheme;
120293
120701
  exports.safeStyled = safeStyled;
120294
120702
  exports.safeThemeColor = safeThemeColor;
120295
120703
  exports.safeThemeSpacing = safeThemeSpacing;
120296
120704
  exports.safeThemeValue = safeThemeValue;
120705
+ exports.themeForMode = themeForMode;
120706
+ exports.themeToMode = themeToMode;
120297
120707
  exports.toTitleCase = toTitleCase;
120298
120708
  exports.transformEvaluation = transformEvaluation;
120299
120709
  exports.truncateText = truncateText;