@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.
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var React10 = require('react');
4
+ var React11 = require('react');
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
6
  var reactPdf = require('react-pdf');
7
7
  require('react-pdf/dist/Page/AnnotationLayer.css');
@@ -32,7 +32,7 @@ function _interopNamespace(e) {
32
32
  return Object.freeze(n);
33
33
  }
34
34
 
35
- var React10__default = /*#__PURE__*/_interopDefault(React10);
35
+ var React11__default = /*#__PURE__*/_interopDefault(React11);
36
36
  var XLSX__namespace = /*#__PURE__*/_interopNamespace(XLSX);
37
37
  var Papa__default = /*#__PURE__*/_interopDefault(Papa);
38
38
  var mammoth__namespace = /*#__PURE__*/_interopNamespace(mammoth);
@@ -106,7 +106,7 @@ var init_theme = __esm({
106
106
  }
107
107
  });
108
108
  function useTheme() {
109
- return React10.useContext(GenUIThemeContext);
109
+ return React11.useContext(GenUIThemeContext);
110
110
  }
111
111
  var DEFAULT_TOKENS, GenUIThemeContext;
112
112
  var init_ThemeContext = __esm({
@@ -128,7 +128,7 @@ var init_ThemeContext = __esm({
128
128
  SECONDARY,
129
129
  CHART_PALETTE: [...CHART_PALETTE]
130
130
  };
131
- GenUIThemeContext = React10.createContext(DEFAULT_TOKENS);
131
+ GenUIThemeContext = React11.createContext(DEFAULT_TOKENS);
132
132
  }
133
133
  });
134
134
  function renderInline(text) {
@@ -505,8 +505,8 @@ function probePdfWorker() {
505
505
  return probe;
506
506
  }
507
507
  function usePdfWorkerReady(enabled) {
508
- const [ready, setReady] = React10.useState(null);
509
- React10.useEffect(() => {
508
+ const [ready, setReady] = React11.useState(null);
509
+ React11.useEffect(() => {
510
510
  let cancelled = false;
511
511
  probePdfWorker().then((ok) => {
512
512
  if (!cancelled) setReady(ok);
@@ -538,15 +538,15 @@ __export(PdfViewer_exports, {
538
538
  });
539
539
  function PdfViewer({ url, base64, onLoadSuccess, onLoadError }) {
540
540
  const { BORDER: BORDER2, MUTED: MUTED2, SURFACE: SURFACE2 } = useTheme();
541
- const [numPages, setNumPages] = React10.useState(0);
542
- const [currentPage, setCurrentPage] = React10.useState(1);
543
- const [loading, setLoading] = React10.useState(true);
544
- const handleLoad = React10.useCallback(({ numPages: n }) => {
541
+ const [numPages, setNumPages] = React11.useState(0);
542
+ const [currentPage, setCurrentPage] = React11.useState(1);
543
+ const [loading, setLoading] = React11.useState(true);
544
+ const handleLoad = React11.useCallback(({ numPages: n }) => {
545
545
  setNumPages(n);
546
546
  setLoading(false);
547
547
  onLoadSuccess == null ? void 0 : onLoadSuccess(n);
548
548
  }, [onLoadSuccess]);
549
- React10.useEffect(() => {
549
+ React11.useEffect(() => {
550
550
  if (numPages <= 1) return;
551
551
  const handler = (e) => {
552
552
  var _a;
@@ -654,13 +654,13 @@ __export(ExcelViewer_exports, {
654
654
  });
655
655
  function ExcelViewer({ url, base64, onLoadSuccess }) {
656
656
  const { BORDER: BORDER2, MUTED: MUTED2, PAPER: PAPER2, SURFACE: SURFACE2 } = useTheme();
657
- const [sheetNames, setSheetNames] = React10.useState([]);
658
- const [activeSheet, setActiveSheet] = React10.useState(0);
659
- const [data, setData] = React10.useState([]);
660
- const [loading, setLoading] = React10.useState(true);
661
- const [error, setError] = React10.useState(null);
662
- const wbRef = React10.useRef(null);
663
- React10.useEffect(() => {
657
+ const [sheetNames, setSheetNames] = React11.useState([]);
658
+ const [activeSheet, setActiveSheet] = React11.useState(0);
659
+ const [data, setData] = React11.useState([]);
660
+ const [loading, setLoading] = React11.useState(true);
661
+ const [error, setError] = React11.useState(null);
662
+ const wbRef = React11.useRef(null);
663
+ React11.useEffect(() => {
664
664
  let cancelled = false;
665
665
  setLoading(true);
666
666
  setError(null);
@@ -718,7 +718,7 @@ function ExcelViewer({ url, base64, onLoadSuccess }) {
718
718
  const rows = XLSX__namespace.utils.sheet_to_json(wbRef.current.Sheets[wbRef.current.SheetNames[idx]], { header: 1 });
719
719
  setData(rows);
720
720
  };
721
- React10.useEffect(() => {
721
+ React11.useEffect(() => {
722
722
  if (sheetNames.length <= 1) return;
723
723
  const handler = (e) => {
724
724
  var _a;
@@ -844,10 +844,10 @@ __export(CsvViewer_exports, {
844
844
  });
845
845
  function CsvViewer({ url, base64, delimiter, maxRows }) {
846
846
  const { BORDER: BORDER2, MUTED: MUTED2, PAPER: PAPER2 } = useTheme();
847
- const [rows, setRows] = React10.useState([]);
848
- const [loading, setLoading] = React10.useState(true);
849
- const [error, setError] = React10.useState(null);
850
- React10.useEffect(() => {
847
+ const [rows, setRows] = React11.useState([]);
848
+ const [loading, setLoading] = React11.useState(true);
849
+ const [error, setError] = React11.useState(null);
850
+ React11.useEffect(() => {
851
851
  let cancelled = false;
852
852
  setLoading(true);
853
853
  setError(null);
@@ -966,10 +966,10 @@ __export(TextViewer_exports, {
966
966
  });
967
967
  function TextViewer({ url, base64, markdown = false, maxLines }) {
968
968
  const { MUTED: MUTED2 } = useTheme();
969
- const [text, setText] = React10.useState("");
970
- const [loading, setLoading] = React10.useState(true);
971
- const [error, setError] = React10.useState(null);
972
- React10.useEffect(() => {
969
+ const [text, setText] = React11.useState("");
970
+ const [loading, setLoading] = React11.useState(true);
971
+ const [error, setError] = React11.useState(null);
972
+ React11.useEffect(() => {
973
973
  let cancelled = false;
974
974
  setLoading(true);
975
975
  setError(null);
@@ -1067,10 +1067,10 @@ function sanitize(html) {
1067
1067
  }
1068
1068
  function DocxViewer({ url, base64 }) {
1069
1069
  const { MUTED: MUTED2, BORDER: BORDER2, SURFACE: SURFACE2 } = useTheme();
1070
- const [html, setHtml] = React10.useState("");
1071
- const [loading, setLoading] = React10.useState(true);
1072
- const [error, setError] = React10.useState(null);
1073
- React10.useEffect(() => {
1070
+ const [html, setHtml] = React11.useState("");
1071
+ const [loading, setLoading] = React11.useState(true);
1072
+ const [error, setError] = React11.useState(null);
1073
+ React11.useEffect(() => {
1074
1074
  let cancelled = false;
1075
1075
  setLoading(true);
1076
1076
  setError(null);
@@ -1150,6 +1150,89 @@ var init_DocxViewer = __esm({
1150
1150
  }
1151
1151
  });
1152
1152
 
1153
+ // src/shared/viewers/HtmlViewer.tsx
1154
+ var HtmlViewer_exports = {};
1155
+ __export(HtmlViewer_exports, {
1156
+ HtmlViewer: () => HtmlViewer
1157
+ });
1158
+ function HtmlViewer({ url, base64, height = 480 }) {
1159
+ const { MUTED: MUTED2 } = useTheme();
1160
+ const [html, setHtml] = React11.useState("");
1161
+ const [loading, setLoading] = React11.useState(true);
1162
+ const [error, setError] = React11.useState(null);
1163
+ React11.useEffect(() => {
1164
+ let cancelled = false;
1165
+ setLoading(true);
1166
+ setError(null);
1167
+ if (base64) {
1168
+ try {
1169
+ if (!cancelled) {
1170
+ setHtml(base64ToText(base64));
1171
+ setLoading(false);
1172
+ }
1173
+ } catch (e) {
1174
+ if (!cancelled) {
1175
+ setError(e instanceof Error ? e.message : "Failed to decode HTML");
1176
+ setLoading(false);
1177
+ }
1178
+ }
1179
+ return () => {
1180
+ cancelled = true;
1181
+ };
1182
+ }
1183
+ if (!url) {
1184
+ setError("No file source provided");
1185
+ setLoading(false);
1186
+ return () => {
1187
+ cancelled = true;
1188
+ };
1189
+ }
1190
+ fetch(url).then((r) => {
1191
+ if (!r.ok) throw new Error(`Failed to fetch: ${r.status}`);
1192
+ return r.text();
1193
+ }).then((t) => {
1194
+ if (cancelled) return;
1195
+ setHtml(t);
1196
+ setLoading(false);
1197
+ }).catch((e) => {
1198
+ if (cancelled) return;
1199
+ setError(e.message);
1200
+ setLoading(false);
1201
+ });
1202
+ return () => {
1203
+ cancelled = true;
1204
+ };
1205
+ }, [url, base64]);
1206
+ if (loading) {
1207
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { padding: "24px", color: MUTED2, fontSize: "13px", textAlign: "center" }, children: "Loading\u2026" });
1208
+ }
1209
+ if (error) {
1210
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { padding: "24px", color: "#dc2626", fontSize: "13px", textAlign: "center" }, children: error });
1211
+ }
1212
+ return /* @__PURE__ */ jsxRuntime.jsx(
1213
+ "iframe",
1214
+ {
1215
+ title: "HTML preview",
1216
+ sandbox: "",
1217
+ srcDoc: html,
1218
+ style: {
1219
+ width: "100%",
1220
+ height: `${height}px`,
1221
+ border: "none",
1222
+ background: "white",
1223
+ display: "block"
1224
+ }
1225
+ }
1226
+ );
1227
+ }
1228
+ var init_HtmlViewer = __esm({
1229
+ "src/shared/viewers/HtmlViewer.tsx"() {
1230
+ "use client";
1231
+ init_ThemeContext();
1232
+ init_decode();
1233
+ }
1234
+ });
1235
+
1153
1236
  // src/shared/ColumnSettingsPanel.tsx
1154
1237
  init_ThemeContext();
1155
1238
  function ColumnSettingsPanel({ columns, hidden, onToggle, onShowAll, onHideAll }) {
@@ -1201,16 +1284,16 @@ var DOT_COLOR = "#aaaaaa";
1201
1284
  var DOT_HOVER = "#555555";
1202
1285
  function ComponentActions({ children, onDownloadCSV, columnConfig, filename = "component" }) {
1203
1286
  const { BORDER: BORDER2, MUTED: MUTED2, SURFACE: SURFACE2, SURFACE_MUTED: SURFACE_MUTED2 } = useTheme();
1204
- const [open, setOpen] = React10.useState(false);
1205
- const [view, setView] = React10.useState("main");
1206
- const contentRef = React10.useRef(null);
1207
- const menuRef = React10.useRef(null);
1208
- const btnRef = React10.useRef(null);
1209
- const close = React10.useCallback(() => {
1287
+ const [open, setOpen] = React11.useState(false);
1288
+ const [view, setView] = React11.useState("main");
1289
+ const contentRef = React11.useRef(null);
1290
+ const menuRef = React11.useRef(null);
1291
+ const btnRef = React11.useRef(null);
1292
+ const close = React11.useCallback(() => {
1210
1293
  setOpen(false);
1211
1294
  setView("main");
1212
1295
  }, []);
1213
- React10.useEffect(() => {
1296
+ React11.useEffect(() => {
1214
1297
  if (!open) return;
1215
1298
  const handler = (e) => {
1216
1299
  var _a, _b;
@@ -1221,7 +1304,7 @@ function ComponentActions({ children, onDownloadCSV, columnConfig, filename = "c
1221
1304
  document.addEventListener("mousedown", handler);
1222
1305
  return () => document.removeEventListener("mousedown", handler);
1223
1306
  }, [open, close]);
1224
- const handleDownloadPNG = React10.useCallback(async () => {
1307
+ const handleDownloadPNG = React11.useCallback(async () => {
1225
1308
  if (!contentRef.current) return;
1226
1309
  try {
1227
1310
  const url = await htmlToImage.toPng(contentRef.current, { backgroundColor: "white", pixelRatio: 2 });
@@ -1233,7 +1316,7 @@ function ComponentActions({ children, onDownloadCSV, columnConfig, filename = "c
1233
1316
  }
1234
1317
  close();
1235
1318
  }, [filename, close]);
1236
- const handleCSV = React10.useCallback(() => {
1319
+ const handleCSV = React11.useCallback(() => {
1237
1320
  onDownloadCSV == null ? void 0 : onDownloadCSV();
1238
1321
  close();
1239
1322
  }, [onDownloadCSV, close]);
@@ -1355,7 +1438,7 @@ init_theme();
1355
1438
  var FAMILIES = [
1356
1439
  { exts: ["csv", "tsv", "xls", "xlsx", "numbers"], fg: SEMANTIC.success.color, bg: SEMANTIC.success.bg },
1357
1440
  { exts: ["pdf"], fg: SEMANTIC.error.color, bg: SEMANTIC.error.bg },
1358
- { exts: ["doc", "docx", "txt", "md", "rtf", "pages"], fg: SEMANTIC.info.color, bg: SEMANTIC.info.bg },
1441
+ { exts: ["doc", "docx", "txt", "md", "rtf", "pages", "html", "htm"], fg: SEMANTIC.info.color, bg: SEMANTIC.info.bg },
1359
1442
  { exts: ["json", "yaml", "yml", "xml", "toml"], fg: SEMANTIC.purple.color, bg: SEMANTIC.purple.bg },
1360
1443
  { exts: ["zip", "tar", "gz", "rar", "7z"], fg: SEMANTIC.warning.color, bg: SEMANTIC.warning.bg },
1361
1444
  { exts: ["png", "jpg", "jpeg", "gif", "svg", "webp", "bmp"], fg: SEMANTIC.info.color, bg: SEMANTIC.info.bg }
@@ -1382,7 +1465,9 @@ var PREVIEW_EXTS = {
1382
1465
  txt: "text",
1383
1466
  log: "text",
1384
1467
  text: "text",
1385
- docx: "docx"
1468
+ docx: "docx",
1469
+ html: "html",
1470
+ htm: "html"
1386
1471
  };
1387
1472
  function extOf(fileType, filename) {
1388
1473
  var _a;
@@ -1393,6 +1478,7 @@ function extOf(fileType, filename) {
1393
1478
  if (mime.includes("csv")) return "csv";
1394
1479
  if (mime.includes("markdown")) return "md";
1395
1480
  if (mime.includes("wordprocessing") || mime.includes("msword")) return "docx";
1481
+ if (mime.includes("html")) return "html";
1396
1482
  if (mime.startsWith("text/")) return "txt";
1397
1483
  } else if (fileType) {
1398
1484
  const t = fileType.toLowerCase().replace(/[^a-z0-9]/g, "");
@@ -1427,20 +1513,21 @@ function isExpirySoon(expiresAt) {
1427
1513
  // src/shared/viewers/PreviewHost.tsx
1428
1514
  init_ThemeContext();
1429
1515
  init_pdfWorkerProbe();
1430
- var PdfViewer2 = React10.lazy(
1516
+ var PdfViewer2 = React11.lazy(
1431
1517
  () => Promise.resolve().then(() => (init_PdfViewer(), PdfViewer_exports)).then((m) => ({ default: m.PdfViewer }))
1432
1518
  );
1433
- var ExcelViewer2 = React10.lazy(
1519
+ var ExcelViewer2 = React11.lazy(
1434
1520
  () => Promise.resolve().then(() => (init_ExcelViewer(), ExcelViewer_exports)).then((m) => ({ default: m.ExcelViewer }))
1435
1521
  );
1436
- var CsvViewer2 = React10.lazy(() => Promise.resolve().then(() => (init_CsvViewer(), CsvViewer_exports)).then((m) => ({ default: m.CsvViewer })));
1437
- var TextViewer2 = React10.lazy(() => Promise.resolve().then(() => (init_TextViewer(), TextViewer_exports)).then((m) => ({ default: m.TextViewer })));
1438
- var DocxViewer2 = React10.lazy(() => Promise.resolve().then(() => (init_DocxViewer(), DocxViewer_exports)).then((m) => ({ default: m.DocxViewer })));
1522
+ var CsvViewer2 = React11.lazy(() => Promise.resolve().then(() => (init_CsvViewer(), CsvViewer_exports)).then((m) => ({ default: m.CsvViewer })));
1523
+ var TextViewer2 = React11.lazy(() => Promise.resolve().then(() => (init_TextViewer(), TextViewer_exports)).then((m) => ({ default: m.TextViewer })));
1524
+ var DocxViewer2 = React11.lazy(() => Promise.resolve().then(() => (init_DocxViewer(), DocxViewer_exports)).then((m) => ({ default: m.DocxViewer })));
1525
+ var HtmlViewer2 = React11.lazy(() => Promise.resolve().then(() => (init_HtmlViewer(), HtmlViewer_exports)).then((m) => ({ default: m.HtmlViewer })));
1439
1526
  var PEEK_ROWS = 20;
1440
1527
  var PEEK_LINES = 40;
1441
1528
  function GatedPdfViewer({ source }) {
1442
1529
  const { MUTED: MUTED2 } = useTheme();
1443
- const [failed, setFailed] = React10.useState(false);
1530
+ const [failed, setFailed] = React11.useState(false);
1444
1531
  const workerReady = usePdfWorkerReady(true);
1445
1532
  const ready = failed ? false : workerReady;
1446
1533
  if (ready === null) {
@@ -1475,10 +1562,13 @@ function PreviewHost({ kind, source, mode = "full" }) {
1475
1562
  case "docx":
1476
1563
  viewer = /* @__PURE__ */ jsxRuntime.jsx(DocxViewer2, { url: source.url, base64: source.base64 });
1477
1564
  break;
1565
+ case "html":
1566
+ viewer = /* @__PURE__ */ jsxRuntime.jsx(HtmlViewer2, { url: source.url, base64: source.base64, height: peek ? 240 : 480 });
1567
+ break;
1478
1568
  default:
1479
1569
  return null;
1480
1570
  }
1481
- return /* @__PURE__ */ jsxRuntime.jsx(React10.Suspense, { fallback, children: viewer });
1571
+ return /* @__PURE__ */ jsxRuntime.jsx(React11.Suspense, { fallback, children: viewer });
1482
1572
  }
1483
1573
 
1484
1574
  // src/shared/PreviewModal.tsx
@@ -1494,7 +1584,7 @@ function PreviewModal({
1494
1584
  onDownload
1495
1585
  }) {
1496
1586
  const { BORDER: BORDER2, MUTED: MUTED2, ACCENT: ACCENT2, SURFACE: SURFACE2, FOREGROUND: FOREGROUND2, SCRIM: SCRIM2 } = useTheme();
1497
- React10.useEffect(() => {
1587
+ React11.useEffect(() => {
1498
1588
  if (!open) return;
1499
1589
  const onKey = (e) => {
1500
1590
  if (e.key === "Escape") onClose();
@@ -1671,17 +1761,17 @@ function FileCard({
1671
1761
  previewDisabled = false
1672
1762
  }) {
1673
1763
  const { BORDER: BORDER2, MUTED: MUTED2, ACCENT: ACCENT2, SURFACE: SURFACE2, SURFACE_MUTED: SURFACE_MUTED2, SHADOW: SHADOW2 } = useTheme();
1674
- const [cardHover, setCardHover] = React10.useState(false);
1675
- const [btnHover, setBtnHover] = React10.useState(false);
1676
- const [pvHover, setPvHover] = React10.useState(false);
1764
+ const [cardHover, setCardHover] = React11.useState(false);
1765
+ const [btnHover, setBtnHover] = React11.useState(false);
1766
+ const [pvHover, setPvHover] = React11.useState(false);
1677
1767
  const previewKind = previewKindFor(fileType, filename);
1678
1768
  const canPreview = !previewDisabled && previewKind !== null && (!!previewUrl || !!fetchPreviewBlob);
1679
- const [peekOpen, setPeekOpen] = React10.useState(false);
1680
- const [modalOpen, setModalOpen] = React10.useState(false);
1681
- const [source, setSource] = React10.useState(previewUrl ? { url: previewUrl } : null);
1682
- const [pvLoading, setPvLoading] = React10.useState(false);
1683
- const [pvError, setPvError] = React10.useState(null);
1684
- const ensureSource = React10.useCallback(async () => {
1769
+ const [peekOpen, setPeekOpen] = React11.useState(false);
1770
+ const [modalOpen, setModalOpen] = React11.useState(false);
1771
+ const [source, setSource] = React11.useState(previewUrl ? { url: previewUrl } : null);
1772
+ const [pvLoading, setPvLoading] = React11.useState(false);
1773
+ const [pvError, setPvError] = React11.useState(null);
1774
+ const ensureSource = React11.useCallback(async () => {
1685
1775
  if (source) return source;
1686
1776
  if (previewUrl) {
1687
1777
  const s = { url: previewUrl };
@@ -1703,7 +1793,7 @@ function FileCard({
1703
1793
  setPvLoading(false);
1704
1794
  }
1705
1795
  }, [source, previewUrl, fetchPreviewBlob]);
1706
- const togglePeek = React10.useCallback(async () => {
1796
+ const togglePeek = React11.useCallback(async () => {
1707
1797
  if (peekOpen) {
1708
1798
  setPeekOpen(false);
1709
1799
  return;
@@ -1711,7 +1801,7 @@ function FileCard({
1711
1801
  setPeekOpen(true);
1712
1802
  await ensureSource();
1713
1803
  }, [peekOpen, ensureSource]);
1714
- const openModal = React10.useCallback(async () => {
1804
+ const openModal = React11.useCallback(async () => {
1715
1805
  const s = await ensureSource();
1716
1806
  if (s) setModalOpen(true);
1717
1807
  }, [ensureSource]);
@@ -1826,7 +1916,7 @@ function FileCard({
1826
1916
  whiteSpace: "nowrap"
1827
1917
  },
1828
1918
  children: [
1829
- metaTokens.map((t, i) => /* @__PURE__ */ jsxRuntime.jsxs(React10__default.default.Fragment, { children: [
1919
+ metaTokens.map((t, i) => /* @__PURE__ */ jsxRuntime.jsxs(React11__default.default.Fragment, { children: [
1830
1920
  i > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: MUTED2 }, children: "\xB7" }),
1831
1921
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: t })
1832
1922
  ] }, i)),