@adoptai/genui-components 0.1.68 → 0.1.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/renderer.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var React45 = require('react');
4
+ var React46 = require('react');
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
6
  var dagre = require('@dagrejs/dagre');
7
7
  var reactDom = require('react-dom');
@@ -37,7 +37,7 @@ function _interopNamespace(e) {
37
37
  return Object.freeze(n);
38
38
  }
39
39
 
40
- var React45__default = /*#__PURE__*/_interopDefault(React45);
40
+ var React46__default = /*#__PURE__*/_interopDefault(React46);
41
41
  var dagre__default = /*#__PURE__*/_interopDefault(dagre);
42
42
  var XLSX__namespace = /*#__PURE__*/_interopNamespace(XLSX);
43
43
  var Papa__default = /*#__PURE__*/_interopDefault(Papa);
@@ -125,7 +125,7 @@ var init_theme = __esm({
125
125
  }
126
126
  });
127
127
  function useTheme() {
128
- return React45.useContext(GenUIThemeContext);
128
+ return React46.useContext(GenUIThemeContext);
129
129
  }
130
130
  var DEFAULT_TOKENS, GenUIThemeContext;
131
131
  var init_ThemeContext = __esm({
@@ -147,7 +147,7 @@ var init_ThemeContext = __esm({
147
147
  SECONDARY,
148
148
  CHART_PALETTE: [...CHART_PALETTE]
149
149
  };
150
- GenUIThemeContext = React45.createContext(DEFAULT_TOKENS);
150
+ GenUIThemeContext = React46.createContext(DEFAULT_TOKENS);
151
151
  }
152
152
  });
153
153
  function renderInline(text) {
@@ -883,11 +883,11 @@ async function getMermaid(t) {
883
883
  }
884
884
  function MermaidFallback({ diagram, title }) {
885
885
  const tokens = useTheme();
886
- const [svg, setSvg] = React45.useState("");
887
- const [err, setErr] = React45.useState(false);
888
- const [full, setFull] = React45.useState(false);
889
- const idRef = React45.useRef(0);
890
- React45.useEffect(() => {
886
+ const [svg, setSvg] = React46.useState("");
887
+ const [err, setErr] = React46.useState(false);
888
+ const [full, setFull] = React46.useState(false);
889
+ const idRef = React46.useRef(0);
890
+ React46.useEffect(() => {
891
891
  const id = ++renderSeq;
892
892
  idRef.current = id;
893
893
  setErr(false);
@@ -956,7 +956,7 @@ function FullscreenModalInner({ nodes, edges, title, onClose }) {
956
956
  ] }) });
957
957
  }
958
958
  function FullscreenModal({ nodes, edges, title, onClose }) {
959
- React45.useEffect(() => {
959
+ React46.useEffect(() => {
960
960
  const h = (e) => {
961
961
  if (e.key === "Escape") onClose();
962
962
  };
@@ -969,8 +969,8 @@ function FullscreenModal({ nodes, edges, title, onClose }) {
969
969
  );
970
970
  }
971
971
  function usePrefersReducedMotion() {
972
- const [reduced, setReduced] = React45.useState(false);
973
- React45.useEffect(() => {
972
+ const [reduced, setReduced] = React46.useState(false);
973
+ React46.useEffect(() => {
974
974
  var _a;
975
975
  if (typeof matchMedia === "undefined") return;
976
976
  const mq = matchMedia("(prefers-reduced-motion: reduce)");
@@ -1014,9 +1014,9 @@ function topoOrder(nodeIds, edges) {
1014
1014
  }
1015
1015
  function useAutoplay(order, enabled) {
1016
1016
  const reduced = usePrefersReducedMotion();
1017
- const [step, setStep] = React45.useState(0);
1017
+ const [step, setStep] = React46.useState(0);
1018
1018
  const key = order.join("|");
1019
- React45.useEffect(() => {
1019
+ React46.useEffect(() => {
1020
1020
  if (!enabled || reduced || order.length === 0) {
1021
1021
  setStep(0);
1022
1022
  return;
@@ -1038,7 +1038,7 @@ function useAutoplay(order, enabled) {
1038
1038
  timer = setTimeout(tick, 850);
1039
1039
  return () => clearTimeout(timer);
1040
1040
  }, [enabled, reduced, key]);
1041
- return React45.useMemo(() => {
1041
+ return React46.useMemo(() => {
1042
1042
  const m = {};
1043
1043
  order.forEach((id, i) => {
1044
1044
  m[id] = i < step ? "done" : i === step ? "active" : "pending";
@@ -1060,13 +1060,13 @@ function resolveStates(nodes, nodeStates) {
1060
1060
  }
1061
1061
  function Inner({ diagram, title, autoplay, nodeStates }) {
1062
1062
  const tokens = useTheme();
1063
- const [full, setFull] = React45.useState(false);
1064
- const [focused, setFocused] = React45.useState(false);
1065
- const [boxW, setBoxW] = React45.useState(640);
1066
- const containerRef = React45.useRef(null);
1067
- const parsed = React45.useMemo(() => parseMermaidFlow(diagram), [diagram]);
1068
- const layout = React45.useMemo(() => parsed ? computeLayout(parsed) : null, [parsed]);
1069
- const themedEdges = React45.useMemo(
1063
+ const [full, setFull] = React46.useState(false);
1064
+ const [focused, setFocused] = React46.useState(false);
1065
+ const [boxW, setBoxW] = React46.useState(640);
1066
+ const containerRef = React46.useRef(null);
1067
+ const parsed = React46.useMemo(() => parseMermaidFlow(diagram), [diagram]);
1068
+ const layout = React46.useMemo(() => parsed ? computeLayout(parsed) : null, [parsed]);
1069
+ const themedEdges = React46.useMemo(
1070
1070
  () => {
1071
1071
  var _a;
1072
1072
  return ((_a = layout == null ? void 0 : layout.edges) != null ? _a : []).map((e) => __spreadProps(__spreadValues({}, e), {
@@ -1078,7 +1078,7 @@ function Inner({ diagram, title, autoplay, nodeStates }) {
1078
1078
  },
1079
1079
  [layout, tokens.ACCENT, tokens.MUTED]
1080
1080
  );
1081
- const order = React45.useMemo(
1081
+ const order = React46.useMemo(
1082
1082
  () => {
1083
1083
  var _a, _b;
1084
1084
  return topoOrder(((_a = layout == null ? void 0 : layout.nodes) != null ? _a : []).map((n) => n.id), (_b = layout == null ? void 0 : layout.edges) != null ? _b : []);
@@ -1086,19 +1086,19 @@ function Inner({ diagram, title, autoplay, nodeStates }) {
1086
1086
  [layout]
1087
1087
  );
1088
1088
  const autoStatus = useAutoplay(order, !!autoplay);
1089
- const staticStatus = React45.useMemo(() => {
1089
+ const staticStatus = React46.useMemo(() => {
1090
1090
  var _a;
1091
1091
  return resolveStates((_a = layout == null ? void 0 : layout.nodes) != null ? _a : [], nodeStates);
1092
1092
  }, [layout, nodeStates]);
1093
1093
  const statusMap = autoplay ? autoStatus : staticStatus;
1094
- const displayNodes = React45.useMemo(
1094
+ const displayNodes = React46.useMemo(
1095
1095
  () => {
1096
1096
  var _a;
1097
1097
  return ((_a = layout == null ? void 0 : layout.nodes) != null ? _a : []).map((n) => __spreadProps(__spreadValues({}, n), { data: __spreadProps(__spreadValues({}, n.data), { status: statusMap[n.id] }) }));
1098
1098
  },
1099
1099
  [layout, statusMap]
1100
1100
  );
1101
- const displayEdges = React45.useMemo(
1101
+ const displayEdges = React46.useMemo(
1102
1102
  () => themedEdges.map((e) => {
1103
1103
  const ss = statusMap[e.source];
1104
1104
  const ts = statusMap[e.target];
@@ -1118,13 +1118,13 @@ function Inner({ diagram, title, autoplay, nodeStates }) {
1118
1118
  const [nodes, setNodes, onNC] = react.useNodesState(displayNodes);
1119
1119
  const [edges, setEdges, onEC] = react.useEdgesState(displayEdges);
1120
1120
  const rf = react.useReactFlow();
1121
- React45.useEffect(() => {
1121
+ React46.useEffect(() => {
1122
1122
  setNodes(displayNodes);
1123
1123
  }, [displayNodes, setNodes]);
1124
- React45.useEffect(() => {
1124
+ React46.useEffect(() => {
1125
1125
  setEdges(displayEdges);
1126
1126
  }, [displayEdges, setEdges]);
1127
- React45.useEffect(() => {
1127
+ React46.useEffect(() => {
1128
1128
  const id = requestAnimationFrame(() => {
1129
1129
  try {
1130
1130
  rf.fitView({ padding: 0.1 });
@@ -1133,14 +1133,14 @@ function Inner({ diagram, title, autoplay, nodeStates }) {
1133
1133
  });
1134
1134
  return () => cancelAnimationFrame(id);
1135
1135
  }, [layout, rf]);
1136
- const handleClickOutside = React45.useCallback((e) => {
1136
+ const handleClickOutside = React46.useCallback((e) => {
1137
1137
  if (containerRef.current && !containerRef.current.contains(e.target)) setFocused(false);
1138
1138
  }, []);
1139
- React45.useEffect(() => {
1139
+ React46.useEffect(() => {
1140
1140
  document.addEventListener("mousedown", handleClickOutside);
1141
1141
  return () => document.removeEventListener("mousedown", handleClickOutside);
1142
1142
  }, [handleClickOutside]);
1143
- React45.useEffect(() => {
1143
+ React46.useEffect(() => {
1144
1144
  const el = containerRef.current;
1145
1145
  if (!el) return;
1146
1146
  let raf = 0;
@@ -1327,8 +1327,8 @@ function probePdfWorker() {
1327
1327
  return probe;
1328
1328
  }
1329
1329
  function usePdfWorkerReady(enabled) {
1330
- const [ready, setReady] = React45.useState(null);
1331
- React45.useEffect(() => {
1330
+ const [ready, setReady] = React46.useState(null);
1331
+ React46.useEffect(() => {
1332
1332
  if (!enabled) return;
1333
1333
  let cancelled = false;
1334
1334
  probePdfWorker().then((ok) => {
@@ -1361,15 +1361,15 @@ __export(PdfViewer_exports, {
1361
1361
  });
1362
1362
  function PdfViewer({ url, base64, onLoadSuccess, onLoadError }) {
1363
1363
  const { BORDER: BORDER3, MUTED: MUTED2, SURFACE: SURFACE2 } = useTheme();
1364
- const [numPages, setNumPages] = React45.useState(0);
1365
- const [currentPage, setCurrentPage] = React45.useState(1);
1366
- const [loading, setLoading] = React45.useState(true);
1367
- const handleLoad = React45.useCallback(({ numPages: n }) => {
1364
+ const [numPages, setNumPages] = React46.useState(0);
1365
+ const [currentPage, setCurrentPage] = React46.useState(1);
1366
+ const [loading, setLoading] = React46.useState(true);
1367
+ const handleLoad = React46.useCallback(({ numPages: n }) => {
1368
1368
  setNumPages(n);
1369
1369
  setLoading(false);
1370
1370
  onLoadSuccess == null ? void 0 : onLoadSuccess(n);
1371
1371
  }, [onLoadSuccess]);
1372
- React45.useEffect(() => {
1372
+ React46.useEffect(() => {
1373
1373
  if (numPages <= 1) return;
1374
1374
  const handler = (e) => {
1375
1375
  var _a;
@@ -1477,13 +1477,13 @@ __export(ExcelViewer_exports, {
1477
1477
  });
1478
1478
  function ExcelViewer({ url, base64, onLoadSuccess }) {
1479
1479
  const { BORDER: BORDER3, MUTED: MUTED2, PAPER: PAPER2, SURFACE: SURFACE2 } = useTheme();
1480
- const [sheetNames, setSheetNames] = React45.useState([]);
1481
- const [activeSheet, setActiveSheet] = React45.useState(0);
1482
- const [data, setData] = React45.useState([]);
1483
- const [loading, setLoading] = React45.useState(true);
1484
- const [error, setError] = React45.useState(null);
1485
- const wbRef = React45.useRef(null);
1486
- React45.useEffect(() => {
1480
+ const [sheetNames, setSheetNames] = React46.useState([]);
1481
+ const [activeSheet, setActiveSheet] = React46.useState(0);
1482
+ const [data, setData] = React46.useState([]);
1483
+ const [loading, setLoading] = React46.useState(true);
1484
+ const [error, setError] = React46.useState(null);
1485
+ const wbRef = React46.useRef(null);
1486
+ React46.useEffect(() => {
1487
1487
  let cancelled = false;
1488
1488
  setLoading(true);
1489
1489
  setError(null);
@@ -1541,7 +1541,7 @@ function ExcelViewer({ url, base64, onLoadSuccess }) {
1541
1541
  const rows = XLSX__namespace.utils.sheet_to_json(wbRef.current.Sheets[wbRef.current.SheetNames[idx]], { header: 1 });
1542
1542
  setData(rows);
1543
1543
  };
1544
- React45.useEffect(() => {
1544
+ React46.useEffect(() => {
1545
1545
  if (sheetNames.length <= 1) return;
1546
1546
  const handler = (e) => {
1547
1547
  var _a;
@@ -1667,10 +1667,10 @@ __export(CsvViewer_exports, {
1667
1667
  });
1668
1668
  function CsvViewer({ url, base64, delimiter, maxRows }) {
1669
1669
  const { BORDER: BORDER3, MUTED: MUTED2, PAPER: PAPER2 } = useTheme();
1670
- const [rows, setRows] = React45.useState([]);
1671
- const [loading, setLoading] = React45.useState(true);
1672
- const [error, setError] = React45.useState(null);
1673
- React45.useEffect(() => {
1670
+ const [rows, setRows] = React46.useState([]);
1671
+ const [loading, setLoading] = React46.useState(true);
1672
+ const [error, setError] = React46.useState(null);
1673
+ React46.useEffect(() => {
1674
1674
  let cancelled = false;
1675
1675
  setLoading(true);
1676
1676
  setError(null);
@@ -1789,10 +1789,10 @@ __export(TextViewer_exports, {
1789
1789
  });
1790
1790
  function TextViewer({ url, base64, markdown = false, maxLines }) {
1791
1791
  const { MUTED: MUTED2 } = useTheme();
1792
- const [text, setText] = React45.useState("");
1793
- const [loading, setLoading] = React45.useState(true);
1794
- const [error, setError] = React45.useState(null);
1795
- React45.useEffect(() => {
1792
+ const [text, setText] = React46.useState("");
1793
+ const [loading, setLoading] = React46.useState(true);
1794
+ const [error, setError] = React46.useState(null);
1795
+ React46.useEffect(() => {
1796
1796
  let cancelled = false;
1797
1797
  setLoading(true);
1798
1798
  setError(null);
@@ -1890,10 +1890,10 @@ function sanitize(html) {
1890
1890
  }
1891
1891
  function DocxViewer({ url, base64 }) {
1892
1892
  const { MUTED: MUTED2, BORDER: BORDER3, SURFACE: SURFACE2 } = useTheme();
1893
- const [html, setHtml] = React45.useState("");
1894
- const [loading, setLoading] = React45.useState(true);
1895
- const [error, setError] = React45.useState(null);
1896
- React45.useEffect(() => {
1893
+ const [html, setHtml] = React46.useState("");
1894
+ const [loading, setLoading] = React46.useState(true);
1895
+ const [error, setError] = React46.useState(null);
1896
+ React46.useEffect(() => {
1897
1897
  let cancelled = false;
1898
1898
  setLoading(true);
1899
1899
  setError(null);
@@ -1972,6 +1972,89 @@ var init_DocxViewer = __esm({
1972
1972
  init_decode();
1973
1973
  }
1974
1974
  });
1975
+
1976
+ // src/shared/viewers/HtmlViewer.tsx
1977
+ var HtmlViewer_exports = {};
1978
+ __export(HtmlViewer_exports, {
1979
+ HtmlViewer: () => HtmlViewer
1980
+ });
1981
+ function HtmlViewer({ url, base64, height = 480 }) {
1982
+ const { MUTED: MUTED2 } = useTheme();
1983
+ const [html, setHtml] = React46.useState("");
1984
+ const [loading, setLoading] = React46.useState(true);
1985
+ const [error, setError] = React46.useState(null);
1986
+ React46.useEffect(() => {
1987
+ let cancelled = false;
1988
+ setLoading(true);
1989
+ setError(null);
1990
+ if (base64) {
1991
+ try {
1992
+ if (!cancelled) {
1993
+ setHtml(base64ToText(base64));
1994
+ setLoading(false);
1995
+ }
1996
+ } catch (e) {
1997
+ if (!cancelled) {
1998
+ setError(e instanceof Error ? e.message : "Failed to decode HTML");
1999
+ setLoading(false);
2000
+ }
2001
+ }
2002
+ return () => {
2003
+ cancelled = true;
2004
+ };
2005
+ }
2006
+ if (!url) {
2007
+ setError("No file source provided");
2008
+ setLoading(false);
2009
+ return () => {
2010
+ cancelled = true;
2011
+ };
2012
+ }
2013
+ fetch(url).then((r) => {
2014
+ if (!r.ok) throw new Error(`Failed to fetch: ${r.status}`);
2015
+ return r.text();
2016
+ }).then((t) => {
2017
+ if (cancelled) return;
2018
+ setHtml(t);
2019
+ setLoading(false);
2020
+ }).catch((e) => {
2021
+ if (cancelled) return;
2022
+ setError(e.message);
2023
+ setLoading(false);
2024
+ });
2025
+ return () => {
2026
+ cancelled = true;
2027
+ };
2028
+ }, [url, base64]);
2029
+ if (loading) {
2030
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { padding: "24px", color: MUTED2, fontSize: "13px", textAlign: "center" }, children: "Loading\u2026" });
2031
+ }
2032
+ if (error) {
2033
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { padding: "24px", color: "#dc2626", fontSize: "13px", textAlign: "center" }, children: error });
2034
+ }
2035
+ return /* @__PURE__ */ jsxRuntime.jsx(
2036
+ "iframe",
2037
+ {
2038
+ title: "HTML preview",
2039
+ sandbox: "",
2040
+ srcDoc: html,
2041
+ style: {
2042
+ width: "100%",
2043
+ height: `${height}px`,
2044
+ border: "none",
2045
+ background: "white",
2046
+ display: "block"
2047
+ }
2048
+ }
2049
+ );
2050
+ }
2051
+ var init_HtmlViewer = __esm({
2052
+ "src/shared/viewers/HtmlViewer.tsx"() {
2053
+ "use client";
2054
+ init_ThemeContext();
2055
+ init_decode();
2056
+ }
2057
+ });
1975
2058
  var dataTableSchema = zod.z.object({
1976
2059
  type: zod.z.literal("data-table"),
1977
2060
  title: zod.z.string().optional(),
@@ -6122,16 +6205,16 @@ var DOT_COLOR = "#aaaaaa";
6122
6205
  var DOT_HOVER = "#555555";
6123
6206
  function ComponentActions({ children, onDownloadCSV, columnConfig, filename = "component" }) {
6124
6207
  const { BORDER: BORDER3, MUTED: MUTED2, SURFACE: SURFACE2, SURFACE_MUTED: SURFACE_MUTED2 } = useTheme();
6125
- const [open, setOpen] = React45.useState(false);
6126
- const [view, setView] = React45.useState("main");
6127
- const contentRef = React45.useRef(null);
6128
- const menuRef = React45.useRef(null);
6129
- const btnRef = React45.useRef(null);
6130
- const close = React45.useCallback(() => {
6208
+ const [open, setOpen] = React46.useState(false);
6209
+ const [view, setView] = React46.useState("main");
6210
+ const contentRef = React46.useRef(null);
6211
+ const menuRef = React46.useRef(null);
6212
+ const btnRef = React46.useRef(null);
6213
+ const close = React46.useCallback(() => {
6131
6214
  setOpen(false);
6132
6215
  setView("main");
6133
6216
  }, []);
6134
- React45.useEffect(() => {
6217
+ React46.useEffect(() => {
6135
6218
  if (!open) return;
6136
6219
  const handler = (e) => {
6137
6220
  var _a, _b;
@@ -6142,7 +6225,7 @@ function ComponentActions({ children, onDownloadCSV, columnConfig, filename = "c
6142
6225
  document.addEventListener("mousedown", handler);
6143
6226
  return () => document.removeEventListener("mousedown", handler);
6144
6227
  }, [open, close]);
6145
- const handleDownloadPNG = React45.useCallback(async () => {
6228
+ const handleDownloadPNG = React46.useCallback(async () => {
6146
6229
  if (!contentRef.current) return;
6147
6230
  try {
6148
6231
  const url = await htmlToImage.toPng(contentRef.current, { backgroundColor: "white", pixelRatio: 2 });
@@ -6154,7 +6237,7 @@ function ComponentActions({ children, onDownloadCSV, columnConfig, filename = "c
6154
6237
  }
6155
6238
  close();
6156
6239
  }, [filename, close]);
6157
- const handleCSV = React45.useCallback(() => {
6240
+ const handleCSV = React46.useCallback(() => {
6158
6241
  onDownloadCSV == null ? void 0 : onDownloadCSV();
6159
6242
  close();
6160
6243
  }, [onDownloadCSV, close]);
@@ -6267,12 +6350,12 @@ function MenuButton({ label, onClick }) {
6267
6350
  );
6268
6351
  }
6269
6352
  function useColumnVisibility(columns) {
6270
- const [hidden, setHidden] = React45.useState(/* @__PURE__ */ new Set());
6271
- const visibleColumns = React45.useMemo(
6353
+ const [hidden, setHidden] = React46.useState(/* @__PURE__ */ new Set());
6354
+ const visibleColumns = React46.useMemo(
6272
6355
  () => columns.filter((c) => !hidden.has(c.key)),
6273
6356
  [columns, hidden]
6274
6357
  );
6275
- const toggle = React45.useCallback((key) => {
6358
+ const toggle = React46.useCallback((key) => {
6276
6359
  setHidden((prev) => {
6277
6360
  const next = new Set(prev);
6278
6361
  if (next.has(key)) next.delete(key);
@@ -6280,8 +6363,8 @@ function useColumnVisibility(columns) {
6280
6363
  return next;
6281
6364
  });
6282
6365
  }, []);
6283
- const showAll = React45.useCallback(() => setHidden(/* @__PURE__ */ new Set()), []);
6284
- const hideAll = React45.useCallback(
6366
+ const showAll = React46.useCallback(() => setHidden(/* @__PURE__ */ new Set()), []);
6367
+ const hideAll = React46.useCallback(
6285
6368
  () => setHidden(new Set(columns.map((c) => c.key))),
6286
6369
  [columns]
6287
6370
  );
@@ -6538,9 +6621,9 @@ function AlertResolver(p) {
6538
6621
  // src/composites/stat-grid/resolver.tsx
6539
6622
  init_Markdown();
6540
6623
  function FitText({ children, max = 22, min = 13, title, className, style }) {
6541
- const ref = React45.useRef(null);
6542
- const [size, setSize] = React45.useState(max);
6543
- React45.useLayoutEffect(() => {
6624
+ const ref = React46.useRef(null);
6625
+ const [size, setSize] = React46.useState(max);
6626
+ React46.useLayoutEffect(() => {
6544
6627
  const el = ref.current;
6545
6628
  if (!el) return void 0;
6546
6629
  const fit = () => {
@@ -6629,7 +6712,7 @@ init_ThemeContext();
6629
6712
  function TabsPanelResolver(p) {
6630
6713
  var _a;
6631
6714
  const { BORDER: BORDER3, MUTED: MUTED2, PAPER: PAPER2, SURFACE: SURFACE2, ACCENT: ACCENT2 } = useTheme();
6632
- const [activeIdx, setActiveIdx] = React45.useState(0);
6715
+ const [activeIdx, setActiveIdx] = React46.useState(0);
6633
6716
  const activeTab = p.tabs[activeIdx];
6634
6717
  return /* @__PURE__ */ jsxRuntime.jsx(ComponentActions, { filename: "tabs-panel", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { width: "100%", display: "flex", flexDirection: "column", gap: "0" }, children: [
6635
6718
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -6893,7 +6976,7 @@ var thStyle = (MUTED2, BORDER3, PAPER2) => ({
6893
6976
  function ScreenerTableResolver(p) {
6894
6977
  var _a, _b, _c, _d, _e, _f;
6895
6978
  const { ACCENT: ACCENT2, BORDER: BORDER3, BORDER_SOFT: BORDER_SOFT2, MUTED: MUTED2, PAPER: PAPER2, SURFACE: SURFACE2, SURFACE_MUTED: SURFACE_MUTED2 } = useTheme();
6896
- const [activeFilters, setActiveFilters] = React45.useState(new Set((_a = p.activeFilters) != null ? _a : []));
6979
+ const [activeFilters, setActiveFilters] = React46.useState(new Set((_a = p.activeFilters) != null ? _a : []));
6897
6980
  const { visibleColumns, hidden, toggle, showAll, hideAll, allColumns } = useColumnVisibility((_b = p.columns) != null ? _b : []);
6898
6981
  const toggleFilter = (f) => setActiveFilters((prev) => {
6899
6982
  const next = new Set(prev);
@@ -6963,7 +7046,7 @@ var th2 = (MUTED2, BORDER3, PAPER2) => ({
6963
7046
  function GroupRows({ group, columns, depth }) {
6964
7047
  var _a, _b;
6965
7048
  const { MUTED: MUTED2, PAPER: PAPER2, BORDER_SOFT: BORDER_SOFT2 } = useTheme();
6966
- const [open, setOpen] = React45.useState(true);
7049
+ const [open, setOpen] = React46.useState(true);
6967
7050
  const indent = depth * 14;
6968
7051
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
6969
7052
  /* @__PURE__ */ jsxRuntime.jsxs(
@@ -7068,7 +7151,7 @@ var dotColor = {
7068
7151
  function NewsFeedResolver(p) {
7069
7152
  var _a, _b;
7070
7153
  const { ACCENT: ACCENT2, MUTED: MUTED2, SURFACE: SURFACE2, SHADOW: SHADOW2 } = useTheme();
7071
- const [filter, setFilter] = React45.useState(null);
7154
+ const [filter, setFilter] = React46.useState(null);
7072
7155
  const sentiments = ["positive", "neutral", "negative"].filter(
7073
7156
  (s) => {
7074
7157
  var _a2;
@@ -7110,9 +7193,9 @@ function NewsFeedResolver(p) {
7110
7193
  ] }) });
7111
7194
  }
7112
7195
  function useSeriesToggle(seriesKeys) {
7113
- const [hidden, setHidden] = React45.useState(/* @__PURE__ */ new Set());
7114
- const isVisible = React45.useCallback((key) => !hidden.has(key), [hidden]);
7115
- const toggle = React45.useCallback((key) => {
7196
+ const [hidden, setHidden] = React46.useState(/* @__PURE__ */ new Set());
7197
+ const isVisible = React46.useCallback((key) => !hidden.has(key), [hidden]);
7198
+ const toggle = React46.useCallback((key) => {
7116
7199
  setHidden((prev) => {
7117
7200
  const next = new Set(prev);
7118
7201
  if (next.has(key)) next.delete(key);
@@ -7120,7 +7203,7 @@ function useSeriesToggle(seriesKeys) {
7120
7203
  return next;
7121
7204
  });
7122
7205
  }, []);
7123
- const showAll = React45.useCallback(() => setHidden(/* @__PURE__ */ new Set()), []);
7206
+ const showAll = React46.useCallback(() => setHidden(/* @__PURE__ */ new Set()), []);
7124
7207
  return { hidden, isVisible, toggle, showAll, allKeys: seriesKeys };
7125
7208
  }
7126
7209
 
@@ -7425,7 +7508,7 @@ function WaterfallChartResolver(p) {
7425
7508
  }
7426
7509
  init_ThemeContext();
7427
7510
  init_theme();
7428
- var FlowGraph2 = React45__default.default.lazy(
7511
+ var FlowGraph2 = React46__default.default.lazy(
7429
7512
  () => Promise.resolve().then(() => (init_FlowGraph(), FlowGraph_exports)).then((m) => ({ default: m.FlowGraph }))
7430
7513
  );
7431
7514
  function FlowCanvasRenderer({
@@ -7466,7 +7549,7 @@ function FlowCanvasRenderer({
7466
7549
  overflow: "hidden",
7467
7550
  background: SURFACE2,
7468
7551
  position: "relative"
7469
- }, diagram ? {} : { height: "320px" }), children: diagram ? /* @__PURE__ */ jsxRuntime.jsx(React45.Suspense, { fallback: null, children: /* @__PURE__ */ jsxRuntime.jsx(FlowGraph2, { diagram, title, autoplay, nodeStates }) }) : /* @__PURE__ */ jsxRuntime.jsx("div", { style: {
7552
+ }, diagram ? {} : { height: "320px" }), children: diagram ? /* @__PURE__ */ jsxRuntime.jsx(React46.Suspense, { fallback: null, children: /* @__PURE__ */ jsxRuntime.jsx(FlowGraph2, { diagram, title, autoplay, nodeStates }) }) : /* @__PURE__ */ jsxRuntime.jsx("div", { style: {
7470
7553
  position: "absolute",
7471
7554
  inset: 0,
7472
7555
  display: "flex",
@@ -7701,7 +7784,7 @@ function TrialBalanceResolver(p) {
7701
7784
  gDebit += a.debit;
7702
7785
  gCredit += a.credit;
7703
7786
  });
7704
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
7787
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
7705
7788
  /* @__PURE__ */ jsxRuntime.jsx("tr", { children: /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan: 4, style: {
7706
7789
  padding: "8px 12px",
7707
7790
  fontSize: "12px",
@@ -8239,7 +8322,7 @@ function ItemRow({ item }) {
8239
8322
  }
8240
8323
  function Section({ section }) {
8241
8324
  const { BORDER: BORDER3, MUTED: MUTED2, SURFACE: SURFACE2 } = useTheme();
8242
- const [open, setOpen] = React45.useState(true);
8325
+ const [open, setOpen] = React46.useState(true);
8243
8326
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
8244
8327
  /* @__PURE__ */ jsxRuntime.jsxs(
8245
8328
  "button",
@@ -8362,7 +8445,7 @@ function ReconciliationViewResolver(p) {
8362
8445
  const { BORDER: BORDER3, BORDER_SOFT: BORDER_SOFT2, MUTED: MUTED2, PAPER: PAPER2, ACCENT: ACCENT2, SURFACE: SURFACE2, SURFACE_MUTED: SURFACE_MUTED2 } = useTheme();
8363
8446
  const sourceA = (_a = p.sourceA) != null ? _a : { label: "Source A" };
8364
8447
  const sourceB = (_b = p.sourceB) != null ? _b : { label: "Source B" };
8365
- const [activeTab, setActiveTab] = React45.useState("matched");
8448
+ const [activeTab, setActiveTab] = React46.useState("matched");
8366
8449
  const balanceA = (_d = (_c = p.summary) == null ? void 0 : _c.balanceA) != null ? _d : 0;
8367
8450
  const balanceB = (_f = (_e = p.summary) == null ? void 0 : _e.balanceB) != null ? _f : 0;
8368
8451
  const difference = (_h = (_g = p.summary) == null ? void 0 : _g.difference) != null ? _h : balanceA - balanceB;
@@ -9008,7 +9091,7 @@ function ChangesView({ changes }) {
9008
9091
  function EventCard({ event }) {
9009
9092
  var _a;
9010
9093
  const { BORDER: BORDER3, MUTED: MUTED2, ACCENT: ACCENT2, SURFACE: SURFACE2 } = useTheme();
9011
- const [showChanges, setShowChanges] = React45.useState(false);
9094
+ const [showChanges, setShowChanges] = React46.useState(false);
9012
9095
  const ac = (_a = actionConfig[event.action]) != null ? _a : actionConfig.commented;
9013
9096
  const hasChanges = event.changes && event.changes.length > 0;
9014
9097
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", gap: "12px", position: "relative" }, children: [
@@ -9066,23 +9149,23 @@ function AuditTrailResolver(p) {
9066
9149
  }
9067
9150
  init_Markdown();
9068
9151
  function useFullscreen(ref) {
9069
- const [isFullscreen, setIsFullscreen] = React45.useState(false);
9070
- React45.useEffect(() => {
9152
+ const [isFullscreen, setIsFullscreen] = React46.useState(false);
9153
+ React46.useEffect(() => {
9071
9154
  const handler = () => {
9072
9155
  setIsFullscreen(!!document.fullscreenElement);
9073
9156
  };
9074
9157
  document.addEventListener("fullscreenchange", handler);
9075
9158
  return () => document.removeEventListener("fullscreenchange", handler);
9076
9159
  }, []);
9077
- const enter = React45.useCallback(() => {
9160
+ const enter = React46.useCallback(() => {
9078
9161
  var _a, _b;
9079
9162
  (_b = (_a = ref.current) == null ? void 0 : _a.requestFullscreen) == null ? void 0 : _b.call(_a);
9080
9163
  }, [ref]);
9081
- const exit = React45.useCallback(() => {
9164
+ const exit = React46.useCallback(() => {
9082
9165
  var _a;
9083
9166
  if (document.fullscreenElement) (_a = document.exitFullscreen) == null ? void 0 : _a.call(document);
9084
9167
  }, []);
9085
- const toggle = React45.useCallback(() => {
9168
+ const toggle = React46.useCallback(() => {
9086
9169
  if (isFullscreen) exit();
9087
9170
  else enter();
9088
9171
  }, [isFullscreen, enter, exit]);
@@ -9093,10 +9176,10 @@ function useFullscreen(ref) {
9093
9176
  init_theme();
9094
9177
  init_ThemeContext();
9095
9178
  init_pdfWorkerProbe();
9096
- var PdfViewer2 = React45__default.default.lazy(
9179
+ var PdfViewer2 = React46__default.default.lazy(
9097
9180
  () => Promise.resolve().then(() => (init_PdfViewer(), PdfViewer_exports)).then((m) => ({ default: m.PdfViewer }))
9098
9181
  );
9099
- var ExcelViewer2 = React45__default.default.lazy(
9182
+ var ExcelViewer2 = React46__default.default.lazy(
9100
9183
  () => Promise.resolve().then(() => (init_ExcelViewer(), ExcelViewer_exports)).then((m) => ({ default: m.ExcelViewer }))
9101
9184
  );
9102
9185
  var highlightColors = {
@@ -9147,8 +9230,8 @@ function DownloadIcon() {
9147
9230
  function DocumentPreviewResolver(p) {
9148
9231
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u;
9149
9232
  const { BORDER: BORDER3, MUTED: MUTED2, PAPER: PAPER2, ACCENT: ACCENT2, SURFACE: SURFACE2, SHADOW: SHADOW2 } = useTheme();
9150
- const [currentPage, setCurrentPage] = React45.useState(0);
9151
- const containerRef = React45.useRef(null);
9233
+ const [currentPage, setCurrentPage] = React46.useState(0);
9234
+ const containerRef = React46.useRef(null);
9152
9235
  const { isFullscreen, toggle } = useFullscreen(containerRef);
9153
9236
  const hasRealFile = !!(((_a = p.source) == null ? void 0 : _a.url) || ((_b = p.source) == null ? void 0 : _b.base64));
9154
9237
  const isPdf = p.documentType === "pdf";
@@ -9156,15 +9239,15 @@ function DocumentPreviewResolver(p) {
9156
9239
  const totalPages = ((_c = p.pages) != null ? _c : []).length;
9157
9240
  const page = p.pages[currentPage];
9158
9241
  const pageHighlights = ((_d = p.highlights) != null ? _d : []).filter((h) => h.pageIndex === currentPage);
9159
- const [pdfFailed, setPdfFailed] = React45.useState(false);
9242
+ const [pdfFailed, setPdfFailed] = React46.useState(false);
9160
9243
  const pdfWorkerReady = usePdfWorkerReady(hasRealFile && isPdf);
9161
9244
  const pdfReady = pdfFailed ? false : pdfWorkerReady;
9162
9245
  const showPdfViewer = hasRealFile && isPdf && pdfReady === true;
9163
9246
  const pdfPending = hasRealFile && isPdf && pdfReady === null;
9164
- const handlePdfLoad = React45.useCallback(() => {
9247
+ const handlePdfLoad = React46.useCallback(() => {
9165
9248
  }, []);
9166
- const handlePdfError = React45.useCallback(() => setPdfFailed(true), []);
9167
- const handleExcelLoad = React45.useCallback(() => {
9249
+ const handlePdfError = React46.useCallback(() => setPdfFailed(true), []);
9250
+ const handleExcelLoad = React46.useCallback(() => {
9168
9251
  }, []);
9169
9252
  return /* @__PURE__ */ jsxRuntime.jsx(ComponentActions, { filename: (_e = p.title) != null ? _e : "document-preview", children: /* @__PURE__ */ jsxRuntime.jsxs(
9170
9253
  "div",
@@ -9277,7 +9360,7 @@ function DocumentPreviewResolver(p) {
9277
9360
  display: "flex",
9278
9361
  flexDirection: "column"
9279
9362
  }, children: [
9280
- showPdfViewer ? /* @__PURE__ */ jsxRuntime.jsx(React45.Suspense, { fallback: null, children: /* @__PURE__ */ jsxRuntime.jsx(PdfViewer2, { url: (_q = p.source) == null ? void 0 : _q.url, base64: (_r = p.source) == null ? void 0 : _r.base64, onLoadSuccess: handlePdfLoad, onLoadError: handlePdfError }) }) : pdfPending ? /* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "flex", alignItems: "center", justifyContent: "center", height: "200px", color: MUTED2, fontSize: "13px" }, children: "Loading preview\u2026" }) : hasRealFile && isExcel ? /* @__PURE__ */ jsxRuntime.jsx(React45.Suspense, { fallback: null, children: /* @__PURE__ */ jsxRuntime.jsx(ExcelViewer2, { url: (_s = p.source) == null ? void 0 : _s.url, base64: (_t = p.source) == null ? void 0 : _t.base64, onLoadSuccess: handleExcelLoad }) }) : (page == null ? void 0 : page.imageUrl) ? /* @__PURE__ */ jsxRuntime.jsx("div", { style: { padding: "20px" }, children: /* @__PURE__ */ jsxRuntime.jsx("img", { src: page.imageUrl, alt: page.label, style: { maxWidth: "100%", borderRadius: "4px" } }) }) : (page == null ? void 0 : page.content) ? /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontFamily: "var(--font-sans, system-ui)", fontSize: "13px", color: "var(--foreground)", lineHeight: 1.6, margin: 0, padding: "20px" }, children: /* @__PURE__ */ jsxRuntime.jsx(Markdown, { content: page.content }) }) : /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: "center", height: "120px", color: MUTED2, fontSize: "13px" }, children: [
9363
+ showPdfViewer ? /* @__PURE__ */ jsxRuntime.jsx(React46.Suspense, { fallback: null, children: /* @__PURE__ */ jsxRuntime.jsx(PdfViewer2, { url: (_q = p.source) == null ? void 0 : _q.url, base64: (_r = p.source) == null ? void 0 : _r.base64, onLoadSuccess: handlePdfLoad, onLoadError: handlePdfError }) }) : pdfPending ? /* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "flex", alignItems: "center", justifyContent: "center", height: "200px", color: MUTED2, fontSize: "13px" }, children: "Loading preview\u2026" }) : hasRealFile && isExcel ? /* @__PURE__ */ jsxRuntime.jsx(React46.Suspense, { fallback: null, children: /* @__PURE__ */ jsxRuntime.jsx(ExcelViewer2, { url: (_s = p.source) == null ? void 0 : _s.url, base64: (_t = p.source) == null ? void 0 : _t.base64, onLoadSuccess: handleExcelLoad }) }) : (page == null ? void 0 : page.imageUrl) ? /* @__PURE__ */ jsxRuntime.jsx("div", { style: { padding: "20px" }, children: /* @__PURE__ */ jsxRuntime.jsx("img", { src: page.imageUrl, alt: page.label, style: { maxWidth: "100%", borderRadius: "4px" } }) }) : (page == null ? void 0 : page.content) ? /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontFamily: "var(--font-sans, system-ui)", fontSize: "13px", color: "var(--foreground)", lineHeight: 1.6, margin: 0, padding: "20px" }, children: /* @__PURE__ */ jsxRuntime.jsx(Markdown, { content: page.content }) }) : /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: "center", height: "120px", color: MUTED2, fontSize: "13px" }, children: [
9281
9364
  "No content available for ",
9282
9365
  (_u = page == null ? void 0 : page.label) != null ? _u : "this page"
9283
9366
  ] }),
@@ -9342,7 +9425,7 @@ function ConfidenceBar({ confidence, height = 6 }) {
9342
9425
  function StepCard({ step, isLast }) {
9343
9426
  var _a;
9344
9427
  const { ACCENT: ACCENT2, MUTED: MUTED2, BORDER: BORDER3, SURFACE_MUTED: SURFACE_MUTED2 } = useTheme();
9345
- const [expanded, setExpanded] = React45.useState(false);
9428
+ const [expanded, setExpanded] = React46.useState(false);
9346
9429
  const cfg = stepTypeConfig[step.stepType];
9347
9430
  const detail = (_a = step.detail) != null ? _a : "";
9348
9431
  const isLong = detail.length > 100;
@@ -9851,7 +9934,7 @@ function ExampleRow({ example }) {
9851
9934
  }
9852
9935
  function PartSection({ part, defaultOpen }) {
9853
9936
  const { BORDER: BORDER3, MUTED: MUTED2, SURFACE: SURFACE2 } = useTheme();
9854
- const [open, setOpen] = React45.useState(defaultOpen);
9937
+ const [open, setOpen] = React46.useState(defaultOpen);
9855
9938
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
9856
9939
  /* @__PURE__ */ jsxRuntime.jsxs(
9857
9940
  "button",
@@ -9981,7 +10064,7 @@ function EngagementPipelineResolver(p) {
9981
10064
  const defaultActive = phases.findIndex(
9982
10065
  (ph) => ph.status === "in-progress" || ph.status === "blocked"
9983
10066
  );
9984
- const [activeIdx, setActiveIdx] = React45.useState(defaultActive >= 0 ? defaultActive : 0);
10067
+ const [activeIdx, setActiveIdx] = React46.useState(defaultActive >= 0 ? defaultActive : 0);
9985
10068
  const activePhase = phases[activeIdx];
9986
10069
  return /* @__PURE__ */ jsxRuntime.jsx(ComponentActions, { filename: (_b = p.title) != null ? _b : "engagement-pipeline", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { width: "100%", display: "flex", flexDirection: "column", gap: "12px" }, children: [
9987
10070
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "4px" }, children: [
@@ -10065,7 +10148,7 @@ function EngagementPipelineResolver(p) {
10065
10148
  const color = (_a2 = statusColor2[phase.status]) != null ? _a2 : "#d6d3d1";
10066
10149
  const isCurrent = i === activeIdx;
10067
10150
  const size = isCurrent ? 28 : 20;
10068
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
10151
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
10069
10152
  i > 0 && /* @__PURE__ */ jsxRuntime.jsx(
10070
10153
  "div",
10071
10154
  {
@@ -10373,7 +10456,7 @@ function Avatar({ name, avatar, hovered }) {
10373
10456
  function EntityCardGridResolver(p) {
10374
10457
  var _a, _b;
10375
10458
  const { BORDER: BORDER3, MUTED: MUTED2, ACCENT: ACCENT2, SHADOW: SHADOW2 } = useTheme();
10376
- const [hoveredId, setHoveredId] = React45.useState(null);
10459
+ const [hoveredId, setHoveredId] = React46.useState(null);
10377
10460
  return /* @__PURE__ */ jsxRuntime.jsx(ComponentActions, { filename: (_a = p.title) != null ? _a : "entity-card-grid", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { width: "100%", display: "flex", flexDirection: "column", gap: "10px" }, children: [
10378
10461
  p.title && /* @__PURE__ */ jsxRuntime.jsx(
10379
10462
  "p",
@@ -10630,7 +10713,7 @@ function StepRow({ step }) {
10630
10713
  function JobTrackerResolver(p) {
10631
10714
  var _a, _b, _c, _d, _e, _f, _g;
10632
10715
  const { BORDER: BORDER3, MUTED: MUTED2, ACCENT: ACCENT2, PAPER: PAPER2, SURFACE: SURFACE2, SURFACE_MUTED: SURFACE_MUTED2, SHADOW: SHADOW2 } = useTheme();
10633
- const [stepsOpen, setStepsOpen] = React45.useState(true);
10716
+ const [stepsOpen, setStepsOpen] = React46.useState(true);
10634
10717
  const barColor = (_a = statusColors[p.status]) != null ? _a : MUTED2;
10635
10718
  const badge = (_b = statusBadgeConfig[p.status]) != null ? _b : statusBadgeConfig.queued;
10636
10719
  const progress = (_c = p.progress) != null ? _c : p.status === "completed" ? 100 : 0;
@@ -11073,7 +11156,7 @@ function CitationCard({
11073
11156
  }
11074
11157
  function FollowUpItem({ text }) {
11075
11158
  const { SECONDARY: SECONDARY2 } = useTheme();
11076
- const [hovered, setHovered] = React45.useState(false);
11159
+ const [hovered, setHovered] = React46.useState(false);
11077
11160
  return /* @__PURE__ */ jsxRuntime.jsxs(
11078
11161
  "span",
11079
11162
  {
@@ -11099,7 +11182,7 @@ function CitationMarker({
11099
11182
  onClick
11100
11183
  }) {
11101
11184
  const { SECONDARY: SECONDARY2 } = useTheme();
11102
- const [hovered, setHovered] = React45.useState(false);
11185
+ const [hovered, setHovered] = React46.useState(false);
11103
11186
  return /* @__PURE__ */ jsxRuntime.jsx(
11104
11187
  "sup",
11105
11188
  {
@@ -11128,7 +11211,7 @@ function CitationMarker({
11128
11211
  function CitedAnswerResolver(p) {
11129
11212
  var _a, _b, _c, _d, _e;
11130
11213
  const { BORDER: BORDER3, MUTED: MUTED2, ACCENT: ACCENT2, SECONDARY: SECONDARY2, SURFACE: SURFACE2, SHADOW: SHADOW2 } = useTheme();
11131
- const [expandedIds, setExpandedIds] = React45.useState(/* @__PURE__ */ new Set());
11214
+ const [expandedIds, setExpandedIds] = React46.useState(/* @__PURE__ */ new Set());
11132
11215
  const toggleCitation = (id) => {
11133
11216
  setExpandedIds((prev) => {
11134
11217
  const next = new Set(prev);
@@ -11433,7 +11516,7 @@ function TransactionFeedResolver(p) {
11433
11516
  var _a, _b, _c, _d, _e;
11434
11517
  const { BORDER: BORDER3, MUTED: MUTED2 } = useTheme();
11435
11518
  const currency = (_a = p.currency) != null ? _a : "USD";
11436
- const [hoveredIndex, setHoveredIndex] = React45.useState(null);
11519
+ const [hoveredIndex, setHoveredIndex] = React46.useState(null);
11437
11520
  const hasBalance = ((_b = p.transactions) != null ? _b : []).some((tx) => tx.balance != null);
11438
11521
  const totalInflows = p.transactions.filter((tx) => tx.amount > 0 && tx.status !== "reversed").reduce((sum, tx) => sum + tx.amount, 0);
11439
11522
  const totalOutflows = p.transactions.filter((tx) => tx.amount < 0 && tx.status !== "reversed").reduce((sum, tx) => sum + tx.amount, 0);
@@ -11591,7 +11674,7 @@ function formatDate2(dateStr) {
11591
11674
  function FileRow({ item }) {
11592
11675
  var _a;
11593
11676
  const { BORDER: BORDER3, MUTED: MUTED2, PAPER: PAPER2, SURFACE: SURFACE2, SECONDARY: SECONDARY2 } = useTheme();
11594
- const [hovered, setHovered] = React45.useState(false);
11677
+ const [hovered, setHovered] = React46.useState(false);
11595
11678
  const cfg = getDocConfig(item.docType);
11596
11679
  return /* @__PURE__ */ jsxRuntime.jsxs(
11597
11680
  "div",
@@ -11668,8 +11751,8 @@ function FileRow({ item }) {
11668
11751
  }
11669
11752
  function GroupSection({ groupName, items }) {
11670
11753
  const { BORDER: BORDER3, MUTED: MUTED2, SURFACE: SURFACE2, SURFACE_MUTED: SURFACE_MUTED2 } = useTheme();
11671
- const [open, setOpen] = React45.useState(true);
11672
- const [headerHovered, setHeaderHovered] = React45.useState(false);
11754
+ const [open, setOpen] = React46.useState(true);
11755
+ const [headerHovered, setHeaderHovered] = React46.useState(false);
11673
11756
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
11674
11757
  /* @__PURE__ */ jsxRuntime.jsxs(
11675
11758
  "button",
@@ -11785,7 +11868,7 @@ init_theme();
11785
11868
  var FAMILIES = [
11786
11869
  { exts: ["csv", "tsv", "xls", "xlsx", "numbers"], fg: SEMANTIC.success.color, bg: SEMANTIC.success.bg },
11787
11870
  { exts: ["pdf"], fg: SEMANTIC.error.color, bg: SEMANTIC.error.bg },
11788
- { exts: ["doc", "docx", "txt", "md", "rtf", "pages"], fg: SEMANTIC.info.color, bg: SEMANTIC.info.bg },
11871
+ { exts: ["doc", "docx", "txt", "md", "rtf", "pages", "html", "htm"], fg: SEMANTIC.info.color, bg: SEMANTIC.info.bg },
11789
11872
  { exts: ["json", "yaml", "yml", "xml", "toml"], fg: SEMANTIC.purple.color, bg: SEMANTIC.purple.bg },
11790
11873
  { exts: ["zip", "tar", "gz", "rar", "7z"], fg: SEMANTIC.warning.color, bg: SEMANTIC.warning.bg },
11791
11874
  { exts: ["png", "jpg", "jpeg", "gif", "svg", "webp", "bmp"], fg: SEMANTIC.info.color, bg: SEMANTIC.info.bg }
@@ -11812,7 +11895,9 @@ var PREVIEW_EXTS = {
11812
11895
  txt: "text",
11813
11896
  log: "text",
11814
11897
  text: "text",
11815
- docx: "docx"
11898
+ docx: "docx",
11899
+ html: "html",
11900
+ htm: "html"
11816
11901
  };
11817
11902
  function extOf(fileType, filename) {
11818
11903
  var _a;
@@ -11823,6 +11908,7 @@ function extOf(fileType, filename) {
11823
11908
  if (mime.includes("csv")) return "csv";
11824
11909
  if (mime.includes("markdown")) return "md";
11825
11910
  if (mime.includes("wordprocessing") || mime.includes("msword")) return "docx";
11911
+ if (mime.includes("html")) return "html";
11826
11912
  if (mime.startsWith("text/")) return "txt";
11827
11913
  } else if (fileType) {
11828
11914
  const t = fileType.toLowerCase().replace(/[^a-z0-9]/g, "");
@@ -11857,20 +11943,21 @@ function isExpirySoon(expiresAt) {
11857
11943
  // src/shared/viewers/PreviewHost.tsx
11858
11944
  init_ThemeContext();
11859
11945
  init_pdfWorkerProbe();
11860
- var PdfViewer3 = React45.lazy(
11946
+ var PdfViewer3 = React46.lazy(
11861
11947
  () => Promise.resolve().then(() => (init_PdfViewer(), PdfViewer_exports)).then((m) => ({ default: m.PdfViewer }))
11862
11948
  );
11863
- var ExcelViewer3 = React45.lazy(
11949
+ var ExcelViewer3 = React46.lazy(
11864
11950
  () => Promise.resolve().then(() => (init_ExcelViewer(), ExcelViewer_exports)).then((m) => ({ default: m.ExcelViewer }))
11865
11951
  );
11866
- var CsvViewer2 = React45.lazy(() => Promise.resolve().then(() => (init_CsvViewer(), CsvViewer_exports)).then((m) => ({ default: m.CsvViewer })));
11867
- var TextViewer2 = React45.lazy(() => Promise.resolve().then(() => (init_TextViewer(), TextViewer_exports)).then((m) => ({ default: m.TextViewer })));
11868
- var DocxViewer2 = React45.lazy(() => Promise.resolve().then(() => (init_DocxViewer(), DocxViewer_exports)).then((m) => ({ default: m.DocxViewer })));
11952
+ var CsvViewer2 = React46.lazy(() => Promise.resolve().then(() => (init_CsvViewer(), CsvViewer_exports)).then((m) => ({ default: m.CsvViewer })));
11953
+ var TextViewer2 = React46.lazy(() => Promise.resolve().then(() => (init_TextViewer(), TextViewer_exports)).then((m) => ({ default: m.TextViewer })));
11954
+ var DocxViewer2 = React46.lazy(() => Promise.resolve().then(() => (init_DocxViewer(), DocxViewer_exports)).then((m) => ({ default: m.DocxViewer })));
11955
+ var HtmlViewer2 = React46.lazy(() => Promise.resolve().then(() => (init_HtmlViewer(), HtmlViewer_exports)).then((m) => ({ default: m.HtmlViewer })));
11869
11956
  var PEEK_ROWS = 20;
11870
11957
  var PEEK_LINES = 40;
11871
11958
  function GatedPdfViewer({ source }) {
11872
11959
  const { MUTED: MUTED2 } = useTheme();
11873
- const [failed, setFailed] = React45.useState(false);
11960
+ const [failed, setFailed] = React46.useState(false);
11874
11961
  const workerReady = usePdfWorkerReady(true);
11875
11962
  const ready = failed ? false : workerReady;
11876
11963
  if (ready === null) {
@@ -11905,10 +11992,13 @@ function PreviewHost({ kind, source, mode = "full" }) {
11905
11992
  case "docx":
11906
11993
  viewer = /* @__PURE__ */ jsxRuntime.jsx(DocxViewer2, { url: source.url, base64: source.base64 });
11907
11994
  break;
11995
+ case "html":
11996
+ viewer = /* @__PURE__ */ jsxRuntime.jsx(HtmlViewer2, { url: source.url, base64: source.base64, height: peek ? 240 : 480 });
11997
+ break;
11908
11998
  default:
11909
11999
  return null;
11910
12000
  }
11911
- return /* @__PURE__ */ jsxRuntime.jsx(React45.Suspense, { fallback, children: viewer });
12001
+ return /* @__PURE__ */ jsxRuntime.jsx(React46.Suspense, { fallback, children: viewer });
11912
12002
  }
11913
12003
 
11914
12004
  // src/shared/PreviewModal.tsx
@@ -11924,7 +12014,7 @@ function PreviewModal({
11924
12014
  onDownload
11925
12015
  }) {
11926
12016
  const { BORDER: BORDER3, MUTED: MUTED2, ACCENT: ACCENT2, SURFACE: SURFACE2, FOREGROUND: FOREGROUND2, SCRIM: SCRIM2 } = useTheme();
11927
- React45.useEffect(() => {
12017
+ React46.useEffect(() => {
11928
12018
  if (!open) return;
11929
12019
  const onKey = (e) => {
11930
12020
  if (e.key === "Escape") onClose();
@@ -12101,17 +12191,17 @@ function FileCard({
12101
12191
  previewDisabled = false
12102
12192
  }) {
12103
12193
  const { BORDER: BORDER3, MUTED: MUTED2, ACCENT: ACCENT2, SURFACE: SURFACE2, SURFACE_MUTED: SURFACE_MUTED2, SHADOW: SHADOW2 } = useTheme();
12104
- const [cardHover, setCardHover] = React45.useState(false);
12105
- const [btnHover, setBtnHover] = React45.useState(false);
12106
- const [pvHover, setPvHover] = React45.useState(false);
12194
+ const [cardHover, setCardHover] = React46.useState(false);
12195
+ const [btnHover, setBtnHover] = React46.useState(false);
12196
+ const [pvHover, setPvHover] = React46.useState(false);
12107
12197
  const previewKind = previewKindFor(fileType, filename);
12108
12198
  const canPreview = !previewDisabled && previewKind !== null && (!!previewUrl || !!fetchPreviewBlob);
12109
- const [peekOpen, setPeekOpen] = React45.useState(false);
12110
- const [modalOpen, setModalOpen] = React45.useState(false);
12111
- const [source, setSource] = React45.useState(previewUrl ? { url: previewUrl } : null);
12112
- const [pvLoading, setPvLoading] = React45.useState(false);
12113
- const [pvError, setPvError] = React45.useState(null);
12114
- const ensureSource = React45.useCallback(async () => {
12199
+ const [peekOpen, setPeekOpen] = React46.useState(false);
12200
+ const [modalOpen, setModalOpen] = React46.useState(false);
12201
+ const [source, setSource] = React46.useState(previewUrl ? { url: previewUrl } : null);
12202
+ const [pvLoading, setPvLoading] = React46.useState(false);
12203
+ const [pvError, setPvError] = React46.useState(null);
12204
+ const ensureSource = React46.useCallback(async () => {
12115
12205
  if (source) return source;
12116
12206
  if (previewUrl) {
12117
12207
  const s = { url: previewUrl };
@@ -12133,7 +12223,7 @@ function FileCard({
12133
12223
  setPvLoading(false);
12134
12224
  }
12135
12225
  }, [source, previewUrl, fetchPreviewBlob]);
12136
- const togglePeek = React45.useCallback(async () => {
12226
+ const togglePeek = React46.useCallback(async () => {
12137
12227
  if (peekOpen) {
12138
12228
  setPeekOpen(false);
12139
12229
  return;
@@ -12141,7 +12231,7 @@ function FileCard({
12141
12231
  setPeekOpen(true);
12142
12232
  await ensureSource();
12143
12233
  }, [peekOpen, ensureSource]);
12144
- const openModal = React45.useCallback(async () => {
12234
+ const openModal = React46.useCallback(async () => {
12145
12235
  const s = await ensureSource();
12146
12236
  if (s) setModalOpen(true);
12147
12237
  }, [ensureSource]);
@@ -12256,7 +12346,7 @@ function FileCard({
12256
12346
  whiteSpace: "nowrap"
12257
12347
  },
12258
12348
  children: [
12259
- metaTokens.map((t, i) => /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
12349
+ metaTokens.map((t, i) => /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
12260
12350
  i > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: MUTED2 }, children: "\xB7" }),
12261
12351
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: t })
12262
12352
  ] }, i)),
@@ -12601,7 +12691,7 @@ function ServiceCard({ item, isHovered, onHover, onLeave: onLeave2 }) {
12601
12691
  function OpsDashboardResolver(p) {
12602
12692
  var _a, _b, _c;
12603
12693
  const { BORDER: BORDER3, MUTED: MUTED2 } = useTheme();
12604
- const [hoveredId, setHoveredId] = React45.useState(null);
12694
+ const [hoveredId, setHoveredId] = React46.useState(null);
12605
12695
  const hasRunning = ((_a = p.items) != null ? _a : []).some((item) => item.state === "running");
12606
12696
  return /* @__PURE__ */ jsxRuntime.jsxs(ComponentActions, { filename: (_b = p.title) != null ? _b : "ops-dashboard", children: [
12607
12697
  hasRunning && /* @__PURE__ */ jsxRuntime.jsx("style", { children: PULSE_KEYFRAMES }),
@@ -12655,8 +12745,8 @@ function formatDate3(value) {
12655
12745
  }
12656
12746
  function CopyButton({ value, rowHovered }) {
12657
12747
  const { MUTED: MUTED2 } = useTheme();
12658
- const [copied, setCopied] = React45.useState(false);
12659
- const [btnHovered, setBtnHovered] = React45.useState(false);
12748
+ const [copied, setCopied] = React46.useState(false);
12749
+ const [btnHovered, setBtnHovered] = React46.useState(false);
12660
12750
  const handleCopy = () => {
12661
12751
  navigator.clipboard.writeText(value).then(() => {
12662
12752
  setCopied(true);
@@ -12750,7 +12840,7 @@ function ValueCell({ item }) {
12750
12840
  }
12751
12841
  function KVRow({ item, isLast, index }) {
12752
12842
  const { MUTED: MUTED2, BORDER: BORDER3, SURFACE: SURFACE2, SURFACE_MUTED: SURFACE_MUTED2 } = useTheme();
12753
- const [hovered, setHovered] = React45.useState(false);
12843
+ const [hovered, setHovered] = React46.useState(false);
12754
12844
  const altBg = index % 2 === 1 ? SURFACE_MUTED2 : SURFACE2;
12755
12845
  return /* @__PURE__ */ jsxRuntime.jsxs(
12756
12846
  "div",
@@ -12835,7 +12925,7 @@ function KeyValueListResolver(p) {
12835
12925
  var _a3;
12836
12926
  return sum + ((_a3 = g.items) != null ? _a3 : []).length;
12837
12927
  }, 0);
12838
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
12928
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
12839
12929
  /* @__PURE__ */ jsxRuntime.jsxs(
12840
12930
  "div",
12841
12931
  {
@@ -13013,7 +13103,7 @@ function BalanceSheetResolver(p) {
13013
13103
  /* @__PURE__ */ jsxRuntime.jsxs("tbody", { children: [
13014
13104
  ((_p = p.sections) != null ? _p : []).map((section) => {
13015
13105
  var _a2;
13016
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
13106
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
13017
13107
  /* @__PURE__ */ jsxRuntime.jsx("tr", { children: /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan, style: {
13018
13108
  padding: "8px 12px",
13019
13109
  fontSize: "12px",
@@ -13026,7 +13116,7 @@ function BalanceSheetResolver(p) {
13026
13116
  }, children: (_a2 = categoryLabels2[section.category]) != null ? _a2 : section.category }) }),
13027
13117
  section.subsections.map((sub, si) => {
13028
13118
  var _a3;
13029
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
13119
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
13030
13120
  /* @__PURE__ */ jsxRuntime.jsx("tr", { children: /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan, style: {
13031
13121
  padding: "6px 10px 6px 24px",
13032
13122
  fontSize: "12px",
@@ -13202,7 +13292,7 @@ function IncomeStatementResolver(p) {
13202
13292
  textAlign: "left",
13203
13293
  whiteSpace: "nowrap"
13204
13294
  }, children: "\xA0" }),
13205
- periods.map((period) => /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
13295
+ periods.map((period) => /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
13206
13296
  /* @__PURE__ */ jsxRuntime.jsx("th", { style: {
13207
13297
  fontSize: "11px",
13208
13298
  fontWeight: 500,
@@ -13233,7 +13323,7 @@ function IncomeStatementResolver(p) {
13233
13323
  sections.map((section, si) => {
13234
13324
  var _a2;
13235
13325
  const isSubtotal = section.sectionType === "subtotal";
13236
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
13326
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
13237
13327
  /* @__PURE__ */ jsxRuntime.jsx("tr", { children: /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan: colCount, style: {
13238
13328
  padding: "8px 12px",
13239
13329
  fontSize: "12px",
@@ -13264,7 +13354,7 @@ function IncomeStatementResolver(p) {
13264
13354
  var _a4;
13265
13355
  const val = (_a4 = amounts[pi]) != null ? _a4 : 0;
13266
13356
  const isNeg = val < 0;
13267
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
13357
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
13268
13358
  /* @__PURE__ */ jsxRuntime.jsx("td", { style: {
13269
13359
  padding: "6px 10px",
13270
13360
  fontSize: "13px",
@@ -13299,7 +13389,7 @@ function IncomeStatementResolver(p) {
13299
13389
  var _a2;
13300
13390
  const val = (_a2 = grossProfit[pi]) != null ? _a2 : 0;
13301
13391
  const isNeg = val < 0;
13302
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
13392
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
13303
13393
  /* @__PURE__ */ jsxRuntime.jsx("td", { style: {
13304
13394
  padding: "8px 10px",
13305
13395
  fontSize: "12px",
@@ -13334,7 +13424,7 @@ function IncomeStatementResolver(p) {
13334
13424
  var _a2;
13335
13425
  const val = (_a2 = operatingIncome[pi]) != null ? _a2 : 0;
13336
13426
  const isNeg = val < 0;
13337
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
13427
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
13338
13428
  /* @__PURE__ */ jsxRuntime.jsx("td", { style: {
13339
13429
  padding: "8px 10px",
13340
13430
  fontSize: "12px",
@@ -13368,7 +13458,7 @@ function IncomeStatementResolver(p) {
13368
13458
  var _a2;
13369
13459
  const val = (_a2 = netIncome[pi]) != null ? _a2 : 0;
13370
13460
  const isNeg = val < 0;
13371
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
13461
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
13372
13462
  /* @__PURE__ */ jsxRuntime.jsx("td", { style: {
13373
13463
  padding: "10px 10px",
13374
13464
  fontSize: "13px",
@@ -13588,7 +13678,7 @@ function CashFlowStatementResolver(p) {
13588
13678
  /* @__PURE__ */ jsxRuntime.jsxs("tbody", { children: [
13589
13679
  activities.map((activity, ai) => {
13590
13680
  var _a2, _b2, _c2;
13591
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
13681
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
13592
13682
  ai > 0 && /* @__PURE__ */ jsxRuntime.jsx("tr", { children: /* @__PURE__ */ jsxRuntime.jsx(
13593
13683
  "td",
13594
13684
  {
@@ -16002,8 +16092,8 @@ var PRIORITY_STYLES = {
16002
16092
  function EscalationCardResolver(p) {
16003
16093
  var _a, _b, _c, _d, _e;
16004
16094
  const { BORDER: BORDER3, MUTED: MUTED2, ACCENT: ACCENT2, ACCENT_SOFT: ACCENT_SOFT2, SHADOW: SHADOW2 } = useTheme();
16005
- const [cardHovered, setCardHovered] = React45.useState(false);
16006
- const [btnHovered, setBtnHovered] = React45.useState(false);
16095
+ const [cardHovered, setCardHovered] = React46.useState(false);
16096
+ const [btnHovered, setBtnHovered] = React46.useState(false);
16007
16097
  const priorityStyle = p.priority ? PRIORITY_STYLES[p.priority] : null;
16008
16098
  const railColor = (_a = priorityStyle == null ? void 0 : priorityStyle.color) != null ? _a : ACCENT2;
16009
16099
  const iconBg = (_b = priorityStyle == null ? void 0 : priorityStyle.bg) != null ? _b : "#fff2ec";
@@ -16875,9 +16965,9 @@ var CONNECTED_GREEN = "#15803d";
16875
16965
  function ConnectIntegrationResolver(p) {
16876
16966
  var _a;
16877
16967
  const { BORDER: BORDER3, MUTED: MUTED2, ACCENT: ACCENT2, ACCENT_SOFT: ACCENT_SOFT2, PAPER: PAPER2, SURFACE: SURFACE2, SHADOW: SHADOW2 } = useTheme();
16878
- const [cardHovered, setCardHovered] = React45.useState(false);
16879
- const [btnHovered, setBtnHovered] = React45.useState(false);
16880
- const [imgFailed, setImgFailed] = React45.useState(false);
16968
+ const [cardHovered, setCardHovered] = React46.useState(false);
16969
+ const [btnHovered, setBtnHovered] = React46.useState(false);
16970
+ const [imgFailed, setImgFailed] = React46.useState(false);
16881
16971
  const name = (p.integrationName || "Integration").trim();
16882
16972
  const initial = name.charAt(0).toUpperCase();
16883
16973
  const iconSrc = p.iconUrl || brandIconUrl(name);
@@ -17039,9 +17129,9 @@ function IntegrationsListResolver(p) {
17039
17129
  var _a, _b;
17040
17130
  const { BORDER: BORDER3, MUTED: MUTED2, PAPER: PAPER2, ACCENT: ACCENT2, ACCENT_SOFT: ACCENT_SOFT2, SURFACE: SURFACE2, SHADOW: SHADOW2 } = useTheme();
17041
17131
  const integrations = Array.isArray(p.integrations) ? p.integrations : [];
17042
- const [rowHover, setRowHover] = React45.useState(null);
17043
- const [btnHover, setBtnHover] = React45.useState(null);
17044
- const [failed, setFailed] = React45.useState({});
17132
+ const [rowHover, setRowHover] = React46.useState(null);
17133
+ const [btnHover, setBtnHover] = React46.useState(null);
17134
+ const [failed, setFailed] = React46.useState({});
17045
17135
  const connectedCount = integrations.filter((i) => i.status === "connected").length;
17046
17136
  return /* @__PURE__ */ jsxRuntime.jsx(ComponentActions, { filename: (_a = p.title) != null ? _a : "integrations", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { width: "100%", display: "flex", flexDirection: "column", gap: "11px" }, children: [
17047
17137
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "2px" }, children: [
@@ -17533,13 +17623,13 @@ var ellipsis = {
17533
17623
  function PipelinePreviewResolver(p) {
17534
17624
  var _a, _b, _c, _d, _e, _f, _g;
17535
17625
  const { MUTED: MUTED2, PAPER: PAPER2, BORDER: BORDER3, ACCENT: ACCENT2, ACCENT_SOFT: ACCENT_SOFT2, SURFACE: SURFACE2 } = useTheme();
17536
- const [btnHovered, setBtnHovered] = React45.useState(false);
17626
+ const [btnHovered, setBtnHovered] = React46.useState(false);
17537
17627
  const stateCfg = STATE_CONFIG[(_a = p.state) != null ? _a : "draft"];
17538
17628
  const destinations = (_b = p.destinations) != null ? _b : [];
17539
17629
  const steps = (_c = p.steps) != null ? _c : [];
17540
17630
  const workstreams = (_d = p.workstreams) != null ? _d : [];
17541
17631
  const scheduleLabel = p.schedule ? p.schedule.type === "manual" ? "Manual" : (_f = (_e = p.schedule.label) != null ? _e : p.schedule.cron) != null ? _f : "Scheduled" : null;
17542
- const { nodes, edges, viewBox, vbW, vbH } = React45.useMemo(() => {
17632
+ const { nodes, edges, viewBox, vbW, vbH } = React46.useMemo(() => {
17543
17633
  const res = layoutGraph(steps);
17544
17634
  const b = layoutBounds(res.nodes);
17545
17635
  const pad = 24;
@@ -17553,7 +17643,7 @@ function PipelinePreviewResolver(p) {
17553
17643
  vbH: h
17554
17644
  };
17555
17645
  }, [steps]);
17556
- const nodeMap = React45.useMemo(() => {
17646
+ const nodeMap = React46.useMemo(() => {
17557
17647
  const m = {};
17558
17648
  nodes.forEach((n) => m[n.id] = n);
17559
17649
  return m;
@@ -17931,9 +18021,9 @@ var DEFAULT_INTERACTION = {
17931
18021
  onDecisionSource: void 0,
17932
18022
  onDecisionQueueSubmit: void 0
17933
18023
  };
17934
- var GenUIInteractionContext = React45.createContext(DEFAULT_INTERACTION);
18024
+ var GenUIInteractionContext = React46.createContext(DEFAULT_INTERACTION);
17935
18025
  function useGenUIInteraction() {
17936
- return React45.useContext(GenUIInteractionContext);
18026
+ return React46.useContext(GenUIInteractionContext);
17937
18027
  }
17938
18028
  var STATUS_COLORS3 = {
17939
18029
  done: "#15803d",
@@ -18125,8 +18215,8 @@ var CARD_MIN = 132;
18125
18215
  var CARD_GAP = 16;
18126
18216
  var AUTO_COMPACT_BELOW = 360;
18127
18217
  function useContainerWidth(ref) {
18128
- const [w, setW] = React45__default.default.useState(0);
18129
- React45__default.default.useLayoutEffect(() => {
18218
+ const [w, setW] = React46__default.default.useState(0);
18219
+ React46__default.default.useLayoutEffect(() => {
18130
18220
  const el = ref.current;
18131
18221
  if (!el || typeof ResizeObserver === "undefined") return;
18132
18222
  const ro = new ResizeObserver((entries) => {
@@ -18229,15 +18319,15 @@ function WorkflowStepperRenderer({
18229
18319
  const interactive = typeof onSelectStep === "function";
18230
18320
  const statusColor3 = (s) => s === "active" || s === "running" ? ACCENT2 : STATUS_COLORS3[s];
18231
18321
  const doneCount = steps.filter((s) => s.status === "done").length;
18232
- const rootRef = React45__default.default.useRef(null);
18322
+ const rootRef = React46__default.default.useRef(null);
18233
18323
  const containerW = useContainerWidth(rootRef);
18234
18324
  let resolved = density === "auto" ? "full" : density;
18235
18325
  if (density === "auto" && containerW > 0) {
18236
18326
  const needed = steps.length * CARD_MIN + Math.max(0, steps.length - 1) * CARD_GAP;
18237
18327
  resolved = containerW < AUTO_COMPACT_BELOW || needed > containerW * 1.6 ? "compact" : "full";
18238
18328
  }
18239
- const scrollerRef = React45__default.default.useRef(null);
18240
- React45__default.default.useEffect(() => {
18329
+ const scrollerRef = React46__default.default.useRef(null);
18330
+ React46__default.default.useEffect(() => {
18241
18331
  if (resolved !== "full" || loading) return;
18242
18332
  const sc = scrollerRef.current;
18243
18333
  if (!sc) return;
@@ -18248,11 +18338,11 @@ function WorkflowStepperRenderer({
18248
18338
  el.scrollIntoView({ inline: "center", block: "nearest", behavior: "smooth" });
18249
18339
  }
18250
18340
  }, [resolved, loading, selectedStep, activeStepId]);
18251
- const [edges, setEdges] = React45__default.default.useState({
18341
+ const [edges, setEdges] = React46__default.default.useState({
18252
18342
  left: false,
18253
18343
  right: false
18254
18344
  });
18255
- const updateEdges = React45__default.default.useCallback(() => {
18345
+ const updateEdges = React46__default.default.useCallback(() => {
18256
18346
  const sc = scrollerRef.current;
18257
18347
  if (!sc) return;
18258
18348
  const max = sc.scrollWidth - sc.clientWidth;
@@ -18261,7 +18351,7 @@ function WorkflowStepperRenderer({
18261
18351
  const right = sl < max - 1;
18262
18352
  setEdges((prev) => prev.left === left && prev.right === right ? prev : { left, right });
18263
18353
  }, []);
18264
- React45__default.default.useLayoutEffect(() => {
18354
+ React46__default.default.useLayoutEffect(() => {
18265
18355
  if (resolved !== "full" || loading) return;
18266
18356
  updateEdges();
18267
18357
  const sc = scrollerRef.current;
@@ -18317,7 +18407,7 @@ function WorkflowStepperRenderer({
18317
18407
  const reached = s.status !== "pending";
18318
18408
  const clickable = interactive && reached;
18319
18409
  const size = act ? 11 : done ? 9 : 8;
18320
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
18410
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
18321
18411
  i > 0 && /* @__PURE__ */ jsxRuntime.jsx(
18322
18412
  "span",
18323
18413
  {
@@ -18461,7 +18551,7 @@ function WorkflowStepperRenderer({
18461
18551
  const color = statusColor3(step.status);
18462
18552
  const humans = ((_a2 = step.assignees) != null ? _a2 : []).filter((a) => a.kind === "human");
18463
18553
  const roleCaption = humans.map((h) => h.role).filter(Boolean).slice(0, 2).join(" \xB7 ");
18464
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
18554
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
18465
18555
  i > 0 && /* @__PURE__ */ jsxRuntime.jsx(
18466
18556
  "div",
18467
18557
  {
@@ -18827,11 +18917,11 @@ function FieldDetail({
18827
18917
  }) {
18828
18918
  var _a, _b, _c, _d;
18829
18919
  const { BORDER: BORDER3, MUTED: MUTED2, PAPER: PAPER2, SECONDARY: SECONDARY2, SURFACE: SURFACE2, ACCENT: ACCENT2 } = useTheme();
18830
- const [editing, setEditing] = React45__default.default.useState(false);
18831
- const [draft, setDraft] = React45__default.default.useState("");
18832
- const [saving, setSaving] = React45__default.default.useState(false);
18833
- const [saveError, setSaveError] = React45__default.default.useState(null);
18834
- const textareaRef = React45__default.default.useRef(null);
18920
+ const [editing, setEditing] = React46__default.default.useState(false);
18921
+ const [draft, setDraft] = React46__default.default.useState("");
18922
+ const [saving, setSaving] = React46__default.default.useState(false);
18923
+ const [saveError, setSaveError] = React46__default.default.useState(null);
18924
+ const textareaRef = React46__default.default.useRef(null);
18835
18925
  const color = fieldColor(field, SECONDARY2);
18836
18926
  const corrected = field.state === "corrected";
18837
18927
  const startEdit = (e) => {
@@ -19341,7 +19431,7 @@ function FieldDetails({
19341
19431
  },
19342
19432
  children: facts.map((f) => {
19343
19433
  var _a2;
19344
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
19434
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
19345
19435
  /* @__PURE__ */ jsxRuntime.jsx("dt", { style: { fontSize: "12px", color: MUTED2 }, children: f.label }),
19346
19436
  /* @__PURE__ */ jsxRuntime.jsxs(
19347
19437
  "dd",
@@ -19440,7 +19530,7 @@ function FieldAuditLog({
19440
19530
  fields = []
19441
19531
  }) {
19442
19532
  const { BORDER: BORDER3, MUTED: MUTED2, PAPER: PAPER2, SECONDARY: SECONDARY2 } = useTheme();
19443
- const fieldLabelMap = React45__default.default.useMemo(() => {
19533
+ const fieldLabelMap = React46__default.default.useMemo(() => {
19444
19534
  var _a;
19445
19535
  const map = {};
19446
19536
  for (const f of fields) map[f.field_key] = (_a = f.label) != null ? _a : f.field_key;
@@ -19639,10 +19729,10 @@ function PageOverlay({
19639
19729
  secondary
19640
19730
  }) {
19641
19731
  const { PAPER: PAPER2, MUTED: MUTED2 } = useTheme();
19642
- const imgRef = React45__default.default.useRef(null);
19643
- const selectedBoxRef = React45__default.default.useRef(null);
19644
- const [px, setPx] = React45__default.default.useState(null);
19645
- React45__default.default.useEffect(() => {
19732
+ const imgRef = React46__default.default.useRef(null);
19733
+ const selectedBoxRef = React46__default.default.useRef(null);
19734
+ const [px, setPx] = React46__default.default.useState(null);
19735
+ React46__default.default.useEffect(() => {
19646
19736
  const el = imgRef.current;
19647
19737
  if (!el) return;
19648
19738
  const measure = () => {
@@ -19656,7 +19746,7 @@ function PageOverlay({
19656
19746
  ro.observe(el);
19657
19747
  return () => ro.disconnect();
19658
19748
  }, [page.imageUrl]);
19659
- React45__default.default.useEffect(() => {
19749
+ React46__default.default.useEffect(() => {
19660
19750
  if (!selectedKey) return;
19661
19751
  if (!fields.some((f) => f.field_key === selectedKey && f.bbox)) return;
19662
19752
  const el = selectedBoxRef.current;
@@ -19758,8 +19848,8 @@ function ExtractionDetail({
19758
19848
  auditLoading
19759
19849
  }) {
19760
19850
  const { BORDER: BORDER3, MUTED: MUTED2, PAPER: PAPER2, SECONDARY: SECONDARY2 } = useTheme();
19761
- const selectedCardRef = React45__default.default.useRef(null);
19762
- React45__default.default.useEffect(() => {
19851
+ const selectedCardRef = React46__default.default.useRef(null);
19852
+ React46__default.default.useEffect(() => {
19763
19853
  if (!selectedKey || tab !== "fields") return;
19764
19854
  const el = selectedCardRef.current;
19765
19855
  if (el && typeof el.scrollIntoView === "function") {
@@ -19930,7 +20020,7 @@ function ExtractionModal({
19930
20020
  children
19931
20021
  }) {
19932
20022
  const { BORDER: BORDER3, MUTED: MUTED2, SURFACE: SURFACE2, FOREGROUND: FOREGROUND2, SCRIM: SCRIM2 } = useTheme();
19933
- React45__default.default.useEffect(() => {
20023
+ React46__default.default.useEffect(() => {
19934
20024
  if (!open) return;
19935
20025
  const onKey = (e) => {
19936
20026
  if (e.key === "Escape") onClose();
@@ -20059,19 +20149,19 @@ function ExtractionModal({
20059
20149
  function DocumentFieldExtractionResolver(p) {
20060
20150
  var _a, _b;
20061
20151
  const { BORDER: BORDER3, MUTED: MUTED2, PAPER: PAPER2, SURFACE: SURFACE2, SHADOW: SHADOW2, ACCENT: ACCENT2 } = useTheme();
20062
- const [selectedKey, setSelectedKey] = React45__default.default.useState(null);
20063
- const [open, setOpen] = React45__default.default.useState(false);
20064
- const [tab, setTab] = React45__default.default.useState("fields");
20152
+ const [selectedKey, setSelectedKey] = React46__default.default.useState(null);
20153
+ const [open, setOpen] = React46__default.default.useState(false);
20154
+ const [tab, setTab] = React46__default.default.useState("fields");
20065
20155
  const pages = (_a = p.pages) != null ? _a : [];
20066
20156
  const fields = (_b = p.fields) != null ? _b : [];
20067
20157
  const editable = typeof p.onFieldSave === "function";
20068
20158
  const onLoadAudit = p.onLoadAudit;
20069
- React45__default.default.useEffect(() => {
20159
+ React46__default.default.useEffect(() => {
20070
20160
  if (tab === "audit" && onLoadAudit) {
20071
20161
  onLoadAudit();
20072
20162
  }
20073
20163
  }, [tab, onLoadAudit]);
20074
- const correctionCounts = React45__default.default.useMemo(() => {
20164
+ const correctionCounts = React46__default.default.useMemo(() => {
20075
20165
  var _a2, _b2;
20076
20166
  const counts = {};
20077
20167
  for (const ev of (_a2 = p.auditEvents) != null ? _a2 : []) {
@@ -20317,8 +20407,8 @@ function formatAmount2(amount, currency = "USD") {
20317
20407
  return `${sign}${symbol}${body}`;
20318
20408
  }
20319
20409
  function useContainerWidth2(ref) {
20320
- const [w, setW] = React45__default.default.useState(0);
20321
- React45__default.default.useLayoutEffect(() => {
20410
+ const [w, setW] = React46__default.default.useState(0);
20411
+ React46__default.default.useLayoutEffect(() => {
20322
20412
  const el = ref.current;
20323
20413
  if (!el || typeof ResizeObserver === "undefined") return;
20324
20414
  const ro = new ResizeObserver((entries) => {
@@ -20413,8 +20503,8 @@ function ValueAdjuster({
20413
20503
  const { SURFACE_MUTED: SURFACE_MUTED2 } = useTheme();
20414
20504
  const adjust = option.adjust;
20415
20505
  const suggested = clampToRange((_a = option.value) != null ? _a : adjust.min, adjust);
20416
- const [value, setValue] = React45__default.default.useState(suggested);
20417
- const [text, setText] = React45__default.default.useState(String(suggested));
20506
+ const [value, setValue] = React46__default.default.useState(suggested);
20507
+ const [text, setText] = React46__default.default.useState(String(suggested));
20418
20508
  const step = (_b = adjust.step) != null ? _b : Number.isInteger(adjust.min) && Number.isInteger(adjust.max) ? 1 : (adjust.max - adjust.min) / 100;
20419
20509
  const pct = adjust.max > adjust.min ? (value - adjust.min) / (adjust.max - adjust.min) * 100 : 0;
20420
20510
  const suggestedPct = adjust.max > adjust.min ? (suggested - adjust.min) / (adjust.max - adjust.min) * 100 : 0;
@@ -20620,10 +20710,10 @@ function DecisionCardRenderer({
20620
20710
  }) {
20621
20711
  var _a, _b, _c;
20622
20712
  const { BORDER: BORDER3, MUTED: MUTED2, ACCENT: ACCENT2, ACCENT_SOFT: ACCENT_SOFT2, SURFACE: SURFACE2, SURFACE_MUTED: SURFACE_MUTED2, SHADOW: SHADOW2 } = useTheme();
20623
- const rootRef = React45__default.default.useRef(null);
20713
+ const rootRef = React46__default.default.useRef(null);
20624
20714
  const width = useContainerWidth2(rootRef);
20625
20715
  const stacked = width > 0 && width < STACK_BELOW;
20626
- const [adjustingIdx, setAdjustingIdx] = React45__default.default.useState(null);
20716
+ const [adjustingIdx, setAdjustingIdx] = React46__default.default.useState(null);
20627
20717
  const options = (_a = data.options) != null ? _a : [];
20628
20718
  const recommendedIdx = Math.max(
20629
20719
  0,
@@ -20924,8 +21014,8 @@ function DecisionCardResolver(p) {
20924
21014
  const decisionId = (_a = p.id) != null ? _a : p.title;
20925
21015
  const hostResolved = resolvedDecisions == null ? void 0 : resolvedDecisions[decisionId];
20926
21016
  const initial = hostResolved != null ? hostResolved : p.resolved ? composeResolution(p, p.resolved.option, p.resolved.value) : null;
20927
- const [localResolved, setLocalResolved] = React45__default.default.useState(initial);
20928
- React45__default.default.useEffect(() => {
21017
+ const [localResolved, setLocalResolved] = React46__default.default.useState(initial);
21018
+ React46__default.default.useEffect(() => {
20929
21019
  if (hostResolved !== void 0) setLocalResolved(hostResolved);
20930
21020
  }, [hostResolved]);
20931
21021
  const resolved = hostResolved != null ? hostResolved : localResolved;
@@ -20999,11 +21089,11 @@ function DecisionQueueRenderer({
20999
21089
  var _a;
21000
21090
  const { BORDER: BORDER3, MUTED: MUTED2, ACCENT: ACCENT2, SURFACE: SURFACE2, SURFACE_MUTED: SURFACE_MUTED2, BORDER_SOFT: BORDER_SOFT2, PAPER: PAPER2, SHADOW: SHADOW2 } = useTheme();
21001
21091
  const items = (_a = data.items) != null ? _a : [];
21002
- const [decisions, setDecisions] = React45__default.default.useState(
21092
+ const [decisions, setDecisions] = React46__default.default.useState(
21003
21093
  () => items.map(() => void 0)
21004
21094
  );
21005
21095
  const firstUndecided = decisions.findIndex((d) => !d);
21006
- const [focusIdx, setFocusIdx] = React45__default.default.useState(firstUndecided >= 0 ? firstUndecided : null);
21096
+ const [focusIdx, setFocusIdx] = React46__default.default.useState(firstUndecided >= 0 ? firstUndecided : null);
21007
21097
  const isSubmitted = submitted != null;
21008
21098
  const shown = isSubmitted ? items.map(
21009
21099
  (item, i) => {
@@ -21028,16 +21118,16 @@ function DecisionQueueRenderer({
21028
21118
  const final = decisions;
21029
21119
  onSubmit == null ? void 0 : onSubmit(final, composeQueueMessage(items, final));
21030
21120
  };
21031
- const onReadyRef = React45__default.default.useRef(onReady);
21032
- React45__default.default.useEffect(() => {
21121
+ const onReadyRef = React46__default.default.useRef(onReady);
21122
+ React46__default.default.useEffect(() => {
21033
21123
  onReadyRef.current = onReady;
21034
21124
  });
21035
- React45__default.default.useEffect(() => {
21125
+ React46__default.default.useEffect(() => {
21036
21126
  if (!onReadyRef.current) return;
21037
21127
  const msg = allDecided ? composeQueueMessage(items, decisions) : null;
21038
21128
  onReadyRef.current(allDecided && !isSubmitted, msg, decisions.filter(Boolean));
21039
21129
  }, [decisions, allDecided, isSubmitted]);
21040
- React45__default.default.useEffect(() => {
21130
+ React46__default.default.useEffect(() => {
21041
21131
  if (!submitRef) return;
21042
21132
  submitRef.current = handleSubmit;
21043
21133
  return () => {
@@ -21262,7 +21352,7 @@ function DecisionQueueResolver(p) {
21262
21352
  const { resolvedDecisions, onDecisionQueueSubmit } = useGenUIInteraction();
21263
21353
  const queueId = (_b = (_a = p.id) != null ? _a : p.title) != null ? _b : "decision-queue";
21264
21354
  const replayed = (_d = (_c = p.resolved) == null ? void 0 : _c.decisions) != null ? _d : null;
21265
- const [localSubmitted, setLocalSubmitted] = React45__default.default.useState(null);
21355
+ const [localSubmitted, setLocalSubmitted] = React46__default.default.useState(null);
21266
21356
  const hostLocked = (resolvedDecisions == null ? void 0 : resolvedDecisions[queueId]) != null;
21267
21357
  const submitted = (_e = replayed != null ? replayed : localSubmitted) != null ? _e : hostLocked ? [] : null;
21268
21358
  const handleSubmit = (decisions, message) => {
@@ -21340,9 +21430,9 @@ function ExternalIcon() {
21340
21430
  function TabbyAuthResolver(p) {
21341
21431
  var _a, _b, _c;
21342
21432
  const { BORDER: BORDER3, MUTED: MUTED2, ACCENT: ACCENT2, ACCENT_SOFT: ACCENT_SOFT2, SURFACE: SURFACE2, SURFACE_MUTED: SURFACE_MUTED2, SHADOW: SHADOW2 } = useTheme();
21343
- const [cardHovered, setCardHovered] = React45.useState(false);
21344
- const [btnHovered, setBtnHovered] = React45.useState(false);
21345
- const [imgFailed, setImgFailed] = React45.useState(false);
21433
+ const [cardHovered, setCardHovered] = React46.useState(false);
21434
+ const [btnHovered, setBtnHovered] = React46.useState(false);
21435
+ const [imgFailed, setImgFailed] = React46.useState(false);
21346
21436
  const app = humanizeApp(p.app || "the app");
21347
21437
  const connected = p.state === "connected";
21348
21438
  const accent = connected ? CONNECTED_GREEN3 : ACCENT2;
@@ -21748,7 +21838,7 @@ function InlineSpinner() {
21748
21838
  }
21749
21839
  function GenUIRenderer({ payload }) {
21750
21840
  return /* @__PURE__ */ jsxRuntime.jsx(
21751
- React45.Suspense,
21841
+ React46.Suspense,
21752
21842
  {
21753
21843
  fallback: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", gap: "8px", padding: "8px 0" }, children: [
21754
21844
  /* @__PURE__ */ jsxRuntime.jsx(InlineSpinner, {}),