@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/index.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,14 +125,14 @@ var init_theme = __esm({
125
125
  }
126
126
  });
127
127
  function GenUIThemeProvider({ colors, children }) {
128
- const merged = React45.useMemo(
128
+ const merged = React46.useMemo(
129
129
  () => colors ? __spreadValues(__spreadValues({}, exports.DEFAULT_TOKENS), colors) : exports.DEFAULT_TOKENS,
130
130
  [colors]
131
131
  );
132
132
  return /* @__PURE__ */ jsxRuntime.jsx(GenUIThemeContext.Provider, { value: merged, children });
133
133
  }
134
134
  function useTheme() {
135
- return React45.useContext(GenUIThemeContext);
135
+ return React46.useContext(GenUIThemeContext);
136
136
  }
137
137
  exports.DEFAULT_TOKENS = void 0; var GenUIThemeContext;
138
138
  var init_ThemeContext = __esm({
@@ -154,7 +154,7 @@ var init_ThemeContext = __esm({
154
154
  SECONDARY: exports.SECONDARY,
155
155
  CHART_PALETTE: [...exports.CHART_PALETTE]
156
156
  };
157
- GenUIThemeContext = React45.createContext(exports.DEFAULT_TOKENS);
157
+ GenUIThemeContext = React46.createContext(exports.DEFAULT_TOKENS);
158
158
  }
159
159
  });
160
160
  function renderInline(text) {
@@ -890,11 +890,11 @@ async function getMermaid(t) {
890
890
  }
891
891
  function MermaidFallback({ diagram, title }) {
892
892
  const tokens = useTheme();
893
- const [svg, setSvg] = React45.useState("");
894
- const [err, setErr] = React45.useState(false);
895
- const [full, setFull] = React45.useState(false);
896
- const idRef = React45.useRef(0);
897
- React45.useEffect(() => {
893
+ const [svg, setSvg] = React46.useState("");
894
+ const [err, setErr] = React46.useState(false);
895
+ const [full, setFull] = React46.useState(false);
896
+ const idRef = React46.useRef(0);
897
+ React46.useEffect(() => {
898
898
  const id = ++renderSeq;
899
899
  idRef.current = id;
900
900
  setErr(false);
@@ -963,7 +963,7 @@ function FullscreenModalInner({ nodes, edges, title, onClose }) {
963
963
  ] }) });
964
964
  }
965
965
  function FullscreenModal({ nodes, edges, title, onClose }) {
966
- React45.useEffect(() => {
966
+ React46.useEffect(() => {
967
967
  const h = (e) => {
968
968
  if (e.key === "Escape") onClose();
969
969
  };
@@ -976,8 +976,8 @@ function FullscreenModal({ nodes, edges, title, onClose }) {
976
976
  );
977
977
  }
978
978
  function usePrefersReducedMotion() {
979
- const [reduced, setReduced] = React45.useState(false);
980
- React45.useEffect(() => {
979
+ const [reduced, setReduced] = React46.useState(false);
980
+ React46.useEffect(() => {
981
981
  var _a2;
982
982
  if (typeof matchMedia === "undefined") return;
983
983
  const mq = matchMedia("(prefers-reduced-motion: reduce)");
@@ -1021,9 +1021,9 @@ function topoOrder(nodeIds, edges) {
1021
1021
  }
1022
1022
  function useAutoplay(order, enabled) {
1023
1023
  const reduced = usePrefersReducedMotion();
1024
- const [step, setStep] = React45.useState(0);
1024
+ const [step, setStep] = React46.useState(0);
1025
1025
  const key = order.join("|");
1026
- React45.useEffect(() => {
1026
+ React46.useEffect(() => {
1027
1027
  if (!enabled || reduced || order.length === 0) {
1028
1028
  setStep(0);
1029
1029
  return;
@@ -1045,7 +1045,7 @@ function useAutoplay(order, enabled) {
1045
1045
  timer = setTimeout(tick, 850);
1046
1046
  return () => clearTimeout(timer);
1047
1047
  }, [enabled, reduced, key]);
1048
- return React45.useMemo(() => {
1048
+ return React46.useMemo(() => {
1049
1049
  const m = {};
1050
1050
  order.forEach((id, i) => {
1051
1051
  m[id] = i < step ? "done" : i === step ? "active" : "pending";
@@ -1067,13 +1067,13 @@ function resolveStates(nodes, nodeStates) {
1067
1067
  }
1068
1068
  function Inner({ diagram, title, autoplay, nodeStates }) {
1069
1069
  const tokens = useTheme();
1070
- const [full, setFull] = React45.useState(false);
1071
- const [focused, setFocused] = React45.useState(false);
1072
- const [boxW, setBoxW] = React45.useState(640);
1073
- const containerRef = React45.useRef(null);
1074
- const parsed = React45.useMemo(() => parseMermaidFlow(diagram), [diagram]);
1075
- const layout = React45.useMemo(() => parsed ? computeLayout(parsed) : null, [parsed]);
1076
- const themedEdges = React45.useMemo(
1070
+ const [full, setFull] = React46.useState(false);
1071
+ const [focused, setFocused] = React46.useState(false);
1072
+ const [boxW, setBoxW] = React46.useState(640);
1073
+ const containerRef = React46.useRef(null);
1074
+ const parsed = React46.useMemo(() => parseMermaidFlow(diagram), [diagram]);
1075
+ const layout = React46.useMemo(() => parsed ? computeLayout(parsed) : null, [parsed]);
1076
+ const themedEdges = React46.useMemo(
1077
1077
  () => {
1078
1078
  var _a2;
1079
1079
  return ((_a2 = layout == null ? void 0 : layout.edges) != null ? _a2 : []).map((e) => __spreadProps(__spreadValues({}, e), {
@@ -1085,7 +1085,7 @@ function Inner({ diagram, title, autoplay, nodeStates }) {
1085
1085
  },
1086
1086
  [layout, tokens.ACCENT, tokens.MUTED]
1087
1087
  );
1088
- const order = React45.useMemo(
1088
+ const order = React46.useMemo(
1089
1089
  () => {
1090
1090
  var _a2, _b;
1091
1091
  return topoOrder(((_a2 = layout == null ? void 0 : layout.nodes) != null ? _a2 : []).map((n) => n.id), (_b = layout == null ? void 0 : layout.edges) != null ? _b : []);
@@ -1093,19 +1093,19 @@ function Inner({ diagram, title, autoplay, nodeStates }) {
1093
1093
  [layout]
1094
1094
  );
1095
1095
  const autoStatus = useAutoplay(order, !!autoplay);
1096
- const staticStatus = React45.useMemo(() => {
1096
+ const staticStatus = React46.useMemo(() => {
1097
1097
  var _a2;
1098
1098
  return resolveStates((_a2 = layout == null ? void 0 : layout.nodes) != null ? _a2 : [], nodeStates);
1099
1099
  }, [layout, nodeStates]);
1100
1100
  const statusMap = autoplay ? autoStatus : staticStatus;
1101
- const displayNodes = React45.useMemo(
1101
+ const displayNodes = React46.useMemo(
1102
1102
  () => {
1103
1103
  var _a2;
1104
1104
  return ((_a2 = layout == null ? void 0 : layout.nodes) != null ? _a2 : []).map((n) => __spreadProps(__spreadValues({}, n), { data: __spreadProps(__spreadValues({}, n.data), { status: statusMap[n.id] }) }));
1105
1105
  },
1106
1106
  [layout, statusMap]
1107
1107
  );
1108
- const displayEdges = React45.useMemo(
1108
+ const displayEdges = React46.useMemo(
1109
1109
  () => themedEdges.map((e) => {
1110
1110
  const ss = statusMap[e.source];
1111
1111
  const ts = statusMap[e.target];
@@ -1125,13 +1125,13 @@ function Inner({ diagram, title, autoplay, nodeStates }) {
1125
1125
  const [nodes, setNodes, onNC] = react.useNodesState(displayNodes);
1126
1126
  const [edges, setEdges, onEC] = react.useEdgesState(displayEdges);
1127
1127
  const rf = react.useReactFlow();
1128
- React45.useEffect(() => {
1128
+ React46.useEffect(() => {
1129
1129
  setNodes(displayNodes);
1130
1130
  }, [displayNodes, setNodes]);
1131
- React45.useEffect(() => {
1131
+ React46.useEffect(() => {
1132
1132
  setEdges(displayEdges);
1133
1133
  }, [displayEdges, setEdges]);
1134
- React45.useEffect(() => {
1134
+ React46.useEffect(() => {
1135
1135
  const id = requestAnimationFrame(() => {
1136
1136
  try {
1137
1137
  rf.fitView({ padding: 0.1 });
@@ -1140,14 +1140,14 @@ function Inner({ diagram, title, autoplay, nodeStates }) {
1140
1140
  });
1141
1141
  return () => cancelAnimationFrame(id);
1142
1142
  }, [layout, rf]);
1143
- const handleClickOutside = React45.useCallback((e) => {
1143
+ const handleClickOutside = React46.useCallback((e) => {
1144
1144
  if (containerRef.current && !containerRef.current.contains(e.target)) setFocused(false);
1145
1145
  }, []);
1146
- React45.useEffect(() => {
1146
+ React46.useEffect(() => {
1147
1147
  document.addEventListener("mousedown", handleClickOutside);
1148
1148
  return () => document.removeEventListener("mousedown", handleClickOutside);
1149
1149
  }, [handleClickOutside]);
1150
- React45.useEffect(() => {
1150
+ React46.useEffect(() => {
1151
1151
  const el = containerRef.current;
1152
1152
  if (!el) return;
1153
1153
  let raf = 0;
@@ -1334,8 +1334,8 @@ function probePdfWorker() {
1334
1334
  return probe;
1335
1335
  }
1336
1336
  function usePdfWorkerReady(enabled) {
1337
- const [ready, setReady] = React45.useState(null);
1338
- React45.useEffect(() => {
1337
+ const [ready, setReady] = React46.useState(null);
1338
+ React46.useEffect(() => {
1339
1339
  if (!enabled) return;
1340
1340
  let cancelled = false;
1341
1341
  probePdfWorker().then((ok) => {
@@ -1368,15 +1368,15 @@ __export(PdfViewer_exports, {
1368
1368
  });
1369
1369
  function PdfViewer({ url, base64, onLoadSuccess, onLoadError }) {
1370
1370
  const { BORDER: BORDER3, MUTED: MUTED2, SURFACE: SURFACE2 } = useTheme();
1371
- const [numPages, setNumPages] = React45.useState(0);
1372
- const [currentPage, setCurrentPage] = React45.useState(1);
1373
- const [loading, setLoading] = React45.useState(true);
1374
- const handleLoad = React45.useCallback(({ numPages: n }) => {
1371
+ const [numPages, setNumPages] = React46.useState(0);
1372
+ const [currentPage, setCurrentPage] = React46.useState(1);
1373
+ const [loading, setLoading] = React46.useState(true);
1374
+ const handleLoad = React46.useCallback(({ numPages: n }) => {
1375
1375
  setNumPages(n);
1376
1376
  setLoading(false);
1377
1377
  onLoadSuccess == null ? void 0 : onLoadSuccess(n);
1378
1378
  }, [onLoadSuccess]);
1379
- React45.useEffect(() => {
1379
+ React46.useEffect(() => {
1380
1380
  if (numPages <= 1) return;
1381
1381
  const handler = (e) => {
1382
1382
  var _a2;
@@ -1484,13 +1484,13 @@ __export(ExcelViewer_exports, {
1484
1484
  });
1485
1485
  function ExcelViewer({ url, base64, onLoadSuccess }) {
1486
1486
  const { BORDER: BORDER3, MUTED: MUTED2, PAPER: PAPER2, SURFACE: SURFACE2 } = useTheme();
1487
- const [sheetNames, setSheetNames] = React45.useState([]);
1488
- const [activeSheet, setActiveSheet] = React45.useState(0);
1489
- const [data, setData] = React45.useState([]);
1490
- const [loading, setLoading] = React45.useState(true);
1491
- const [error, setError] = React45.useState(null);
1492
- const wbRef = React45.useRef(null);
1493
- React45.useEffect(() => {
1487
+ const [sheetNames, setSheetNames] = React46.useState([]);
1488
+ const [activeSheet, setActiveSheet] = React46.useState(0);
1489
+ const [data, setData] = React46.useState([]);
1490
+ const [loading, setLoading] = React46.useState(true);
1491
+ const [error, setError] = React46.useState(null);
1492
+ const wbRef = React46.useRef(null);
1493
+ React46.useEffect(() => {
1494
1494
  let cancelled = false;
1495
1495
  setLoading(true);
1496
1496
  setError(null);
@@ -1548,7 +1548,7 @@ function ExcelViewer({ url, base64, onLoadSuccess }) {
1548
1548
  const rows = XLSX__namespace.utils.sheet_to_json(wbRef.current.Sheets[wbRef.current.SheetNames[idx]], { header: 1 });
1549
1549
  setData(rows);
1550
1550
  };
1551
- React45.useEffect(() => {
1551
+ React46.useEffect(() => {
1552
1552
  if (sheetNames.length <= 1) return;
1553
1553
  const handler = (e) => {
1554
1554
  var _a2;
@@ -1674,10 +1674,10 @@ __export(CsvViewer_exports, {
1674
1674
  });
1675
1675
  function CsvViewer({ url, base64, delimiter, maxRows }) {
1676
1676
  const { BORDER: BORDER3, MUTED: MUTED2, PAPER: PAPER2 } = useTheme();
1677
- const [rows, setRows] = React45.useState([]);
1678
- const [loading, setLoading] = React45.useState(true);
1679
- const [error, setError] = React45.useState(null);
1680
- React45.useEffect(() => {
1677
+ const [rows, setRows] = React46.useState([]);
1678
+ const [loading, setLoading] = React46.useState(true);
1679
+ const [error, setError] = React46.useState(null);
1680
+ React46.useEffect(() => {
1681
1681
  let cancelled = false;
1682
1682
  setLoading(true);
1683
1683
  setError(null);
@@ -1796,10 +1796,10 @@ __export(TextViewer_exports, {
1796
1796
  });
1797
1797
  function TextViewer({ url, base64, markdown = false, maxLines }) {
1798
1798
  const { MUTED: MUTED2 } = useTheme();
1799
- const [text, setText] = React45.useState("");
1800
- const [loading, setLoading] = React45.useState(true);
1801
- const [error, setError] = React45.useState(null);
1802
- React45.useEffect(() => {
1799
+ const [text, setText] = React46.useState("");
1800
+ const [loading, setLoading] = React46.useState(true);
1801
+ const [error, setError] = React46.useState(null);
1802
+ React46.useEffect(() => {
1803
1803
  let cancelled = false;
1804
1804
  setLoading(true);
1805
1805
  setError(null);
@@ -1897,10 +1897,10 @@ function sanitize(html) {
1897
1897
  }
1898
1898
  function DocxViewer({ url, base64 }) {
1899
1899
  const { MUTED: MUTED2, BORDER: BORDER3, SURFACE: SURFACE2 } = useTheme();
1900
- const [html, setHtml] = React45.useState("");
1901
- const [loading, setLoading] = React45.useState(true);
1902
- const [error, setError] = React45.useState(null);
1903
- React45.useEffect(() => {
1900
+ const [html, setHtml] = React46.useState("");
1901
+ const [loading, setLoading] = React46.useState(true);
1902
+ const [error, setError] = React46.useState(null);
1903
+ React46.useEffect(() => {
1904
1904
  let cancelled = false;
1905
1905
  setLoading(true);
1906
1906
  setError(null);
@@ -1980,6 +1980,89 @@ var init_DocxViewer = __esm({
1980
1980
  }
1981
1981
  });
1982
1982
 
1983
+ // src/shared/viewers/HtmlViewer.tsx
1984
+ var HtmlViewer_exports = {};
1985
+ __export(HtmlViewer_exports, {
1986
+ HtmlViewer: () => HtmlViewer
1987
+ });
1988
+ function HtmlViewer({ url, base64, height = 480 }) {
1989
+ const { MUTED: MUTED2 } = useTheme();
1990
+ const [html, setHtml] = React46.useState("");
1991
+ const [loading, setLoading] = React46.useState(true);
1992
+ const [error, setError] = React46.useState(null);
1993
+ React46.useEffect(() => {
1994
+ let cancelled = false;
1995
+ setLoading(true);
1996
+ setError(null);
1997
+ if (base64) {
1998
+ try {
1999
+ if (!cancelled) {
2000
+ setHtml(base64ToText(base64));
2001
+ setLoading(false);
2002
+ }
2003
+ } catch (e) {
2004
+ if (!cancelled) {
2005
+ setError(e instanceof Error ? e.message : "Failed to decode HTML");
2006
+ setLoading(false);
2007
+ }
2008
+ }
2009
+ return () => {
2010
+ cancelled = true;
2011
+ };
2012
+ }
2013
+ if (!url) {
2014
+ setError("No file source provided");
2015
+ setLoading(false);
2016
+ return () => {
2017
+ cancelled = true;
2018
+ };
2019
+ }
2020
+ fetch(url).then((r) => {
2021
+ if (!r.ok) throw new Error(`Failed to fetch: ${r.status}`);
2022
+ return r.text();
2023
+ }).then((t) => {
2024
+ if (cancelled) return;
2025
+ setHtml(t);
2026
+ setLoading(false);
2027
+ }).catch((e) => {
2028
+ if (cancelled) return;
2029
+ setError(e.message);
2030
+ setLoading(false);
2031
+ });
2032
+ return () => {
2033
+ cancelled = true;
2034
+ };
2035
+ }, [url, base64]);
2036
+ if (loading) {
2037
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { padding: "24px", color: MUTED2, fontSize: "13px", textAlign: "center" }, children: "Loading\u2026" });
2038
+ }
2039
+ if (error) {
2040
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { padding: "24px", color: "#dc2626", fontSize: "13px", textAlign: "center" }, children: error });
2041
+ }
2042
+ return /* @__PURE__ */ jsxRuntime.jsx(
2043
+ "iframe",
2044
+ {
2045
+ title: "HTML preview",
2046
+ sandbox: "",
2047
+ srcDoc: html,
2048
+ style: {
2049
+ width: "100%",
2050
+ height: `${height}px`,
2051
+ border: "none",
2052
+ background: "white",
2053
+ display: "block"
2054
+ }
2055
+ }
2056
+ );
2057
+ }
2058
+ var init_HtmlViewer = __esm({
2059
+ "src/shared/viewers/HtmlViewer.tsx"() {
2060
+ "use client";
2061
+ init_ThemeContext();
2062
+ init_decode();
2063
+ }
2064
+ });
2065
+
1983
2066
  // src/index.ts
1984
2067
  init_ThemeContext();
1985
2068
  var dataTableSchema = zod.z.object({
@@ -6161,16 +6244,16 @@ var DOT_COLOR = "#aaaaaa";
6161
6244
  var DOT_HOVER = "#555555";
6162
6245
  function ComponentActions({ children, onDownloadCSV, columnConfig, filename = "component" }) {
6163
6246
  const { BORDER: BORDER3, MUTED: MUTED2, SURFACE: SURFACE2, SURFACE_MUTED: SURFACE_MUTED2 } = useTheme();
6164
- const [open, setOpen] = React45.useState(false);
6165
- const [view, setView] = React45.useState("main");
6166
- const contentRef = React45.useRef(null);
6167
- const menuRef = React45.useRef(null);
6168
- const btnRef = React45.useRef(null);
6169
- const close = React45.useCallback(() => {
6247
+ const [open, setOpen] = React46.useState(false);
6248
+ const [view, setView] = React46.useState("main");
6249
+ const contentRef = React46.useRef(null);
6250
+ const menuRef = React46.useRef(null);
6251
+ const btnRef = React46.useRef(null);
6252
+ const close = React46.useCallback(() => {
6170
6253
  setOpen(false);
6171
6254
  setView("main");
6172
6255
  }, []);
6173
- React45.useEffect(() => {
6256
+ React46.useEffect(() => {
6174
6257
  if (!open) return;
6175
6258
  const handler = (e) => {
6176
6259
  var _a2, _b;
@@ -6181,7 +6264,7 @@ function ComponentActions({ children, onDownloadCSV, columnConfig, filename = "c
6181
6264
  document.addEventListener("mousedown", handler);
6182
6265
  return () => document.removeEventListener("mousedown", handler);
6183
6266
  }, [open, close]);
6184
- const handleDownloadPNG = React45.useCallback(async () => {
6267
+ const handleDownloadPNG = React46.useCallback(async () => {
6185
6268
  if (!contentRef.current) return;
6186
6269
  try {
6187
6270
  const url = await htmlToImage.toPng(contentRef.current, { backgroundColor: "white", pixelRatio: 2 });
@@ -6193,7 +6276,7 @@ function ComponentActions({ children, onDownloadCSV, columnConfig, filename = "c
6193
6276
  }
6194
6277
  close();
6195
6278
  }, [filename, close]);
6196
- const handleCSV = React45.useCallback(() => {
6279
+ const handleCSV = React46.useCallback(() => {
6197
6280
  onDownloadCSV == null ? void 0 : onDownloadCSV();
6198
6281
  close();
6199
6282
  }, [onDownloadCSV, close]);
@@ -6306,12 +6389,12 @@ function MenuButton({ label, onClick }) {
6306
6389
  );
6307
6390
  }
6308
6391
  function useColumnVisibility(columns) {
6309
- const [hidden, setHidden] = React45.useState(/* @__PURE__ */ new Set());
6310
- const visibleColumns = React45.useMemo(
6392
+ const [hidden, setHidden] = React46.useState(/* @__PURE__ */ new Set());
6393
+ const visibleColumns = React46.useMemo(
6311
6394
  () => columns.filter((c) => !hidden.has(c.key)),
6312
6395
  [columns, hidden]
6313
6396
  );
6314
- const toggle = React45.useCallback((key) => {
6397
+ const toggle = React46.useCallback((key) => {
6315
6398
  setHidden((prev) => {
6316
6399
  const next = new Set(prev);
6317
6400
  if (next.has(key)) next.delete(key);
@@ -6319,8 +6402,8 @@ function useColumnVisibility(columns) {
6319
6402
  return next;
6320
6403
  });
6321
6404
  }, []);
6322
- const showAll = React45.useCallback(() => setHidden(/* @__PURE__ */ new Set()), []);
6323
- const hideAll = React45.useCallback(
6405
+ const showAll = React46.useCallback(() => setHidden(/* @__PURE__ */ new Set()), []);
6406
+ const hideAll = React46.useCallback(
6324
6407
  () => setHidden(new Set(columns.map((c) => c.key))),
6325
6408
  [columns]
6326
6409
  );
@@ -6577,9 +6660,9 @@ function AlertResolver(p) {
6577
6660
  // src/composites/stat-grid/resolver.tsx
6578
6661
  init_Markdown();
6579
6662
  function FitText({ children, max = 22, min = 13, title, className, style }) {
6580
- const ref = React45.useRef(null);
6581
- const [size, setSize] = React45.useState(max);
6582
- React45.useLayoutEffect(() => {
6663
+ const ref = React46.useRef(null);
6664
+ const [size, setSize] = React46.useState(max);
6665
+ React46.useLayoutEffect(() => {
6583
6666
  const el = ref.current;
6584
6667
  if (!el) return void 0;
6585
6668
  const fit = () => {
@@ -6673,7 +6756,7 @@ init_ThemeContext();
6673
6756
  function TabsPanelResolver(p) {
6674
6757
  var _a2;
6675
6758
  const { BORDER: BORDER3, MUTED: MUTED2, PAPER: PAPER2, SURFACE: SURFACE2, ACCENT: ACCENT2 } = useTheme();
6676
- const [activeIdx, setActiveIdx] = React45.useState(0);
6759
+ const [activeIdx, setActiveIdx] = React46.useState(0);
6677
6760
  const activeTab = p.tabs[activeIdx];
6678
6761
  return /* @__PURE__ */ jsxRuntime.jsx(ComponentActions, { filename: "tabs-panel", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { width: "100%", display: "flex", flexDirection: "column", gap: "0" }, children: [
6679
6762
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -6937,7 +7020,7 @@ var thStyle = (MUTED2, BORDER3, PAPER2) => ({
6937
7020
  function ScreenerTableResolver(p) {
6938
7021
  var _a2, _b, _c, _d, _e, _f;
6939
7022
  const { ACCENT: ACCENT2, BORDER: BORDER3, BORDER_SOFT: BORDER_SOFT2, MUTED: MUTED2, PAPER: PAPER2, SURFACE: SURFACE2, SURFACE_MUTED: SURFACE_MUTED2 } = useTheme();
6940
- const [activeFilters, setActiveFilters] = React45.useState(new Set((_a2 = p.activeFilters) != null ? _a2 : []));
7023
+ const [activeFilters, setActiveFilters] = React46.useState(new Set((_a2 = p.activeFilters) != null ? _a2 : []));
6941
7024
  const { visibleColumns, hidden, toggle, showAll, hideAll, allColumns } = useColumnVisibility((_b = p.columns) != null ? _b : []);
6942
7025
  const toggleFilter = (f) => setActiveFilters((prev) => {
6943
7026
  const next = new Set(prev);
@@ -7007,7 +7090,7 @@ var th2 = (MUTED2, BORDER3, PAPER2) => ({
7007
7090
  function GroupRows({ group, columns, depth }) {
7008
7091
  var _a2, _b;
7009
7092
  const { MUTED: MUTED2, PAPER: PAPER2, BORDER_SOFT: BORDER_SOFT2 } = useTheme();
7010
- const [open, setOpen] = React45.useState(true);
7093
+ const [open, setOpen] = React46.useState(true);
7011
7094
  const indent = depth * 14;
7012
7095
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
7013
7096
  /* @__PURE__ */ jsxRuntime.jsxs(
@@ -7112,7 +7195,7 @@ var dotColor = {
7112
7195
  function NewsFeedResolver(p) {
7113
7196
  var _a2, _b;
7114
7197
  const { ACCENT: ACCENT2, MUTED: MUTED2, SURFACE: SURFACE2, SHADOW: SHADOW2 } = useTheme();
7115
- const [filter, setFilter] = React45.useState(null);
7198
+ const [filter, setFilter] = React46.useState(null);
7116
7199
  const sentiments = ["positive", "neutral", "negative"].filter(
7117
7200
  (s) => {
7118
7201
  var _a3;
@@ -7154,9 +7237,9 @@ function NewsFeedResolver(p) {
7154
7237
  ] }) });
7155
7238
  }
7156
7239
  function useSeriesToggle(seriesKeys) {
7157
- const [hidden, setHidden] = React45.useState(/* @__PURE__ */ new Set());
7158
- const isVisible = React45.useCallback((key) => !hidden.has(key), [hidden]);
7159
- const toggle = React45.useCallback((key) => {
7240
+ const [hidden, setHidden] = React46.useState(/* @__PURE__ */ new Set());
7241
+ const isVisible = React46.useCallback((key) => !hidden.has(key), [hidden]);
7242
+ const toggle = React46.useCallback((key) => {
7160
7243
  setHidden((prev) => {
7161
7244
  const next = new Set(prev);
7162
7245
  if (next.has(key)) next.delete(key);
@@ -7164,7 +7247,7 @@ function useSeriesToggle(seriesKeys) {
7164
7247
  return next;
7165
7248
  });
7166
7249
  }, []);
7167
- const showAll = React45.useCallback(() => setHidden(/* @__PURE__ */ new Set()), []);
7250
+ const showAll = React46.useCallback(() => setHidden(/* @__PURE__ */ new Set()), []);
7168
7251
  return { hidden, isVisible, toggle, showAll, allKeys: seriesKeys };
7169
7252
  }
7170
7253
 
@@ -7469,7 +7552,7 @@ function WaterfallChartResolver(p) {
7469
7552
  }
7470
7553
  init_ThemeContext();
7471
7554
  init_theme();
7472
- var FlowGraph2 = React45__default.default.lazy(
7555
+ var FlowGraph2 = React46__default.default.lazy(
7473
7556
  () => Promise.resolve().then(() => (init_FlowGraph(), FlowGraph_exports)).then((m) => ({ default: m.FlowGraph }))
7474
7557
  );
7475
7558
  function FlowCanvasRenderer({
@@ -7510,7 +7593,7 @@ function FlowCanvasRenderer({
7510
7593
  overflow: "hidden",
7511
7594
  background: SURFACE2,
7512
7595
  position: "relative"
7513
- }, 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: {
7596
+ }, 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: {
7514
7597
  position: "absolute",
7515
7598
  inset: 0,
7516
7599
  display: "flex",
@@ -7745,7 +7828,7 @@ function TrialBalanceResolver(p) {
7745
7828
  gDebit += a.debit;
7746
7829
  gCredit += a.credit;
7747
7830
  });
7748
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
7831
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
7749
7832
  /* @__PURE__ */ jsxRuntime.jsx("tr", { children: /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan: 4, style: {
7750
7833
  padding: "8px 12px",
7751
7834
  fontSize: "12px",
@@ -8283,7 +8366,7 @@ function ItemRow({ item }) {
8283
8366
  }
8284
8367
  function Section({ section }) {
8285
8368
  const { BORDER: BORDER3, MUTED: MUTED2, SURFACE: SURFACE2 } = useTheme();
8286
- const [open, setOpen] = React45.useState(true);
8369
+ const [open, setOpen] = React46.useState(true);
8287
8370
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
8288
8371
  /* @__PURE__ */ jsxRuntime.jsxs(
8289
8372
  "button",
@@ -8406,7 +8489,7 @@ function ReconciliationViewResolver(p) {
8406
8489
  const { BORDER: BORDER3, BORDER_SOFT: BORDER_SOFT2, MUTED: MUTED2, PAPER: PAPER2, ACCENT: ACCENT2, SURFACE: SURFACE2, SURFACE_MUTED: SURFACE_MUTED2 } = useTheme();
8407
8490
  const sourceA = (_a2 = p.sourceA) != null ? _a2 : { label: "Source A" };
8408
8491
  const sourceB = (_b = p.sourceB) != null ? _b : { label: "Source B" };
8409
- const [activeTab, setActiveTab] = React45.useState("matched");
8492
+ const [activeTab, setActiveTab] = React46.useState("matched");
8410
8493
  const balanceA = (_d = (_c = p.summary) == null ? void 0 : _c.balanceA) != null ? _d : 0;
8411
8494
  const balanceB = (_f = (_e = p.summary) == null ? void 0 : _e.balanceB) != null ? _f : 0;
8412
8495
  const difference = (_h = (_g = p.summary) == null ? void 0 : _g.difference) != null ? _h : balanceA - balanceB;
@@ -9052,7 +9135,7 @@ function ChangesView({ changes }) {
9052
9135
  function EventCard({ event }) {
9053
9136
  var _a2;
9054
9137
  const { BORDER: BORDER3, MUTED: MUTED2, ACCENT: ACCENT2, SURFACE: SURFACE2 } = useTheme();
9055
- const [showChanges, setShowChanges] = React45.useState(false);
9138
+ const [showChanges, setShowChanges] = React46.useState(false);
9056
9139
  const ac = (_a2 = actionConfig[event.action]) != null ? _a2 : actionConfig.commented;
9057
9140
  const hasChanges = event.changes && event.changes.length > 0;
9058
9141
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", gap: "12px", position: "relative" }, children: [
@@ -9110,23 +9193,23 @@ function AuditTrailResolver(p) {
9110
9193
  }
9111
9194
  init_Markdown();
9112
9195
  function useFullscreen(ref) {
9113
- const [isFullscreen, setIsFullscreen] = React45.useState(false);
9114
- React45.useEffect(() => {
9196
+ const [isFullscreen, setIsFullscreen] = React46.useState(false);
9197
+ React46.useEffect(() => {
9115
9198
  const handler = () => {
9116
9199
  setIsFullscreen(!!document.fullscreenElement);
9117
9200
  };
9118
9201
  document.addEventListener("fullscreenchange", handler);
9119
9202
  return () => document.removeEventListener("fullscreenchange", handler);
9120
9203
  }, []);
9121
- const enter = React45.useCallback(() => {
9204
+ const enter = React46.useCallback(() => {
9122
9205
  var _a2, _b;
9123
9206
  (_b = (_a2 = ref.current) == null ? void 0 : _a2.requestFullscreen) == null ? void 0 : _b.call(_a2);
9124
9207
  }, [ref]);
9125
- const exit = React45.useCallback(() => {
9208
+ const exit = React46.useCallback(() => {
9126
9209
  var _a2;
9127
9210
  if (document.fullscreenElement) (_a2 = document.exitFullscreen) == null ? void 0 : _a2.call(document);
9128
9211
  }, []);
9129
- const toggle = React45.useCallback(() => {
9212
+ const toggle = React46.useCallback(() => {
9130
9213
  if (isFullscreen) exit();
9131
9214
  else enter();
9132
9215
  }, [isFullscreen, enter, exit]);
@@ -9137,10 +9220,10 @@ function useFullscreen(ref) {
9137
9220
  init_theme();
9138
9221
  init_ThemeContext();
9139
9222
  init_pdfWorkerProbe();
9140
- var PdfViewer2 = React45__default.default.lazy(
9223
+ var PdfViewer2 = React46__default.default.lazy(
9141
9224
  () => Promise.resolve().then(() => (init_PdfViewer(), PdfViewer_exports)).then((m) => ({ default: m.PdfViewer }))
9142
9225
  );
9143
- var ExcelViewer2 = React45__default.default.lazy(
9226
+ var ExcelViewer2 = React46__default.default.lazy(
9144
9227
  () => Promise.resolve().then(() => (init_ExcelViewer(), ExcelViewer_exports)).then((m) => ({ default: m.ExcelViewer }))
9145
9228
  );
9146
9229
  var highlightColors = {
@@ -9191,8 +9274,8 @@ function DownloadIcon() {
9191
9274
  function DocumentPreviewResolver(p) {
9192
9275
  var _a2, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u;
9193
9276
  const { BORDER: BORDER3, MUTED: MUTED2, PAPER: PAPER2, ACCENT: ACCENT2, SURFACE: SURFACE2, SHADOW: SHADOW2 } = useTheme();
9194
- const [currentPage, setCurrentPage] = React45.useState(0);
9195
- const containerRef = React45.useRef(null);
9277
+ const [currentPage, setCurrentPage] = React46.useState(0);
9278
+ const containerRef = React46.useRef(null);
9196
9279
  const { isFullscreen, toggle } = useFullscreen(containerRef);
9197
9280
  const hasRealFile = !!(((_a2 = p.source) == null ? void 0 : _a2.url) || ((_b = p.source) == null ? void 0 : _b.base64));
9198
9281
  const isPdf = p.documentType === "pdf";
@@ -9200,15 +9283,15 @@ function DocumentPreviewResolver(p) {
9200
9283
  const totalPages = ((_c = p.pages) != null ? _c : []).length;
9201
9284
  const page = p.pages[currentPage];
9202
9285
  const pageHighlights = ((_d = p.highlights) != null ? _d : []).filter((h) => h.pageIndex === currentPage);
9203
- const [pdfFailed, setPdfFailed] = React45.useState(false);
9286
+ const [pdfFailed, setPdfFailed] = React46.useState(false);
9204
9287
  const pdfWorkerReady = usePdfWorkerReady(hasRealFile && isPdf);
9205
9288
  const pdfReady = pdfFailed ? false : pdfWorkerReady;
9206
9289
  const showPdfViewer = hasRealFile && isPdf && pdfReady === true;
9207
9290
  const pdfPending = hasRealFile && isPdf && pdfReady === null;
9208
- const handlePdfLoad = React45.useCallback(() => {
9291
+ const handlePdfLoad = React46.useCallback(() => {
9209
9292
  }, []);
9210
- const handlePdfError = React45.useCallback(() => setPdfFailed(true), []);
9211
- const handleExcelLoad = React45.useCallback(() => {
9293
+ const handlePdfError = React46.useCallback(() => setPdfFailed(true), []);
9294
+ const handleExcelLoad = React46.useCallback(() => {
9212
9295
  }, []);
9213
9296
  return /* @__PURE__ */ jsxRuntime.jsx(ComponentActions, { filename: (_e = p.title) != null ? _e : "document-preview", children: /* @__PURE__ */ jsxRuntime.jsxs(
9214
9297
  "div",
@@ -9321,7 +9404,7 @@ function DocumentPreviewResolver(p) {
9321
9404
  display: "flex",
9322
9405
  flexDirection: "column"
9323
9406
  }, children: [
9324
- 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: [
9407
+ 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: [
9325
9408
  "No content available for ",
9326
9409
  (_u = page == null ? void 0 : page.label) != null ? _u : "this page"
9327
9410
  ] }),
@@ -9386,7 +9469,7 @@ function ConfidenceBar({ confidence, height = 6 }) {
9386
9469
  function StepCard({ step, isLast }) {
9387
9470
  var _a2;
9388
9471
  const { ACCENT: ACCENT2, MUTED: MUTED2, BORDER: BORDER3, SURFACE_MUTED: SURFACE_MUTED2 } = useTheme();
9389
- const [expanded, setExpanded] = React45.useState(false);
9472
+ const [expanded, setExpanded] = React46.useState(false);
9390
9473
  const cfg = stepTypeConfig[step.stepType];
9391
9474
  const detail = (_a2 = step.detail) != null ? _a2 : "";
9392
9475
  const isLong = detail.length > 100;
@@ -9895,7 +9978,7 @@ function ExampleRow({ example }) {
9895
9978
  }
9896
9979
  function PartSection({ part, defaultOpen }) {
9897
9980
  const { BORDER: BORDER3, MUTED: MUTED2, SURFACE: SURFACE2 } = useTheme();
9898
- const [open, setOpen] = React45.useState(defaultOpen);
9981
+ const [open, setOpen] = React46.useState(defaultOpen);
9899
9982
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
9900
9983
  /* @__PURE__ */ jsxRuntime.jsxs(
9901
9984
  "button",
@@ -10025,7 +10108,7 @@ function EngagementPipelineResolver(p) {
10025
10108
  const defaultActive = phases.findIndex(
10026
10109
  (ph) => ph.status === "in-progress" || ph.status === "blocked"
10027
10110
  );
10028
- const [activeIdx, setActiveIdx] = React45.useState(defaultActive >= 0 ? defaultActive : 0);
10111
+ const [activeIdx, setActiveIdx] = React46.useState(defaultActive >= 0 ? defaultActive : 0);
10029
10112
  const activePhase = phases[activeIdx];
10030
10113
  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: [
10031
10114
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "4px" }, children: [
@@ -10109,7 +10192,7 @@ function EngagementPipelineResolver(p) {
10109
10192
  const color = (_a3 = statusColor2[phase.status]) != null ? _a3 : "#d6d3d1";
10110
10193
  const isCurrent = i === activeIdx;
10111
10194
  const size = isCurrent ? 28 : 20;
10112
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
10195
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
10113
10196
  i > 0 && /* @__PURE__ */ jsxRuntime.jsx(
10114
10197
  "div",
10115
10198
  {
@@ -10417,7 +10500,7 @@ function Avatar({ name, avatar, hovered }) {
10417
10500
  function EntityCardGridResolver(p) {
10418
10501
  var _a2, _b;
10419
10502
  const { BORDER: BORDER3, MUTED: MUTED2, ACCENT: ACCENT2, SHADOW: SHADOW2 } = useTheme();
10420
- const [hoveredId, setHoveredId] = React45.useState(null);
10503
+ const [hoveredId, setHoveredId] = React46.useState(null);
10421
10504
  return /* @__PURE__ */ jsxRuntime.jsx(ComponentActions, { filename: (_a2 = p.title) != null ? _a2 : "entity-card-grid", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { width: "100%", display: "flex", flexDirection: "column", gap: "10px" }, children: [
10422
10505
  p.title && /* @__PURE__ */ jsxRuntime.jsx(
10423
10506
  "p",
@@ -10674,7 +10757,7 @@ function StepRow({ step }) {
10674
10757
  function JobTrackerResolver(p) {
10675
10758
  var _a2, _b, _c, _d, _e, _f, _g;
10676
10759
  const { BORDER: BORDER3, MUTED: MUTED2, ACCENT: ACCENT2, PAPER: PAPER2, SURFACE: SURFACE2, SURFACE_MUTED: SURFACE_MUTED2, SHADOW: SHADOW2 } = useTheme();
10677
- const [stepsOpen, setStepsOpen] = React45.useState(true);
10760
+ const [stepsOpen, setStepsOpen] = React46.useState(true);
10678
10761
  const barColor = (_a2 = statusColors[p.status]) != null ? _a2 : MUTED2;
10679
10762
  const badge = (_b = statusBadgeConfig[p.status]) != null ? _b : statusBadgeConfig.queued;
10680
10763
  const progress = (_c = p.progress) != null ? _c : p.status === "completed" ? 100 : 0;
@@ -11117,7 +11200,7 @@ function CitationCard({
11117
11200
  }
11118
11201
  function FollowUpItem({ text }) {
11119
11202
  const { SECONDARY: SECONDARY2 } = useTheme();
11120
- const [hovered, setHovered] = React45.useState(false);
11203
+ const [hovered, setHovered] = React46.useState(false);
11121
11204
  return /* @__PURE__ */ jsxRuntime.jsxs(
11122
11205
  "span",
11123
11206
  {
@@ -11143,7 +11226,7 @@ function CitationMarker({
11143
11226
  onClick
11144
11227
  }) {
11145
11228
  const { SECONDARY: SECONDARY2 } = useTheme();
11146
- const [hovered, setHovered] = React45.useState(false);
11229
+ const [hovered, setHovered] = React46.useState(false);
11147
11230
  return /* @__PURE__ */ jsxRuntime.jsx(
11148
11231
  "sup",
11149
11232
  {
@@ -11172,7 +11255,7 @@ function CitationMarker({
11172
11255
  function CitedAnswerResolver(p) {
11173
11256
  var _a2, _b, _c, _d, _e;
11174
11257
  const { BORDER: BORDER3, MUTED: MUTED2, ACCENT: ACCENT2, SECONDARY: SECONDARY2, SURFACE: SURFACE2, SHADOW: SHADOW2 } = useTheme();
11175
- const [expandedIds, setExpandedIds] = React45.useState(/* @__PURE__ */ new Set());
11258
+ const [expandedIds, setExpandedIds] = React46.useState(/* @__PURE__ */ new Set());
11176
11259
  const toggleCitation = (id) => {
11177
11260
  setExpandedIds((prev) => {
11178
11261
  const next = new Set(prev);
@@ -11477,7 +11560,7 @@ function TransactionFeedResolver(p) {
11477
11560
  var _a2, _b, _c, _d, _e;
11478
11561
  const { BORDER: BORDER3, MUTED: MUTED2 } = useTheme();
11479
11562
  const currency = (_a2 = p.currency) != null ? _a2 : "USD";
11480
- const [hoveredIndex, setHoveredIndex] = React45.useState(null);
11563
+ const [hoveredIndex, setHoveredIndex] = React46.useState(null);
11481
11564
  const hasBalance = ((_b = p.transactions) != null ? _b : []).some((tx) => tx.balance != null);
11482
11565
  const totalInflows = p.transactions.filter((tx) => tx.amount > 0 && tx.status !== "reversed").reduce((sum, tx) => sum + tx.amount, 0);
11483
11566
  const totalOutflows = p.transactions.filter((tx) => tx.amount < 0 && tx.status !== "reversed").reduce((sum, tx) => sum + tx.amount, 0);
@@ -11635,7 +11718,7 @@ function formatDate2(dateStr) {
11635
11718
  function FileRow({ item }) {
11636
11719
  var _a2;
11637
11720
  const { BORDER: BORDER3, MUTED: MUTED2, PAPER: PAPER2, SURFACE: SURFACE2, SECONDARY: SECONDARY2 } = useTheme();
11638
- const [hovered, setHovered] = React45.useState(false);
11721
+ const [hovered, setHovered] = React46.useState(false);
11639
11722
  const cfg = getDocConfig(item.docType);
11640
11723
  return /* @__PURE__ */ jsxRuntime.jsxs(
11641
11724
  "div",
@@ -11712,8 +11795,8 @@ function FileRow({ item }) {
11712
11795
  }
11713
11796
  function GroupSection({ groupName, items }) {
11714
11797
  const { BORDER: BORDER3, MUTED: MUTED2, SURFACE: SURFACE2, SURFACE_MUTED: SURFACE_MUTED2 } = useTheme();
11715
- const [open, setOpen] = React45.useState(true);
11716
- const [headerHovered, setHeaderHovered] = React45.useState(false);
11798
+ const [open, setOpen] = React46.useState(true);
11799
+ const [headerHovered, setHeaderHovered] = React46.useState(false);
11717
11800
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
11718
11801
  /* @__PURE__ */ jsxRuntime.jsxs(
11719
11802
  "button",
@@ -11829,7 +11912,7 @@ init_theme();
11829
11912
  var FAMILIES = [
11830
11913
  { exts: ["csv", "tsv", "xls", "xlsx", "numbers"], fg: exports.SEMANTIC.success.color, bg: exports.SEMANTIC.success.bg },
11831
11914
  { exts: ["pdf"], fg: exports.SEMANTIC.error.color, bg: exports.SEMANTIC.error.bg },
11832
- { exts: ["doc", "docx", "txt", "md", "rtf", "pages"], fg: exports.SEMANTIC.info.color, bg: exports.SEMANTIC.info.bg },
11915
+ { exts: ["doc", "docx", "txt", "md", "rtf", "pages", "html", "htm"], fg: exports.SEMANTIC.info.color, bg: exports.SEMANTIC.info.bg },
11833
11916
  { exts: ["json", "yaml", "yml", "xml", "toml"], fg: exports.SEMANTIC.purple.color, bg: exports.SEMANTIC.purple.bg },
11834
11917
  { exts: ["zip", "tar", "gz", "rar", "7z"], fg: exports.SEMANTIC.warning.color, bg: exports.SEMANTIC.warning.bg },
11835
11918
  { exts: ["png", "jpg", "jpeg", "gif", "svg", "webp", "bmp"], fg: exports.SEMANTIC.info.color, bg: exports.SEMANTIC.info.bg }
@@ -11856,7 +11939,9 @@ var PREVIEW_EXTS = {
11856
11939
  txt: "text",
11857
11940
  log: "text",
11858
11941
  text: "text",
11859
- docx: "docx"
11942
+ docx: "docx",
11943
+ html: "html",
11944
+ htm: "html"
11860
11945
  };
11861
11946
  function extOf(fileType, filename) {
11862
11947
  var _a2;
@@ -11867,6 +11952,7 @@ function extOf(fileType, filename) {
11867
11952
  if (mime.includes("csv")) return "csv";
11868
11953
  if (mime.includes("markdown")) return "md";
11869
11954
  if (mime.includes("wordprocessing") || mime.includes("msword")) return "docx";
11955
+ if (mime.includes("html")) return "html";
11870
11956
  if (mime.startsWith("text/")) return "txt";
11871
11957
  } else if (fileType) {
11872
11958
  const t = fileType.toLowerCase().replace(/[^a-z0-9]/g, "");
@@ -11904,20 +11990,21 @@ function isExpirySoon(expiresAt) {
11904
11990
  // src/shared/viewers/PreviewHost.tsx
11905
11991
  init_ThemeContext();
11906
11992
  init_pdfWorkerProbe();
11907
- var PdfViewer3 = React45.lazy(
11993
+ var PdfViewer3 = React46.lazy(
11908
11994
  () => Promise.resolve().then(() => (init_PdfViewer(), PdfViewer_exports)).then((m) => ({ default: m.PdfViewer }))
11909
11995
  );
11910
- var ExcelViewer3 = React45.lazy(
11996
+ var ExcelViewer3 = React46.lazy(
11911
11997
  () => Promise.resolve().then(() => (init_ExcelViewer(), ExcelViewer_exports)).then((m) => ({ default: m.ExcelViewer }))
11912
11998
  );
11913
- var CsvViewer2 = React45.lazy(() => Promise.resolve().then(() => (init_CsvViewer(), CsvViewer_exports)).then((m) => ({ default: m.CsvViewer })));
11914
- var TextViewer2 = React45.lazy(() => Promise.resolve().then(() => (init_TextViewer(), TextViewer_exports)).then((m) => ({ default: m.TextViewer })));
11915
- var DocxViewer2 = React45.lazy(() => Promise.resolve().then(() => (init_DocxViewer(), DocxViewer_exports)).then((m) => ({ default: m.DocxViewer })));
11999
+ var CsvViewer2 = React46.lazy(() => Promise.resolve().then(() => (init_CsvViewer(), CsvViewer_exports)).then((m) => ({ default: m.CsvViewer })));
12000
+ var TextViewer2 = React46.lazy(() => Promise.resolve().then(() => (init_TextViewer(), TextViewer_exports)).then((m) => ({ default: m.TextViewer })));
12001
+ var DocxViewer2 = React46.lazy(() => Promise.resolve().then(() => (init_DocxViewer(), DocxViewer_exports)).then((m) => ({ default: m.DocxViewer })));
12002
+ var HtmlViewer2 = React46.lazy(() => Promise.resolve().then(() => (init_HtmlViewer(), HtmlViewer_exports)).then((m) => ({ default: m.HtmlViewer })));
11916
12003
  var PEEK_ROWS = 20;
11917
12004
  var PEEK_LINES = 40;
11918
12005
  function GatedPdfViewer({ source }) {
11919
12006
  const { MUTED: MUTED2 } = useTheme();
11920
- const [failed, setFailed] = React45.useState(false);
12007
+ const [failed, setFailed] = React46.useState(false);
11921
12008
  const workerReady = usePdfWorkerReady(true);
11922
12009
  const ready = failed ? false : workerReady;
11923
12010
  if (ready === null) {
@@ -11952,10 +12039,13 @@ function PreviewHost({ kind, source, mode = "full" }) {
11952
12039
  case "docx":
11953
12040
  viewer = /* @__PURE__ */ jsxRuntime.jsx(DocxViewer2, { url: source.url, base64: source.base64 });
11954
12041
  break;
12042
+ case "html":
12043
+ viewer = /* @__PURE__ */ jsxRuntime.jsx(HtmlViewer2, { url: source.url, base64: source.base64, height: peek ? 240 : 480 });
12044
+ break;
11955
12045
  default:
11956
12046
  return null;
11957
12047
  }
11958
- return /* @__PURE__ */ jsxRuntime.jsx(React45.Suspense, { fallback, children: viewer });
12048
+ return /* @__PURE__ */ jsxRuntime.jsx(React46.Suspense, { fallback, children: viewer });
11959
12049
  }
11960
12050
 
11961
12051
  // src/shared/PreviewModal.tsx
@@ -11971,7 +12061,7 @@ function PreviewModal({
11971
12061
  onDownload
11972
12062
  }) {
11973
12063
  const { BORDER: BORDER3, MUTED: MUTED2, ACCENT: ACCENT2, SURFACE: SURFACE2, FOREGROUND: FOREGROUND2, SCRIM: SCRIM2 } = useTheme();
11974
- React45.useEffect(() => {
12064
+ React46.useEffect(() => {
11975
12065
  if (!open) return;
11976
12066
  const onKey = (e) => {
11977
12067
  if (e.key === "Escape") onClose();
@@ -12148,17 +12238,17 @@ function FileCard({
12148
12238
  previewDisabled = false
12149
12239
  }) {
12150
12240
  const { BORDER: BORDER3, MUTED: MUTED2, ACCENT: ACCENT2, SURFACE: SURFACE2, SURFACE_MUTED: SURFACE_MUTED2, SHADOW: SHADOW2 } = useTheme();
12151
- const [cardHover, setCardHover] = React45.useState(false);
12152
- const [btnHover, setBtnHover] = React45.useState(false);
12153
- const [pvHover, setPvHover] = React45.useState(false);
12241
+ const [cardHover, setCardHover] = React46.useState(false);
12242
+ const [btnHover, setBtnHover] = React46.useState(false);
12243
+ const [pvHover, setPvHover] = React46.useState(false);
12154
12244
  const previewKind = previewKindFor(fileType, filename);
12155
12245
  const canPreview = !previewDisabled && previewKind !== null && (!!previewUrl || !!fetchPreviewBlob);
12156
- const [peekOpen, setPeekOpen] = React45.useState(false);
12157
- const [modalOpen, setModalOpen] = React45.useState(false);
12158
- const [source, setSource] = React45.useState(previewUrl ? { url: previewUrl } : null);
12159
- const [pvLoading, setPvLoading] = React45.useState(false);
12160
- const [pvError, setPvError] = React45.useState(null);
12161
- const ensureSource = React45.useCallback(async () => {
12246
+ const [peekOpen, setPeekOpen] = React46.useState(false);
12247
+ const [modalOpen, setModalOpen] = React46.useState(false);
12248
+ const [source, setSource] = React46.useState(previewUrl ? { url: previewUrl } : null);
12249
+ const [pvLoading, setPvLoading] = React46.useState(false);
12250
+ const [pvError, setPvError] = React46.useState(null);
12251
+ const ensureSource = React46.useCallback(async () => {
12162
12252
  if (source) return source;
12163
12253
  if (previewUrl) {
12164
12254
  const s = { url: previewUrl };
@@ -12180,7 +12270,7 @@ function FileCard({
12180
12270
  setPvLoading(false);
12181
12271
  }
12182
12272
  }, [source, previewUrl, fetchPreviewBlob]);
12183
- const togglePeek = React45.useCallback(async () => {
12273
+ const togglePeek = React46.useCallback(async () => {
12184
12274
  if (peekOpen) {
12185
12275
  setPeekOpen(false);
12186
12276
  return;
@@ -12188,7 +12278,7 @@ function FileCard({
12188
12278
  setPeekOpen(true);
12189
12279
  await ensureSource();
12190
12280
  }, [peekOpen, ensureSource]);
12191
- const openModal = React45.useCallback(async () => {
12281
+ const openModal = React46.useCallback(async () => {
12192
12282
  const s = await ensureSource();
12193
12283
  if (s) setModalOpen(true);
12194
12284
  }, [ensureSource]);
@@ -12303,7 +12393,7 @@ function FileCard({
12303
12393
  whiteSpace: "nowrap"
12304
12394
  },
12305
12395
  children: [
12306
- metaTokens.map((t, i) => /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
12396
+ metaTokens.map((t, i) => /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
12307
12397
  i > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: MUTED2 }, children: "\xB7" }),
12308
12398
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: t })
12309
12399
  ] }, i)),
@@ -12648,7 +12738,7 @@ function ServiceCard({ item, isHovered, onHover, onLeave: onLeave2 }) {
12648
12738
  function OpsDashboardResolver(p) {
12649
12739
  var _a2, _b, _c;
12650
12740
  const { BORDER: BORDER3, MUTED: MUTED2 } = useTheme();
12651
- const [hoveredId, setHoveredId] = React45.useState(null);
12741
+ const [hoveredId, setHoveredId] = React46.useState(null);
12652
12742
  const hasRunning = ((_a2 = p.items) != null ? _a2 : []).some((item) => item.state === "running");
12653
12743
  return /* @__PURE__ */ jsxRuntime.jsxs(ComponentActions, { filename: (_b = p.title) != null ? _b : "ops-dashboard", children: [
12654
12744
  hasRunning && /* @__PURE__ */ jsxRuntime.jsx("style", { children: PULSE_KEYFRAMES }),
@@ -12702,8 +12792,8 @@ function formatDate3(value) {
12702
12792
  }
12703
12793
  function CopyButton({ value, rowHovered }) {
12704
12794
  const { MUTED: MUTED2 } = useTheme();
12705
- const [copied, setCopied] = React45.useState(false);
12706
- const [btnHovered, setBtnHovered] = React45.useState(false);
12795
+ const [copied, setCopied] = React46.useState(false);
12796
+ const [btnHovered, setBtnHovered] = React46.useState(false);
12707
12797
  const handleCopy = () => {
12708
12798
  navigator.clipboard.writeText(value).then(() => {
12709
12799
  setCopied(true);
@@ -12797,7 +12887,7 @@ function ValueCell({ item }) {
12797
12887
  }
12798
12888
  function KVRow({ item, isLast, index }) {
12799
12889
  const { MUTED: MUTED2, BORDER: BORDER3, SURFACE: SURFACE2, SURFACE_MUTED: SURFACE_MUTED2 } = useTheme();
12800
- const [hovered, setHovered] = React45.useState(false);
12890
+ const [hovered, setHovered] = React46.useState(false);
12801
12891
  const altBg = index % 2 === 1 ? SURFACE_MUTED2 : SURFACE2;
12802
12892
  return /* @__PURE__ */ jsxRuntime.jsxs(
12803
12893
  "div",
@@ -12882,7 +12972,7 @@ function KeyValueListResolver(p) {
12882
12972
  var _a4;
12883
12973
  return sum + ((_a4 = g.items) != null ? _a4 : []).length;
12884
12974
  }, 0);
12885
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
12975
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
12886
12976
  /* @__PURE__ */ jsxRuntime.jsxs(
12887
12977
  "div",
12888
12978
  {
@@ -13060,7 +13150,7 @@ function BalanceSheetResolver(p) {
13060
13150
  /* @__PURE__ */ jsxRuntime.jsxs("tbody", { children: [
13061
13151
  ((_p = p.sections) != null ? _p : []).map((section) => {
13062
13152
  var _a3;
13063
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
13153
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
13064
13154
  /* @__PURE__ */ jsxRuntime.jsx("tr", { children: /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan, style: {
13065
13155
  padding: "8px 12px",
13066
13156
  fontSize: "12px",
@@ -13073,7 +13163,7 @@ function BalanceSheetResolver(p) {
13073
13163
  }, children: (_a3 = categoryLabels2[section.category]) != null ? _a3 : section.category }) }),
13074
13164
  section.subsections.map((sub, si) => {
13075
13165
  var _a4;
13076
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
13166
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
13077
13167
  /* @__PURE__ */ jsxRuntime.jsx("tr", { children: /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan, style: {
13078
13168
  padding: "6px 10px 6px 24px",
13079
13169
  fontSize: "12px",
@@ -13249,7 +13339,7 @@ function IncomeStatementResolver(p) {
13249
13339
  textAlign: "left",
13250
13340
  whiteSpace: "nowrap"
13251
13341
  }, children: "\xA0" }),
13252
- periods.map((period) => /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
13342
+ periods.map((period) => /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
13253
13343
  /* @__PURE__ */ jsxRuntime.jsx("th", { style: {
13254
13344
  fontSize: "11px",
13255
13345
  fontWeight: 500,
@@ -13280,7 +13370,7 @@ function IncomeStatementResolver(p) {
13280
13370
  sections.map((section, si) => {
13281
13371
  var _a3;
13282
13372
  const isSubtotal = section.sectionType === "subtotal";
13283
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
13373
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
13284
13374
  /* @__PURE__ */ jsxRuntime.jsx("tr", { children: /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan: colCount, style: {
13285
13375
  padding: "8px 12px",
13286
13376
  fontSize: "12px",
@@ -13311,7 +13401,7 @@ function IncomeStatementResolver(p) {
13311
13401
  var _a5;
13312
13402
  const val = (_a5 = amounts[pi]) != null ? _a5 : 0;
13313
13403
  const isNeg = val < 0;
13314
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
13404
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
13315
13405
  /* @__PURE__ */ jsxRuntime.jsx("td", { style: {
13316
13406
  padding: "6px 10px",
13317
13407
  fontSize: "13px",
@@ -13346,7 +13436,7 @@ function IncomeStatementResolver(p) {
13346
13436
  var _a3;
13347
13437
  const val = (_a3 = grossProfit[pi]) != null ? _a3 : 0;
13348
13438
  const isNeg = val < 0;
13349
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
13439
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
13350
13440
  /* @__PURE__ */ jsxRuntime.jsx("td", { style: {
13351
13441
  padding: "8px 10px",
13352
13442
  fontSize: "12px",
@@ -13381,7 +13471,7 @@ function IncomeStatementResolver(p) {
13381
13471
  var _a3;
13382
13472
  const val = (_a3 = operatingIncome[pi]) != null ? _a3 : 0;
13383
13473
  const isNeg = val < 0;
13384
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
13474
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
13385
13475
  /* @__PURE__ */ jsxRuntime.jsx("td", { style: {
13386
13476
  padding: "8px 10px",
13387
13477
  fontSize: "12px",
@@ -13415,7 +13505,7 @@ function IncomeStatementResolver(p) {
13415
13505
  var _a3;
13416
13506
  const val = (_a3 = netIncome[pi]) != null ? _a3 : 0;
13417
13507
  const isNeg = val < 0;
13418
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
13508
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
13419
13509
  /* @__PURE__ */ jsxRuntime.jsx("td", { style: {
13420
13510
  padding: "10px 10px",
13421
13511
  fontSize: "13px",
@@ -13635,7 +13725,7 @@ function CashFlowStatementResolver(p) {
13635
13725
  /* @__PURE__ */ jsxRuntime.jsxs("tbody", { children: [
13636
13726
  activities.map((activity, ai) => {
13637
13727
  var _a3, _b2, _c2;
13638
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
13728
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
13639
13729
  ai > 0 && /* @__PURE__ */ jsxRuntime.jsx("tr", { children: /* @__PURE__ */ jsxRuntime.jsx(
13640
13730
  "td",
13641
13731
  {
@@ -16049,8 +16139,8 @@ var PRIORITY_STYLES = {
16049
16139
  function EscalationCardResolver(p) {
16050
16140
  var _a2, _b, _c, _d, _e;
16051
16141
  const { BORDER: BORDER3, MUTED: MUTED2, ACCENT: ACCENT2, ACCENT_SOFT: ACCENT_SOFT2, SHADOW: SHADOW2 } = useTheme();
16052
- const [cardHovered, setCardHovered] = React45.useState(false);
16053
- const [btnHovered, setBtnHovered] = React45.useState(false);
16142
+ const [cardHovered, setCardHovered] = React46.useState(false);
16143
+ const [btnHovered, setBtnHovered] = React46.useState(false);
16054
16144
  const priorityStyle = p.priority ? PRIORITY_STYLES[p.priority] : null;
16055
16145
  const railColor = (_a2 = priorityStyle == null ? void 0 : priorityStyle.color) != null ? _a2 : ACCENT2;
16056
16146
  const iconBg = (_b = priorityStyle == null ? void 0 : priorityStyle.bg) != null ? _b : "#fff2ec";
@@ -16922,9 +17012,9 @@ var CONNECTED_GREEN = "#15803d";
16922
17012
  function ConnectIntegrationResolver(p) {
16923
17013
  var _a2;
16924
17014
  const { BORDER: BORDER3, MUTED: MUTED2, ACCENT: ACCENT2, ACCENT_SOFT: ACCENT_SOFT2, PAPER: PAPER2, SURFACE: SURFACE2, SHADOW: SHADOW2 } = useTheme();
16925
- const [cardHovered, setCardHovered] = React45.useState(false);
16926
- const [btnHovered, setBtnHovered] = React45.useState(false);
16927
- const [imgFailed, setImgFailed] = React45.useState(false);
17015
+ const [cardHovered, setCardHovered] = React46.useState(false);
17016
+ const [btnHovered, setBtnHovered] = React46.useState(false);
17017
+ const [imgFailed, setImgFailed] = React46.useState(false);
16928
17018
  const name = (p.integrationName || "Integration").trim();
16929
17019
  const initial = name.charAt(0).toUpperCase();
16930
17020
  const iconSrc = p.iconUrl || brandIconUrl(name);
@@ -17086,9 +17176,9 @@ function IntegrationsListResolver(p) {
17086
17176
  var _a2, _b;
17087
17177
  const { BORDER: BORDER3, MUTED: MUTED2, PAPER: PAPER2, ACCENT: ACCENT2, ACCENT_SOFT: ACCENT_SOFT2, SURFACE: SURFACE2, SHADOW: SHADOW2 } = useTheme();
17088
17178
  const integrations = Array.isArray(p.integrations) ? p.integrations : [];
17089
- const [rowHover, setRowHover] = React45.useState(null);
17090
- const [btnHover, setBtnHover] = React45.useState(null);
17091
- const [failed, setFailed] = React45.useState({});
17179
+ const [rowHover, setRowHover] = React46.useState(null);
17180
+ const [btnHover, setBtnHover] = React46.useState(null);
17181
+ const [failed, setFailed] = React46.useState({});
17092
17182
  const connectedCount = integrations.filter((i) => i.status === "connected").length;
17093
17183
  return /* @__PURE__ */ jsxRuntime.jsx(ComponentActions, { filename: (_a2 = p.title) != null ? _a2 : "integrations", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { width: "100%", display: "flex", flexDirection: "column", gap: "11px" }, children: [
17094
17184
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "2px" }, children: [
@@ -17580,13 +17670,13 @@ var ellipsis = {
17580
17670
  function PipelinePreviewResolver(p) {
17581
17671
  var _a2, _b, _c, _d, _e, _f, _g;
17582
17672
  const { MUTED: MUTED2, PAPER: PAPER2, BORDER: BORDER3, ACCENT: ACCENT2, ACCENT_SOFT: ACCENT_SOFT2, SURFACE: SURFACE2 } = useTheme();
17583
- const [btnHovered, setBtnHovered] = React45.useState(false);
17673
+ const [btnHovered, setBtnHovered] = React46.useState(false);
17584
17674
  const stateCfg = STATE_CONFIG[(_a2 = p.state) != null ? _a2 : "draft"];
17585
17675
  const destinations = (_b = p.destinations) != null ? _b : [];
17586
17676
  const steps = (_c = p.steps) != null ? _c : [];
17587
17677
  const workstreams = (_d = p.workstreams) != null ? _d : [];
17588
17678
  const scheduleLabel = p.schedule ? p.schedule.type === "manual" ? "Manual" : (_f = (_e = p.schedule.label) != null ? _e : p.schedule.cron) != null ? _f : "Scheduled" : null;
17589
- const { nodes, edges, viewBox, vbW, vbH } = React45.useMemo(() => {
17679
+ const { nodes, edges, viewBox, vbW, vbH } = React46.useMemo(() => {
17590
17680
  const res = layoutGraph(steps);
17591
17681
  const b = layoutBounds(res.nodes);
17592
17682
  const pad = 24;
@@ -17600,7 +17690,7 @@ function PipelinePreviewResolver(p) {
17600
17690
  vbH: h
17601
17691
  };
17602
17692
  }, [steps]);
17603
- const nodeMap = React45.useMemo(() => {
17693
+ const nodeMap = React46.useMemo(() => {
17604
17694
  const m = {};
17605
17695
  nodes.forEach((n) => m[n.id] = n);
17606
17696
  return m;
@@ -17978,12 +18068,12 @@ var DEFAULT_INTERACTION = {
17978
18068
  onDecisionSource: void 0,
17979
18069
  onDecisionQueueSubmit: void 0
17980
18070
  };
17981
- var GenUIInteractionContext = React45.createContext(DEFAULT_INTERACTION);
18071
+ var GenUIInteractionContext = React46.createContext(DEFAULT_INTERACTION);
17982
18072
  function GenUIInteractionProvider({ value, children }) {
17983
18073
  return /* @__PURE__ */ jsxRuntime.jsx(GenUIInteractionContext.Provider, { value, children });
17984
18074
  }
17985
18075
  function useGenUIInteraction() {
17986
- return React45.useContext(GenUIInteractionContext);
18076
+ return React46.useContext(GenUIInteractionContext);
17987
18077
  }
17988
18078
  var STATUS_COLORS3 = {
17989
18079
  done: "#15803d",
@@ -18175,8 +18265,8 @@ var CARD_MIN = 132;
18175
18265
  var CARD_GAP = 16;
18176
18266
  var AUTO_COMPACT_BELOW = 360;
18177
18267
  function useContainerWidth(ref) {
18178
- const [w, setW] = React45__default.default.useState(0);
18179
- React45__default.default.useLayoutEffect(() => {
18268
+ const [w, setW] = React46__default.default.useState(0);
18269
+ React46__default.default.useLayoutEffect(() => {
18180
18270
  const el = ref.current;
18181
18271
  if (!el || typeof ResizeObserver === "undefined") return;
18182
18272
  const ro = new ResizeObserver((entries) => {
@@ -18279,15 +18369,15 @@ function WorkflowStepperRenderer({
18279
18369
  const interactive = typeof onSelectStep === "function";
18280
18370
  const statusColor3 = (s) => s === "active" || s === "running" ? ACCENT2 : STATUS_COLORS3[s];
18281
18371
  const doneCount = steps.filter((s) => s.status === "done").length;
18282
- const rootRef = React45__default.default.useRef(null);
18372
+ const rootRef = React46__default.default.useRef(null);
18283
18373
  const containerW = useContainerWidth(rootRef);
18284
18374
  let resolved = density === "auto" ? "full" : density;
18285
18375
  if (density === "auto" && containerW > 0) {
18286
18376
  const needed = steps.length * CARD_MIN + Math.max(0, steps.length - 1) * CARD_GAP;
18287
18377
  resolved = containerW < AUTO_COMPACT_BELOW || needed > containerW * 1.6 ? "compact" : "full";
18288
18378
  }
18289
- const scrollerRef = React45__default.default.useRef(null);
18290
- React45__default.default.useEffect(() => {
18379
+ const scrollerRef = React46__default.default.useRef(null);
18380
+ React46__default.default.useEffect(() => {
18291
18381
  if (resolved !== "full" || loading) return;
18292
18382
  const sc = scrollerRef.current;
18293
18383
  if (!sc) return;
@@ -18298,11 +18388,11 @@ function WorkflowStepperRenderer({
18298
18388
  el.scrollIntoView({ inline: "center", block: "nearest", behavior: "smooth" });
18299
18389
  }
18300
18390
  }, [resolved, loading, selectedStep, activeStepId]);
18301
- const [edges, setEdges] = React45__default.default.useState({
18391
+ const [edges, setEdges] = React46__default.default.useState({
18302
18392
  left: false,
18303
18393
  right: false
18304
18394
  });
18305
- const updateEdges = React45__default.default.useCallback(() => {
18395
+ const updateEdges = React46__default.default.useCallback(() => {
18306
18396
  const sc = scrollerRef.current;
18307
18397
  if (!sc) return;
18308
18398
  const max = sc.scrollWidth - sc.clientWidth;
@@ -18311,7 +18401,7 @@ function WorkflowStepperRenderer({
18311
18401
  const right = sl < max - 1;
18312
18402
  setEdges((prev) => prev.left === left && prev.right === right ? prev : { left, right });
18313
18403
  }, []);
18314
- React45__default.default.useLayoutEffect(() => {
18404
+ React46__default.default.useLayoutEffect(() => {
18315
18405
  if (resolved !== "full" || loading) return;
18316
18406
  updateEdges();
18317
18407
  const sc = scrollerRef.current;
@@ -18367,7 +18457,7 @@ function WorkflowStepperRenderer({
18367
18457
  const reached = s.status !== "pending";
18368
18458
  const clickable = interactive && reached;
18369
18459
  const size = act ? 11 : done ? 9 : 8;
18370
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
18460
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
18371
18461
  i > 0 && /* @__PURE__ */ jsxRuntime.jsx(
18372
18462
  "span",
18373
18463
  {
@@ -18511,7 +18601,7 @@ function WorkflowStepperRenderer({
18511
18601
  const color = statusColor3(step.status);
18512
18602
  const humans = ((_a3 = step.assignees) != null ? _a3 : []).filter((a) => a.kind === "human");
18513
18603
  const roleCaption = humans.map((h) => h.role).filter(Boolean).slice(0, 2).join(" \xB7 ");
18514
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
18604
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
18515
18605
  i > 0 && /* @__PURE__ */ jsxRuntime.jsx(
18516
18606
  "div",
18517
18607
  {
@@ -18877,11 +18967,11 @@ function FieldDetail({
18877
18967
  }) {
18878
18968
  var _a2, _b, _c, _d;
18879
18969
  const { BORDER: BORDER3, MUTED: MUTED2, PAPER: PAPER2, SECONDARY: SECONDARY2, SURFACE: SURFACE2, ACCENT: ACCENT2 } = useTheme();
18880
- const [editing, setEditing] = React45__default.default.useState(false);
18881
- const [draft, setDraft] = React45__default.default.useState("");
18882
- const [saving, setSaving] = React45__default.default.useState(false);
18883
- const [saveError, setSaveError] = React45__default.default.useState(null);
18884
- const textareaRef = React45__default.default.useRef(null);
18970
+ const [editing, setEditing] = React46__default.default.useState(false);
18971
+ const [draft, setDraft] = React46__default.default.useState("");
18972
+ const [saving, setSaving] = React46__default.default.useState(false);
18973
+ const [saveError, setSaveError] = React46__default.default.useState(null);
18974
+ const textareaRef = React46__default.default.useRef(null);
18885
18975
  const color = fieldColor(field, SECONDARY2);
18886
18976
  const corrected = field.state === "corrected";
18887
18977
  const startEdit = (e) => {
@@ -19391,7 +19481,7 @@ function FieldDetails({
19391
19481
  },
19392
19482
  children: facts.map((f) => {
19393
19483
  var _a3;
19394
- return /* @__PURE__ */ jsxRuntime.jsxs(React45__default.default.Fragment, { children: [
19484
+ return /* @__PURE__ */ jsxRuntime.jsxs(React46__default.default.Fragment, { children: [
19395
19485
  /* @__PURE__ */ jsxRuntime.jsx("dt", { style: { fontSize: "12px", color: MUTED2 }, children: f.label }),
19396
19486
  /* @__PURE__ */ jsxRuntime.jsxs(
19397
19487
  "dd",
@@ -19490,7 +19580,7 @@ function FieldAuditLog({
19490
19580
  fields = []
19491
19581
  }) {
19492
19582
  const { BORDER: BORDER3, MUTED: MUTED2, PAPER: PAPER2, SECONDARY: SECONDARY2 } = useTheme();
19493
- const fieldLabelMap = React45__default.default.useMemo(() => {
19583
+ const fieldLabelMap = React46__default.default.useMemo(() => {
19494
19584
  var _a2;
19495
19585
  const map = {};
19496
19586
  for (const f of fields) map[f.field_key] = (_a2 = f.label) != null ? _a2 : f.field_key;
@@ -19689,10 +19779,10 @@ function PageOverlay({
19689
19779
  secondary
19690
19780
  }) {
19691
19781
  const { PAPER: PAPER2, MUTED: MUTED2 } = useTheme();
19692
- const imgRef = React45__default.default.useRef(null);
19693
- const selectedBoxRef = React45__default.default.useRef(null);
19694
- const [px, setPx] = React45__default.default.useState(null);
19695
- React45__default.default.useEffect(() => {
19782
+ const imgRef = React46__default.default.useRef(null);
19783
+ const selectedBoxRef = React46__default.default.useRef(null);
19784
+ const [px, setPx] = React46__default.default.useState(null);
19785
+ React46__default.default.useEffect(() => {
19696
19786
  const el = imgRef.current;
19697
19787
  if (!el) return;
19698
19788
  const measure = () => {
@@ -19706,7 +19796,7 @@ function PageOverlay({
19706
19796
  ro.observe(el);
19707
19797
  return () => ro.disconnect();
19708
19798
  }, [page.imageUrl]);
19709
- React45__default.default.useEffect(() => {
19799
+ React46__default.default.useEffect(() => {
19710
19800
  if (!selectedKey) return;
19711
19801
  if (!fields.some((f) => f.field_key === selectedKey && f.bbox)) return;
19712
19802
  const el = selectedBoxRef.current;
@@ -19808,8 +19898,8 @@ function ExtractionDetail({
19808
19898
  auditLoading
19809
19899
  }) {
19810
19900
  const { BORDER: BORDER3, MUTED: MUTED2, PAPER: PAPER2, SECONDARY: SECONDARY2 } = useTheme();
19811
- const selectedCardRef = React45__default.default.useRef(null);
19812
- React45__default.default.useEffect(() => {
19901
+ const selectedCardRef = React46__default.default.useRef(null);
19902
+ React46__default.default.useEffect(() => {
19813
19903
  if (!selectedKey || tab !== "fields") return;
19814
19904
  const el = selectedCardRef.current;
19815
19905
  if (el && typeof el.scrollIntoView === "function") {
@@ -19980,7 +20070,7 @@ function ExtractionModal({
19980
20070
  children
19981
20071
  }) {
19982
20072
  const { BORDER: BORDER3, MUTED: MUTED2, SURFACE: SURFACE2, FOREGROUND: FOREGROUND2, SCRIM: SCRIM2 } = useTheme();
19983
- React45__default.default.useEffect(() => {
20073
+ React46__default.default.useEffect(() => {
19984
20074
  if (!open) return;
19985
20075
  const onKey = (e) => {
19986
20076
  if (e.key === "Escape") onClose();
@@ -20109,19 +20199,19 @@ function ExtractionModal({
20109
20199
  function DocumentFieldExtractionResolver(p) {
20110
20200
  var _a2, _b;
20111
20201
  const { BORDER: BORDER3, MUTED: MUTED2, PAPER: PAPER2, SURFACE: SURFACE2, SHADOW: SHADOW2, ACCENT: ACCENT2 } = useTheme();
20112
- const [selectedKey, setSelectedKey] = React45__default.default.useState(null);
20113
- const [open, setOpen] = React45__default.default.useState(false);
20114
- const [tab, setTab] = React45__default.default.useState("fields");
20202
+ const [selectedKey, setSelectedKey] = React46__default.default.useState(null);
20203
+ const [open, setOpen] = React46__default.default.useState(false);
20204
+ const [tab, setTab] = React46__default.default.useState("fields");
20115
20205
  const pages = (_a2 = p.pages) != null ? _a2 : [];
20116
20206
  const fields = (_b = p.fields) != null ? _b : [];
20117
20207
  const editable = typeof p.onFieldSave === "function";
20118
20208
  const onLoadAudit = p.onLoadAudit;
20119
- React45__default.default.useEffect(() => {
20209
+ React46__default.default.useEffect(() => {
20120
20210
  if (tab === "audit" && onLoadAudit) {
20121
20211
  onLoadAudit();
20122
20212
  }
20123
20213
  }, [tab, onLoadAudit]);
20124
- const correctionCounts = React45__default.default.useMemo(() => {
20214
+ const correctionCounts = React46__default.default.useMemo(() => {
20125
20215
  var _a3, _b2;
20126
20216
  const counts = {};
20127
20217
  for (const ev of (_a3 = p.auditEvents) != null ? _a3 : []) {
@@ -20478,8 +20568,8 @@ function formatAmount2(amount, currency = "USD") {
20478
20568
  return `${sign}${symbol}${body}`;
20479
20569
  }
20480
20570
  function useContainerWidth2(ref) {
20481
- const [w, setW] = React45__default.default.useState(0);
20482
- React45__default.default.useLayoutEffect(() => {
20571
+ const [w, setW] = React46__default.default.useState(0);
20572
+ React46__default.default.useLayoutEffect(() => {
20483
20573
  const el = ref.current;
20484
20574
  if (!el || typeof ResizeObserver === "undefined") return;
20485
20575
  const ro = new ResizeObserver((entries) => {
@@ -20574,8 +20664,8 @@ function ValueAdjuster({
20574
20664
  const { SURFACE_MUTED: SURFACE_MUTED2 } = useTheme();
20575
20665
  const adjust = option.adjust;
20576
20666
  const suggested = clampToRange((_a2 = option.value) != null ? _a2 : adjust.min, adjust);
20577
- const [value, setValue] = React45__default.default.useState(suggested);
20578
- const [text, setText] = React45__default.default.useState(String(suggested));
20667
+ const [value, setValue] = React46__default.default.useState(suggested);
20668
+ const [text, setText] = React46__default.default.useState(String(suggested));
20579
20669
  const step = (_b = adjust.step) != null ? _b : Number.isInteger(adjust.min) && Number.isInteger(adjust.max) ? 1 : (adjust.max - adjust.min) / 100;
20580
20670
  const pct = adjust.max > adjust.min ? (value - adjust.min) / (adjust.max - adjust.min) * 100 : 0;
20581
20671
  const suggestedPct = adjust.max > adjust.min ? (suggested - adjust.min) / (adjust.max - adjust.min) * 100 : 0;
@@ -20781,10 +20871,10 @@ function DecisionCardRenderer({
20781
20871
  }) {
20782
20872
  var _a2, _b, _c;
20783
20873
  const { BORDER: BORDER3, MUTED: MUTED2, ACCENT: ACCENT2, ACCENT_SOFT: ACCENT_SOFT2, SURFACE: SURFACE2, SURFACE_MUTED: SURFACE_MUTED2, SHADOW: SHADOW2 } = useTheme();
20784
- const rootRef = React45__default.default.useRef(null);
20874
+ const rootRef = React46__default.default.useRef(null);
20785
20875
  const width = useContainerWidth2(rootRef);
20786
20876
  const stacked = width > 0 && width < STACK_BELOW;
20787
- const [adjustingIdx, setAdjustingIdx] = React45__default.default.useState(null);
20877
+ const [adjustingIdx, setAdjustingIdx] = React46__default.default.useState(null);
20788
20878
  const options = (_a2 = data.options) != null ? _a2 : [];
20789
20879
  const recommendedIdx = Math.max(
20790
20880
  0,
@@ -21085,8 +21175,8 @@ function DecisionCardResolver(p) {
21085
21175
  const decisionId = (_a2 = p.id) != null ? _a2 : p.title;
21086
21176
  const hostResolved = resolvedDecisions == null ? void 0 : resolvedDecisions[decisionId];
21087
21177
  const initial = hostResolved != null ? hostResolved : p.resolved ? composeResolution(p, p.resolved.option, p.resolved.value) : null;
21088
- const [localResolved, setLocalResolved] = React45__default.default.useState(initial);
21089
- React45__default.default.useEffect(() => {
21178
+ const [localResolved, setLocalResolved] = React46__default.default.useState(initial);
21179
+ React46__default.default.useEffect(() => {
21090
21180
  if (hostResolved !== void 0) setLocalResolved(hostResolved);
21091
21181
  }, [hostResolved]);
21092
21182
  const resolved = hostResolved != null ? hostResolved : localResolved;
@@ -21160,11 +21250,11 @@ function DecisionQueueRenderer({
21160
21250
  var _a2;
21161
21251
  const { BORDER: BORDER3, MUTED: MUTED2, ACCENT: ACCENT2, SURFACE: SURFACE2, SURFACE_MUTED: SURFACE_MUTED2, BORDER_SOFT: BORDER_SOFT2, PAPER: PAPER2, SHADOW: SHADOW2 } = useTheme();
21162
21252
  const items = (_a2 = data.items) != null ? _a2 : [];
21163
- const [decisions, setDecisions] = React45__default.default.useState(
21253
+ const [decisions, setDecisions] = React46__default.default.useState(
21164
21254
  () => items.map(() => void 0)
21165
21255
  );
21166
21256
  const firstUndecided = decisions.findIndex((d) => !d);
21167
- const [focusIdx, setFocusIdx] = React45__default.default.useState(firstUndecided >= 0 ? firstUndecided : null);
21257
+ const [focusIdx, setFocusIdx] = React46__default.default.useState(firstUndecided >= 0 ? firstUndecided : null);
21168
21258
  const isSubmitted = submitted != null;
21169
21259
  const shown = isSubmitted ? items.map(
21170
21260
  (item, i) => {
@@ -21189,16 +21279,16 @@ function DecisionQueueRenderer({
21189
21279
  const final = decisions;
21190
21280
  onSubmit == null ? void 0 : onSubmit(final, composeQueueMessage(items, final));
21191
21281
  };
21192
- const onReadyRef = React45__default.default.useRef(onReady);
21193
- React45__default.default.useEffect(() => {
21282
+ const onReadyRef = React46__default.default.useRef(onReady);
21283
+ React46__default.default.useEffect(() => {
21194
21284
  onReadyRef.current = onReady;
21195
21285
  });
21196
- React45__default.default.useEffect(() => {
21286
+ React46__default.default.useEffect(() => {
21197
21287
  if (!onReadyRef.current) return;
21198
21288
  const msg = allDecided ? composeQueueMessage(items, decisions) : null;
21199
21289
  onReadyRef.current(allDecided && !isSubmitted, msg, decisions.filter(Boolean));
21200
21290
  }, [decisions, allDecided, isSubmitted]);
21201
- React45__default.default.useEffect(() => {
21291
+ React46__default.default.useEffect(() => {
21202
21292
  if (!submitRef) return;
21203
21293
  submitRef.current = handleSubmit;
21204
21294
  return () => {
@@ -21423,7 +21513,7 @@ function DecisionQueueResolver(p) {
21423
21513
  const { resolvedDecisions, onDecisionQueueSubmit } = useGenUIInteraction();
21424
21514
  const queueId = (_b = (_a2 = p.id) != null ? _a2 : p.title) != null ? _b : "decision-queue";
21425
21515
  const replayed = (_d = (_c = p.resolved) == null ? void 0 : _c.decisions) != null ? _d : null;
21426
- const [localSubmitted, setLocalSubmitted] = React45__default.default.useState(null);
21516
+ const [localSubmitted, setLocalSubmitted] = React46__default.default.useState(null);
21427
21517
  const hostLocked = (resolvedDecisions == null ? void 0 : resolvedDecisions[queueId]) != null;
21428
21518
  const submitted = (_e = replayed != null ? replayed : localSubmitted) != null ? _e : hostLocked ? [] : null;
21429
21519
  const handleSubmit = (decisions, message) => {
@@ -21501,9 +21591,9 @@ function ExternalIcon() {
21501
21591
  function TabbyAuthResolver(p) {
21502
21592
  var _a2, _b, _c;
21503
21593
  const { BORDER: BORDER3, MUTED: MUTED2, ACCENT: ACCENT2, ACCENT_SOFT: ACCENT_SOFT2, SURFACE: SURFACE2, SURFACE_MUTED: SURFACE_MUTED2, SHADOW: SHADOW2 } = useTheme();
21504
- const [cardHovered, setCardHovered] = React45.useState(false);
21505
- const [btnHovered, setBtnHovered] = React45.useState(false);
21506
- const [imgFailed, setImgFailed] = React45.useState(false);
21594
+ const [cardHovered, setCardHovered] = React46.useState(false);
21595
+ const [btnHovered, setBtnHovered] = React46.useState(false);
21596
+ const [imgFailed, setImgFailed] = React46.useState(false);
21507
21597
  const app = humanizeApp(p.app || "the app");
21508
21598
  const connected = p.state === "connected";
21509
21599
  const accent = connected ? CONNECTED_GREEN3 : ACCENT2;
@@ -21909,7 +21999,7 @@ function InlineSpinner() {
21909
21999
  }
21910
22000
  function GenUIRenderer({ payload }) {
21911
22001
  return /* @__PURE__ */ jsxRuntime.jsx(
21912
- React45.Suspense,
22002
+ React46.Suspense,
21913
22003
  {
21914
22004
  fallback: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", gap: "8px", padding: "8px 0" }, children: [
21915
22005
  /* @__PURE__ */ jsxRuntime.jsx(InlineSpinner, {}),
@@ -22061,7 +22151,7 @@ var INPUT_ERROR = { borderColor: "#dc2626" };
22061
22151
  var SELECT_EXTRA = { cursor: "pointer" };
22062
22152
  function useInputBase() {
22063
22153
  const { BORDER: BORDER3, SURFACE: SURFACE2 } = useTheme();
22064
- return React45.useMemo(() => ({
22154
+ return React46.useMemo(() => ({
22065
22155
  font: "inherit",
22066
22156
  fontSize: "13px",
22067
22157
  padding: "7px 10px",
@@ -22142,7 +22232,7 @@ function SelectField({ field, value, onChange, disabled, error }) {
22142
22232
  }
22143
22233
  function MultiSelectField({ field, value, onChange, disabled }) {
22144
22234
  const { MUTED: MUTED2, ACCENT: ACCENT2, BORDER: BORDER3, SURFACE: SURFACE2 } = useTheme();
22145
- const [hovered, setHovered] = React45.useState(null);
22235
+ const [hovered, setHovered] = React46.useState(null);
22146
22236
  const options = field.options || [];
22147
22237
  const selected = Array.isArray(value) ? value : [];
22148
22238
  const toggle = (optValue) => {
@@ -22259,8 +22349,8 @@ function DocGlyph({ color }) {
22259
22349
  }
22260
22350
  function FileUploadField({ field, value, onChange, disabled, onFileUpload, error, dense }) {
22261
22351
  const { MUTED: MUTED2, ACCENT: ACCENT2, BORDER: BORDER3, PAPER: PAPER2, SURFACE: SURFACE2 } = useTheme();
22262
- const keyRef = React45__default.default.useRef(0);
22263
- const [entries, setEntries] = React45.useState(() => {
22352
+ const keyRef = React46__default.default.useRef(0);
22353
+ const [entries, setEntries] = React46.useState(() => {
22264
22354
  const arr = Array.isArray(value) ? value : value && typeof value === "object" ? [value] : [];
22265
22355
  return arr.map((item) => {
22266
22356
  var _a2, _b;
@@ -22268,11 +22358,11 @@ function FileUploadField({ field, value, onChange, disabled, onFileUpload, error
22268
22358
  return { key: keyRef.current += 1, name: (_b = (_a2 = r.filename) != null ? _a2 : r.name) != null ? _b : "file", size: r.size, status: "done", result: r };
22269
22359
  });
22270
22360
  });
22271
- const entriesRef = React45__default.default.useRef(entries);
22361
+ const entriesRef = React46__default.default.useRef(entries);
22272
22362
  entriesRef.current = entries;
22273
- const [dragOver, setDragOver] = React45.useState(false);
22274
- const inputRef = React45__default.default.useRef(null);
22275
- React45__default.default.useEffect(() => {
22363
+ const [dragOver, setDragOver] = React46.useState(false);
22364
+ const inputRef = React46__default.default.useRef(null);
22365
+ React46__default.default.useEffect(() => {
22276
22366
  ensureFileUploadKeyframes();
22277
22367
  }, []);
22278
22368
  const interactive = !disabled;
@@ -22403,24 +22493,24 @@ function EntityPickerField({ field, value, onChange, disabled, error, onEntitySe
22403
22493
  const { BORDER: BORDER3, MUTED: MUTED2, ACCENT: ACCENT2, PAPER: PAPER2, SURFACE: SURFACE2 } = useTheme();
22404
22494
  const base = useInputBase();
22405
22495
  const source = field.source || "";
22406
- const [open, setOpen] = React45.useState(false);
22407
- const [query, setQuery] = React45.useState("");
22408
- const [results, setResults] = React45.useState([]);
22409
- const [loading, setLoading] = React45.useState(false);
22410
- const [err, setErr] = React45.useState(null);
22411
- const [hi, setHi] = React45.useState(0);
22412
- const [selectedLabel, setSelectedLabel] = React45.useState(null);
22413
- const [creating, setCreating] = React45.useState(false);
22414
- const [createVals, setCreateVals] = React45.useState({});
22415
- const [createBusy, setCreateBusy] = React45.useState(false);
22416
- const boxRef = React45.useRef(null);
22417
- const seq = React45.useRef(0);
22496
+ const [open, setOpen] = React46.useState(false);
22497
+ const [query, setQuery] = React46.useState("");
22498
+ const [results, setResults] = React46.useState([]);
22499
+ const [loading, setLoading] = React46.useState(false);
22500
+ const [err, setErr] = React46.useState(null);
22501
+ const [hi, setHi] = React46.useState(0);
22502
+ const [selectedLabel, setSelectedLabel] = React46.useState(null);
22503
+ const [creating, setCreating] = React46.useState(false);
22504
+ const [createVals, setCreateVals] = React46.useState({});
22505
+ const [createBusy, setCreateBusy] = React46.useState(false);
22506
+ const boxRef = React46.useRef(null);
22507
+ const seq = React46.useRef(0);
22418
22508
  const allowCreate = !!field.allow_create && !!onEntityCreate;
22419
- const createFields = React45.useMemo(
22509
+ const createFields = React46.useMemo(
22420
22510
  () => field.create_fields && field.create_fields.length ? field.create_fields : [{ name: "name", label: "Name", field_type: "text", required: true, placeholder: "" }],
22421
22511
  [field.create_fields]
22422
22512
  );
22423
- const runSearch = React45.useCallback(
22513
+ const runSearch = React46.useCallback(
22424
22514
  (q) => {
22425
22515
  if (!onEntitySearch || !source) return;
22426
22516
  const my = ++seq.current;
@@ -22442,12 +22532,12 @@ function EntityPickerField({ field, value, onChange, disabled, error, onEntitySe
22442
22532
  },
22443
22533
  [onEntitySearch, source]
22444
22534
  );
22445
- React45.useEffect(() => {
22535
+ React46.useEffect(() => {
22446
22536
  if (!open || creating) return;
22447
22537
  const id = setTimeout(() => runSearch(query), 200);
22448
22538
  return () => clearTimeout(id);
22449
22539
  }, [open, creating, query, runSearch]);
22450
- React45.useEffect(() => {
22540
+ React46.useEffect(() => {
22451
22541
  if (!open) return;
22452
22542
  const onDoc = (e) => {
22453
22543
  if (boxRef.current && !boxRef.current.contains(e.target)) {
@@ -22462,7 +22552,7 @@ function EntityPickerField({ field, value, onChange, disabled, error, onEntitySe
22462
22552
  if (disabled) return;
22463
22553
  setOpen(true);
22464
22554
  };
22465
- const select = React45.useCallback((opt) => {
22555
+ const select = React46.useCallback((opt) => {
22466
22556
  onChange({ value: opt.value, label: opt.label });
22467
22557
  setSelectedLabel(opt.label);
22468
22558
  setQuery("");
@@ -22476,14 +22566,14 @@ function EntityPickerField({ field, value, onChange, disabled, error, onEntitySe
22476
22566
  const otherRequired = createFields.filter((f) => f !== nameField && f.required);
22477
22567
  const showCreateRow = allowCreate && !creating && query.trim().length > 0;
22478
22568
  const totalRows = results.length + (showCreateRow ? 1 : 0);
22479
- const beginCreate = React45.useCallback(() => {
22569
+ const beginCreate = React46.useCallback(() => {
22480
22570
  const init = {};
22481
22571
  if (nameField && query.trim()) init[nameField.name] = query.trim();
22482
22572
  setCreateVals(init);
22483
22573
  setErr(null);
22484
22574
  setCreating(true);
22485
22575
  }, [nameField, query]);
22486
- const submitCreate = React45.useCallback((vals) => {
22576
+ const submitCreate = React46.useCallback((vals) => {
22487
22577
  if (!onEntityCreate || !source) return;
22488
22578
  const payload = vals || createVals;
22489
22579
  for (const f of createFields) {
@@ -22496,7 +22586,7 @@ function EntityPickerField({ field, value, onChange, disabled, error, onEntitySe
22496
22586
  setErr(null);
22497
22587
  onEntityCreate(source, payload).then((opt) => select(opt)).catch(() => setErr("Couldn't create \u2014 you may not have permission")).finally(() => setCreateBusy(false));
22498
22588
  }, [onEntityCreate, source, createFields, createVals, select]);
22499
- const handleCreateRow = React45.useCallback(() => {
22589
+ const handleCreateRow = React46.useCallback(() => {
22500
22590
  const q = query.trim();
22501
22591
  if (!q || !nameField) return;
22502
22592
  if (otherRequired.length === 0) {
@@ -22678,11 +22768,11 @@ function _fileExt(path, type) {
22678
22768
  function FileMapField({ field, value, onChange, disabled }) {
22679
22769
  const { BORDER: BORDER3, MUTED: MUTED2, ACCENT: ACCENT2, PAPER: PAPER2, SURFACE: SURFACE2 } = useTheme();
22680
22770
  const cfg = field.file_map || null;
22681
- const categories = React45.useMemo(() => (cfg == null ? void 0 : cfg.categories) || [], [cfg]);
22682
- const fileList = React45.useMemo(() => (cfg == null ? void 0 : cfg.files) || [], [cfg]);
22771
+ const categories = React46.useMemo(() => (cfg == null ? void 0 : cfg.categories) || [], [cfg]);
22772
+ const fileList = React46.useMemo(() => (cfg == null ? void 0 : cfg.files) || [], [cfg]);
22683
22773
  const suggestions = (cfg == null ? void 0 : cfg.suggestions) || {};
22684
22774
  const confidence = (cfg == null ? void 0 : cfg.confidence) || {};
22685
- const initial = React45.useMemo(() => {
22775
+ const initial = React46.useMemo(() => {
22686
22776
  const a = {};
22687
22777
  if (value && typeof value === "object" && !Array.isArray(value)) {
22688
22778
  for (const [grp, paths] of Object.entries(value))
@@ -22694,15 +22784,15 @@ function FileMapField({ field, value, onChange, disabled }) {
22694
22784
  for (const f of fileList) if (!(f.path in a)) a[f.path] = _FILEMAP_UNASSIGNED;
22695
22785
  return a;
22696
22786
  }, []);
22697
- const [assignment, setAssignment] = React45.useState(initial);
22698
- const [collapsed, setCollapsed] = React45.useState({});
22699
- const [menuFor, setMenuFor] = React45.useState(null);
22700
- const boardRef = React45.useRef(null);
22701
- const fileByPath = React45.useMemo(
22787
+ const [assignment, setAssignment] = React46.useState(initial);
22788
+ const [collapsed, setCollapsed] = React46.useState({});
22789
+ const [menuFor, setMenuFor] = React46.useState(null);
22790
+ const boardRef = React46.useRef(null);
22791
+ const fileByPath = React46.useMemo(
22702
22792
  () => Object.fromEntries(fileList.map((f) => [f.path, f])),
22703
22793
  [fileList]
22704
22794
  );
22705
- const groupFrom = React45.useCallback((a) => {
22795
+ const groupFrom = React46.useCallback((a) => {
22706
22796
  const g = { [_FILEMAP_UNASSIGNED]: [] };
22707
22797
  for (const c of categories) g[c.id] = [];
22708
22798
  for (const f of fileList) {
@@ -22712,16 +22802,16 @@ function FileMapField({ field, value, onChange, disabled }) {
22712
22802
  }
22713
22803
  return g;
22714
22804
  }, [categories, fileList]);
22715
- const grouped = React45.useMemo(() => groupFrom(assignment), [assignment, groupFrom]);
22716
- const emit = React45.useCallback((g) => onChange(g), [onChange]);
22717
- const emittedRef = React45.useRef(false);
22718
- React45.useEffect(() => {
22805
+ const grouped = React46.useMemo(() => groupFrom(assignment), [assignment, groupFrom]);
22806
+ const emit = React46.useCallback((g) => onChange(g), [onChange]);
22807
+ const emittedRef = React46.useRef(false);
22808
+ React46.useEffect(() => {
22719
22809
  if (!emittedRef.current) {
22720
22810
  emittedRef.current = true;
22721
22811
  emit(grouped);
22722
22812
  }
22723
22813
  }, [grouped, emit]);
22724
- React45.useEffect(() => {
22814
+ React46.useEffect(() => {
22725
22815
  if (!menuFor) return;
22726
22816
  const onDoc = (e) => {
22727
22817
  if (boardRef.current && !boardRef.current.contains(e.target)) setMenuFor(null);
@@ -22729,7 +22819,7 @@ function FileMapField({ field, value, onChange, disabled }) {
22729
22819
  document.addEventListener("mousedown", onDoc);
22730
22820
  return () => document.removeEventListener("mousedown", onDoc);
22731
22821
  }, [menuFor]);
22732
- const move = React45.useCallback((path, grp) => {
22822
+ const move = React46.useCallback((path, grp) => {
22733
22823
  setMenuFor(null);
22734
22824
  setAssignment((prev) => {
22735
22825
  const next = __spreadProps(__spreadValues({}, prev), { [path]: grp });
@@ -22879,7 +22969,7 @@ function FieldRenderer({ field, value, onChange, disabled, error, onFileUpload,
22879
22969
  ] });
22880
22970
  }
22881
22971
  init_ThemeContext();
22882
- var SlotErrorBoundary = class extends React45__default.default.Component {
22972
+ var SlotErrorBoundary = class extends React46__default.default.Component {
22883
22973
  constructor(props) {
22884
22974
  super(props);
22885
22975
  this.state = { hasError: false };
@@ -22965,7 +23055,7 @@ function BuilderRecap({ builder, state }) {
22965
23055
  return String(value);
22966
23056
  };
22967
23057
  const decisionField = (b) => (b.fields || []).find((f) => f.field_type === "select") || (b.fields || [])[0];
22968
- const rows = React45.useMemo(
23058
+ const rows = React46.useMemo(
22969
23059
  () => blocks.map((b) => {
22970
23060
  const df = decisionField(b);
22971
23061
  const decision = df ? display(df, state.getValue(b.id, df.name)) : "";
@@ -22975,7 +23065,7 @@ function BuilderRecap({ builder, state }) {
22975
23065
  // eslint-disable-next-line react-hooks/exhaustive-deps
22976
23066
  [blocks, state.values]
22977
23067
  );
22978
- const counts = React45.useMemo(() => {
23068
+ const counts = React46.useMemo(() => {
22979
23069
  const m = /* @__PURE__ */ new Map();
22980
23070
  for (const r of rows) {
22981
23071
  const k = r.decision || "\u2014";
@@ -23110,7 +23200,7 @@ function isRequiredMissing(fieldType, v) {
23110
23200
  }
23111
23201
  function useBuilderState(blocks) {
23112
23202
  const isMultiBlock = blocks.length > 1;
23113
- const [values, setValues] = React45.useState(() => {
23203
+ const [values, setValues] = React46.useState(() => {
23114
23204
  const init = {};
23115
23205
  for (const block of blocks) {
23116
23206
  for (const field of block.fields || []) {
@@ -23119,17 +23209,17 @@ function useBuilderState(blocks) {
23119
23209
  }
23120
23210
  return init;
23121
23211
  });
23122
- const [errors, setErrors] = React45.useState({});
23123
- const [currentBlock, setCurrentBlock] = React45.useState(0);
23124
- const getValue = React45.useCallback(
23212
+ const [errors, setErrors] = React46.useState({});
23213
+ const [currentBlock, setCurrentBlock] = React46.useState(0);
23214
+ const getValue = React46.useCallback(
23125
23215
  (blockId, name) => values[fieldKey(blockId, name)],
23126
23216
  [values]
23127
23217
  );
23128
- const getError = React45.useCallback(
23218
+ const getError = React46.useCallback(
23129
23219
  (blockId, name) => errors[fieldKey(blockId, name)],
23130
23220
  [errors]
23131
23221
  );
23132
- const setFieldValue = React45.useCallback((blockId, name, value) => {
23222
+ const setFieldValue = React46.useCallback((blockId, name, value) => {
23133
23223
  const k = fieldKey(blockId, name);
23134
23224
  setValues((prev) => __spreadProps(__spreadValues({}, prev), { [k]: value }));
23135
23225
  setErrors((prev) => {
@@ -23139,7 +23229,7 @@ function useBuilderState(blocks) {
23139
23229
  return next;
23140
23230
  });
23141
23231
  }, []);
23142
- const validateBlock = React45.useCallback(
23232
+ const validateBlock = React46.useCallback(
23143
23233
  (blockIdx) => {
23144
23234
  const block = blocks[blockIdx];
23145
23235
  if (!block) return true;
@@ -23173,7 +23263,7 @@ function useBuilderState(blocks) {
23173
23263
  },
23174
23264
  [blocks, values]
23175
23265
  );
23176
- const validateAllDetailed = React45.useCallback(() => {
23266
+ const validateAllDetailed = React46.useCallback(() => {
23177
23267
  let firstBlockIndex = -1;
23178
23268
  let firstKey = null;
23179
23269
  let firstBlockId = null;
@@ -23201,7 +23291,7 @@ function useBuilderState(blocks) {
23201
23291
  if (firstBlockIndex >= 0) setCurrentBlock(firstBlockIndex);
23202
23292
  return { firstKey, firstBlockId, firstName, firstBlockIndex, failingKeys };
23203
23293
  }, [blocks, values]);
23204
- const validateAll = React45.useCallback(
23294
+ const validateAll = React46.useCallback(
23205
23295
  () => validateAllDetailed().failingKeys.length === 0,
23206
23296
  [validateAllDetailed]
23207
23297
  );
@@ -23236,7 +23326,7 @@ function BlockForm({
23236
23326
  }) {
23237
23327
  var _a2;
23238
23328
  const t = useTheme();
23239
- const S3 = React45.useMemo(() => makeStyles(t), [t]);
23329
+ const S3 = React46.useMemo(() => makeStyles(t), [t]);
23240
23330
  const block = builder.blocks[0];
23241
23331
  const isEscalation = variant === "escalation";
23242
23332
  const errorCount = ((block == null ? void 0 : block.fields) || []).reduce(
@@ -23442,7 +23532,7 @@ init_ThemeContext();
23442
23532
  function StepperBuilder({ builder, state, onSubmit, onCancel, disabled, onFileUpload, onEntitySearch, onEntityCreate, dense }) {
23443
23533
  var _a2;
23444
23534
  const t = useTheme();
23445
- const S3 = React45.useMemo(() => makeStyles2(t), [t]);
23535
+ const S3 = React46.useMemo(() => makeStyles2(t), [t]);
23446
23536
  const { blocks } = builder;
23447
23537
  const total = blocks.length;
23448
23538
  const idx = Math.min(Math.max(state.currentBlock, 0), Math.max(total - 1, 0));
@@ -23644,7 +23734,7 @@ function BuilderFormResolver({
23644
23734
  `[BuilderForm] builder "${builder.builder_id}" declared builder_kind="${declaredKind}" with ${blockCount} blocks; rendering as stepper to avoid dropping blocks.`
23645
23735
  );
23646
23736
  }
23647
- const buildSubmission = React45.useCallback(() => {
23737
+ const buildSubmission = React46.useCallback(() => {
23648
23738
  const blocks = (builder.blocks || []).map((b) => ({
23649
23739
  id: b.id,
23650
23740
  title: b.title,
@@ -23656,7 +23746,7 @@ function BuilderFormResolver({
23656
23746
  blocks
23657
23747
  }, blocks.length === 1 ? { values: blocks[0].values } : {});
23658
23748
  }, [builder, kind, state.getValue]);
23659
- const handleSubmit = React45.useCallback(() => {
23749
+ const handleSubmit = React46.useCallback(() => {
23660
23750
  if (disabled) return;
23661
23751
  const failure = state.validateAllDetailed();
23662
23752
  if (failure.failingKeys.length > 0) {
@@ -23665,25 +23755,25 @@ function BuilderFormResolver({
23665
23755
  }
23666
23756
  onSubmit(buildSubmission());
23667
23757
  }, [disabled, state.validateAllDetailed, onSubmit, buildSubmission, onValidationError]);
23668
- const onChangeRef = React45.useRef(onChange);
23669
- React45.useEffect(() => {
23758
+ const onChangeRef = React46.useRef(onChange);
23759
+ React46.useEffect(() => {
23670
23760
  onChangeRef.current = onChange;
23671
23761
  });
23672
- React45.useEffect(() => {
23762
+ React46.useEffect(() => {
23673
23763
  var _a3;
23674
23764
  (_a3 = onChangeRef.current) == null ? void 0 : _a3.call(onChangeRef, buildSubmission());
23675
23765
  }, [state.values]);
23676
- const onBlockChangeRef = React45.useRef(onBlockChange);
23677
- React45.useEffect(() => {
23766
+ const onBlockChangeRef = React46.useRef(onBlockChange);
23767
+ React46.useEffect(() => {
23678
23768
  onBlockChangeRef.current = onBlockChange;
23679
23769
  });
23680
23770
  const activeIdx = kind === "stepper" ? state.currentBlock : 0;
23681
- React45.useEffect(() => {
23771
+ React46.useEffect(() => {
23682
23772
  var _a3;
23683
23773
  const block = (builder.blocks || [])[activeIdx];
23684
23774
  if (block) (_a3 = onBlockChangeRef.current) == null ? void 0 : _a3.call(onBlockChangeRef, block, activeIdx);
23685
23775
  }, [activeIdx]);
23686
- React45.useEffect(() => {
23776
+ React46.useEffect(() => {
23687
23777
  if (!submitRef) return;
23688
23778
  submitRef.current = handleSubmit;
23689
23779
  return () => {
@@ -23746,7 +23836,7 @@ function BuilderFormResolver({
23746
23836
  }
23747
23837
  }
23748
23838
  function resolveBuilder(payload, callbacks) {
23749
- return React45__default.default.createElement(BuilderFormResolver, __spreadValues({
23839
+ return React46__default.default.createElement(BuilderFormResolver, __spreadValues({
23750
23840
  builder: payload
23751
23841
  }, callbacks));
23752
23842
  }