@yumiai/chat-widget 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/CHANGELOG.md +92 -0
  2. package/README.md +119 -22
  3. package/dist/ExcelCore-DJOIVQMI.js +11 -0
  4. package/dist/ExcelCore-DJOIVQMI.js.map +1 -0
  5. package/dist/ExcelViewer-3YLLYYIQ.js +65 -0
  6. package/dist/ExcelViewer-3YLLYYIQ.js.map +1 -0
  7. package/dist/GerberViewerA2UI-7CNT7HX4.css +693 -0
  8. package/dist/GerberViewerA2UI-7CNT7HX4.css.map +1 -0
  9. package/dist/GerberViewerA2UI-X5FWAD5M.js +57 -0
  10. package/dist/GerberViewerA2UI-X5FWAD5M.js.map +1 -0
  11. package/dist/GraphStatsLegend-D5bPeXB_.d.cts +607 -0
  12. package/dist/GraphStatsLegend-D5bPeXB_.d.ts +607 -0
  13. package/dist/JsonRenderStandalone-EIZM62JU.js +18 -0
  14. package/dist/JsonRenderStandalone-EIZM62JU.js.map +1 -0
  15. package/dist/JsonRenderStandalone-POB4Q3N3.css +2384 -0
  16. package/dist/JsonRenderStandalone-POB4Q3N3.css.map +1 -0
  17. package/dist/JsonRenderStandalone-UsTcST4G.d.cts +23 -0
  18. package/dist/JsonRenderStandalone-UsTcST4G.d.ts +23 -0
  19. package/dist/KicadViewer-GV6ZC4AQ.js +124 -0
  20. package/dist/KicadViewer-GV6ZC4AQ.js.map +1 -0
  21. package/dist/KicadViewerCore-U7BWZHKJ.js +11 -0
  22. package/dist/KicadViewerCore-U7BWZHKJ.js.map +1 -0
  23. package/dist/PdfViewer-CHPDRK46.js +51 -0
  24. package/dist/PdfViewer-CHPDRK46.js.map +1 -0
  25. package/dist/PdfViewer-LPYGQETK.css +1899 -0
  26. package/dist/PdfViewer-LPYGQETK.css.map +1 -0
  27. package/dist/PdfViewerCore-HJPEHSRA.js +364 -0
  28. package/dist/PdfViewerCore-HJPEHSRA.js.map +1 -0
  29. package/dist/PowerPointCore-FPDR2BL4.js +11 -0
  30. package/dist/PowerPointCore-FPDR2BL4.js.map +1 -0
  31. package/dist/PowerPointViewer-LQTO6UCU.js +61 -0
  32. package/dist/PowerPointViewer-LQTO6UCU.js.map +1 -0
  33. package/dist/StepViewerCore-7W3L3R4E.js +285 -0
  34. package/dist/StepViewerCore-7W3L3R4E.js.map +1 -0
  35. package/dist/ThreeViewerCore-N3QJD5QI.js +161 -0
  36. package/dist/ThreeViewerCore-N3QJD5QI.js.map +1 -0
  37. package/dist/WordCore-JKSXK2XD.js +11 -0
  38. package/dist/WordCore-JKSXK2XD.js.map +1 -0
  39. package/dist/WordViewer-ZHCQMHOH.js +61 -0
  40. package/dist/WordViewer-ZHCQMHOH.js.map +1 -0
  41. package/dist/chunk-2SKA3F5U.js +88 -0
  42. package/dist/chunk-2SKA3F5U.js.map +1 -0
  43. package/dist/chunk-2UC7YLVX.js +318 -0
  44. package/dist/chunk-2UC7YLVX.js.map +1 -0
  45. package/dist/chunk-3R6T3LBR.js +24 -0
  46. package/dist/chunk-3R6T3LBR.js.map +1 -0
  47. package/dist/chunk-56WRZM3R.js +398 -0
  48. package/dist/chunk-56WRZM3R.js.map +1 -0
  49. package/dist/chunk-7A4FY6FK.js +10226 -0
  50. package/dist/chunk-7A4FY6FK.js.map +1 -0
  51. package/dist/chunk-7D4SUZUM.js +38 -0
  52. package/dist/chunk-7D4SUZUM.js.map +1 -0
  53. package/dist/chunk-7S67DOHQ.js +436 -0
  54. package/dist/chunk-7S67DOHQ.js.map +1 -0
  55. package/dist/chunk-CFKGNAJM.js +14013 -0
  56. package/dist/chunk-CFKGNAJM.js.map +1 -0
  57. package/dist/chunk-GAMA3VA7.js +99 -0
  58. package/dist/chunk-GAMA3VA7.js.map +1 -0
  59. package/dist/chunk-GYXTSY22.js +639 -0
  60. package/dist/chunk-GYXTSY22.js.map +1 -0
  61. package/dist/chunk-K4KGNVL5.js +77 -0
  62. package/dist/chunk-K4KGNVL5.js.map +1 -0
  63. package/dist/chunk-KQV7IKET.js +1621 -0
  64. package/dist/chunk-KQV7IKET.js.map +1 -0
  65. package/dist/chunk-O3NXUM6C.js +1871 -0
  66. package/dist/chunk-O3NXUM6C.js.map +1 -0
  67. package/dist/chunk-PZXSASDY.js +83 -0
  68. package/dist/chunk-PZXSASDY.js.map +1 -0
  69. package/dist/chunk-QLVPIM6R.js +595 -0
  70. package/dist/chunk-QLVPIM6R.js.map +1 -0
  71. package/dist/chunk-VXJWGLZ7.js +21 -0
  72. package/dist/chunk-VXJWGLZ7.js.map +1 -0
  73. package/dist/chunk-XQ562W7I.js +116 -0
  74. package/dist/chunk-XQ562W7I.js.map +1 -0
  75. package/dist/components/JsonRender/standalone.cjs +39368 -0
  76. package/dist/components/JsonRender/standalone.cjs.map +1 -0
  77. package/dist/components/JsonRender/standalone.css +2384 -0
  78. package/dist/components/JsonRender/standalone.css.map +1 -0
  79. package/dist/components/JsonRender/standalone.d.cts +16 -0
  80. package/dist/components/JsonRender/standalone.d.ts +16 -0
  81. package/dist/components/JsonRender/standalone.js +38 -0
  82. package/dist/components/JsonRender/standalone.js.map +1 -0
  83. package/dist/gerber-2d-entry-OQ4SQRBY.js +3950 -0
  84. package/dist/gerber-2d-entry-OQ4SQRBY.js.map +1 -0
  85. package/dist/gerber-3d-entry-DEHDBOO2.js +3679 -0
  86. package/dist/gerber-3d-entry-DEHDBOO2.js.map +1 -0
  87. package/dist/gerber-simulation-entry-EBDX72XE.js +1801 -0
  88. package/dist/gerber-simulation-entry-EBDX72XE.js.map +1 -0
  89. package/dist/index.cjs +60113 -2970
  90. package/dist/index.cjs.map +1 -1
  91. package/dist/index.css +11342 -1708
  92. package/dist/index.css.map +1 -1
  93. package/dist/index.d.cts +3275 -77
  94. package/dist/index.d.ts +3275 -77
  95. package/dist/index.js +18078 -2540
  96. package/dist/index.js.map +1 -1
  97. package/dist/provenance/index.cjs +2248 -0
  98. package/dist/provenance/index.cjs.map +1 -0
  99. package/dist/provenance/index.css +52 -0
  100. package/dist/provenance/index.css.map +1 -0
  101. package/dist/provenance/index.d.cts +12 -0
  102. package/dist/provenance/index.d.ts +12 -0
  103. package/dist/provenance/index.js +27 -0
  104. package/dist/provenance/index.js.map +1 -0
  105. package/dist/resolveToArrayBuffer-AQIDZHSQ.js +23 -0
  106. package/dist/resolveToArrayBuffer-AQIDZHSQ.js.map +1 -0
  107. package/package.json +96 -17
@@ -0,0 +1,398 @@
1
+ import {
2
+ useRevokeBlobUrl
3
+ } from "./chunk-VXJWGLZ7.js";
4
+
5
+ // src/components/ViewerCore/ExcelCore.tsx
6
+ import { useEffect as useEffect2, useState, useMemo as useMemo2, useCallback, useRef as useRef2 } from "react";
7
+
8
+ // src/components/ViewerCore/hooks/useXrefChips.ts
9
+ import { useRef, useEffect, useMemo } from "react";
10
+
11
+ // src/components/FileViewer/xref/xrefParser.ts
12
+ var XREF_RE = /@xref\(\s*(\w+)\s*,\s*((?:rid|url):\/\/[^\s,"]+)\s*,\s*"((?:[^"\\]|\\.)*)"\s*\)/g;
13
+ var VALID_RELATIONS = /* @__PURE__ */ new Set([
14
+ "cites",
15
+ "implements",
16
+ "extends",
17
+ "derived_from",
18
+ "supersedes",
19
+ "related"
20
+ ]);
21
+ function parseXrefs(content) {
22
+ const results = [];
23
+ const re = new RegExp(XREF_RE.source, XREF_RE.flags);
24
+ let match;
25
+ while ((match = re.exec(content)) !== null) {
26
+ const relation = match[1];
27
+ const resourceUri = match[2];
28
+ const description = match[3].replace(/\\"/g, '"');
29
+ const sourceLine = content.substring(0, match.index).split("\n").length;
30
+ let targetFileId = null;
31
+ let targetLocation = null;
32
+ if (resourceUri.startsWith("rid://")) {
33
+ const parts = resourceUri.substring(6).split("#", 2);
34
+ targetFileId = parts[0];
35
+ targetLocation = parts.length > 1 ? parts[1] : null;
36
+ }
37
+ if (!VALID_RELATIONS.has(relation)) continue;
38
+ results.push({
39
+ relation,
40
+ target_resource: resourceUri,
41
+ target_file_id: targetFileId,
42
+ target_location: targetLocation,
43
+ description,
44
+ source_line: sourceLine
45
+ });
46
+ }
47
+ return results;
48
+ }
49
+ var XREF_MARKER_PREFIX = "\u27E6XREF\u2039";
50
+ var XREF_MARKER_SUFFIX = "\u203A\u27E7";
51
+ function replaceXrefsWithMarkers(content) {
52
+ const wrapRe = /\[(@xref\(\s*\w+\s*,\s*(?:rid|url):\/\/[^\s,"]+\s*,\s*"(?:[^"\\]|\\.)*"\s*\))\]/g;
53
+ let result = content.replace(wrapRe, "$1");
54
+ const commentXrefRe = /<!--\s*(@xref\(\s*\w+\s*,\s*(?:rid|url):\/\/[^\s,"]+\s*,\s*"(?:[^"\\]|\\.)*"\s*\))\s*-->/g;
55
+ result = result.replace(commentXrefRe, "$1");
56
+ const markers = /* @__PURE__ */ new Map();
57
+ let idx = 0;
58
+ const re = new RegExp(XREF_RE.source, XREF_RE.flags);
59
+ result = result.replace(re, (_match, relation, uri, desc) => {
60
+ if (!VALID_RELATIONS.has(relation)) return _match;
61
+ const description = desc.replace(/\\"/g, '"');
62
+ let targetFileId = null;
63
+ let targetLocation = null;
64
+ if (uri.startsWith("rid://")) {
65
+ const parts = uri.substring(6).split("#", 2);
66
+ targetFileId = parts[0];
67
+ targetLocation = parts.length > 1 ? parts[1] : null;
68
+ }
69
+ const record = {
70
+ relation,
71
+ target_resource: uri,
72
+ target_file_id: targetFileId,
73
+ target_location: targetLocation,
74
+ description,
75
+ source_line: 0
76
+ };
77
+ const currentIdx = idx++;
78
+ markers.set(currentIdx, { index: currentIdx, relation, uri, description, record });
79
+ return `${XREF_MARKER_PREFIX}${currentIdx}${XREF_MARKER_SUFFIX}`;
80
+ });
81
+ return { content: result, markers };
82
+ }
83
+
84
+ // src/components/ViewerCore/hooks/useXrefChips.ts
85
+ function escapeRegExp(s) {
86
+ return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
87
+ }
88
+ var MARKER_RE = new RegExp(
89
+ `${escapeRegExp(XREF_MARKER_PREFIX)}(\\d+)${escapeRegExp(XREF_MARKER_SUFFIX)}`
90
+ );
91
+ var MARKER_GLOBAL_RE = new RegExp(MARKER_RE.source, "g");
92
+ function createChip(data, onClick, onLinkClick) {
93
+ const chip = document.createElement("span");
94
+ chip.className = "ycw-xref-chip";
95
+ chip.setAttribute("role", "button");
96
+ chip.setAttribute("tabindex", "0");
97
+ chip.textContent = `\u{1F4CE} ${data.description}`;
98
+ chip.addEventListener("click", (e) => {
99
+ e.preventDefault();
100
+ e.stopPropagation();
101
+ if (data.record.target_resource.startsWith("url://")) {
102
+ const url = data.record.target_resource.replace(/^url:\/\//, "https://");
103
+ onLinkClick?.(url);
104
+ window.open(url, "_blank", "noopener,noreferrer");
105
+ } else {
106
+ onClick(data.record);
107
+ }
108
+ });
109
+ chip.addEventListener("keydown", (e) => {
110
+ if (e.key === "Enter" || e.key === " ") chip.click();
111
+ });
112
+ return chip;
113
+ }
114
+ function replaceMarkersInNode(textNode, markers, onClick, onLinkClick) {
115
+ const text = textNode.textContent || "";
116
+ if (!text.includes(XREF_MARKER_PREFIX)) return;
117
+ const parts = [];
118
+ let lastIndex = 0;
119
+ const re = new RegExp(MARKER_RE.source, "g");
120
+ let m;
121
+ while ((m = re.exec(text)) !== null) {
122
+ if (m.index > lastIndex) parts.push(text.substring(lastIndex, m.index));
123
+ const data = markers.get(Number(m[1]));
124
+ if (data) parts.push(data);
125
+ else parts.push(m[0]);
126
+ lastIndex = m.index + m[0].length;
127
+ }
128
+ if (lastIndex < text.length) parts.push(text.substring(lastIndex));
129
+ if (parts.length <= 1 && typeof parts[0] === "string") return;
130
+ const frag = document.createDocumentFragment();
131
+ for (const p of parts) {
132
+ if (typeof p === "string") {
133
+ frag.appendChild(document.createTextNode(p));
134
+ } else {
135
+ frag.appendChild(createChip(p, onClick, onLinkClick));
136
+ }
137
+ }
138
+ textNode.replaceWith(frag);
139
+ }
140
+ function walkTextNodes(root, cb) {
141
+ const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);
142
+ const nodes = [];
143
+ while (walker.nextNode()) nodes.push(walker.currentNode);
144
+ nodes.forEach(cb);
145
+ }
146
+ function patchCrossNodeMarkers(root, markers, onClick, onLinkClick) {
147
+ const fullText = root.textContent || "";
148
+ if (!fullText.includes(XREF_MARKER_PREFIX)) return;
149
+ const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);
150
+ const textNodes = [];
151
+ let pos = 0;
152
+ while (walker.nextNode()) {
153
+ const node = walker.currentNode;
154
+ const len = (node.textContent || "").length;
155
+ textNodes.push({ node, start: pos, end: pos + len });
156
+ pos += len;
157
+ }
158
+ const re = new RegExp(MARKER_RE.source, "g");
159
+ const replacements = [];
160
+ let match;
161
+ while ((match = re.exec(fullText)) !== null) {
162
+ const data = markers.get(Number(match[1]));
163
+ if (data) {
164
+ replacements.push({ start: match.index, end: match.index + match[0].length, data });
165
+ }
166
+ }
167
+ if (replacements.length === 0) return;
168
+ for (let i = replacements.length - 1; i >= 0; i--) {
169
+ const { start, end, data } = replacements[i];
170
+ const range = document.createRange();
171
+ let startSet = false;
172
+ let endSet = false;
173
+ for (const tn of textNodes) {
174
+ if (!startSet && tn.start <= start && start < tn.end) {
175
+ range.setStart(tn.node, start - tn.start);
176
+ startSet = true;
177
+ }
178
+ if (!endSet && tn.start < end && end <= tn.end) {
179
+ range.setEnd(tn.node, end - tn.start);
180
+ endSet = true;
181
+ }
182
+ if (startSet && endSet) break;
183
+ }
184
+ if (startSet && endSet) {
185
+ range.deleteContents();
186
+ range.insertNode(createChip(data, onClick, onLinkClick));
187
+ }
188
+ }
189
+ }
190
+ function useXrefChips(containerRef, content, onXrefClick, onLinkClick) {
191
+ const { content: processedContent, markers } = useMemo(
192
+ () => replaceXrefsWithMarkers(content),
193
+ [content]
194
+ );
195
+ const onXrefClickRef = useRef(onXrefClick);
196
+ onXrefClickRef.current = onXrefClick;
197
+ const onLinkClickRef = useRef(onLinkClick);
198
+ onLinkClickRef.current = onLinkClick;
199
+ const markersRef = useRef(markers);
200
+ markersRef.current = markers;
201
+ useEffect(() => {
202
+ const el = containerRef.current;
203
+ if (!el || markersRef.current.size === 0) return;
204
+ const handleClick = (xref) => onXrefClickRef.current?.(xref);
205
+ const handleLink = (url) => onLinkClickRef.current?.(url);
206
+ const patchNode = (node) => {
207
+ walkTextNodes(
208
+ node,
209
+ (tn) => replaceMarkersInNode(tn, markersRef.current, handleClick, handleLink)
210
+ );
211
+ if (node instanceof HTMLElement) {
212
+ const remaining = node.textContent || "";
213
+ if (remaining.includes(XREF_MARKER_PREFIX)) {
214
+ patchCrossNodeMarkers(node, markersRef.current, handleClick, handleLink);
215
+ }
216
+ }
217
+ };
218
+ patchNode(el);
219
+ const observer = new MutationObserver((mutations) => {
220
+ for (const mut of mutations) {
221
+ for (const added of mut.addedNodes) {
222
+ patchNode(added);
223
+ }
224
+ }
225
+ });
226
+ observer.observe(el, { childList: true, subtree: true });
227
+ return () => observer.disconnect();
228
+ }, [processedContent, containerRef]);
229
+ return { processedContent, hasMarkers: markers.size > 0 };
230
+ }
231
+
232
+ // src/components/ViewerCore/ExcelCore.tsx
233
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
234
+ var COL_LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
235
+ function colLabel(idx) {
236
+ let label = "";
237
+ let n = idx;
238
+ while (n >= 0) {
239
+ label = COL_LETTERS[n % 26] + label;
240
+ n = Math.floor(n / 26) - 1;
241
+ }
242
+ return label;
243
+ }
244
+ var PAGE_SIZE = 100;
245
+ var BUFFER = 20;
246
+ var ExcelCore = ({ src, content, sheet, className, loadingLabel, rowsLabel = "rows", columnsLabel = "columns", onXrefClick, onLinkClick }) => {
247
+ const [sheets, setSheets] = useState([]);
248
+ const [activeSheet, setActiveSheet] = useState(0);
249
+ const [error, setError] = useState();
250
+ const [sortCol, setSortCol] = useState(null);
251
+ const [sortDir, setSortDir] = useState(null);
252
+ const [visibleStart, setVisibleStart] = useState(0);
253
+ const scrollRef = useRef2(null);
254
+ const containerRef = useRef2(null);
255
+ useRevokeBlobUrl(src);
256
+ const { processedContent } = useXrefChips(containerRef, content ?? "", onXrefClick, onLinkClick);
257
+ useEffect2(() => {
258
+ const inputContent = content ? processedContent : void 0;
259
+ if (!src && !inputContent) return;
260
+ let cancelled = false;
261
+ (async () => {
262
+ try {
263
+ const XLSX = await import("xlsx");
264
+ if (cancelled) return;
265
+ let wb;
266
+ if (inputContent) {
267
+ wb = XLSX.read(inputContent, { type: "string" });
268
+ } else {
269
+ const { resolveToArrayBuffer } = await import("./resolveToArrayBuffer-AQIDZHSQ.js");
270
+ const buf = await resolveToArrayBuffer(src);
271
+ if (cancelled) return;
272
+ wb = XLSX.read(buf, { type: "array" });
273
+ }
274
+ const result = wb.SheetNames.map((name) => {
275
+ const ws = wb.Sheets[name];
276
+ const json = XLSX.utils.sheet_to_json(ws, { header: 1 });
277
+ const headers = (json[0] ?? []).map(String);
278
+ const rows = json.slice(1).map((r) => Array.isArray(r) ? r.map(String) : []);
279
+ return { name, headers, rows };
280
+ });
281
+ if (!cancelled) {
282
+ setSheets(result);
283
+ const idx = sheet ? result.findIndex((s) => s.name === sheet) : 0;
284
+ setActiveSheet(idx >= 0 ? idx : 0);
285
+ setSortCol(null);
286
+ setSortDir(null);
287
+ setVisibleStart(0);
288
+ }
289
+ } catch (err) {
290
+ if (!cancelled) setError(String(err?.message ?? err));
291
+ }
292
+ })();
293
+ return () => {
294
+ cancelled = true;
295
+ };
296
+ }, [src, processedContent, content, sheet]);
297
+ const currentSheet = sheets[activeSheet];
298
+ const sortedRows = useMemo2(() => {
299
+ if (!currentSheet) return [];
300
+ if (sortCol === null || sortDir === null) return currentSheet.rows;
301
+ const col = sortCol;
302
+ const dir = sortDir === "asc" ? 1 : -1;
303
+ return [...currentSheet.rows].sort((a, b) => {
304
+ const va = a[col] ?? "";
305
+ const vb = b[col] ?? "";
306
+ const na = parseFloat(va);
307
+ const nb = parseFloat(vb);
308
+ if (!isNaN(na) && !isNaN(nb)) return (na - nb) * dir;
309
+ return va.localeCompare(vb) * dir;
310
+ });
311
+ }, [currentSheet, sortCol, sortDir]);
312
+ const visibleRows = useMemo2(() => {
313
+ const start = Math.max(0, visibleStart - BUFFER);
314
+ const end = Math.min(sortedRows.length, visibleStart + PAGE_SIZE + BUFFER);
315
+ return { start, end, rows: sortedRows.slice(start, end) };
316
+ }, [sortedRows, visibleStart]);
317
+ const handleSort = useCallback((colIdx) => {
318
+ if (sortCol === colIdx) {
319
+ setSortDir((prev) => prev === "asc" ? "desc" : prev === "desc" ? null : "asc");
320
+ if (sortDir === "desc") setSortCol(null);
321
+ } else {
322
+ setSortCol(colIdx);
323
+ setSortDir("asc");
324
+ }
325
+ }, [sortCol, sortDir]);
326
+ const handleScroll = useCallback(() => {
327
+ const el = scrollRef.current;
328
+ if (!el) return;
329
+ const rowHeight = 28;
330
+ const scrollTop = el.scrollTop;
331
+ setVisibleStart(Math.floor(scrollTop / rowHeight));
332
+ }, []);
333
+ const maxCols = currentSheet ? Math.max(currentSheet.headers.length, ...currentSheet.rows.map((r) => r.length)) : 0;
334
+ return /* @__PURE__ */ jsx("div", { ref: containerRef, className: `ycw-excel-viewer ${className || ""}`, children: error ? /* @__PURE__ */ jsx("div", { className: "ycw-viewer-error", children: error }) : !sheets.length ? /* @__PURE__ */ jsx("div", { className: "ycw-viewer-loading", children: loadingLabel || "Loading\u2026" }) : /* @__PURE__ */ jsxs(Fragment, { children: [
335
+ sheets.length > 1 && /* @__PURE__ */ jsx("div", { className: "ycw-excel-sheet-tabs", children: sheets.map((s, i) => /* @__PURE__ */ jsx(
336
+ "button",
337
+ {
338
+ type: "button",
339
+ onClick: () => {
340
+ setActiveSheet(i);
341
+ setSortCol(null);
342
+ setSortDir(null);
343
+ setVisibleStart(0);
344
+ },
345
+ className: `ycw-excel-sheet-tab ${i === activeSheet ? "ycw-excel-sheet-tab--active" : ""}`,
346
+ children: s.name
347
+ },
348
+ s.name
349
+ )) }),
350
+ /* @__PURE__ */ jsx("div", { ref: scrollRef, onScroll: handleScroll, className: "ycw-excel-scroll", children: /* @__PURE__ */ jsxs("table", { className: "ycw-excel-table", children: [
351
+ /* @__PURE__ */ jsxs("thead", { className: "ycw-excel-thead", children: [
352
+ /* @__PURE__ */ jsxs("tr", { children: [
353
+ /* @__PURE__ */ jsx("th", { className: "ycw-excel-col-header ycw-excel-row-idx", children: "#" }),
354
+ Array.from({ length: maxCols }, (_, i) => /* @__PURE__ */ jsx("th", { className: "ycw-excel-col-header", children: colLabel(i) }, i))
355
+ ] }),
356
+ currentSheet.headers.length > 0 && /* @__PURE__ */ jsxs("tr", { children: [
357
+ /* @__PURE__ */ jsx("th", { className: "ycw-excel-data-header ycw-excel-row-idx" }),
358
+ currentSheet.headers.map((h, i) => /* @__PURE__ */ jsxs("th", { onClick: () => handleSort(i), className: "ycw-excel-data-header ycw-excel-data-header--sortable", children: [
359
+ h,
360
+ sortCol === i && /* @__PURE__ */ jsx("span", { className: "ycw-excel-sort-indicator", children: sortDir === "asc" ? "\u25B2" : "\u25BC" })
361
+ ] }, i))
362
+ ] })
363
+ ] }),
364
+ /* @__PURE__ */ jsxs("tbody", { children: [
365
+ visibleRows.start > 0 && /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", { colSpan: maxCols + 1, style: { height: visibleRows.start * 28, padding: 0, border: "none" } }) }),
366
+ visibleRows.rows.map((row, ri) => {
367
+ const rowIdx = visibleRows.start + ri;
368
+ return /* @__PURE__ */ jsxs("tr", { children: [
369
+ /* @__PURE__ */ jsx("td", { className: "ycw-excel-row-idx", children: rowIdx + 1 }),
370
+ Array.from({ length: maxCols }, (_, ci) => /* @__PURE__ */ jsx("td", { className: "ycw-excel-cell", children: row[ci] ?? "" }, ci))
371
+ ] }, rowIdx);
372
+ }),
373
+ visibleRows.end < sortedRows.length && /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", { colSpan: maxCols + 1, style: { height: (sortedRows.length - visibleRows.end) * 28, padding: 0, border: "none" } }) })
374
+ ] })
375
+ ] }) }),
376
+ /* @__PURE__ */ jsxs("div", { className: "ycw-excel-footer", children: [
377
+ sortedRows.length,
378
+ " ",
379
+ rowsLabel,
380
+ " \xD7 ",
381
+ maxCols,
382
+ " ",
383
+ columnsLabel
384
+ ] })
385
+ ] }) });
386
+ };
387
+ var ExcelCore_default = ExcelCore;
388
+
389
+ export {
390
+ parseXrefs,
391
+ XREF_MARKER_PREFIX,
392
+ XREF_MARKER_SUFFIX,
393
+ replaceXrefsWithMarkers,
394
+ useXrefChips,
395
+ ExcelCore,
396
+ ExcelCore_default
397
+ };
398
+ //# sourceMappingURL=chunk-56WRZM3R.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ViewerCore/ExcelCore.tsx","../src/components/ViewerCore/hooks/useXrefChips.ts","../src/components/FileViewer/xref/xrefParser.ts"],"sourcesContent":["import React, { useEffect, useState, useMemo, useCallback, useRef } from 'react'\nimport { useRevokeBlobUrl } from './hooks/useRevokeBlobUrl.js'\nimport { useXrefChips } from './hooks/useXrefChips'\n\nexport interface ExcelCoreProps {\n src?: string\n content?: string\n sheet?: string\n className?: string\n loadingLabel?: string\n rowsLabel?: string\n columnsLabel?: string\n onXrefClick?: (xref: unknown) => void\n onLinkClick?: (url: string) => void\n}\n\ninterface SheetData {\n name: string\n headers: string[]\n rows: string[][]\n}\n\ntype SortDir = 'asc' | 'desc' | null\n\nconst COL_LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'\nfunction colLabel(idx: number): string {\n let label = ''\n let n = idx\n while (n >= 0) {\n label = COL_LETTERS[n % 26] + label\n n = Math.floor(n / 26) - 1\n }\n return label\n}\n\nconst PAGE_SIZE = 100\nconst BUFFER = 20\n\nexport const ExcelCore: React.FC<ExcelCoreProps> = ({ src, content, sheet, className, loadingLabel, rowsLabel = 'rows', columnsLabel = 'columns', onXrefClick, onLinkClick }) => {\n const [sheets, setSheets] = useState<SheetData[]>([])\n const [activeSheet, setActiveSheet] = useState(0)\n const [error, setError] = useState<string>()\n const [sortCol, setSortCol] = useState<number | null>(null)\n const [sortDir, setSortDir] = useState<SortDir>(null)\n const [visibleStart, setVisibleStart] = useState(0)\n const scrollRef = useRef<HTMLDivElement>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n useRevokeBlobUrl(src)\n\n const { processedContent } = useXrefChips(containerRef, content ?? '', onXrefClick, onLinkClick)\n\n useEffect(() => {\n const inputContent = content ? processedContent : undefined\n if (!src && !inputContent) return\n let cancelled = false\n\n ;(async () => {\n try {\n const XLSX = await import('xlsx')\n if (cancelled) return\n\n let wb: ReturnType<typeof XLSX.read>\n if (inputContent) {\n wb = XLSX.read(inputContent, { type: 'string' })\n } else {\n const { resolveToArrayBuffer } = await import('./utils/resolveToArrayBuffer.js')\n const buf = await resolveToArrayBuffer(src!)\n if (cancelled) return\n wb = XLSX.read(buf, { type: 'array' })\n }\n\n const result: SheetData[] = wb.SheetNames.map(name => {\n const ws = wb.Sheets[name]\n const json = XLSX.utils.sheet_to_json<string[]>(ws, { header: 1 })\n const headers = (json[0] ?? []).map(String)\n const rows = json.slice(1).map(r => Array.isArray(r) ? r.map(String) : [])\n return { name, headers, rows }\n })\n\n if (!cancelled) {\n setSheets(result)\n const idx = sheet ? result.findIndex(s => s.name === sheet) : 0\n setActiveSheet(idx >= 0 ? idx : 0)\n setSortCol(null)\n setSortDir(null)\n setVisibleStart(0)\n }\n } catch (err) {\n if (!cancelled) setError(String((err as Error)?.message ?? err))\n }\n })()\n\n return () => { cancelled = true }\n }, [src, processedContent, content, sheet])\n\n const currentSheet = sheets[activeSheet]\n\n const sortedRows = useMemo(() => {\n if (!currentSheet) return []\n if (sortCol === null || sortDir === null) return currentSheet.rows\n const col = sortCol\n const dir = sortDir === 'asc' ? 1 : -1\n return [...currentSheet.rows].sort((a, b) => {\n const va = a[col] ?? ''\n const vb = b[col] ?? ''\n const na = parseFloat(va)\n const nb = parseFloat(vb)\n if (!isNaN(na) && !isNaN(nb)) return (na - nb) * dir\n return va.localeCompare(vb) * dir\n })\n }, [currentSheet, sortCol, sortDir])\n\n const visibleRows = useMemo(() => {\n const start = Math.max(0, visibleStart - BUFFER)\n const end = Math.min(sortedRows.length, visibleStart + PAGE_SIZE + BUFFER)\n return { start, end, rows: sortedRows.slice(start, end) }\n }, [sortedRows, visibleStart])\n\n const handleSort = useCallback((colIdx: number) => {\n if (sortCol === colIdx) {\n setSortDir(prev => prev === 'asc' ? 'desc' : prev === 'desc' ? null : 'asc')\n if (sortDir === 'desc') setSortCol(null)\n } else {\n setSortCol(colIdx)\n setSortDir('asc')\n }\n }, [sortCol, sortDir])\n\n const handleScroll = useCallback(() => {\n const el = scrollRef.current\n if (!el) return\n const rowHeight = 28\n const scrollTop = el.scrollTop\n setVisibleStart(Math.floor(scrollTop / rowHeight))\n }, [])\n\n const maxCols = currentSheet ? Math.max(currentSheet.headers.length, ...currentSheet.rows.map(r => r.length)) : 0\n\n return (\n <div ref={containerRef} className={`ycw-excel-viewer ${className || ''}`}>\n {error ? (\n <div className=\"ycw-viewer-error\">{error}</div>\n ) : !sheets.length ? (\n <div className=\"ycw-viewer-loading\">{loadingLabel || 'Loading…'}</div>\n ) : (\n <>\n {sheets.length > 1 && (\n <div className=\"ycw-excel-sheet-tabs\">\n {sheets.map((s, i) => (\n <button key={s.name} type=\"button\" onClick={() => { setActiveSheet(i); setSortCol(null); setSortDir(null); setVisibleStart(0) }}\n className={`ycw-excel-sheet-tab ${i === activeSheet ? 'ycw-excel-sheet-tab--active' : ''}`}>\n {s.name}\n </button>\n ))}\n </div>\n )}\n\n <div ref={scrollRef} onScroll={handleScroll} className=\"ycw-excel-scroll\">\n <table className=\"ycw-excel-table\">\n <thead className=\"ycw-excel-thead\">\n <tr>\n <th className=\"ycw-excel-col-header ycw-excel-row-idx\">#</th>\n {Array.from({ length: maxCols }, (_, i) => (\n <th key={i} className=\"ycw-excel-col-header\">{colLabel(i)}</th>\n ))}\n </tr>\n {currentSheet.headers.length > 0 && (\n <tr>\n <th className=\"ycw-excel-data-header ycw-excel-row-idx\"></th>\n {currentSheet.headers.map((h, i) => (\n <th key={i} onClick={() => handleSort(i)} className=\"ycw-excel-data-header ycw-excel-data-header--sortable\">\n {h}\n {sortCol === i && (\n <span className=\"ycw-excel-sort-indicator\">{sortDir === 'asc' ? '▲' : '▼'}</span>\n )}\n </th>\n ))}\n </tr>\n )}\n </thead>\n <tbody>\n {visibleRows.start > 0 && (\n <tr><td colSpan={maxCols + 1} style={{ height: visibleRows.start * 28, padding: 0, border: 'none' }} /></tr>\n )}\n {visibleRows.rows.map((row, ri) => {\n const rowIdx = visibleRows.start + ri\n return (\n <tr key={rowIdx}>\n <td className=\"ycw-excel-row-idx\">{rowIdx + 1}</td>\n {Array.from({ length: maxCols }, (_, ci) => (\n <td key={ci} className=\"ycw-excel-cell\">{row[ci] ?? ''}</td>\n ))}\n </tr>\n )\n })}\n {visibleRows.end < sortedRows.length && (\n <tr><td colSpan={maxCols + 1} style={{ height: (sortedRows.length - visibleRows.end) * 28, padding: 0, border: 'none' }} /></tr>\n )}\n </tbody>\n </table>\n </div>\n\n <div className=\"ycw-excel-footer\">\n {sortedRows.length} {rowsLabel} × {maxCols} {columnsLabel}\n </div>\n </>\n )}\n </div>\n )\n}\n\nexport default ExcelCore\n","import { useRef, useEffect, useMemo } from 'react'\nimport {\n replaceXrefsWithMarkers,\n XREF_MARKER_PREFIX,\n XREF_MARKER_SUFFIX,\n type XrefInlineData,\n} from '../../FileViewer/xref/xrefParser'\n\nfunction escapeRegExp(s: string) {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\nconst MARKER_RE = new RegExp(\n `${escapeRegExp(XREF_MARKER_PREFIX)}(\\\\d+)${escapeRegExp(XREF_MARKER_SUFFIX)}`,\n)\n\nconst MARKER_GLOBAL_RE = new RegExp(MARKER_RE.source, 'g')\n\nfunction createChip(\n data: XrefInlineData,\n onClick: (xref: unknown) => void,\n onLinkClick?: (url: string) => void,\n): HTMLSpanElement {\n const chip = document.createElement('span')\n chip.className = 'ycw-xref-chip'\n chip.setAttribute('role', 'button')\n chip.setAttribute('tabindex', '0')\n chip.textContent = `📎 ${data.description}`\n chip.addEventListener('click', (e) => {\n e.preventDefault()\n e.stopPropagation()\n if (data.record.target_resource.startsWith('url://')) {\n const url = data.record.target_resource.replace(/^url:\\/\\//, 'https://')\n onLinkClick?.(url)\n window.open(url, '_blank', 'noopener,noreferrer')\n } else {\n onClick(data.record)\n }\n })\n chip.addEventListener('keydown', (e) => {\n if (e.key === 'Enter' || e.key === ' ') chip.click()\n })\n return chip\n}\n\nfunction replaceMarkersInNode(\n textNode: Text,\n markers: Map<number, XrefInlineData>,\n onClick: (xref: unknown) => void,\n onLinkClick?: (url: string) => void,\n) {\n const text = textNode.textContent || ''\n if (!text.includes(XREF_MARKER_PREFIX)) return\n\n const parts: (string | XrefInlineData)[] = []\n let lastIndex = 0\n const re = new RegExp(MARKER_RE.source, 'g')\n let m: RegExpExecArray | null\n\n while ((m = re.exec(text)) !== null) {\n if (m.index > lastIndex) parts.push(text.substring(lastIndex, m.index))\n const data = markers.get(Number(m[1]))\n if (data) parts.push(data)\n else parts.push(m[0])\n lastIndex = m.index + m[0].length\n }\n if (lastIndex < text.length) parts.push(text.substring(lastIndex))\n if (parts.length <= 1 && typeof parts[0] === 'string') return\n\n const frag = document.createDocumentFragment()\n for (const p of parts) {\n if (typeof p === 'string') {\n frag.appendChild(document.createTextNode(p))\n } else {\n frag.appendChild(createChip(p, onClick, onLinkClick))\n }\n }\n textNode.replaceWith(frag)\n}\n\nfunction walkTextNodes(root: Node, cb: (n: Text) => void) {\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT)\n const nodes: Text[] = []\n while (walker.nextNode()) nodes.push(walker.currentNode as Text)\n nodes.forEach(cb)\n}\n\n/**\n * Cross-node fallback: when syntax highlighters split marker characters\n * across sibling elements (e.g. <span>⟦</span><span>XREF</span><span>‹0›⟧</span>),\n * single text-node scanning fails. This uses Range API to find markers\n * spanning multiple DOM nodes and replace them.\n */\nfunction patchCrossNodeMarkers(\n root: HTMLElement,\n markers: Map<number, XrefInlineData>,\n onClick: (xref: unknown) => void,\n onLinkClick?: (url: string) => void,\n) {\n const fullText = root.textContent || ''\n if (!fullText.includes(XREF_MARKER_PREFIX)) return\n\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT)\n const textNodes: { node: Text; start: number; end: number }[] = []\n let pos = 0\n while (walker.nextNode()) {\n const node = walker.currentNode as Text\n const len = (node.textContent || '').length\n textNodes.push({ node, start: pos, end: pos + len })\n pos += len\n }\n\n const re = new RegExp(MARKER_RE.source, 'g')\n const replacements: { start: number; end: number; data: XrefInlineData }[] = []\n let match: RegExpExecArray | null\n\n while ((match = re.exec(fullText)) !== null) {\n const data = markers.get(Number(match[1]))\n if (data) {\n replacements.push({ start: match.index, end: match.index + match[0].length, data })\n }\n }\n\n if (replacements.length === 0) return\n\n for (let i = replacements.length - 1; i >= 0; i--) {\n const { start, end, data } = replacements[i]\n const range = document.createRange()\n\n let startSet = false\n let endSet = false\n for (const tn of textNodes) {\n if (!startSet && tn.start <= start && start < tn.end) {\n range.setStart(tn.node, start - tn.start)\n startSet = true\n }\n if (!endSet && tn.start < end && end <= tn.end) {\n range.setEnd(tn.node, end - tn.start)\n endSet = true\n }\n if (startSet && endSet) break\n }\n\n if (startSet && endSet) {\n range.deleteContents()\n range.insertNode(createChip(data, onClick, onLinkClick))\n }\n }\n}\n\n/**\n * Shared hook: pre-process content for xref markers, then DOM-patch rendered\n * text nodes into interactive ycw-xref-chip elements via MutationObserver.\n *\n * Two-pass strategy:\n * 1. Walk individual text nodes for markers (fast path, handles most cases)\n * 2. If markers remain (split across elements by syntax highlighters),\n * use Range API to find and replace across node boundaries (fallback)\n */\nexport function useXrefChips(\n containerRef: React.RefObject<HTMLElement | null>,\n content: string,\n onXrefClick?: (xref: unknown) => void,\n onLinkClick?: (url: string) => void,\n): { processedContent: string; hasMarkers: boolean } {\n const { content: processedContent, markers } = useMemo(\n () => replaceXrefsWithMarkers(content),\n [content],\n )\n\n const onXrefClickRef = useRef(onXrefClick)\n onXrefClickRef.current = onXrefClick\n const onLinkClickRef = useRef(onLinkClick)\n onLinkClickRef.current = onLinkClick\n const markersRef = useRef(markers)\n markersRef.current = markers\n\n useEffect(() => {\n const el = containerRef.current\n if (!el || markersRef.current.size === 0) return\n\n const handleClick = (xref: unknown) => onXrefClickRef.current?.(xref)\n const handleLink = (url: string) => onLinkClickRef.current?.(url)\n\n const patchNode = (node: Node) => {\n walkTextNodes(node, (tn) =>\n replaceMarkersInNode(tn, markersRef.current, handleClick, handleLink),\n )\n if (node instanceof HTMLElement) {\n const remaining = node.textContent || ''\n if (remaining.includes(XREF_MARKER_PREFIX)) {\n patchCrossNodeMarkers(node, markersRef.current, handleClick, handleLink)\n }\n }\n }\n\n patchNode(el)\n\n const observer = new MutationObserver((mutations) => {\n for (const mut of mutations) {\n for (const added of mut.addedNodes) {\n patchNode(added)\n }\n }\n })\n observer.observe(el, { childList: true, subtree: true })\n\n return () => observer.disconnect()\n }, [processedContent, containerRef])\n\n return { processedContent, hasMarkers: markers.size > 0 }\n}\n","import type { XrefRecord } from '../../../types.js'\n\nconst XREF_RE = /@xref\\(\\s*(\\w+)\\s*,\\s*((?:rid|url):\\/\\/[^\\s,\"]+)\\s*,\\s*\"((?:[^\"\\\\]|\\\\.)*)\"\\s*\\)/g\n\nconst VALID_RELATIONS = new Set([\n 'cites', 'implements', 'extends', 'derived_from', 'supersedes', 'related',\n])\n\nexport function parseXrefs(content: string): XrefRecord[] {\n const results: XrefRecord[] = []\n const re = new RegExp(XREF_RE.source, XREF_RE.flags)\n let match: RegExpExecArray | null\n\n while ((match = re.exec(content)) !== null) {\n const relation = match[1]\n const resourceUri = match[2]\n const description = match[3].replace(/\\\\\"/g, '\"')\n const sourceLine = content.substring(0, match.index).split('\\n').length\n\n let targetFileId: string | null = null\n let targetLocation: string | null = null\n if (resourceUri.startsWith('rid://')) {\n const parts = resourceUri.substring(6).split('#', 2)\n targetFileId = parts[0]\n targetLocation = parts.length > 1 ? parts[1] : null\n }\n\n if (!VALID_RELATIONS.has(relation)) continue\n\n results.push({\n relation,\n target_resource: resourceUri,\n target_file_id: targetFileId,\n target_location: targetLocation,\n description,\n source_line: sourceLine,\n })\n }\n\n return results\n}\n\nexport const XREF_MARKER_PREFIX = '\\u27E6XREF\\u2039'\nexport const XREF_MARKER_SUFFIX = '\\u203A\\u27E7'\nconst XREF_MARKER_RE = /\\u27E6XREF\\u2039(\\d+)\\u203A\\u27E7/g\n\nexport interface XrefInlineData {\n index: number\n relation: string\n uri: string\n description: string\n record: XrefRecord\n}\n\n/**\n * Replace @xref(...) with plain-text markers ⟦XREF‹0›⟧ that Streamdown renders as-is.\n * Returns processed content + a map of marker index → xref data.\n */\nexport function replaceXrefsWithMarkers(content: string): {\n content: string\n markers: Map<number, XrefInlineData>\n} {\n const wrapRe = /\\[(@xref\\(\\s*\\w+\\s*,\\s*(?:rid|url):\\/\\/[^\\s,\"]+\\s*,\\s*\"(?:[^\"\\\\]|\\\\.)*\"\\s*\\))\\]/g\n let result = content.replace(wrapRe, '$1')\n\n const commentXrefRe = /<!--\\s*(@xref\\(\\s*\\w+\\s*,\\s*(?:rid|url):\\/\\/[^\\s,\"]+\\s*,\\s*\"(?:[^\"\\\\]|\\\\.)*\"\\s*\\))\\s*-->/g\n result = result.replace(commentXrefRe, '$1')\n\n const markers = new Map<number, XrefInlineData>()\n let idx = 0\n\n const re = new RegExp(XREF_RE.source, XREF_RE.flags)\n result = result.replace(re, (_match, relation, uri, desc) => {\n if (!VALID_RELATIONS.has(relation)) return _match\n const description = desc.replace(/\\\\\"/g, '\"')\n\n let targetFileId: string | null = null\n let targetLocation: string | null = null\n if (uri.startsWith('rid://')) {\n const parts = uri.substring(6).split('#', 2)\n targetFileId = parts[0]\n targetLocation = parts.length > 1 ? parts[1] : null\n }\n\n const record: XrefRecord = {\n relation,\n target_resource: uri,\n target_file_id: targetFileId,\n target_location: targetLocation,\n description,\n source_line: 0,\n }\n\n const currentIdx = idx++\n markers.set(currentIdx, { index: currentIdx, relation, uri, description, record })\n return `${XREF_MARKER_PREFIX}${currentIdx}${XREF_MARKER_SUFFIX}`\n })\n\n return { content: result, markers }\n}\n\n/**\n * RegExp for finding xref markers in rendered text nodes.\n */\nexport { XREF_MARKER_RE }\n"],"mappings":"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","names":["useEffect","useMemo","useRef","useRef","useEffect","useMemo"]}