@adoptai/genui-components 0.1.67 → 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.
Files changed (32) hide show
  1. package/dist/composites/document-preview/PdfViewer.d.ts +2 -1
  2. package/dist/composites/document-preview/PdfViewer.d.ts.map +1 -1
  3. package/dist/composites/document-preview/resolver.cjs +90 -11
  4. package/dist/composites/document-preview/resolver.cjs.map +1 -1
  5. package/dist/composites/document-preview/resolver.d.ts.map +1 -1
  6. package/dist/composites/document-preview/resolver.js +90 -11
  7. package/dist/composites/document-preview/resolver.js.map +1 -1
  8. package/dist/composites/download-card/resolver.cjs +244 -69
  9. package/dist/composites/download-card/resolver.cjs.map +1 -1
  10. package/dist/composites/download-card/resolver.js +189 -14
  11. package/dist/composites/download-card/resolver.js.map +1 -1
  12. package/dist/index.cjs +472 -289
  13. package/dist/index.cjs.map +1 -1
  14. package/dist/index.js +265 -82
  15. package/dist/index.js.map +1 -1
  16. package/dist/renderer.cjs +404 -221
  17. package/dist/renderer.cjs.map +1 -1
  18. package/dist/renderer.js +259 -76
  19. package/dist/renderer.js.map +1 -1
  20. package/dist/resolver.cjs +403 -220
  21. package/dist/resolver.cjs.map +1 -1
  22. package/dist/resolver.js +259 -76
  23. package/dist/resolver.js.map +1 -1
  24. package/dist/shared/fileType.d.ts +1 -1
  25. package/dist/shared/fileType.d.ts.map +1 -1
  26. package/dist/shared/viewers/HtmlViewer.d.ts +12 -0
  27. package/dist/shared/viewers/HtmlViewer.d.ts.map +1 -0
  28. package/dist/shared/viewers/PreviewHost.d.ts.map +1 -1
  29. package/dist/shared/viewers/pdfWorkerProbe.d.ts +31 -0
  30. package/dist/shared/viewers/pdfWorkerProbe.d.ts.map +1 -0
  31. package/dist/tool-definitions.json +2 -2
  32. package/package.json +1 -1
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;
@@ -1292,23 +1292,84 @@ var init_FlowGraph = __esm({
1292
1292
  renderSeq = 0;
1293
1293
  }
1294
1294
  });
1295
+ function resolvePdfWorkerSrc(pdfjs2) {
1296
+ const override = typeof window !== "undefined" ? window.__GENUI_PDF_WORKER_SRC__ : void 0;
1297
+ const current = pdfjs2.GlobalWorkerOptions.workerSrc;
1298
+ const isConfigured = !!current && current !== "pdf.worker.mjs";
1299
+ if (override) {
1300
+ pdfjs2.GlobalWorkerOptions.workerSrc = override;
1301
+ } else if (!isConfigured) {
1302
+ pdfjs2.GlobalWorkerOptions.workerSrc = `https://cdn.jsdelivr.net/npm/pdfjs-dist@${pdfjs2.version}/build/pdf.worker.min.mjs`;
1303
+ }
1304
+ return pdfjs2.GlobalWorkerOptions.workerSrc;
1305
+ }
1306
+ function probePdfWorker() {
1307
+ if (probe) return probe;
1308
+ probe = (async () => {
1309
+ if (typeof window === "undefined") return false;
1310
+ try {
1311
+ const { pdfjs: pdfjs2 } = await import('react-pdf');
1312
+ resolvePdfWorkerSrc(pdfjs2);
1313
+ const task = pdfjs2.getDocument({ data: new TextEncoder().encode(TINY_PDF) });
1314
+ const doc = await Promise.race([
1315
+ task.promise,
1316
+ new Promise(
1317
+ (_, reject) => setTimeout(() => reject(new Error("pdf worker probe timed out")), PROBE_TIMEOUT_MS)
1318
+ )
1319
+ ]);
1320
+ await doc.destroy();
1321
+ return true;
1322
+ } catch (e) {
1323
+ probe = null;
1324
+ return false;
1325
+ }
1326
+ })();
1327
+ return probe;
1328
+ }
1329
+ function usePdfWorkerReady(enabled) {
1330
+ const [ready, setReady] = React46.useState(null);
1331
+ React46.useEffect(() => {
1332
+ if (!enabled) return;
1333
+ let cancelled = false;
1334
+ probePdfWorker().then((ok) => {
1335
+ if (!cancelled) setReady(ok);
1336
+ });
1337
+ return () => {
1338
+ cancelled = true;
1339
+ };
1340
+ }, [enabled]);
1341
+ return enabled ? ready : null;
1342
+ }
1343
+ var TINY_PDF, PROBE_TIMEOUT_MS, probe;
1344
+ var init_pdfWorkerProbe = __esm({
1345
+ "src/shared/viewers/pdfWorkerProbe.ts"() {
1346
+ "use client";
1347
+ TINY_PDF = `%PDF-1.1
1348
+ 1 0 obj<</Type/Catalog/Pages 2 0 R>>endobj
1349
+ 2 0 obj<</Type/Pages/Kids[3 0 R]/Count 1>>endobj
1350
+ 3 0 obj<</Type/Page/Parent 2 0 R/MediaBox[0 0 3 3]>>endobj
1351
+ trailer<</Root 1 0 R>>`;
1352
+ PROBE_TIMEOUT_MS = 5e3;
1353
+ probe = null;
1354
+ }
1355
+ });
1295
1356
 
1296
1357
  // src/composites/document-preview/PdfViewer.tsx
1297
1358
  var PdfViewer_exports = {};
1298
1359
  __export(PdfViewer_exports, {
1299
1360
  PdfViewer: () => PdfViewer
1300
1361
  });
1301
- function PdfViewer({ url, base64, onLoadSuccess }) {
1362
+ function PdfViewer({ url, base64, onLoadSuccess, onLoadError }) {
1302
1363
  const { BORDER: BORDER3, MUTED: MUTED2, SURFACE: SURFACE2 } = useTheme();
1303
- const [numPages, setNumPages] = React45.useState(0);
1304
- const [currentPage, setCurrentPage] = React45.useState(1);
1305
- const [loading, setLoading] = React45.useState(true);
1306
- 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 }) => {
1307
1368
  setNumPages(n);
1308
1369
  setLoading(false);
1309
1370
  onLoadSuccess == null ? void 0 : onLoadSuccess(n);
1310
1371
  }, [onLoadSuccess]);
1311
- React45.useEffect(() => {
1372
+ React46.useEffect(() => {
1312
1373
  if (numPages <= 1) return;
1313
1374
  const handler = (e) => {
1314
1375
  var _a;
@@ -1378,23 +1439,34 @@ function PdfViewer({ url, base64, onLoadSuccess }) {
1378
1439
  ] }),
1379
1440
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { overflow: "auto", width: "100%", display: "flex", justifyContent: "center", padding: "16px" }, children: [
1380
1441
  loading && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "flex", alignItems: "center", justifyContent: "center", height: "200px", color: MUTED2, fontSize: "13px" }, children: "Loading PDF..." }),
1381
- /* @__PURE__ */ jsxRuntime.jsx(reactPdf.Document, { file: base64 ? `data:application/pdf;base64,${base64}` : url, onLoadSuccess: handleLoad, loading: "", children: /* @__PURE__ */ jsxRuntime.jsx(
1382
- reactPdf.Page,
1442
+ /* @__PURE__ */ jsxRuntime.jsx(
1443
+ reactPdf.Document,
1383
1444
  {
1384
- pageNumber: currentPage,
1385
- width: 540,
1386
- renderTextLayer: true,
1387
- renderAnnotationLayer: true
1445
+ file: base64 ? `data:application/pdf;base64,${base64}` : url,
1446
+ onLoadSuccess: handleLoad,
1447
+ onLoadError,
1448
+ loading: "",
1449
+ error: "",
1450
+ children: /* @__PURE__ */ jsxRuntime.jsx(
1451
+ reactPdf.Page,
1452
+ {
1453
+ pageNumber: currentPage,
1454
+ width: 540,
1455
+ renderTextLayer: true,
1456
+ renderAnnotationLayer: true
1457
+ }
1458
+ )
1388
1459
  }
1389
- ) })
1460
+ )
1390
1461
  ] })
1391
1462
  ] });
1392
1463
  }
1393
1464
  var init_PdfViewer = __esm({
1394
1465
  "src/composites/document-preview/PdfViewer.tsx"() {
1395
1466
  "use client";
1467
+ init_pdfWorkerProbe();
1396
1468
  init_ThemeContext();
1397
- reactPdf.pdfjs.GlobalWorkerOptions.workerSrc = `https://unpkg.com/pdfjs-dist@${reactPdf.pdfjs.version}/build/pdf.worker.min.mjs`;
1469
+ resolvePdfWorkerSrc(reactPdf.pdfjs);
1398
1470
  }
1399
1471
  });
1400
1472
 
@@ -1405,13 +1477,13 @@ __export(ExcelViewer_exports, {
1405
1477
  });
1406
1478
  function ExcelViewer({ url, base64, onLoadSuccess }) {
1407
1479
  const { BORDER: BORDER3, MUTED: MUTED2, PAPER: PAPER2, SURFACE: SURFACE2 } = useTheme();
1408
- const [sheetNames, setSheetNames] = React45.useState([]);
1409
- const [activeSheet, setActiveSheet] = React45.useState(0);
1410
- const [data, setData] = React45.useState([]);
1411
- const [loading, setLoading] = React45.useState(true);
1412
- const [error, setError] = React45.useState(null);
1413
- const wbRef = React45.useRef(null);
1414
- 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(() => {
1415
1487
  let cancelled = false;
1416
1488
  setLoading(true);
1417
1489
  setError(null);
@@ -1469,7 +1541,7 @@ function ExcelViewer({ url, base64, onLoadSuccess }) {
1469
1541
  const rows = XLSX__namespace.utils.sheet_to_json(wbRef.current.Sheets[wbRef.current.SheetNames[idx]], { header: 1 });
1470
1542
  setData(rows);
1471
1543
  };
1472
- React45.useEffect(() => {
1544
+ React46.useEffect(() => {
1473
1545
  if (sheetNames.length <= 1) return;
1474
1546
  const handler = (e) => {
1475
1547
  var _a;
@@ -1595,10 +1667,10 @@ __export(CsvViewer_exports, {
1595
1667
  });
1596
1668
  function CsvViewer({ url, base64, delimiter, maxRows }) {
1597
1669
  const { BORDER: BORDER3, MUTED: MUTED2, PAPER: PAPER2 } = useTheme();
1598
- const [rows, setRows] = React45.useState([]);
1599
- const [loading, setLoading] = React45.useState(true);
1600
- const [error, setError] = React45.useState(null);
1601
- 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(() => {
1602
1674
  let cancelled = false;
1603
1675
  setLoading(true);
1604
1676
  setError(null);
@@ -1717,10 +1789,10 @@ __export(TextViewer_exports, {
1717
1789
  });
1718
1790
  function TextViewer({ url, base64, markdown = false, maxLines }) {
1719
1791
  const { MUTED: MUTED2 } = useTheme();
1720
- const [text, setText] = React45.useState("");
1721
- const [loading, setLoading] = React45.useState(true);
1722
- const [error, setError] = React45.useState(null);
1723
- 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(() => {
1724
1796
  let cancelled = false;
1725
1797
  setLoading(true);
1726
1798
  setError(null);
@@ -1818,10 +1890,10 @@ function sanitize(html) {
1818
1890
  }
1819
1891
  function DocxViewer({ url, base64 }) {
1820
1892
  const { MUTED: MUTED2, BORDER: BORDER3, SURFACE: SURFACE2 } = useTheme();
1821
- const [html, setHtml] = React45.useState("");
1822
- const [loading, setLoading] = React45.useState(true);
1823
- const [error, setError] = React45.useState(null);
1824
- 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(() => {
1825
1897
  let cancelled = false;
1826
1898
  setLoading(true);
1827
1899
  setError(null);
@@ -1900,6 +1972,89 @@ var init_DocxViewer = __esm({
1900
1972
  init_decode();
1901
1973
  }
1902
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
+ });
1903
2058
  var dataTableSchema = zod.z.object({
1904
2059
  type: zod.z.literal("data-table"),
1905
2060
  title: zod.z.string().optional(),
@@ -6050,16 +6205,16 @@ var DOT_COLOR = "#aaaaaa";
6050
6205
  var DOT_HOVER = "#555555";
6051
6206
  function ComponentActions({ children, onDownloadCSV, columnConfig, filename = "component" }) {
6052
6207
  const { BORDER: BORDER3, MUTED: MUTED2, SURFACE: SURFACE2, SURFACE_MUTED: SURFACE_MUTED2 } = useTheme();
6053
- const [open, setOpen] = React45.useState(false);
6054
- const [view, setView] = React45.useState("main");
6055
- const contentRef = React45.useRef(null);
6056
- const menuRef = React45.useRef(null);
6057
- const btnRef = React45.useRef(null);
6058
- 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(() => {
6059
6214
  setOpen(false);
6060
6215
  setView("main");
6061
6216
  }, []);
6062
- React45.useEffect(() => {
6217
+ React46.useEffect(() => {
6063
6218
  if (!open) return;
6064
6219
  const handler = (e) => {
6065
6220
  var _a, _b;
@@ -6070,7 +6225,7 @@ function ComponentActions({ children, onDownloadCSV, columnConfig, filename = "c
6070
6225
  document.addEventListener("mousedown", handler);
6071
6226
  return () => document.removeEventListener("mousedown", handler);
6072
6227
  }, [open, close]);
6073
- const handleDownloadPNG = React45.useCallback(async () => {
6228
+ const handleDownloadPNG = React46.useCallback(async () => {
6074
6229
  if (!contentRef.current) return;
6075
6230
  try {
6076
6231
  const url = await htmlToImage.toPng(contentRef.current, { backgroundColor: "white", pixelRatio: 2 });
@@ -6082,7 +6237,7 @@ function ComponentActions({ children, onDownloadCSV, columnConfig, filename = "c
6082
6237
  }
6083
6238
  close();
6084
6239
  }, [filename, close]);
6085
- const handleCSV = React45.useCallback(() => {
6240
+ const handleCSV = React46.useCallback(() => {
6086
6241
  onDownloadCSV == null ? void 0 : onDownloadCSV();
6087
6242
  close();
6088
6243
  }, [onDownloadCSV, close]);
@@ -6195,12 +6350,12 @@ function MenuButton({ label, onClick }) {
6195
6350
  );
6196
6351
  }
6197
6352
  function useColumnVisibility(columns) {
6198
- const [hidden, setHidden] = React45.useState(/* @__PURE__ */ new Set());
6199
- const visibleColumns = React45.useMemo(
6353
+ const [hidden, setHidden] = React46.useState(/* @__PURE__ */ new Set());
6354
+ const visibleColumns = React46.useMemo(
6200
6355
  () => columns.filter((c) => !hidden.has(c.key)),
6201
6356
  [columns, hidden]
6202
6357
  );
6203
- const toggle = React45.useCallback((key) => {
6358
+ const toggle = React46.useCallback((key) => {
6204
6359
  setHidden((prev) => {
6205
6360
  const next = new Set(prev);
6206
6361
  if (next.has(key)) next.delete(key);
@@ -6208,8 +6363,8 @@ function useColumnVisibility(columns) {
6208
6363
  return next;
6209
6364
  });
6210
6365
  }, []);
6211
- const showAll = React45.useCallback(() => setHidden(/* @__PURE__ */ new Set()), []);
6212
- const hideAll = React45.useCallback(
6366
+ const showAll = React46.useCallback(() => setHidden(/* @__PURE__ */ new Set()), []);
6367
+ const hideAll = React46.useCallback(
6213
6368
  () => setHidden(new Set(columns.map((c) => c.key))),
6214
6369
  [columns]
6215
6370
  );
@@ -6466,9 +6621,9 @@ function AlertResolver(p) {
6466
6621
  // src/composites/stat-grid/resolver.tsx
6467
6622
  init_Markdown();
6468
6623
  function FitText({ children, max = 22, min = 13, title, className, style }) {
6469
- const ref = React45.useRef(null);
6470
- const [size, setSize] = React45.useState(max);
6471
- React45.useLayoutEffect(() => {
6624
+ const ref = React46.useRef(null);
6625
+ const [size, setSize] = React46.useState(max);
6626
+ React46.useLayoutEffect(() => {
6472
6627
  const el = ref.current;
6473
6628
  if (!el) return void 0;
6474
6629
  const fit = () => {
@@ -6557,7 +6712,7 @@ init_ThemeContext();
6557
6712
  function TabsPanelResolver(p) {
6558
6713
  var _a;
6559
6714
  const { BORDER: BORDER3, MUTED: MUTED2, PAPER: PAPER2, SURFACE: SURFACE2, ACCENT: ACCENT2 } = useTheme();
6560
- const [activeIdx, setActiveIdx] = React45.useState(0);
6715
+ const [activeIdx, setActiveIdx] = React46.useState(0);
6561
6716
  const activeTab = p.tabs[activeIdx];
6562
6717
  return /* @__PURE__ */ jsxRuntime.jsx(ComponentActions, { filename: "tabs-panel", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { width: "100%", display: "flex", flexDirection: "column", gap: "0" }, children: [
6563
6718
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -6821,7 +6976,7 @@ var thStyle = (MUTED2, BORDER3, PAPER2) => ({
6821
6976
  function ScreenerTableResolver(p) {
6822
6977
  var _a, _b, _c, _d, _e, _f;
6823
6978
  const { ACCENT: ACCENT2, BORDER: BORDER3, BORDER_SOFT: BORDER_SOFT2, MUTED: MUTED2, PAPER: PAPER2, SURFACE: SURFACE2, SURFACE_MUTED: SURFACE_MUTED2 } = useTheme();
6824
- 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 : []));
6825
6980
  const { visibleColumns, hidden, toggle, showAll, hideAll, allColumns } = useColumnVisibility((_b = p.columns) != null ? _b : []);
6826
6981
  const toggleFilter = (f) => setActiveFilters((prev) => {
6827
6982
  const next = new Set(prev);
@@ -6891,7 +7046,7 @@ var th2 = (MUTED2, BORDER3, PAPER2) => ({
6891
7046
  function GroupRows({ group, columns, depth }) {
6892
7047
  var _a, _b;
6893
7048
  const { MUTED: MUTED2, PAPER: PAPER2, BORDER_SOFT: BORDER_SOFT2 } = useTheme();
6894
- const [open, setOpen] = React45.useState(true);
7049
+ const [open, setOpen] = React46.useState(true);
6895
7050
  const indent = depth * 14;
6896
7051
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
6897
7052
  /* @__PURE__ */ jsxRuntime.jsxs(
@@ -6996,7 +7151,7 @@ var dotColor = {
6996
7151
  function NewsFeedResolver(p) {
6997
7152
  var _a, _b;
6998
7153
  const { ACCENT: ACCENT2, MUTED: MUTED2, SURFACE: SURFACE2, SHADOW: SHADOW2 } = useTheme();
6999
- const [filter, setFilter] = React45.useState(null);
7154
+ const [filter, setFilter] = React46.useState(null);
7000
7155
  const sentiments = ["positive", "neutral", "negative"].filter(
7001
7156
  (s) => {
7002
7157
  var _a2;
@@ -7038,9 +7193,9 @@ function NewsFeedResolver(p) {
7038
7193
  ] }) });
7039
7194
  }
7040
7195
  function useSeriesToggle(seriesKeys) {
7041
- const [hidden, setHidden] = React45.useState(/* @__PURE__ */ new Set());
7042
- const isVisible = React45.useCallback((key) => !hidden.has(key), [hidden]);
7043
- 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) => {
7044
7199
  setHidden((prev) => {
7045
7200
  const next = new Set(prev);
7046
7201
  if (next.has(key)) next.delete(key);
@@ -7048,7 +7203,7 @@ function useSeriesToggle(seriesKeys) {
7048
7203
  return next;
7049
7204
  });
7050
7205
  }, []);
7051
- const showAll = React45.useCallback(() => setHidden(/* @__PURE__ */ new Set()), []);
7206
+ const showAll = React46.useCallback(() => setHidden(/* @__PURE__ */ new Set()), []);
7052
7207
  return { hidden, isVisible, toggle, showAll, allKeys: seriesKeys };
7053
7208
  }
7054
7209
 
@@ -7353,7 +7508,7 @@ function WaterfallChartResolver(p) {
7353
7508
  }
7354
7509
  init_ThemeContext();
7355
7510
  init_theme();
7356
- var FlowGraph2 = React45__default.default.lazy(
7511
+ var FlowGraph2 = React46__default.default.lazy(
7357
7512
  () => Promise.resolve().then(() => (init_FlowGraph(), FlowGraph_exports)).then((m) => ({ default: m.FlowGraph }))
7358
7513
  );
7359
7514
  function FlowCanvasRenderer({
@@ -7394,7 +7549,7 @@ function FlowCanvasRenderer({
7394
7549
  overflow: "hidden",
7395
7550
  background: SURFACE2,
7396
7551
  position: "relative"
7397
- }, 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: {
7398
7553
  position: "absolute",
7399
7554
  inset: 0,
7400
7555
  display: "flex",
@@ -7629,7 +7784,7 @@ function TrialBalanceResolver(p) {
7629
7784
  gDebit += a.debit;
7630
7785
  gCredit += a.credit;
7631
7786
  });
7632
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
7787
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
7633
7788
  /* @__PURE__ */ jsxRuntime.jsx("tr", { children: /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan: 4, style: {
7634
7789
  padding: "8px 12px",
7635
7790
  fontSize: "12px",
@@ -8167,7 +8322,7 @@ function ItemRow({ item }) {
8167
8322
  }
8168
8323
  function Section({ section }) {
8169
8324
  const { BORDER: BORDER3, MUTED: MUTED2, SURFACE: SURFACE2 } = useTheme();
8170
- const [open, setOpen] = React45.useState(true);
8325
+ const [open, setOpen] = React46.useState(true);
8171
8326
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
8172
8327
  /* @__PURE__ */ jsxRuntime.jsxs(
8173
8328
  "button",
@@ -8290,7 +8445,7 @@ function ReconciliationViewResolver(p) {
8290
8445
  const { BORDER: BORDER3, BORDER_SOFT: BORDER_SOFT2, MUTED: MUTED2, PAPER: PAPER2, ACCENT: ACCENT2, SURFACE: SURFACE2, SURFACE_MUTED: SURFACE_MUTED2 } = useTheme();
8291
8446
  const sourceA = (_a = p.sourceA) != null ? _a : { label: "Source A" };
8292
8447
  const sourceB = (_b = p.sourceB) != null ? _b : { label: "Source B" };
8293
- const [activeTab, setActiveTab] = React45.useState("matched");
8448
+ const [activeTab, setActiveTab] = React46.useState("matched");
8294
8449
  const balanceA = (_d = (_c = p.summary) == null ? void 0 : _c.balanceA) != null ? _d : 0;
8295
8450
  const balanceB = (_f = (_e = p.summary) == null ? void 0 : _e.balanceB) != null ? _f : 0;
8296
8451
  const difference = (_h = (_g = p.summary) == null ? void 0 : _g.difference) != null ? _h : balanceA - balanceB;
@@ -8936,7 +9091,7 @@ function ChangesView({ changes }) {
8936
9091
  function EventCard({ event }) {
8937
9092
  var _a;
8938
9093
  const { BORDER: BORDER3, MUTED: MUTED2, ACCENT: ACCENT2, SURFACE: SURFACE2 } = useTheme();
8939
- const [showChanges, setShowChanges] = React45.useState(false);
9094
+ const [showChanges, setShowChanges] = React46.useState(false);
8940
9095
  const ac = (_a = actionConfig[event.action]) != null ? _a : actionConfig.commented;
8941
9096
  const hasChanges = event.changes && event.changes.length > 0;
8942
9097
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", gap: "12px", position: "relative" }, children: [
@@ -8994,23 +9149,23 @@ function AuditTrailResolver(p) {
8994
9149
  }
8995
9150
  init_Markdown();
8996
9151
  function useFullscreen(ref) {
8997
- const [isFullscreen, setIsFullscreen] = React45.useState(false);
8998
- React45.useEffect(() => {
9152
+ const [isFullscreen, setIsFullscreen] = React46.useState(false);
9153
+ React46.useEffect(() => {
8999
9154
  const handler = () => {
9000
9155
  setIsFullscreen(!!document.fullscreenElement);
9001
9156
  };
9002
9157
  document.addEventListener("fullscreenchange", handler);
9003
9158
  return () => document.removeEventListener("fullscreenchange", handler);
9004
9159
  }, []);
9005
- const enter = React45.useCallback(() => {
9160
+ const enter = React46.useCallback(() => {
9006
9161
  var _a, _b;
9007
9162
  (_b = (_a = ref.current) == null ? void 0 : _a.requestFullscreen) == null ? void 0 : _b.call(_a);
9008
9163
  }, [ref]);
9009
- const exit = React45.useCallback(() => {
9164
+ const exit = React46.useCallback(() => {
9010
9165
  var _a;
9011
9166
  if (document.fullscreenElement) (_a = document.exitFullscreen) == null ? void 0 : _a.call(document);
9012
9167
  }, []);
9013
- const toggle = React45.useCallback(() => {
9168
+ const toggle = React46.useCallback(() => {
9014
9169
  if (isFullscreen) exit();
9015
9170
  else enter();
9016
9171
  }, [isFullscreen, enter, exit]);
@@ -9020,10 +9175,11 @@ function useFullscreen(ref) {
9020
9175
  // src/composites/document-preview/resolver.tsx
9021
9176
  init_theme();
9022
9177
  init_ThemeContext();
9023
- var PdfViewer2 = React45__default.default.lazy(
9178
+ init_pdfWorkerProbe();
9179
+ var PdfViewer2 = React46__default.default.lazy(
9024
9180
  () => Promise.resolve().then(() => (init_PdfViewer(), PdfViewer_exports)).then((m) => ({ default: m.PdfViewer }))
9025
9181
  );
9026
- var ExcelViewer2 = React45__default.default.lazy(
9182
+ var ExcelViewer2 = React46__default.default.lazy(
9027
9183
  () => Promise.resolve().then(() => (init_ExcelViewer(), ExcelViewer_exports)).then((m) => ({ default: m.ExcelViewer }))
9028
9184
  );
9029
9185
  var highlightColors = {
@@ -9074,8 +9230,8 @@ function DownloadIcon() {
9074
9230
  function DocumentPreviewResolver(p) {
9075
9231
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u;
9076
9232
  const { BORDER: BORDER3, MUTED: MUTED2, PAPER: PAPER2, ACCENT: ACCENT2, SURFACE: SURFACE2, SHADOW: SHADOW2 } = useTheme();
9077
- const [currentPage, setCurrentPage] = React45.useState(0);
9078
- const containerRef = React45.useRef(null);
9233
+ const [currentPage, setCurrentPage] = React46.useState(0);
9234
+ const containerRef = React46.useRef(null);
9079
9235
  const { isFullscreen, toggle } = useFullscreen(containerRef);
9080
9236
  const hasRealFile = !!(((_a = p.source) == null ? void 0 : _a.url) || ((_b = p.source) == null ? void 0 : _b.base64));
9081
9237
  const isPdf = p.documentType === "pdf";
@@ -9083,9 +9239,15 @@ function DocumentPreviewResolver(p) {
9083
9239
  const totalPages = ((_c = p.pages) != null ? _c : []).length;
9084
9240
  const page = p.pages[currentPage];
9085
9241
  const pageHighlights = ((_d = p.highlights) != null ? _d : []).filter((h) => h.pageIndex === currentPage);
9086
- const handlePdfLoad = React45.useCallback(() => {
9242
+ const [pdfFailed, setPdfFailed] = React46.useState(false);
9243
+ const pdfWorkerReady = usePdfWorkerReady(hasRealFile && isPdf);
9244
+ const pdfReady = pdfFailed ? false : pdfWorkerReady;
9245
+ const showPdfViewer = hasRealFile && isPdf && pdfReady === true;
9246
+ const pdfPending = hasRealFile && isPdf && pdfReady === null;
9247
+ const handlePdfLoad = React46.useCallback(() => {
9087
9248
  }, []);
9088
- const handleExcelLoad = React45.useCallback(() => {
9249
+ const handlePdfError = React46.useCallback(() => setPdfFailed(true), []);
9250
+ const handleExcelLoad = React46.useCallback(() => {
9089
9251
  }, []);
9090
9252
  return /* @__PURE__ */ jsxRuntime.jsx(ComponentActions, { filename: (_e = p.title) != null ? _e : "document-preview", children: /* @__PURE__ */ jsxRuntime.jsxs(
9091
9253
  "div",
@@ -9178,7 +9340,7 @@ function DocumentPreviewResolver(p) {
9178
9340
  children: pg.label
9179
9341
  },
9180
9342
  i
9181
- )) }) : !hasRealFile && totalPages > 1 && /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", gap: "8px", padding: "6px 14px", borderLeft: `1px solid ${BORDER3}`, borderRight: `1px solid ${BORDER3}`, background: SURFACE2 }, children: [
9343
+ )) }) : (!hasRealFile || pdfReady === false) && totalPages > 1 && /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", gap: "8px", padding: "6px 14px", borderLeft: `1px solid ${BORDER3}`, borderRight: `1px solid ${BORDER3}`, background: SURFACE2 }, children: [
9182
9344
  /* @__PURE__ */ jsxRuntime.jsx("button", { onClick: () => setCurrentPage(Math.max(0, currentPage - 1)), disabled: currentPage === 0, style: { border: `1px solid ${BORDER3}`, borderRadius: "4px", padding: "2px 8px", background: SURFACE2, cursor: "pointer", fontSize: "12px", color: currentPage === 0 ? BORDER3 : MUTED2 }, children: "\u2190" }),
9183
9345
  /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { fontSize: "12px", color: MUTED2 }, children: [
9184
9346
  currentPage + 1,
@@ -9198,7 +9360,7 @@ function DocumentPreviewResolver(p) {
9198
9360
  display: "flex",
9199
9361
  flexDirection: "column"
9200
9362
  }, children: [
9201
- hasRealFile && isPdf ? /* @__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 }) }) : 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: [
9202
9364
  "No content available for ",
9203
9365
  (_u = page == null ? void 0 : page.label) != null ? _u : "this page"
9204
9366
  ] }),
@@ -9263,7 +9425,7 @@ function ConfidenceBar({ confidence, height = 6 }) {
9263
9425
  function StepCard({ step, isLast }) {
9264
9426
  var _a;
9265
9427
  const { ACCENT: ACCENT2, MUTED: MUTED2, BORDER: BORDER3, SURFACE_MUTED: SURFACE_MUTED2 } = useTheme();
9266
- const [expanded, setExpanded] = React45.useState(false);
9428
+ const [expanded, setExpanded] = React46.useState(false);
9267
9429
  const cfg = stepTypeConfig[step.stepType];
9268
9430
  const detail = (_a = step.detail) != null ? _a : "";
9269
9431
  const isLong = detail.length > 100;
@@ -9772,7 +9934,7 @@ function ExampleRow({ example }) {
9772
9934
  }
9773
9935
  function PartSection({ part, defaultOpen }) {
9774
9936
  const { BORDER: BORDER3, MUTED: MUTED2, SURFACE: SURFACE2 } = useTheme();
9775
- const [open, setOpen] = React45.useState(defaultOpen);
9937
+ const [open, setOpen] = React46.useState(defaultOpen);
9776
9938
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
9777
9939
  /* @__PURE__ */ jsxRuntime.jsxs(
9778
9940
  "button",
@@ -9902,7 +10064,7 @@ function EngagementPipelineResolver(p) {
9902
10064
  const defaultActive = phases.findIndex(
9903
10065
  (ph) => ph.status === "in-progress" || ph.status === "blocked"
9904
10066
  );
9905
- const [activeIdx, setActiveIdx] = React45.useState(defaultActive >= 0 ? defaultActive : 0);
10067
+ const [activeIdx, setActiveIdx] = React46.useState(defaultActive >= 0 ? defaultActive : 0);
9906
10068
  const activePhase = phases[activeIdx];
9907
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: [
9908
10070
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "4px" }, children: [
@@ -9986,7 +10148,7 @@ function EngagementPipelineResolver(p) {
9986
10148
  const color = (_a2 = statusColor2[phase.status]) != null ? _a2 : "#d6d3d1";
9987
10149
  const isCurrent = i === activeIdx;
9988
10150
  const size = isCurrent ? 28 : 20;
9989
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
10151
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
9990
10152
  i > 0 && /* @__PURE__ */ jsxRuntime.jsx(
9991
10153
  "div",
9992
10154
  {
@@ -10294,7 +10456,7 @@ function Avatar({ name, avatar, hovered }) {
10294
10456
  function EntityCardGridResolver(p) {
10295
10457
  var _a, _b;
10296
10458
  const { BORDER: BORDER3, MUTED: MUTED2, ACCENT: ACCENT2, SHADOW: SHADOW2 } = useTheme();
10297
- const [hoveredId, setHoveredId] = React45.useState(null);
10459
+ const [hoveredId, setHoveredId] = React46.useState(null);
10298
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: [
10299
10461
  p.title && /* @__PURE__ */ jsxRuntime.jsx(
10300
10462
  "p",
@@ -10551,7 +10713,7 @@ function StepRow({ step }) {
10551
10713
  function JobTrackerResolver(p) {
10552
10714
  var _a, _b, _c, _d, _e, _f, _g;
10553
10715
  const { BORDER: BORDER3, MUTED: MUTED2, ACCENT: ACCENT2, PAPER: PAPER2, SURFACE: SURFACE2, SURFACE_MUTED: SURFACE_MUTED2, SHADOW: SHADOW2 } = useTheme();
10554
- const [stepsOpen, setStepsOpen] = React45.useState(true);
10716
+ const [stepsOpen, setStepsOpen] = React46.useState(true);
10555
10717
  const barColor = (_a = statusColors[p.status]) != null ? _a : MUTED2;
10556
10718
  const badge = (_b = statusBadgeConfig[p.status]) != null ? _b : statusBadgeConfig.queued;
10557
10719
  const progress = (_c = p.progress) != null ? _c : p.status === "completed" ? 100 : 0;
@@ -10994,7 +11156,7 @@ function CitationCard({
10994
11156
  }
10995
11157
  function FollowUpItem({ text }) {
10996
11158
  const { SECONDARY: SECONDARY2 } = useTheme();
10997
- const [hovered, setHovered] = React45.useState(false);
11159
+ const [hovered, setHovered] = React46.useState(false);
10998
11160
  return /* @__PURE__ */ jsxRuntime.jsxs(
10999
11161
  "span",
11000
11162
  {
@@ -11020,7 +11182,7 @@ function CitationMarker({
11020
11182
  onClick
11021
11183
  }) {
11022
11184
  const { SECONDARY: SECONDARY2 } = useTheme();
11023
- const [hovered, setHovered] = React45.useState(false);
11185
+ const [hovered, setHovered] = React46.useState(false);
11024
11186
  return /* @__PURE__ */ jsxRuntime.jsx(
11025
11187
  "sup",
11026
11188
  {
@@ -11049,7 +11211,7 @@ function CitationMarker({
11049
11211
  function CitedAnswerResolver(p) {
11050
11212
  var _a, _b, _c, _d, _e;
11051
11213
  const { BORDER: BORDER3, MUTED: MUTED2, ACCENT: ACCENT2, SECONDARY: SECONDARY2, SURFACE: SURFACE2, SHADOW: SHADOW2 } = useTheme();
11052
- const [expandedIds, setExpandedIds] = React45.useState(/* @__PURE__ */ new Set());
11214
+ const [expandedIds, setExpandedIds] = React46.useState(/* @__PURE__ */ new Set());
11053
11215
  const toggleCitation = (id) => {
11054
11216
  setExpandedIds((prev) => {
11055
11217
  const next = new Set(prev);
@@ -11354,7 +11516,7 @@ function TransactionFeedResolver(p) {
11354
11516
  var _a, _b, _c, _d, _e;
11355
11517
  const { BORDER: BORDER3, MUTED: MUTED2 } = useTheme();
11356
11518
  const currency = (_a = p.currency) != null ? _a : "USD";
11357
- const [hoveredIndex, setHoveredIndex] = React45.useState(null);
11519
+ const [hoveredIndex, setHoveredIndex] = React46.useState(null);
11358
11520
  const hasBalance = ((_b = p.transactions) != null ? _b : []).some((tx) => tx.balance != null);
11359
11521
  const totalInflows = p.transactions.filter((tx) => tx.amount > 0 && tx.status !== "reversed").reduce((sum, tx) => sum + tx.amount, 0);
11360
11522
  const totalOutflows = p.transactions.filter((tx) => tx.amount < 0 && tx.status !== "reversed").reduce((sum, tx) => sum + tx.amount, 0);
@@ -11512,7 +11674,7 @@ function formatDate2(dateStr) {
11512
11674
  function FileRow({ item }) {
11513
11675
  var _a;
11514
11676
  const { BORDER: BORDER3, MUTED: MUTED2, PAPER: PAPER2, SURFACE: SURFACE2, SECONDARY: SECONDARY2 } = useTheme();
11515
- const [hovered, setHovered] = React45.useState(false);
11677
+ const [hovered, setHovered] = React46.useState(false);
11516
11678
  const cfg = getDocConfig(item.docType);
11517
11679
  return /* @__PURE__ */ jsxRuntime.jsxs(
11518
11680
  "div",
@@ -11589,8 +11751,8 @@ function FileRow({ item }) {
11589
11751
  }
11590
11752
  function GroupSection({ groupName, items }) {
11591
11753
  const { BORDER: BORDER3, MUTED: MUTED2, SURFACE: SURFACE2, SURFACE_MUTED: SURFACE_MUTED2 } = useTheme();
11592
- const [open, setOpen] = React45.useState(true);
11593
- const [headerHovered, setHeaderHovered] = React45.useState(false);
11754
+ const [open, setOpen] = React46.useState(true);
11755
+ const [headerHovered, setHeaderHovered] = React46.useState(false);
11594
11756
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
11595
11757
  /* @__PURE__ */ jsxRuntime.jsxs(
11596
11758
  "button",
@@ -11706,7 +11868,7 @@ init_theme();
11706
11868
  var FAMILIES = [
11707
11869
  { exts: ["csv", "tsv", "xls", "xlsx", "numbers"], fg: SEMANTIC.success.color, bg: SEMANTIC.success.bg },
11708
11870
  { exts: ["pdf"], fg: SEMANTIC.error.color, bg: SEMANTIC.error.bg },
11709
- { 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 },
11710
11872
  { exts: ["json", "yaml", "yml", "xml", "toml"], fg: SEMANTIC.purple.color, bg: SEMANTIC.purple.bg },
11711
11873
  { exts: ["zip", "tar", "gz", "rar", "7z"], fg: SEMANTIC.warning.color, bg: SEMANTIC.warning.bg },
11712
11874
  { exts: ["png", "jpg", "jpeg", "gif", "svg", "webp", "bmp"], fg: SEMANTIC.info.color, bg: SEMANTIC.info.bg }
@@ -11733,7 +11895,9 @@ var PREVIEW_EXTS = {
11733
11895
  txt: "text",
11734
11896
  log: "text",
11735
11897
  text: "text",
11736
- docx: "docx"
11898
+ docx: "docx",
11899
+ html: "html",
11900
+ htm: "html"
11737
11901
  };
11738
11902
  function extOf(fileType, filename) {
11739
11903
  var _a;
@@ -11744,6 +11908,7 @@ function extOf(fileType, filename) {
11744
11908
  if (mime.includes("csv")) return "csv";
11745
11909
  if (mime.includes("markdown")) return "md";
11746
11910
  if (mime.includes("wordprocessing") || mime.includes("msword")) return "docx";
11911
+ if (mime.includes("html")) return "html";
11747
11912
  if (mime.startsWith("text/")) return "txt";
11748
11913
  } else if (fileType) {
11749
11914
  const t = fileType.toLowerCase().replace(/[^a-z0-9]/g, "");
@@ -11777,17 +11942,32 @@ function isExpirySoon(expiresAt) {
11777
11942
 
11778
11943
  // src/shared/viewers/PreviewHost.tsx
11779
11944
  init_ThemeContext();
11780
- var PdfViewer3 = React45.lazy(
11945
+ init_pdfWorkerProbe();
11946
+ var PdfViewer3 = React46.lazy(
11781
11947
  () => Promise.resolve().then(() => (init_PdfViewer(), PdfViewer_exports)).then((m) => ({ default: m.PdfViewer }))
11782
11948
  );
11783
- var ExcelViewer3 = React45.lazy(
11949
+ var ExcelViewer3 = React46.lazy(
11784
11950
  () => Promise.resolve().then(() => (init_ExcelViewer(), ExcelViewer_exports)).then((m) => ({ default: m.ExcelViewer }))
11785
11951
  );
11786
- var CsvViewer2 = React45.lazy(() => Promise.resolve().then(() => (init_CsvViewer(), CsvViewer_exports)).then((m) => ({ default: m.CsvViewer })));
11787
- var TextViewer2 = React45.lazy(() => Promise.resolve().then(() => (init_TextViewer(), TextViewer_exports)).then((m) => ({ default: m.TextViewer })));
11788
- 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 })));
11789
11956
  var PEEK_ROWS = 20;
11790
11957
  var PEEK_LINES = 40;
11958
+ function GatedPdfViewer({ source }) {
11959
+ const { MUTED: MUTED2 } = useTheme();
11960
+ const [failed, setFailed] = React46.useState(false);
11961
+ const workerReady = usePdfWorkerReady(true);
11962
+ const ready = failed ? false : workerReady;
11963
+ if (ready === null) {
11964
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { padding: "24px", color: MUTED2, fontSize: "13px", textAlign: "center" }, children: "Loading preview\u2026" });
11965
+ }
11966
+ if (ready === false) {
11967
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { padding: "24px", color: MUTED2, fontSize: "13px", textAlign: "center" }, children: "Preview unavailable \u2014 download the file to view it." });
11968
+ }
11969
+ return /* @__PURE__ */ jsxRuntime.jsx(PdfViewer3, { url: source.url, base64: source.base64, onLoadError: () => setFailed(true) });
11970
+ }
11791
11971
  function PreviewHost({ kind, source, mode = "full" }) {
11792
11972
  const { MUTED: MUTED2 } = useTheme();
11793
11973
  const peek = mode === "peek";
@@ -11795,7 +11975,7 @@ function PreviewHost({ kind, source, mode = "full" }) {
11795
11975
  let viewer = null;
11796
11976
  switch (kind) {
11797
11977
  case "pdf":
11798
- viewer = /* @__PURE__ */ jsxRuntime.jsx(PdfViewer3, { url: source.url, base64: source.base64 });
11978
+ viewer = /* @__PURE__ */ jsxRuntime.jsx(GatedPdfViewer, { source });
11799
11979
  break;
11800
11980
  case "excel":
11801
11981
  viewer = /* @__PURE__ */ jsxRuntime.jsx(ExcelViewer3, { url: source.url, base64: source.base64 });
@@ -11812,10 +11992,13 @@ function PreviewHost({ kind, source, mode = "full" }) {
11812
11992
  case "docx":
11813
11993
  viewer = /* @__PURE__ */ jsxRuntime.jsx(DocxViewer2, { url: source.url, base64: source.base64 });
11814
11994
  break;
11995
+ case "html":
11996
+ viewer = /* @__PURE__ */ jsxRuntime.jsx(HtmlViewer2, { url: source.url, base64: source.base64, height: peek ? 240 : 480 });
11997
+ break;
11815
11998
  default:
11816
11999
  return null;
11817
12000
  }
11818
- return /* @__PURE__ */ jsxRuntime.jsx(React45.Suspense, { fallback, children: viewer });
12001
+ return /* @__PURE__ */ jsxRuntime.jsx(React46.Suspense, { fallback, children: viewer });
11819
12002
  }
11820
12003
 
11821
12004
  // src/shared/PreviewModal.tsx
@@ -11831,7 +12014,7 @@ function PreviewModal({
11831
12014
  onDownload
11832
12015
  }) {
11833
12016
  const { BORDER: BORDER3, MUTED: MUTED2, ACCENT: ACCENT2, SURFACE: SURFACE2, FOREGROUND: FOREGROUND2, SCRIM: SCRIM2 } = useTheme();
11834
- React45.useEffect(() => {
12017
+ React46.useEffect(() => {
11835
12018
  if (!open) return;
11836
12019
  const onKey = (e) => {
11837
12020
  if (e.key === "Escape") onClose();
@@ -12008,17 +12191,17 @@ function FileCard({
12008
12191
  previewDisabled = false
12009
12192
  }) {
12010
12193
  const { BORDER: BORDER3, MUTED: MUTED2, ACCENT: ACCENT2, SURFACE: SURFACE2, SURFACE_MUTED: SURFACE_MUTED2, SHADOW: SHADOW2 } = useTheme();
12011
- const [cardHover, setCardHover] = React45.useState(false);
12012
- const [btnHover, setBtnHover] = React45.useState(false);
12013
- 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);
12014
12197
  const previewKind = previewKindFor(fileType, filename);
12015
12198
  const canPreview = !previewDisabled && previewKind !== null && (!!previewUrl || !!fetchPreviewBlob);
12016
- const [peekOpen, setPeekOpen] = React45.useState(false);
12017
- const [modalOpen, setModalOpen] = React45.useState(false);
12018
- const [source, setSource] = React45.useState(previewUrl ? { url: previewUrl } : null);
12019
- const [pvLoading, setPvLoading] = React45.useState(false);
12020
- const [pvError, setPvError] = React45.useState(null);
12021
- 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 () => {
12022
12205
  if (source) return source;
12023
12206
  if (previewUrl) {
12024
12207
  const s = { url: previewUrl };
@@ -12040,7 +12223,7 @@ function FileCard({
12040
12223
  setPvLoading(false);
12041
12224
  }
12042
12225
  }, [source, previewUrl, fetchPreviewBlob]);
12043
- const togglePeek = React45.useCallback(async () => {
12226
+ const togglePeek = React46.useCallback(async () => {
12044
12227
  if (peekOpen) {
12045
12228
  setPeekOpen(false);
12046
12229
  return;
@@ -12048,7 +12231,7 @@ function FileCard({
12048
12231
  setPeekOpen(true);
12049
12232
  await ensureSource();
12050
12233
  }, [peekOpen, ensureSource]);
12051
- const openModal = React45.useCallback(async () => {
12234
+ const openModal = React46.useCallback(async () => {
12052
12235
  const s = await ensureSource();
12053
12236
  if (s) setModalOpen(true);
12054
12237
  }, [ensureSource]);
@@ -12163,7 +12346,7 @@ function FileCard({
12163
12346
  whiteSpace: "nowrap"
12164
12347
  },
12165
12348
  children: [
12166
- 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: [
12167
12350
  i > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: MUTED2 }, children: "\xB7" }),
12168
12351
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: t })
12169
12352
  ] }, i)),
@@ -12508,7 +12691,7 @@ function ServiceCard({ item, isHovered, onHover, onLeave: onLeave2 }) {
12508
12691
  function OpsDashboardResolver(p) {
12509
12692
  var _a, _b, _c;
12510
12693
  const { BORDER: BORDER3, MUTED: MUTED2 } = useTheme();
12511
- const [hoveredId, setHoveredId] = React45.useState(null);
12694
+ const [hoveredId, setHoveredId] = React46.useState(null);
12512
12695
  const hasRunning = ((_a = p.items) != null ? _a : []).some((item) => item.state === "running");
12513
12696
  return /* @__PURE__ */ jsxRuntime.jsxs(ComponentActions, { filename: (_b = p.title) != null ? _b : "ops-dashboard", children: [
12514
12697
  hasRunning && /* @__PURE__ */ jsxRuntime.jsx("style", { children: PULSE_KEYFRAMES }),
@@ -12562,8 +12745,8 @@ function formatDate3(value) {
12562
12745
  }
12563
12746
  function CopyButton({ value, rowHovered }) {
12564
12747
  const { MUTED: MUTED2 } = useTheme();
12565
- const [copied, setCopied] = React45.useState(false);
12566
- const [btnHovered, setBtnHovered] = React45.useState(false);
12748
+ const [copied, setCopied] = React46.useState(false);
12749
+ const [btnHovered, setBtnHovered] = React46.useState(false);
12567
12750
  const handleCopy = () => {
12568
12751
  navigator.clipboard.writeText(value).then(() => {
12569
12752
  setCopied(true);
@@ -12657,7 +12840,7 @@ function ValueCell({ item }) {
12657
12840
  }
12658
12841
  function KVRow({ item, isLast, index }) {
12659
12842
  const { MUTED: MUTED2, BORDER: BORDER3, SURFACE: SURFACE2, SURFACE_MUTED: SURFACE_MUTED2 } = useTheme();
12660
- const [hovered, setHovered] = React45.useState(false);
12843
+ const [hovered, setHovered] = React46.useState(false);
12661
12844
  const altBg = index % 2 === 1 ? SURFACE_MUTED2 : SURFACE2;
12662
12845
  return /* @__PURE__ */ jsxRuntime.jsxs(
12663
12846
  "div",
@@ -12742,7 +12925,7 @@ function KeyValueListResolver(p) {
12742
12925
  var _a3;
12743
12926
  return sum + ((_a3 = g.items) != null ? _a3 : []).length;
12744
12927
  }, 0);
12745
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
12928
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
12746
12929
  /* @__PURE__ */ jsxRuntime.jsxs(
12747
12930
  "div",
12748
12931
  {
@@ -12920,7 +13103,7 @@ function BalanceSheetResolver(p) {
12920
13103
  /* @__PURE__ */ jsxRuntime.jsxs("tbody", { children: [
12921
13104
  ((_p = p.sections) != null ? _p : []).map((section) => {
12922
13105
  var _a2;
12923
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
13106
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
12924
13107
  /* @__PURE__ */ jsxRuntime.jsx("tr", { children: /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan, style: {
12925
13108
  padding: "8px 12px",
12926
13109
  fontSize: "12px",
@@ -12933,7 +13116,7 @@ function BalanceSheetResolver(p) {
12933
13116
  }, children: (_a2 = categoryLabels2[section.category]) != null ? _a2 : section.category }) }),
12934
13117
  section.subsections.map((sub, si) => {
12935
13118
  var _a3;
12936
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
13119
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
12937
13120
  /* @__PURE__ */ jsxRuntime.jsx("tr", { children: /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan, style: {
12938
13121
  padding: "6px 10px 6px 24px",
12939
13122
  fontSize: "12px",
@@ -13109,7 +13292,7 @@ function IncomeStatementResolver(p) {
13109
13292
  textAlign: "left",
13110
13293
  whiteSpace: "nowrap"
13111
13294
  }, children: "\xA0" }),
13112
- periods.map((period) => /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
13295
+ periods.map((period) => /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
13113
13296
  /* @__PURE__ */ jsxRuntime.jsx("th", { style: {
13114
13297
  fontSize: "11px",
13115
13298
  fontWeight: 500,
@@ -13140,7 +13323,7 @@ function IncomeStatementResolver(p) {
13140
13323
  sections.map((section, si) => {
13141
13324
  var _a2;
13142
13325
  const isSubtotal = section.sectionType === "subtotal";
13143
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
13326
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
13144
13327
  /* @__PURE__ */ jsxRuntime.jsx("tr", { children: /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan: colCount, style: {
13145
13328
  padding: "8px 12px",
13146
13329
  fontSize: "12px",
@@ -13171,7 +13354,7 @@ function IncomeStatementResolver(p) {
13171
13354
  var _a4;
13172
13355
  const val = (_a4 = amounts[pi]) != null ? _a4 : 0;
13173
13356
  const isNeg = val < 0;
13174
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
13357
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
13175
13358
  /* @__PURE__ */ jsxRuntime.jsx("td", { style: {
13176
13359
  padding: "6px 10px",
13177
13360
  fontSize: "13px",
@@ -13206,7 +13389,7 @@ function IncomeStatementResolver(p) {
13206
13389
  var _a2;
13207
13390
  const val = (_a2 = grossProfit[pi]) != null ? _a2 : 0;
13208
13391
  const isNeg = val < 0;
13209
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
13392
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
13210
13393
  /* @__PURE__ */ jsxRuntime.jsx("td", { style: {
13211
13394
  padding: "8px 10px",
13212
13395
  fontSize: "12px",
@@ -13241,7 +13424,7 @@ function IncomeStatementResolver(p) {
13241
13424
  var _a2;
13242
13425
  const val = (_a2 = operatingIncome[pi]) != null ? _a2 : 0;
13243
13426
  const isNeg = val < 0;
13244
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
13427
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
13245
13428
  /* @__PURE__ */ jsxRuntime.jsx("td", { style: {
13246
13429
  padding: "8px 10px",
13247
13430
  fontSize: "12px",
@@ -13275,7 +13458,7 @@ function IncomeStatementResolver(p) {
13275
13458
  var _a2;
13276
13459
  const val = (_a2 = netIncome[pi]) != null ? _a2 : 0;
13277
13460
  const isNeg = val < 0;
13278
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
13461
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
13279
13462
  /* @__PURE__ */ jsxRuntime.jsx("td", { style: {
13280
13463
  padding: "10px 10px",
13281
13464
  fontSize: "13px",
@@ -13495,7 +13678,7 @@ function CashFlowStatementResolver(p) {
13495
13678
  /* @__PURE__ */ jsxRuntime.jsxs("tbody", { children: [
13496
13679
  activities.map((activity, ai) => {
13497
13680
  var _a2, _b2, _c2;
13498
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
13681
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
13499
13682
  ai > 0 && /* @__PURE__ */ jsxRuntime.jsx("tr", { children: /* @__PURE__ */ jsxRuntime.jsx(
13500
13683
  "td",
13501
13684
  {
@@ -15909,8 +16092,8 @@ var PRIORITY_STYLES = {
15909
16092
  function EscalationCardResolver(p) {
15910
16093
  var _a, _b, _c, _d, _e;
15911
16094
  const { BORDER: BORDER3, MUTED: MUTED2, ACCENT: ACCENT2, ACCENT_SOFT: ACCENT_SOFT2, SHADOW: SHADOW2 } = useTheme();
15912
- const [cardHovered, setCardHovered] = React45.useState(false);
15913
- const [btnHovered, setBtnHovered] = React45.useState(false);
16095
+ const [cardHovered, setCardHovered] = React46.useState(false);
16096
+ const [btnHovered, setBtnHovered] = React46.useState(false);
15914
16097
  const priorityStyle = p.priority ? PRIORITY_STYLES[p.priority] : null;
15915
16098
  const railColor = (_a = priorityStyle == null ? void 0 : priorityStyle.color) != null ? _a : ACCENT2;
15916
16099
  const iconBg = (_b = priorityStyle == null ? void 0 : priorityStyle.bg) != null ? _b : "#fff2ec";
@@ -16782,9 +16965,9 @@ var CONNECTED_GREEN = "#15803d";
16782
16965
  function ConnectIntegrationResolver(p) {
16783
16966
  var _a;
16784
16967
  const { BORDER: BORDER3, MUTED: MUTED2, ACCENT: ACCENT2, ACCENT_SOFT: ACCENT_SOFT2, PAPER: PAPER2, SURFACE: SURFACE2, SHADOW: SHADOW2 } = useTheme();
16785
- const [cardHovered, setCardHovered] = React45.useState(false);
16786
- const [btnHovered, setBtnHovered] = React45.useState(false);
16787
- 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);
16788
16971
  const name = (p.integrationName || "Integration").trim();
16789
16972
  const initial = name.charAt(0).toUpperCase();
16790
16973
  const iconSrc = p.iconUrl || brandIconUrl(name);
@@ -16946,9 +17129,9 @@ function IntegrationsListResolver(p) {
16946
17129
  var _a, _b;
16947
17130
  const { BORDER: BORDER3, MUTED: MUTED2, PAPER: PAPER2, ACCENT: ACCENT2, ACCENT_SOFT: ACCENT_SOFT2, SURFACE: SURFACE2, SHADOW: SHADOW2 } = useTheme();
16948
17131
  const integrations = Array.isArray(p.integrations) ? p.integrations : [];
16949
- const [rowHover, setRowHover] = React45.useState(null);
16950
- const [btnHover, setBtnHover] = React45.useState(null);
16951
- 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({});
16952
17135
  const connectedCount = integrations.filter((i) => i.status === "connected").length;
16953
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: [
16954
17137
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "2px" }, children: [
@@ -17440,13 +17623,13 @@ var ellipsis = {
17440
17623
  function PipelinePreviewResolver(p) {
17441
17624
  var _a, _b, _c, _d, _e, _f, _g;
17442
17625
  const { MUTED: MUTED2, PAPER: PAPER2, BORDER: BORDER3, ACCENT: ACCENT2, ACCENT_SOFT: ACCENT_SOFT2, SURFACE: SURFACE2 } = useTheme();
17443
- const [btnHovered, setBtnHovered] = React45.useState(false);
17626
+ const [btnHovered, setBtnHovered] = React46.useState(false);
17444
17627
  const stateCfg = STATE_CONFIG[(_a = p.state) != null ? _a : "draft"];
17445
17628
  const destinations = (_b = p.destinations) != null ? _b : [];
17446
17629
  const steps = (_c = p.steps) != null ? _c : [];
17447
17630
  const workstreams = (_d = p.workstreams) != null ? _d : [];
17448
17631
  const scheduleLabel = p.schedule ? p.schedule.type === "manual" ? "Manual" : (_f = (_e = p.schedule.label) != null ? _e : p.schedule.cron) != null ? _f : "Scheduled" : null;
17449
- const { nodes, edges, viewBox, vbW, vbH } = React45.useMemo(() => {
17632
+ const { nodes, edges, viewBox, vbW, vbH } = React46.useMemo(() => {
17450
17633
  const res = layoutGraph(steps);
17451
17634
  const b = layoutBounds(res.nodes);
17452
17635
  const pad = 24;
@@ -17460,7 +17643,7 @@ function PipelinePreviewResolver(p) {
17460
17643
  vbH: h
17461
17644
  };
17462
17645
  }, [steps]);
17463
- const nodeMap = React45.useMemo(() => {
17646
+ const nodeMap = React46.useMemo(() => {
17464
17647
  const m = {};
17465
17648
  nodes.forEach((n) => m[n.id] = n);
17466
17649
  return m;
@@ -17838,9 +18021,9 @@ var DEFAULT_INTERACTION = {
17838
18021
  onDecisionSource: void 0,
17839
18022
  onDecisionQueueSubmit: void 0
17840
18023
  };
17841
- var GenUIInteractionContext = React45.createContext(DEFAULT_INTERACTION);
18024
+ var GenUIInteractionContext = React46.createContext(DEFAULT_INTERACTION);
17842
18025
  function useGenUIInteraction() {
17843
- return React45.useContext(GenUIInteractionContext);
18026
+ return React46.useContext(GenUIInteractionContext);
17844
18027
  }
17845
18028
  var STATUS_COLORS3 = {
17846
18029
  done: "#15803d",
@@ -18032,8 +18215,8 @@ var CARD_MIN = 132;
18032
18215
  var CARD_GAP = 16;
18033
18216
  var AUTO_COMPACT_BELOW = 360;
18034
18217
  function useContainerWidth(ref) {
18035
- const [w, setW] = React45__default.default.useState(0);
18036
- React45__default.default.useLayoutEffect(() => {
18218
+ const [w, setW] = React46__default.default.useState(0);
18219
+ React46__default.default.useLayoutEffect(() => {
18037
18220
  const el = ref.current;
18038
18221
  if (!el || typeof ResizeObserver === "undefined") return;
18039
18222
  const ro = new ResizeObserver((entries) => {
@@ -18136,15 +18319,15 @@ function WorkflowStepperRenderer({
18136
18319
  const interactive = typeof onSelectStep === "function";
18137
18320
  const statusColor3 = (s) => s === "active" || s === "running" ? ACCENT2 : STATUS_COLORS3[s];
18138
18321
  const doneCount = steps.filter((s) => s.status === "done").length;
18139
- const rootRef = React45__default.default.useRef(null);
18322
+ const rootRef = React46__default.default.useRef(null);
18140
18323
  const containerW = useContainerWidth(rootRef);
18141
18324
  let resolved = density === "auto" ? "full" : density;
18142
18325
  if (density === "auto" && containerW > 0) {
18143
18326
  const needed = steps.length * CARD_MIN + Math.max(0, steps.length - 1) * CARD_GAP;
18144
18327
  resolved = containerW < AUTO_COMPACT_BELOW || needed > containerW * 1.6 ? "compact" : "full";
18145
18328
  }
18146
- const scrollerRef = React45__default.default.useRef(null);
18147
- React45__default.default.useEffect(() => {
18329
+ const scrollerRef = React46__default.default.useRef(null);
18330
+ React46__default.default.useEffect(() => {
18148
18331
  if (resolved !== "full" || loading) return;
18149
18332
  const sc = scrollerRef.current;
18150
18333
  if (!sc) return;
@@ -18155,11 +18338,11 @@ function WorkflowStepperRenderer({
18155
18338
  el.scrollIntoView({ inline: "center", block: "nearest", behavior: "smooth" });
18156
18339
  }
18157
18340
  }, [resolved, loading, selectedStep, activeStepId]);
18158
- const [edges, setEdges] = React45__default.default.useState({
18341
+ const [edges, setEdges] = React46__default.default.useState({
18159
18342
  left: false,
18160
18343
  right: false
18161
18344
  });
18162
- const updateEdges = React45__default.default.useCallback(() => {
18345
+ const updateEdges = React46__default.default.useCallback(() => {
18163
18346
  const sc = scrollerRef.current;
18164
18347
  if (!sc) return;
18165
18348
  const max = sc.scrollWidth - sc.clientWidth;
@@ -18168,7 +18351,7 @@ function WorkflowStepperRenderer({
18168
18351
  const right = sl < max - 1;
18169
18352
  setEdges((prev) => prev.left === left && prev.right === right ? prev : { left, right });
18170
18353
  }, []);
18171
- React45__default.default.useLayoutEffect(() => {
18354
+ React46__default.default.useLayoutEffect(() => {
18172
18355
  if (resolved !== "full" || loading) return;
18173
18356
  updateEdges();
18174
18357
  const sc = scrollerRef.current;
@@ -18224,7 +18407,7 @@ function WorkflowStepperRenderer({
18224
18407
  const reached = s.status !== "pending";
18225
18408
  const clickable = interactive && reached;
18226
18409
  const size = act ? 11 : done ? 9 : 8;
18227
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
18410
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
18228
18411
  i > 0 && /* @__PURE__ */ jsxRuntime.jsx(
18229
18412
  "span",
18230
18413
  {
@@ -18368,7 +18551,7 @@ function WorkflowStepperRenderer({
18368
18551
  const color = statusColor3(step.status);
18369
18552
  const humans = ((_a2 = step.assignees) != null ? _a2 : []).filter((a) => a.kind === "human");
18370
18553
  const roleCaption = humans.map((h) => h.role).filter(Boolean).slice(0, 2).join(" \xB7 ");
18371
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
18554
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
18372
18555
  i > 0 && /* @__PURE__ */ jsxRuntime.jsx(
18373
18556
  "div",
18374
18557
  {
@@ -18734,11 +18917,11 @@ function FieldDetail({
18734
18917
  }) {
18735
18918
  var _a, _b, _c, _d;
18736
18919
  const { BORDER: BORDER3, MUTED: MUTED2, PAPER: PAPER2, SECONDARY: SECONDARY2, SURFACE: SURFACE2, ACCENT: ACCENT2 } = useTheme();
18737
- const [editing, setEditing] = React45__default.default.useState(false);
18738
- const [draft, setDraft] = React45__default.default.useState("");
18739
- const [saving, setSaving] = React45__default.default.useState(false);
18740
- const [saveError, setSaveError] = React45__default.default.useState(null);
18741
- 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);
18742
18925
  const color = fieldColor(field, SECONDARY2);
18743
18926
  const corrected = field.state === "corrected";
18744
18927
  const startEdit = (e) => {
@@ -19248,7 +19431,7 @@ function FieldDetails({
19248
19431
  },
19249
19432
  children: facts.map((f) => {
19250
19433
  var _a2;
19251
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
19434
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
19252
19435
  /* @__PURE__ */ jsxRuntime.jsx("dt", { style: { fontSize: "12px", color: MUTED2 }, children: f.label }),
19253
19436
  /* @__PURE__ */ jsxRuntime.jsxs(
19254
19437
  "dd",
@@ -19347,7 +19530,7 @@ function FieldAuditLog({
19347
19530
  fields = []
19348
19531
  }) {
19349
19532
  const { BORDER: BORDER3, MUTED: MUTED2, PAPER: PAPER2, SECONDARY: SECONDARY2 } = useTheme();
19350
- const fieldLabelMap = React45__default.default.useMemo(() => {
19533
+ const fieldLabelMap = React46__default.default.useMemo(() => {
19351
19534
  var _a;
19352
19535
  const map = {};
19353
19536
  for (const f of fields) map[f.field_key] = (_a = f.label) != null ? _a : f.field_key;
@@ -19546,10 +19729,10 @@ function PageOverlay({
19546
19729
  secondary
19547
19730
  }) {
19548
19731
  const { PAPER: PAPER2, MUTED: MUTED2 } = useTheme();
19549
- const imgRef = React45__default.default.useRef(null);
19550
- const selectedBoxRef = React45__default.default.useRef(null);
19551
- const [px, setPx] = React45__default.default.useState(null);
19552
- 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(() => {
19553
19736
  const el = imgRef.current;
19554
19737
  if (!el) return;
19555
19738
  const measure = () => {
@@ -19563,7 +19746,7 @@ function PageOverlay({
19563
19746
  ro.observe(el);
19564
19747
  return () => ro.disconnect();
19565
19748
  }, [page.imageUrl]);
19566
- React45__default.default.useEffect(() => {
19749
+ React46__default.default.useEffect(() => {
19567
19750
  if (!selectedKey) return;
19568
19751
  if (!fields.some((f) => f.field_key === selectedKey && f.bbox)) return;
19569
19752
  const el = selectedBoxRef.current;
@@ -19665,8 +19848,8 @@ function ExtractionDetail({
19665
19848
  auditLoading
19666
19849
  }) {
19667
19850
  const { BORDER: BORDER3, MUTED: MUTED2, PAPER: PAPER2, SECONDARY: SECONDARY2 } = useTheme();
19668
- const selectedCardRef = React45__default.default.useRef(null);
19669
- React45__default.default.useEffect(() => {
19851
+ const selectedCardRef = React46__default.default.useRef(null);
19852
+ React46__default.default.useEffect(() => {
19670
19853
  if (!selectedKey || tab !== "fields") return;
19671
19854
  const el = selectedCardRef.current;
19672
19855
  if (el && typeof el.scrollIntoView === "function") {
@@ -19837,7 +20020,7 @@ function ExtractionModal({
19837
20020
  children
19838
20021
  }) {
19839
20022
  const { BORDER: BORDER3, MUTED: MUTED2, SURFACE: SURFACE2, FOREGROUND: FOREGROUND2, SCRIM: SCRIM2 } = useTheme();
19840
- React45__default.default.useEffect(() => {
20023
+ React46__default.default.useEffect(() => {
19841
20024
  if (!open) return;
19842
20025
  const onKey = (e) => {
19843
20026
  if (e.key === "Escape") onClose();
@@ -19966,19 +20149,19 @@ function ExtractionModal({
19966
20149
  function DocumentFieldExtractionResolver(p) {
19967
20150
  var _a, _b;
19968
20151
  const { BORDER: BORDER3, MUTED: MUTED2, PAPER: PAPER2, SURFACE: SURFACE2, SHADOW: SHADOW2, ACCENT: ACCENT2 } = useTheme();
19969
- const [selectedKey, setSelectedKey] = React45__default.default.useState(null);
19970
- const [open, setOpen] = React45__default.default.useState(false);
19971
- 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");
19972
20155
  const pages = (_a = p.pages) != null ? _a : [];
19973
20156
  const fields = (_b = p.fields) != null ? _b : [];
19974
20157
  const editable = typeof p.onFieldSave === "function";
19975
20158
  const onLoadAudit = p.onLoadAudit;
19976
- React45__default.default.useEffect(() => {
20159
+ React46__default.default.useEffect(() => {
19977
20160
  if (tab === "audit" && onLoadAudit) {
19978
20161
  onLoadAudit();
19979
20162
  }
19980
20163
  }, [tab, onLoadAudit]);
19981
- const correctionCounts = React45__default.default.useMemo(() => {
20164
+ const correctionCounts = React46__default.default.useMemo(() => {
19982
20165
  var _a2, _b2;
19983
20166
  const counts = {};
19984
20167
  for (const ev of (_a2 = p.auditEvents) != null ? _a2 : []) {
@@ -20224,8 +20407,8 @@ function formatAmount2(amount, currency = "USD") {
20224
20407
  return `${sign}${symbol}${body}`;
20225
20408
  }
20226
20409
  function useContainerWidth2(ref) {
20227
- const [w, setW] = React45__default.default.useState(0);
20228
- React45__default.default.useLayoutEffect(() => {
20410
+ const [w, setW] = React46__default.default.useState(0);
20411
+ React46__default.default.useLayoutEffect(() => {
20229
20412
  const el = ref.current;
20230
20413
  if (!el || typeof ResizeObserver === "undefined") return;
20231
20414
  const ro = new ResizeObserver((entries) => {
@@ -20320,8 +20503,8 @@ function ValueAdjuster({
20320
20503
  const { SURFACE_MUTED: SURFACE_MUTED2 } = useTheme();
20321
20504
  const adjust = option.adjust;
20322
20505
  const suggested = clampToRange((_a = option.value) != null ? _a : adjust.min, adjust);
20323
- const [value, setValue] = React45__default.default.useState(suggested);
20324
- 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));
20325
20508
  const step = (_b = adjust.step) != null ? _b : Number.isInteger(adjust.min) && Number.isInteger(adjust.max) ? 1 : (adjust.max - adjust.min) / 100;
20326
20509
  const pct = adjust.max > adjust.min ? (value - adjust.min) / (adjust.max - adjust.min) * 100 : 0;
20327
20510
  const suggestedPct = adjust.max > adjust.min ? (suggested - adjust.min) / (adjust.max - adjust.min) * 100 : 0;
@@ -20527,10 +20710,10 @@ function DecisionCardRenderer({
20527
20710
  }) {
20528
20711
  var _a, _b, _c;
20529
20712
  const { BORDER: BORDER3, MUTED: MUTED2, ACCENT: ACCENT2, ACCENT_SOFT: ACCENT_SOFT2, SURFACE: SURFACE2, SURFACE_MUTED: SURFACE_MUTED2, SHADOW: SHADOW2 } = useTheme();
20530
- const rootRef = React45__default.default.useRef(null);
20713
+ const rootRef = React46__default.default.useRef(null);
20531
20714
  const width = useContainerWidth2(rootRef);
20532
20715
  const stacked = width > 0 && width < STACK_BELOW;
20533
- const [adjustingIdx, setAdjustingIdx] = React45__default.default.useState(null);
20716
+ const [adjustingIdx, setAdjustingIdx] = React46__default.default.useState(null);
20534
20717
  const options = (_a = data.options) != null ? _a : [];
20535
20718
  const recommendedIdx = Math.max(
20536
20719
  0,
@@ -20831,8 +21014,8 @@ function DecisionCardResolver(p) {
20831
21014
  const decisionId = (_a = p.id) != null ? _a : p.title;
20832
21015
  const hostResolved = resolvedDecisions == null ? void 0 : resolvedDecisions[decisionId];
20833
21016
  const initial = hostResolved != null ? hostResolved : p.resolved ? composeResolution(p, p.resolved.option, p.resolved.value) : null;
20834
- const [localResolved, setLocalResolved] = React45__default.default.useState(initial);
20835
- React45__default.default.useEffect(() => {
21017
+ const [localResolved, setLocalResolved] = React46__default.default.useState(initial);
21018
+ React46__default.default.useEffect(() => {
20836
21019
  if (hostResolved !== void 0) setLocalResolved(hostResolved);
20837
21020
  }, [hostResolved]);
20838
21021
  const resolved = hostResolved != null ? hostResolved : localResolved;
@@ -20906,11 +21089,11 @@ function DecisionQueueRenderer({
20906
21089
  var _a;
20907
21090
  const { BORDER: BORDER3, MUTED: MUTED2, ACCENT: ACCENT2, SURFACE: SURFACE2, SURFACE_MUTED: SURFACE_MUTED2, BORDER_SOFT: BORDER_SOFT2, PAPER: PAPER2, SHADOW: SHADOW2 } = useTheme();
20908
21091
  const items = (_a = data.items) != null ? _a : [];
20909
- const [decisions, setDecisions] = React45__default.default.useState(
21092
+ const [decisions, setDecisions] = React46__default.default.useState(
20910
21093
  () => items.map(() => void 0)
20911
21094
  );
20912
21095
  const firstUndecided = decisions.findIndex((d) => !d);
20913
- const [focusIdx, setFocusIdx] = React45__default.default.useState(firstUndecided >= 0 ? firstUndecided : null);
21096
+ const [focusIdx, setFocusIdx] = React46__default.default.useState(firstUndecided >= 0 ? firstUndecided : null);
20914
21097
  const isSubmitted = submitted != null;
20915
21098
  const shown = isSubmitted ? items.map(
20916
21099
  (item, i) => {
@@ -20935,16 +21118,16 @@ function DecisionQueueRenderer({
20935
21118
  const final = decisions;
20936
21119
  onSubmit == null ? void 0 : onSubmit(final, composeQueueMessage(items, final));
20937
21120
  };
20938
- const onReadyRef = React45__default.default.useRef(onReady);
20939
- React45__default.default.useEffect(() => {
21121
+ const onReadyRef = React46__default.default.useRef(onReady);
21122
+ React46__default.default.useEffect(() => {
20940
21123
  onReadyRef.current = onReady;
20941
21124
  });
20942
- React45__default.default.useEffect(() => {
21125
+ React46__default.default.useEffect(() => {
20943
21126
  if (!onReadyRef.current) return;
20944
21127
  const msg = allDecided ? composeQueueMessage(items, decisions) : null;
20945
21128
  onReadyRef.current(allDecided && !isSubmitted, msg, decisions.filter(Boolean));
20946
21129
  }, [decisions, allDecided, isSubmitted]);
20947
- React45__default.default.useEffect(() => {
21130
+ React46__default.default.useEffect(() => {
20948
21131
  if (!submitRef) return;
20949
21132
  submitRef.current = handleSubmit;
20950
21133
  return () => {
@@ -21169,7 +21352,7 @@ function DecisionQueueResolver(p) {
21169
21352
  const { resolvedDecisions, onDecisionQueueSubmit } = useGenUIInteraction();
21170
21353
  const queueId = (_b = (_a = p.id) != null ? _a : p.title) != null ? _b : "decision-queue";
21171
21354
  const replayed = (_d = (_c = p.resolved) == null ? void 0 : _c.decisions) != null ? _d : null;
21172
- const [localSubmitted, setLocalSubmitted] = React45__default.default.useState(null);
21355
+ const [localSubmitted, setLocalSubmitted] = React46__default.default.useState(null);
21173
21356
  const hostLocked = (resolvedDecisions == null ? void 0 : resolvedDecisions[queueId]) != null;
21174
21357
  const submitted = (_e = replayed != null ? replayed : localSubmitted) != null ? _e : hostLocked ? [] : null;
21175
21358
  const handleSubmit = (decisions, message) => {
@@ -21247,9 +21430,9 @@ function ExternalIcon() {
21247
21430
  function TabbyAuthResolver(p) {
21248
21431
  var _a, _b, _c;
21249
21432
  const { BORDER: BORDER3, MUTED: MUTED2, ACCENT: ACCENT2, ACCENT_SOFT: ACCENT_SOFT2, SURFACE: SURFACE2, SURFACE_MUTED: SURFACE_MUTED2, SHADOW: SHADOW2 } = useTheme();
21250
- const [cardHovered, setCardHovered] = React45.useState(false);
21251
- const [btnHovered, setBtnHovered] = React45.useState(false);
21252
- 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);
21253
21436
  const app = humanizeApp(p.app || "the app");
21254
21437
  const connected = p.state === "connected";
21255
21438
  const accent = connected ? CONNECTED_GREEN3 : ACCENT2;
@@ -21655,7 +21838,7 @@ function InlineSpinner() {
21655
21838
  }
21656
21839
  function GenUIRenderer({ payload }) {
21657
21840
  return /* @__PURE__ */ jsxRuntime.jsx(
21658
- React45.Suspense,
21841
+ React46.Suspense,
21659
21842
  {
21660
21843
  fallback: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", gap: "8px", padding: "8px 0" }, children: [
21661
21844
  /* @__PURE__ */ jsxRuntime.jsx(InlineSpinner, {}),