@xyne/workflow-ui 1.3.17 → 1.3.19
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/components/builder/AddStepButton.d.ts +6 -0
- package/dist/components/builder/AddStepButton.d.ts.map +1 -0
- package/dist/components/builder/AddStepButton.js +7 -0
- package/dist/components/builder/AddStepButton.js.map +1 -0
- package/dist/components/builder/BranchEdge.d.ts +3 -0
- package/dist/components/builder/BranchEdge.d.ts.map +1 -0
- package/dist/components/builder/BranchEdge.js +19 -0
- package/dist/components/builder/BranchEdge.js.map +1 -0
- package/dist/components/builder/BuilderToolbar.d.ts +10 -0
- package/dist/components/builder/BuilderToolbar.d.ts.map +1 -0
- package/dist/components/builder/BuilderToolbar.js +16 -0
- package/dist/components/builder/BuilderToolbar.js.map +1 -0
- package/dist/components/builder/StepConfigDrawer.d.ts +11 -0
- package/dist/components/builder/StepConfigDrawer.d.ts.map +1 -0
- package/dist/components/builder/StepConfigDrawer.js +21 -0
- package/dist/components/builder/StepConfigDrawer.js.map +1 -0
- package/dist/components/builder/StepNode.d.ts +15 -0
- package/dist/components/builder/StepNode.d.ts.map +1 -0
- package/dist/components/builder/StepNode.js +56 -0
- package/dist/components/builder/StepNode.js.map +1 -0
- package/dist/components/builder/StepPalette.d.ts +7 -0
- package/dist/components/builder/StepPalette.d.ts.map +1 -0
- package/dist/components/builder/StepPalette.js +83 -0
- package/dist/components/builder/StepPalette.js.map +1 -0
- package/dist/components/builder/StepPicker.d.ts +9 -0
- package/dist/components/builder/StepPicker.d.ts.map +1 -0
- package/dist/components/builder/StepPicker.js +95 -0
- package/dist/components/builder/StepPicker.js.map +1 -0
- package/dist/components/builder/TriggerConfigPanel.d.ts +10 -0
- package/dist/components/builder/TriggerConfigPanel.d.ts.map +1 -0
- package/dist/components/builder/TriggerConfigPanel.js +49 -0
- package/dist/components/builder/TriggerConfigPanel.js.map +1 -0
- package/dist/components/builder/TriggerNode.d.ts +9 -0
- package/dist/components/builder/TriggerNode.d.ts.map +1 -0
- package/dist/components/builder/TriggerNode.js +30 -0
- package/dist/components/builder/TriggerNode.js.map +1 -0
- package/dist/components/builder/TriggerPicker.d.ts +8 -0
- package/dist/components/builder/TriggerPicker.d.ts.map +1 -0
- package/dist/components/builder/TriggerPicker.js +61 -0
- package/dist/components/builder/TriggerPicker.js.map +1 -0
- package/dist/components/builder/WorkflowBuilder.d.ts +20 -0
- package/dist/components/builder/WorkflowBuilder.d.ts.map +1 -0
- package/dist/components/builder/WorkflowBuilder.js +157 -0
- package/dist/components/builder/WorkflowBuilder.js.map +1 -0
- package/dist/components/builder/edge-types.d.ts +3 -0
- package/dist/components/builder/edge-types.d.ts.map +1 -0
- package/dist/components/builder/edge-types.js +5 -0
- package/dist/components/builder/edge-types.js.map +1 -0
- package/dist/components/builder/node-types.d.ts +3 -0
- package/dist/components/builder/node-types.d.ts.map +1 -0
- package/dist/components/builder/node-types.js +11 -0
- package/dist/components/builder/node-types.js.map +1 -0
- package/dist/components/builder/v2/AddStepButton.d.ts +6 -0
- package/dist/components/builder/v2/AddStepButton.d.ts.map +1 -0
- package/dist/components/builder/v2/AddStepButton.js +6 -0
- package/dist/components/builder/v2/AddStepButton.js.map +1 -0
- package/dist/components/builder/v2/BranchEdge.d.ts +3 -0
- package/dist/components/builder/v2/BranchEdge.d.ts.map +1 -0
- package/dist/components/builder/v2/BranchEdge.js +46 -0
- package/dist/components/builder/v2/BranchEdge.js.map +1 -0
- package/dist/components/builder/v2/LoopBodyEdge.d.ts +7 -0
- package/dist/components/builder/v2/LoopBodyEdge.d.ts.map +1 -0
- package/dist/components/builder/v2/LoopBodyEdge.js +19 -0
- package/dist/components/builder/v2/LoopBodyEdge.js.map +1 -0
- package/dist/components/builder/v2/LoopbackEdge.d.ts +10 -0
- package/dist/components/builder/v2/LoopbackEdge.d.ts.map +1 -0
- package/dist/components/builder/v2/LoopbackEdge.js +26 -0
- package/dist/components/builder/v2/LoopbackEdge.js.map +1 -0
- package/dist/components/builder/v2/StepNode.d.ts +21 -0
- package/dist/components/builder/v2/StepNode.d.ts.map +1 -0
- package/dist/components/builder/v2/StepNode.js +36 -0
- package/dist/components/builder/v2/StepNode.js.map +1 -0
- package/dist/components/builder/v2/StepPicker.d.ts +8 -0
- package/dist/components/builder/v2/StepPicker.d.ts.map +1 -0
- package/dist/components/builder/v2/StepPicker.js +73 -0
- package/dist/components/builder/v2/StepPicker.js.map +1 -0
- package/dist/components/builder/v2/TerminalNode.d.ts +6 -0
- package/dist/components/builder/v2/TerminalNode.d.ts.map +1 -0
- package/dist/components/builder/v2/TerminalNode.js +7 -0
- package/dist/components/builder/v2/TerminalNode.js.map +1 -0
- package/dist/components/builder/v2/TriggerNode.d.ts +10 -0
- package/dist/components/builder/v2/TriggerNode.d.ts.map +1 -0
- package/dist/components/builder/v2/TriggerNode.js +20 -0
- package/dist/components/builder/v2/TriggerNode.js.map +1 -0
- package/dist/components/builder/v2/TriggerPicker.d.ts +7 -0
- package/dist/components/builder/v2/TriggerPicker.d.ts.map +1 -0
- package/dist/components/builder/v2/TriggerPicker.js +45 -0
- package/dist/components/builder/v2/TriggerPicker.js.map +1 -0
- package/dist/components/builder/v2/WorkflowBuilder.d.ts +14 -0
- package/dist/components/builder/v2/WorkflowBuilder.d.ts.map +1 -0
- package/dist/components/builder/v2/WorkflowBuilder.js +189 -0
- package/dist/components/builder/v2/WorkflowBuilder.js.map +1 -0
- package/dist/components/builder/v2/edge-types.d.ts +3 -0
- package/dist/components/builder/v2/edge-types.d.ts.map +1 -0
- package/dist/components/builder/v2/edge-types.js +9 -0
- package/dist/components/builder/v2/edge-types.js.map +1 -0
- package/dist/components/builder/v2/icons.d.ts +25 -0
- package/dist/components/builder/v2/icons.d.ts.map +1 -0
- package/dist/components/builder/v2/icons.js +43 -0
- package/dist/components/builder/v2/icons.js.map +1 -0
- package/dist/components/builder/v2/layout-engine.d.ts +76 -0
- package/dist/components/builder/v2/layout-engine.d.ts.map +1 -0
- package/dist/components/builder/v2/layout-engine.js +465 -0
- package/dist/components/builder/v2/layout-engine.js.map +1 -0
- package/dist/components/builder/v2/node-types.d.ts +3 -0
- package/dist/components/builder/v2/node-types.d.ts.map +1 -0
- package/dist/components/builder/v2/node-types.js +11 -0
- package/dist/components/builder/v2/node-types.js.map +1 -0
- package/dist/components/builder/v2/theme.d.ts +28 -0
- package/dist/components/builder/v2/theme.d.ts.map +1 -0
- package/dist/components/builder/v2/theme.js +63 -0
- package/dist/components/builder/v2/theme.js.map +1 -0
- package/dist/components/dashboard/WorkflowSummaryEditor.d.ts +11 -0
- package/dist/components/dashboard/WorkflowSummaryEditor.d.ts.map +1 -0
- package/dist/components/dashboard/WorkflowSummaryEditor.js +46 -0
- package/dist/components/dashboard/WorkflowSummaryEditor.js.map +1 -0
- package/dist/components/execution/CitationSourcePanel.d.ts +3 -2
- package/dist/components/execution/CitationSourcePanel.d.ts.map +1 -1
- package/dist/components/execution/CitationSourcePanel.js +6 -2
- package/dist/components/execution/CitationSourcePanel.js.map +1 -1
- package/dist/components/execution/ExecutionEdge.d.ts +4 -0
- package/dist/components/execution/ExecutionEdge.d.ts.map +1 -0
- package/dist/components/execution/ExecutionEdge.js +27 -0
- package/dist/components/execution/ExecutionEdge.js.map +1 -0
- package/dist/components/execution/ExecutionStepNode.d.ts +14 -0
- package/dist/components/execution/ExecutionStepNode.d.ts.map +1 -0
- package/dist/components/execution/ExecutionStepNode.js +47 -0
- package/dist/components/execution/ExecutionStepNode.js.map +1 -0
- package/dist/components/execution/ExecutionTriggerNode.d.ts +9 -0
- package/dist/components/execution/ExecutionTriggerNode.d.ts.map +1 -0
- package/dist/components/execution/ExecutionTriggerNode.js +15 -0
- package/dist/components/execution/ExecutionTriggerNode.js.map +1 -0
- package/dist/components/execution/ExecutionViewer.d.ts.map +1 -1
- package/dist/components/execution/ExecutionViewer.js +7 -1
- package/dist/components/execution/ExecutionViewer.js.map +1 -1
- package/dist/components/execution/StepAgentPanels.d.ts +9 -0
- package/dist/components/execution/StepAgentPanels.d.ts.map +1 -0
- package/dist/components/execution/StepAgentPanels.js +133 -0
- package/dist/components/execution/StepAgentPanels.js.map +1 -0
- package/dist/components/execution/execution-layout.d.ts +31 -0
- package/dist/components/execution/execution-layout.d.ts.map +1 -0
- package/dist/components/execution/execution-layout.js +90 -0
- package/dist/components/execution/execution-layout.js.map +1 -0
- package/dist/components/execution/journey-model.d.ts +5 -0
- package/dist/components/execution/journey-model.d.ts.map +1 -1
- package/dist/components/execution/journey-model.js +8 -0
- package/dist/components/execution/journey-model.js.map +1 -1
- package/dist/components/execution/origin/OriginTrace.d.ts.map +1 -1
- package/dist/components/execution/origin/OriginTrace.js +8 -1
- package/dist/components/execution/origin/OriginTrace.js.map +1 -1
- package/dist/components/execution/origin/citation-resolver.d.ts +50 -9
- package/dist/components/execution/origin/citation-resolver.d.ts.map +1 -1
- package/dist/components/execution/origin/citation-resolver.js +98 -18
- package/dist/components/execution/origin/citation-resolver.js.map +1 -1
- package/dist/components/execution/origin/origin-resolver.d.ts +6 -0
- package/dist/components/execution/origin/origin-resolver.d.ts.map +1 -1
- package/dist/components/execution/origin/origin-resolver.js +25 -0
- package/dist/components/execution/origin/origin-resolver.js.map +1 -1
- package/dist/components/shared/AttachmentCard.d.ts +4 -5
- package/dist/components/shared/AttachmentCard.d.ts.map +1 -1
- package/dist/components/shared/AttachmentCard.js +2 -2
- package/dist/components/shared/AttachmentCard.js.map +1 -1
- package/dist/components/shared/CitationArrow.d.ts.map +1 -1
- package/dist/components/shared/CitationArrow.js +67 -11
- package/dist/components/shared/CitationArrow.js.map +1 -1
- package/dist/components/shared/DocumentViewer.d.ts +3 -4
- package/dist/components/shared/DocumentViewer.d.ts.map +1 -1
- package/dist/components/shared/DocumentViewer.js +14 -6
- package/dist/components/shared/DocumentViewer.js.map +1 -1
- package/dist/components/shared/JsonTreeViewer.d.ts +9 -0
- package/dist/components/shared/JsonTreeViewer.d.ts.map +1 -0
- package/dist/components/shared/JsonTreeViewer.js +46 -0
- package/dist/components/shared/JsonTreeViewer.js.map +1 -0
- package/dist/components/shared/MarkdownCitation.js +1 -1
- package/dist/components/shared/MarkdownCitation.js.map +1 -1
- package/dist/components/shared/viewers/CsvView.d.ts +3 -1
- package/dist/components/shared/viewers/CsvView.d.ts.map +1 -1
- package/dist/components/shared/viewers/CsvView.js +16 -3
- package/dist/components/shared/viewers/CsvView.js.map +1 -1
- package/dist/components/shared/viewers/DocxView.d.ts +3 -1
- package/dist/components/shared/viewers/DocxView.d.ts.map +1 -1
- package/dist/components/shared/viewers/DocxView.js +5 -1
- package/dist/components/shared/viewers/DocxView.js.map +1 -1
- package/dist/components/shared/viewers/SheetView.d.ts +3 -1
- package/dist/components/shared/viewers/SheetView.d.ts.map +1 -1
- package/dist/components/shared/viewers/SheetView.js +18 -3
- package/dist/components/shared/viewers/SheetView.js.map +1 -1
- package/dist/components/shared/viewers/TextView.d.ts +3 -1
- package/dist/components/shared/viewers/TextView.d.ts.map +1 -1
- package/dist/components/shared/viewers/TextView.js +9 -4
- package/dist/components/shared/viewers/TextView.js.map +1 -1
- package/dist/components/shared/viewers/anchor-match.d.ts +44 -0
- package/dist/components/shared/viewers/anchor-match.d.ts.map +1 -0
- package/dist/components/shared/viewers/anchor-match.js +147 -0
- package/dist/components/shared/viewers/anchor-match.js.map +1 -0
- package/dist/components/shared/viewers/useDomAnchor.d.ts +41 -0
- package/dist/components/shared/viewers/useDomAnchor.d.ts.map +1 -0
- package/dist/components/shared/viewers/useDomAnchor.js +125 -0
- package/dist/components/shared/viewers/useDomAnchor.js.map +1 -0
- package/dist/styles.css +1 -1
- package/package.json +1 -1
- package/dist/components/schema-form/AttachmentField.d.ts +0 -16
- package/dist/components/schema-form/AttachmentField.d.ts.map +0 -1
- package/dist/components/schema-form/AttachmentField.js +0 -139
- package/dist/components/schema-form/AttachmentField.js.map +0 -1
- package/dist/components/share/ShareDialog.d.ts +0 -21
- package/dist/components/share/ShareDialog.d.ts.map +0 -1
- package/dist/components/share/ShareDialog.js +0 -98
- package/dist/components/share/ShareDialog.js.map +0 -1
- package/dist/utils/map-lanes.d.ts +0 -35
- package/dist/utils/map-lanes.d.ts.map +0 -1
- package/dist/utils/map-lanes.js +0 -48
- package/dist/utils/map-lanes.js.map +0 -1
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { cn } from './cn.js';
|
|
4
|
+
/**
|
|
5
|
+
* Collapsible JSON tree viewer. Extracted from StepDetailPanel so the run-view
|
|
6
|
+
* activity timeline (tool-call args/results) can reuse it.
|
|
7
|
+
*/
|
|
8
|
+
export function JsonTreeViewer({ data, placeholder }) {
|
|
9
|
+
if (data === undefined || data === null || (typeof data === 'object' && Object.keys(data).length === 0)) {
|
|
10
|
+
return (_jsx("div", { className: "flex items-center justify-center py-8", children: _jsxs("div", { className: "text-center", children: [_jsxs("svg", { width: "32", height: "32", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", className: "mx-auto text-slate-300 mb-2", children: [_jsx("path", { d: "M13 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9z", strokeLinecap: "round", strokeLinejoin: "round" }), _jsx("polyline", { points: "13 2 13 9 20 9", strokeLinecap: "round", strokeLinejoin: "round" })] }), _jsx("div", { className: "text-[12px] text-slate-400", children: placeholder })] }) }));
|
|
11
|
+
}
|
|
12
|
+
return (_jsx("div", { className: "font-mono text-[12px] leading-[1.6]", children: _jsx(JsonNode, { value: data, depth: 0, isLast: true }) }));
|
|
13
|
+
}
|
|
14
|
+
function JsonNode({ value, depth, keyName, isLast }) {
|
|
15
|
+
const [collapsed, setCollapsed] = useState(depth > 2);
|
|
16
|
+
const indent = depth * 16;
|
|
17
|
+
if (value === null) {
|
|
18
|
+
return (_jsxs("div", { style: { paddingLeft: indent }, className: "flex items-baseline gap-1", children: [keyName !== undefined && _jsxs("span", { className: "text-slate-500", children: [keyName, _jsx("span", { className: "text-slate-400", children: ": " })] }), _jsx("span", { className: "text-slate-400 italic", children: "null" }), !isLast && _jsx("span", { className: "text-slate-300", children: "," })] }));
|
|
19
|
+
}
|
|
20
|
+
if (typeof value === 'boolean') {
|
|
21
|
+
return (_jsxs("div", { style: { paddingLeft: indent }, className: "flex items-baseline gap-1", children: [keyName !== undefined && _jsxs("span", { className: "text-slate-500", children: [keyName, _jsx("span", { className: "text-slate-400", children: ": " })] }), _jsx("span", { className: "text-violet-600", children: value ? 'true' : 'false' }), !isLast && _jsx("span", { className: "text-slate-300", children: "," })] }));
|
|
22
|
+
}
|
|
23
|
+
if (typeof value === 'number') {
|
|
24
|
+
return (_jsxs("div", { style: { paddingLeft: indent }, className: "flex items-baseline gap-1", children: [keyName !== undefined && _jsxs("span", { className: "text-slate-500", children: [keyName, _jsx("span", { className: "text-slate-400", children: ": " })] }), _jsx("span", { className: "text-blue-600", children: String(value) }), !isLast && _jsx("span", { className: "text-slate-300", children: "," })] }));
|
|
25
|
+
}
|
|
26
|
+
if (typeof value === 'string') {
|
|
27
|
+
const isLong = value.length > 80;
|
|
28
|
+
return (_jsxs("div", { style: { paddingLeft: indent }, className: "group/val flex items-start gap-1", children: [keyName !== undefined && _jsxs("span", { className: "shrink-0 text-slate-500", children: [keyName, _jsx("span", { className: "text-slate-400", children: ": " })] }), _jsxs("span", { className: cn('text-emerald-700 break-all', isLong && 'block'), children: ["\"", value, "\""] }), !isLast && _jsx("span", { className: "text-slate-300 shrink-0", children: "," })] }));
|
|
29
|
+
}
|
|
30
|
+
if (Array.isArray(value)) {
|
|
31
|
+
if (value.length === 0) {
|
|
32
|
+
return (_jsxs("div", { style: { paddingLeft: indent }, className: "flex items-baseline gap-1", children: [keyName !== undefined && _jsxs("span", { className: "text-slate-500", children: [keyName, _jsx("span", { className: "text-slate-400", children: ": " })] }), _jsx("span", { className: "text-slate-400", children: "[]" }), !isLast && _jsx("span", { className: "text-slate-300", children: "," })] }));
|
|
33
|
+
}
|
|
34
|
+
return (_jsxs("div", { children: [_jsxs("div", { style: { paddingLeft: indent }, className: "flex items-baseline gap-1 cursor-pointer hover:bg-slate-50 rounded -mx-1 px-1 transition-colors", onClick: () => setCollapsed(!collapsed), children: [_jsx("span", { className: "text-slate-400 w-3 text-center shrink-0 select-none", children: collapsed ? '▶' : '▼' }), keyName !== undefined && _jsxs("span", { className: "text-slate-500", children: [keyName, _jsx("span", { className: "text-slate-400", children: ": " })] }), collapsed ? (_jsxs(_Fragment, { children: [_jsx("span", { className: "text-slate-400", children: "[" }), _jsxs("span", { className: "text-slate-400 text-[10px]", children: [value.length, " items"] }), _jsx("span", { className: "text-slate-400", children: "]" }), !isLast && _jsx("span", { className: "text-slate-300", children: "," })] })) : (_jsx("span", { className: "text-slate-400", children: "[" }))] }), !collapsed && (_jsxs(_Fragment, { children: [value.map((item, i) => (_jsx(JsonNode, { value: item, depth: depth + 1, keyName: String(i), isLast: i === value.length - 1 }, i))), _jsxs("div", { style: { paddingLeft: indent }, className: "flex items-baseline gap-1", children: [_jsx("span", { className: "w-3 shrink-0" }), _jsx("span", { className: "text-slate-400", children: "]" }), !isLast && _jsx("span", { className: "text-slate-300", children: "," })] })] }))] }));
|
|
35
|
+
}
|
|
36
|
+
if (typeof value === 'object') {
|
|
37
|
+
const entries = Object.entries(value);
|
|
38
|
+
if (entries.length === 0) {
|
|
39
|
+
return (_jsxs("div", { style: { paddingLeft: indent }, className: "flex items-baseline gap-1", children: [keyName !== undefined && _jsxs("span", { className: "text-slate-500", children: [keyName, _jsx("span", { className: "text-slate-400", children: ": " })] }), _jsx("span", { className: "text-slate-400", children: '{}' }), !isLast && _jsx("span", { className: "text-slate-300", children: "," })] }));
|
|
40
|
+
}
|
|
41
|
+
return (_jsxs("div", { children: [_jsxs("div", { style: { paddingLeft: indent }, className: "flex items-baseline gap-1 cursor-pointer hover:bg-slate-50 rounded -mx-1 px-1 transition-colors", onClick: () => setCollapsed(!collapsed), children: [_jsx("span", { className: "text-slate-400 w-3 text-center shrink-0 select-none", children: collapsed ? '▶' : '▼' }), keyName !== undefined && _jsxs("span", { className: "text-slate-500", children: [keyName, _jsx("span", { className: "text-slate-400", children: ": " })] }), collapsed ? (_jsxs(_Fragment, { children: [_jsx("span", { className: "text-slate-400", children: '{' }), _jsxs("span", { className: "text-slate-400 text-[10px]", children: [entries.length, " keys"] }), _jsx("span", { className: "text-slate-400", children: '}' }), !isLast && _jsx("span", { className: "text-slate-300", children: "," })] })) : (_jsx("span", { className: "text-slate-400", children: '{' }))] }), !collapsed && (_jsxs(_Fragment, { children: [entries.map(([k, v], i) => (_jsx(JsonNode, { value: v, depth: depth + 1, keyName: k, isLast: i === entries.length - 1 }, k))), _jsxs("div", { style: { paddingLeft: indent }, className: "flex items-baseline gap-1", children: [_jsx("span", { className: "w-3 shrink-0" }), _jsx("span", { className: "text-slate-400", children: '}' }), !isLast && _jsx("span", { className: "text-slate-300", children: "," })] })] }))] }));
|
|
42
|
+
}
|
|
43
|
+
// Fallback for unknown types
|
|
44
|
+
return (_jsxs("div", { style: { paddingLeft: indent }, className: "flex items-baseline gap-1", children: [keyName !== undefined && _jsxs("span", { className: "text-slate-500", children: [keyName, _jsx("span", { className: "text-slate-400", children: ": " })] }), _jsx("span", { className: "text-slate-600", children: String(value) }), !isLast && _jsx("span", { className: "text-slate-300", children: "," })] }));
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=JsonTreeViewer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JsonTreeViewer.js","sourceRoot":"","sources":["../../../src/components/shared/JsonTreeViewer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarkdownCitation.js","sourceRoot":"","sources":["../../../src/components/shared/MarkdownCitation.tsx"],"names":[],"mappings":";AAWA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAgBnD,qFAAqF;AACrF,SAAS,MAAM,CAAC,IAAwB;IACtC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACzC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IACvB,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,SAAS,UAAU,CAAC,KAA4B;IAC9C,wEAAwE;IACxE,4EAA4E;IAC5E,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/D,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC;IACD,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,KAAK,EAAE,EAAE,CAAC;QAChD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,OAAO;YACL,IAAI,EAAE,KAAK;YACX,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"MarkdownCitation.js","sourceRoot":"","sources":["../../../src/components/shared/MarkdownCitation.tsx"],"names":[],"mappings":";AAWA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAgBnD,qFAAqF;AACrF,SAAS,MAAM,CAAC,IAAwB;IACtC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACzC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IACvB,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,SAAS,UAAU,CAAC,KAA4B;IAC9C,wEAAwE;IACxE,4EAA4E;IAC5E,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/D,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC;IACD,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,KAAK,EAAE,EAAE,CAAC;QAChD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,OAAO;YACL,IAAI,EAAE,KAAK;YACX,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,MAAe,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzE,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC/C,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAA4B;IAC3D,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IACnC,OAAO,CACL,gBAAM,SAAS,EAAC,cAAc,aAC3B,KAAK,CAAC,QAAQ,EACd,QAAQ,IAAI,KAAC,aAAa,IAAC,QAAQ,EAAE,QAAQ,GAAI,IAC7C,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CsvView.d.ts","sourceRoot":"","sources":["../../../../src/components/shared/viewers/CsvView.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CsvView.d.ts","sourceRoot":"","sources":["../../../../src/components/shared/viewers/CsvView.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAgB9D,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,+BA2D5F"}
|
|
@@ -1,12 +1,25 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useEffect, useState } from 'react';
|
|
2
|
+
import { useEffect, useRef, useState } from 'react';
|
|
3
3
|
import Papa from 'papaparse';
|
|
4
4
|
import { ViewerLoading } from './chrome.js';
|
|
5
|
+
import { useDomAnchor } from './useDomAnchor.js';
|
|
5
6
|
const MAX_ROWS = 1000;
|
|
7
|
+
/** Spreadsheet column letter for a 0-based index: 0→A, 25→Z, 26→AA. */
|
|
8
|
+
function colName(i) {
|
|
9
|
+
let n = i;
|
|
10
|
+
let s = '';
|
|
11
|
+
do {
|
|
12
|
+
s = String.fromCharCode(65 + (n % 26)) + s;
|
|
13
|
+
n = Math.floor(n / 26) - 1;
|
|
14
|
+
} while (n >= 0);
|
|
15
|
+
return s;
|
|
16
|
+
}
|
|
6
17
|
// CSV/TSV renderer — parses with papaparse and renders a themed table.
|
|
7
|
-
export default function CsvView({ url }) {
|
|
18
|
+
export default function CsvView({ url, anchor }) {
|
|
8
19
|
const [rows, setRows] = useState(null);
|
|
9
20
|
const [failed, setFailed] = useState(false);
|
|
21
|
+
const bodyRef = useRef(null);
|
|
22
|
+
useDomAnchor(bodyRef, anchor, rows?.length ?? -1);
|
|
10
23
|
useEffect(() => {
|
|
11
24
|
let cancelled = false;
|
|
12
25
|
setRows(null);
|
|
@@ -34,6 +47,6 @@ export default function CsvView({ url }) {
|
|
|
34
47
|
const capped = body.slice(0, MAX_ROWS);
|
|
35
48
|
const th = 'sticky top-0 border border-[var(--wui-border)] bg-[var(--wui-bg-subtle)] px-2.5 py-1.5 text-left font-semibold text-[var(--wui-fg)]';
|
|
36
49
|
const td = 'border border-[var(--wui-border)] px-2.5 py-1.5 align-top text-[var(--wui-fg-muted)]';
|
|
37
|
-
return (_jsxs("div", { className: "overflow-auto px-5 py-4", children: [_jsxs("table", { className: "w-full border-collapse text-[12.5px] tabular-nums", children: [head && (_jsx("thead", { children: _jsx("tr", { children: head.map((c, i) => _jsx("th", { className: th, children: c }, i)) }) })), _jsx("tbody", { children: capped.map((row, ri) => (_jsx("tr", { children: row.map((c, ci) => _jsx("td", { className: td, children: c }, ci)) }, ri))) })] }), body.length > capped.length && (_jsxs("p", { className: "mt-2 text-[12px] text-[var(--wui-fg-muted)]", children: ["Showing first ", String(capped.length), " of ", String(body.length), " rows."] }))] }));
|
|
50
|
+
return (_jsxs("div", { ref: bodyRef, className: "overflow-auto px-5 py-4", children: [_jsxs("table", { className: "w-full border-collapse text-[12.5px] tabular-nums", children: [head && (_jsx("thead", { children: _jsx("tr", { children: head.map((c, i) => _jsx("th", { className: th, "data-row": "1", "data-col": colName(i), children: c }, i)) }) })), _jsx("tbody", { children: capped.map((row, ri) => (_jsx("tr", { children: row.map((c, ci) => (_jsx("td", { className: td, "data-row": ri + 2, "data-col": colName(ci), children: c }, ci))) }, ri))) })] }), body.length > capped.length && (_jsxs("p", { className: "mt-2 text-[12px] text-[var(--wui-fg-muted)]", children: ["Showing first ", String(capped.length), " of ", String(body.length), " rows."] }))] }));
|
|
38
51
|
}
|
|
39
52
|
//# sourceMappingURL=CsvView.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CsvView.js","sourceRoot":"","sources":["../../../../src/components/shared/viewers/CsvView.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"CsvView.js","sourceRoot":"","sources":["../../../../src/components/shared/viewers/CsvView.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
import { type Anchor } from './useDomAnchor.js';
|
|
2
|
+
export default function DocxView({ url, anchor }: {
|
|
2
3
|
url: string;
|
|
4
|
+
anchor?: Anchor | undefined;
|
|
3
5
|
}): import("react").JSX.Element;
|
|
4
6
|
//# sourceMappingURL=DocxView.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocxView.d.ts","sourceRoot":"","sources":["../../../../src/components/shared/viewers/DocxView.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DocxView.d.ts","sourceRoot":"","sources":["../../../../src/components/shared/viewers/DocxView.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAK9D,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,+BAyC7F"}
|
|
@@ -2,13 +2,17 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { useEffect, useRef, useState } from 'react';
|
|
3
3
|
import { renderAsync } from 'docx-preview';
|
|
4
4
|
import { ViewerLoading } from './chrome.js';
|
|
5
|
+
import { useDomAnchor } from './useDomAnchor.js';
|
|
5
6
|
// DOCX renderer — docx-preview parses the file into a styled DOM mounted into a
|
|
6
7
|
// ref'd container (it needs a real mounted node, so render the container always
|
|
7
8
|
// and overlay the spinner while it works).
|
|
8
|
-
export default function DocxView({ url }) {
|
|
9
|
+
export default function DocxView({ url, anchor }) {
|
|
9
10
|
const ref = useRef(null);
|
|
10
11
|
const [loading, setLoading] = useState(true);
|
|
11
12
|
const [failed, setFailed] = useState(false);
|
|
13
|
+
// `loading` flips false exactly when renderAsync has built the subtree, so it
|
|
14
|
+
// is the precise moment there is text to search.
|
|
15
|
+
useDomAnchor(ref, anchor, loading);
|
|
12
16
|
useEffect(() => {
|
|
13
17
|
let cancelled = false;
|
|
14
18
|
setLoading(true);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocxView.js","sourceRoot":"","sources":["../../../../src/components/shared/viewers/DocxView.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"DocxView.js","sourceRoot":"","sources":["../../../../src/components/shared/viewers/DocxView.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAe,MAAM,mBAAmB,CAAC;AAE9D,gFAAgF;AAChF,gFAAgF;AAChF,2CAA2C;AAC3C,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAAE,GAAG,EAAE,MAAM,EAAgD;IAC5F,MAAM,GAAG,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IACzC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,8EAA8E;IAC9E,iDAAiD;IACjD,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAEnC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,SAAS,CAAC,KAAK,CAAC,CAAC;QACjB,KAAK,KAAK,CAAC,GAAG,CAAC;aACZ,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;YACV,IAAI,CAAC,CAAC,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YAC7C,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAClB,CAAC,CAAC;aACD,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YACnB,IAAI,SAAS,IAAI,CAAC,GAAG,CAAC,OAAO;gBAAE,OAAO;YACtC,MAAM,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE;gBAC9C,SAAS,EAAE,UAAU;gBACrB,SAAS,EAAE,IAAI;gBACf,WAAW,EAAE,IAAI;aAClB,CAAC,CAAC;YACH,IAAI,CAAC,SAAS;gBAAE,UAAU,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS;YAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrD,OAAO,GAAG,EAAE,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAEV,IAAI,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAEhD,OAAO,CACL,eAAK,SAAS,EAAC,WAAW,aACvB,OAAO,IAAI,KAAC,aAAa,KAAG,EAC7B,cACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAC,kHAAkH,GAC5H,IACE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
import { type Anchor } from './useDomAnchor.js';
|
|
2
|
+
export default function SheetView({ url, anchor }: {
|
|
2
3
|
url: string;
|
|
4
|
+
anchor?: Anchor | undefined;
|
|
3
5
|
}): import("react").JSX.Element;
|
|
4
6
|
//# sourceMappingURL=SheetView.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SheetView.d.ts","sourceRoot":"","sources":["../../../../src/components/shared/viewers/SheetView.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SheetView.d.ts","sourceRoot":"","sources":["../../../../src/components/shared/viewers/SheetView.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAkB9D,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,+BA4F9F"}
|
|
@@ -1,15 +1,30 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useEffect, useState } from 'react';
|
|
2
|
+
import { useEffect, useRef, useState } from 'react';
|
|
3
3
|
import readXlsxFile, { readSheetNames } from 'read-excel-file';
|
|
4
4
|
import { cn } from '../cn.js';
|
|
5
5
|
import { ViewerLoading } from './chrome.js';
|
|
6
|
+
import { useDomAnchor } from './useDomAnchor.js';
|
|
6
7
|
const MAX_ROWS = 1000;
|
|
8
|
+
/** Spreadsheet column letter for a 0-based index: 0→A, 25→Z, 26→AA. */
|
|
9
|
+
function colName(i) {
|
|
10
|
+
let n = i;
|
|
11
|
+
let s = '';
|
|
12
|
+
do {
|
|
13
|
+
s = String.fromCharCode(65 + (n % 26)) + s;
|
|
14
|
+
n = Math.floor(n / 26) - 1;
|
|
15
|
+
} while (n >= 0);
|
|
16
|
+
return s;
|
|
17
|
+
}
|
|
7
18
|
// XLSX/XLS renderer — parses with SheetJS, renders each sheet as a themed table
|
|
8
19
|
// with tabs when there is more than one sheet.
|
|
9
|
-
export default function SheetView({ url }) {
|
|
20
|
+
export default function SheetView({ url, anchor }) {
|
|
10
21
|
const [sheets, setSheets] = useState(null);
|
|
11
22
|
const [active, setActive] = useState(0);
|
|
12
23
|
const [failed, setFailed] = useState(false);
|
|
24
|
+
const bodyRef = useRef(null);
|
|
25
|
+
// Re-anchor when the visible sheet changes — a cell locator naming another
|
|
26
|
+
// sheet must not highlight the same coordinates on whichever one is showing.
|
|
27
|
+
useDomAnchor(bodyRef, anchor, `${String(active)}:${String(sheets?.length ?? -1)}`);
|
|
13
28
|
useEffect(() => {
|
|
14
29
|
let cancelled = false;
|
|
15
30
|
setSheets(null);
|
|
@@ -43,6 +58,6 @@ export default function SheetView({ url }) {
|
|
|
43
58
|
const td = 'border border-[var(--wui-border)] px-2.5 py-1.5 align-top text-[var(--wui-fg-muted)]';
|
|
44
59
|
return (_jsxs("div", { className: "flex h-full flex-col", children: [sheets.length > 1 && (_jsx("div", { className: "flex shrink-0 gap-1 overflow-x-auto border-b border-[var(--wui-border)] px-3 py-2", children: sheets.map((s, i) => (_jsx("button", { type: "button", onClick: () => setActive(i), className: cn('shrink-0 rounded px-2.5 py-1 text-[12px] transition-colors', i === active
|
|
45
60
|
? 'bg-[var(--wui-bg-subtle)] font-semibold text-[var(--wui-fg)]'
|
|
46
|
-
: 'text-[var(--wui-fg-muted)] hover:bg-[var(--wui-bg-subtle)]'), children: s.name }, s.name))) })), _jsxs("div", { className: "overflow-auto px-5 py-4", children: [_jsxs("table", { className: "w-full border-collapse text-[12.5px] tabular-nums", children: [head && (_jsx("thead", { children: _jsx("tr", { children: head.map((c, i) => _jsx("th", { className: th, children: String(c ?? '') }, i)) }) })), _jsx("tbody", { children: capped.map((row, ri) => (_jsx("tr", { children: row.map((c, ci) => _jsx("td", { className: td, children: String(c ?? '') }, ci)) }, ri))) })] }), body.length > capped.length && (_jsxs("p", { className: "mt-2 text-[12px] text-[var(--wui-fg-muted)]", children: ["Showing first ", String(capped.length), " of ", String(body.length), " rows."] }))] })] }));
|
|
61
|
+
: 'text-[var(--wui-fg-muted)] hover:bg-[var(--wui-bg-subtle)]'), children: s.name }, s.name))) })), _jsxs("div", { ref: bodyRef, className: "overflow-auto px-5 py-4", children: [_jsxs("table", { className: "w-full border-collapse text-[12.5px] tabular-nums", children: [head && (_jsx("thead", { children: _jsx("tr", { children: head.map((c, i) => (_jsx("th", { className: th, "data-row": "1", "data-col": colName(i), children: String(c ?? '') }, i))) }) })), _jsx("tbody", { children: capped.map((row, ri) => (_jsx("tr", { children: row.map((c, ci) => (_jsx("td", { className: td, "data-row": ri + 2, "data-col": colName(ci), children: String(c ?? '') }, ci))) }, ri))) })] }), body.length > capped.length && (_jsxs("p", { className: "mt-2 text-[12px] text-[var(--wui-fg-muted)]", children: ["Showing first ", String(capped.length), " of ", String(body.length), " rows."] }))] })] }));
|
|
47
62
|
}
|
|
48
63
|
//# sourceMappingURL=SheetView.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SheetView.js","sourceRoot":"","sources":["../../../../src/components/shared/viewers/SheetView.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"SheetView.js","sourceRoot":"","sources":["../../../../src/components/shared/viewers/SheetView.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
import { type Anchor } from './useDomAnchor.js';
|
|
2
|
+
export default function TextView({ url, mode, anchor, }: {
|
|
2
3
|
url: string;
|
|
3
4
|
mode: 'text' | 'json' | 'markdown';
|
|
5
|
+
anchor?: Anchor | undefined;
|
|
4
6
|
}): import("react").JSX.Element;
|
|
5
7
|
//# sourceMappingURL=TextView.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextView.d.ts","sourceRoot":"","sources":["../../../../src/components/shared/viewers/TextView.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"TextView.d.ts","sourceRoot":"","sources":["../../../../src/components/shared/viewers/TextView.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAK9D,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAC/B,GAAG,EACH,IAAI,EACJ,MAAM,GACP,EAAE;IACD,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B,+BAyCA"}
|
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { useEffect, useState } from 'react';
|
|
2
|
+
import { useEffect, useRef, useState } from 'react';
|
|
3
3
|
import { MarkdownView } from '../MarkdownView.js';
|
|
4
4
|
import { ViewerLoading } from './chrome.js';
|
|
5
|
+
import { useDomAnchor } from './useDomAnchor.js';
|
|
5
6
|
// Plain-text / JSON / Markdown renderer. Fetches the file as text (same-origin,
|
|
6
7
|
// so the auth cookie rides along) and renders by mode. On load failure it
|
|
7
8
|
// throws during render so the parent ViewerBoundary shows the download fallback.
|
|
8
|
-
export default function TextView({ url, mode }) {
|
|
9
|
+
export default function TextView({ url, mode, anchor, }) {
|
|
9
10
|
const [text, setText] = useState(null);
|
|
10
11
|
const [failed, setFailed] = useState(false);
|
|
12
|
+
const bodyRef = useRef(null);
|
|
13
|
+
// `text` gates the search: the content only exists in the DOM once it has
|
|
14
|
+
// loaded, and `mode` because switching renderer rebuilds the subtree.
|
|
15
|
+
useDomAnchor(bodyRef, anchor, `${mode}:${String(text?.length ?? -1)}`);
|
|
11
16
|
useEffect(() => {
|
|
12
17
|
let cancelled = false;
|
|
13
18
|
setText(null);
|
|
@@ -29,10 +34,10 @@ export default function TextView({ url, mode }) {
|
|
|
29
34
|
if (text === null)
|
|
30
35
|
return _jsx(ViewerLoading, {});
|
|
31
36
|
if (mode === 'markdown') {
|
|
32
|
-
return (_jsx("div", { className: "px-5 py-4 text-[14px] text-[var(--wui-fg)]", children: _jsx(MarkdownView, { children: text }) }));
|
|
37
|
+
return (_jsx("div", { ref: bodyRef, className: "px-5 py-4 text-[14px] text-[var(--wui-fg)]", children: _jsx(MarkdownView, { children: text }) }));
|
|
33
38
|
}
|
|
34
39
|
const body = mode === 'json' ? prettyJson(text) : text;
|
|
35
|
-
return (_jsx("pre", { className: "whitespace-pre-wrap break-words px-5 py-4 font-mono text-[12.5px] leading-relaxed text-[var(--wui-fg)]", children: body }));
|
|
40
|
+
return (_jsx("div", { ref: bodyRef, children: _jsx("pre", { className: "whitespace-pre-wrap break-words px-5 py-4 font-mono text-[12.5px] leading-relaxed text-[var(--wui-fg)]", children: body }) }));
|
|
36
41
|
}
|
|
37
42
|
function prettyJson(t) {
|
|
38
43
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextView.js","sourceRoot":"","sources":["../../../../src/components/shared/viewers/TextView.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"TextView.js","sourceRoot":"","sources":["../../../../src/components/shared/viewers/TextView.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAe,MAAM,mBAAmB,CAAC;AAE9D,gFAAgF;AAChF,0EAA0E;AAC1E,iFAAiF;AACjF,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAC/B,GAAG,EACH,IAAI,EACJ,MAAM,GAKP;IACC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACtD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;IACpD,0EAA0E;IAC1E,sEAAsE;IACtE,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAEvE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,OAAO,CAAC,IAAI,CAAC,CAAC;QACd,SAAS,CAAC,KAAK,CAAC,CAAC;QACjB,KAAK,KAAK,CAAC,GAAG,CAAC;aACZ,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;YACV,IAAI,CAAC,CAAC,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YAC7C,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAClB,CAAC,CAAC;aACD,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,SAAS;YAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aAC5C,KAAK,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS;YAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrD,OAAO,GAAG,EAAE,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAEV,IAAI,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAChD,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,KAAC,aAAa,KAAG,CAAC;IAE5C,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACxB,OAAO,CACL,cAAK,GAAG,EAAE,OAAO,EAAE,SAAS,EAAC,4CAA4C,YACvE,KAAC,YAAY,cAAE,IAAI,GAAgB,GAC/B,CACP,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvD,OAAO,CACL,cAAK,GAAG,EAAE,OAAO,YACf,cAAK,SAAS,EAAC,wGAAwG,YACpH,IAAI,GACD,GACF,CACP,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Finding a cited passage inside rendered text — the format-agnostic half of
|
|
3
|
+
* citation anchoring.
|
|
4
|
+
*
|
|
5
|
+
* A citation's `quote` is what the **agent read**, which is rarely byte-identical
|
|
6
|
+
* to what the **viewer renders**: OCR drops or doubles spaces, smart quotes and
|
|
7
|
+
* ligatures differ between the extractor and the renderer, and a passage can be
|
|
8
|
+
* split across elements. An exact `indexOf` therefore fails on precisely the
|
|
9
|
+
* documents citations exist for, and fails *silently* — the reader just sees an
|
|
10
|
+
* unhighlighted page and assumes the citation is wrong.
|
|
11
|
+
*
|
|
12
|
+
* So matching is normalized and laddered: compare on a canonical form, and when
|
|
13
|
+
* the whole phrase misses, fall back to progressively shorter prefixes. The
|
|
14
|
+
* *start* of a quote is reliable even when its middle drifted.
|
|
15
|
+
*
|
|
16
|
+
* Used by every DOM-rendered viewer (text, markdown, json, docx, csv, xlsx) via
|
|
17
|
+
* `useDomAnchor`, and by `PdfView` for its own pdf.js find controller.
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* Canonical form for comparison: folded characters, whitespace runs collapsed to
|
|
21
|
+
* a single space, trimmed. Used on both haystack and needle so they meet in the
|
|
22
|
+
* middle.
|
|
23
|
+
*/
|
|
24
|
+
export declare function normalizeForMatch(s: string): string;
|
|
25
|
+
/**
|
|
26
|
+
* Progressively shorter prefixes of a phrase, longest first.
|
|
27
|
+
*
|
|
28
|
+
* The fallback when a whole quote won't match — because it spans a page break,
|
|
29
|
+
* or its middle drifted in OCR. The start of the value is on the cited page by
|
|
30
|
+
* definition, so a shorter head still lands the reader in the right place.
|
|
31
|
+
*
|
|
32
|
+
* Guards against matching noise: never fewer than 2 words or 4 characters, since
|
|
33
|
+
* a 1-word ladder rung would highlight the first "the" on the page.
|
|
34
|
+
*/
|
|
35
|
+
export declare function buildQueryLadder(value: string): string[];
|
|
36
|
+
/**
|
|
37
|
+
* Find `quote` inside `root`'s rendered text and return a `Range` over it.
|
|
38
|
+
*
|
|
39
|
+
* Tries the whole phrase first, then the prefix ladder. Returns `null` when
|
|
40
|
+
* nothing matches — callers should degrade to "opened, not highlighted" rather
|
|
41
|
+
* than pretending.
|
|
42
|
+
*/
|
|
43
|
+
export declare function findRange(root: HTMLElement, quote: string): Range | null;
|
|
44
|
+
//# sourceMappingURL=anchor-match.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anchor-match.d.ts","sourceRoot":"","sources":["../../../../src/components/shared/viewers/anchor-match.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAiBH;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAenD;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CASxD;AAiDD;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,CAyBxE"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Finding a cited passage inside rendered text — the format-agnostic half of
|
|
3
|
+
* citation anchoring.
|
|
4
|
+
*
|
|
5
|
+
* A citation's `quote` is what the **agent read**, which is rarely byte-identical
|
|
6
|
+
* to what the **viewer renders**: OCR drops or doubles spaces, smart quotes and
|
|
7
|
+
* ligatures differ between the extractor and the renderer, and a passage can be
|
|
8
|
+
* split across elements. An exact `indexOf` therefore fails on precisely the
|
|
9
|
+
* documents citations exist for, and fails *silently* — the reader just sees an
|
|
10
|
+
* unhighlighted page and assumes the citation is wrong.
|
|
11
|
+
*
|
|
12
|
+
* So matching is normalized and laddered: compare on a canonical form, and when
|
|
13
|
+
* the whole phrase misses, fall back to progressively shorter prefixes. The
|
|
14
|
+
* *start* of a quote is reliable even when its middle drifted.
|
|
15
|
+
*
|
|
16
|
+
* Used by every DOM-rendered viewer (text, markdown, json, docx, csv, xlsx) via
|
|
17
|
+
* `useDomAnchor`, and by `PdfView` for its own pdf.js find controller.
|
|
18
|
+
*/
|
|
19
|
+
/** Characters that differ between text extractors and renderers but read the same. */
|
|
20
|
+
const CHAR_FOLD = {
|
|
21
|
+
'‘': "'", '’': "'", '‚': "'", '‛': "'", // ‘ ’ ‚ ‛
|
|
22
|
+
'“': '"', '”': '"', '„': '"', '‟': '"', // “ ” „ ‟
|
|
23
|
+
'–': '-', '—': '-', '−': '-', // – — −
|
|
24
|
+
' ': ' ', ' ': ' ', ' ': ' ', ' ': ' ', // nbsp & friends
|
|
25
|
+
'ff': 'ff', 'fi': 'fi', 'fl': 'fl', // ff fi fl
|
|
26
|
+
'ffi': 'ffi', 'ffl': 'ffl',
|
|
27
|
+
};
|
|
28
|
+
/** Fold one character to its canonical form (may expand, e.g. a ligature). */
|
|
29
|
+
function foldChar(ch) {
|
|
30
|
+
return CHAR_FOLD[ch] ?? ch.toLowerCase();
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Canonical form for comparison: folded characters, whitespace runs collapsed to
|
|
34
|
+
* a single space, trimmed. Used on both haystack and needle so they meet in the
|
|
35
|
+
* middle.
|
|
36
|
+
*/
|
|
37
|
+
export function normalizeForMatch(s) {
|
|
38
|
+
let out = '';
|
|
39
|
+
let pendingSpace = false;
|
|
40
|
+
for (const ch of s) {
|
|
41
|
+
if (/\s/.test(ch)) {
|
|
42
|
+
pendingSpace = out.length > 0;
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
if (pendingSpace) {
|
|
46
|
+
out += ' ';
|
|
47
|
+
pendingSpace = false;
|
|
48
|
+
}
|
|
49
|
+
out += foldChar(ch);
|
|
50
|
+
}
|
|
51
|
+
return out;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Progressively shorter prefixes of a phrase, longest first.
|
|
55
|
+
*
|
|
56
|
+
* The fallback when a whole quote won't match — because it spans a page break,
|
|
57
|
+
* or its middle drifted in OCR. The start of the value is on the cited page by
|
|
58
|
+
* definition, so a shorter head still lands the reader in the right place.
|
|
59
|
+
*
|
|
60
|
+
* Guards against matching noise: never fewer than 2 words or 4 characters, since
|
|
61
|
+
* a 1-word ladder rung would highlight the first "the" on the page.
|
|
62
|
+
*/
|
|
63
|
+
export function buildQueryLadder(value) {
|
|
64
|
+
const words = value.trim().split(/\s+/);
|
|
65
|
+
const ladder = [];
|
|
66
|
+
for (const n of [words.length, 6, 4, 3, 2]) {
|
|
67
|
+
if (n < 2 || n > words.length)
|
|
68
|
+
continue;
|
|
69
|
+
const q = words.slice(0, n).join(' ');
|
|
70
|
+
if (q.length >= 4 && !ladder.includes(q))
|
|
71
|
+
ladder.push(q);
|
|
72
|
+
}
|
|
73
|
+
return ladder.length ? ladder : [value.trim()];
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Flatten a subtree's text into its normalized form plus, for each normalized
|
|
77
|
+
* character, the text node and offset it came from.
|
|
78
|
+
*
|
|
79
|
+
* The index map is what lets a match on the *normalized* string become a real
|
|
80
|
+
* `Range` over the *original* DOM — without it we could detect a hit but not
|
|
81
|
+
* highlight it.
|
|
82
|
+
*/
|
|
83
|
+
function flatten(root) {
|
|
84
|
+
const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);
|
|
85
|
+
let text = '';
|
|
86
|
+
const map = [];
|
|
87
|
+
let pendingSpace = false;
|
|
88
|
+
for (let n = walker.nextNode(); n; n = walker.nextNode()) {
|
|
89
|
+
const node = n;
|
|
90
|
+
const raw = node.data;
|
|
91
|
+
for (let i = 0; i < raw.length; i++) {
|
|
92
|
+
const ch = raw[i];
|
|
93
|
+
if (/\s/.test(ch)) {
|
|
94
|
+
pendingSpace = text.length > 0;
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
if (pendingSpace) {
|
|
98
|
+
// The space belongs to this character's position, so a match starting
|
|
99
|
+
// here still points at a real node offset.
|
|
100
|
+
text += ' ';
|
|
101
|
+
map.push({ node, offset: i });
|
|
102
|
+
pendingSpace = false;
|
|
103
|
+
}
|
|
104
|
+
const folded = foldChar(ch);
|
|
105
|
+
// A ligature folds to several characters; each maps back to the same source.
|
|
106
|
+
for (const f of folded) {
|
|
107
|
+
text += f;
|
|
108
|
+
map.push({ node, offset: i });
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return { text, map };
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Find `quote` inside `root`'s rendered text and return a `Range` over it.
|
|
116
|
+
*
|
|
117
|
+
* Tries the whole phrase first, then the prefix ladder. Returns `null` when
|
|
118
|
+
* nothing matches — callers should degrade to "opened, not highlighted" rather
|
|
119
|
+
* than pretending.
|
|
120
|
+
*/
|
|
121
|
+
export function findRange(root, quote) {
|
|
122
|
+
const needleRaw = quote.trim();
|
|
123
|
+
if (!needleRaw)
|
|
124
|
+
return null;
|
|
125
|
+
const { text, map } = flatten(root);
|
|
126
|
+
if (!text)
|
|
127
|
+
return null;
|
|
128
|
+
for (const candidate of buildQueryLadder(needleRaw)) {
|
|
129
|
+
const needle = normalizeForMatch(candidate);
|
|
130
|
+
if (needle.length < 2)
|
|
131
|
+
continue;
|
|
132
|
+
const at = text.indexOf(needle);
|
|
133
|
+
if (at === -1)
|
|
134
|
+
continue;
|
|
135
|
+
const start = map[at];
|
|
136
|
+
const end = map[at + needle.length - 1];
|
|
137
|
+
if (!start || !end)
|
|
138
|
+
continue;
|
|
139
|
+
const range = document.createRange();
|
|
140
|
+
range.setStart(start.node, start.offset);
|
|
141
|
+
// `end` is the last matched character — the range must close after it.
|
|
142
|
+
range.setEnd(end.node, Math.min(end.offset + 1, end.node.data.length));
|
|
143
|
+
return range;
|
|
144
|
+
}
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=anchor-match.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anchor-match.js","sourceRoot":"","sources":["../../../../src/components/shared/viewers/anchor-match.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scroll to a cited passage and highlight it — for any viewer that renders its
|
|
3
|
+
* content into the DOM (text, markdown, json, docx, csv, xlsx).
|
|
4
|
+
*
|
|
5
|
+
* One hook serves all of them because, once rendered, those formats are just
|
|
6
|
+
* text in a subtree. Only PDF (canvas + its own text layer) and images need
|
|
7
|
+
* bespoke handling. So "support a new format" means *render it and stamp a few
|
|
8
|
+
* data attributes* — not write new anchoring logic.
|
|
9
|
+
*
|
|
10
|
+
* The resolution ladder is deliberately the same everywhere:
|
|
11
|
+
* locator (structural, exact) → quote (fuzzy text search) → nothing
|
|
12
|
+
* and "nothing" is a real outcome: the document still opens, just unhighlighted.
|
|
13
|
+
* Guessing a location would be worse than admitting we couldn't find it.
|
|
14
|
+
*/
|
|
15
|
+
import { type RefObject } from 'react';
|
|
16
|
+
import type { Locator } from '@xyne/workflow-sdk/common';
|
|
17
|
+
export type { Locator } from '@xyne/workflow-sdk/common';
|
|
18
|
+
export interface Anchor {
|
|
19
|
+
/** The cited text. The portable anchor — works in any text-bearing renderer. */
|
|
20
|
+
quote?: string | undefined;
|
|
21
|
+
/** Exact structural address, when the source exposed one. */
|
|
22
|
+
locator?: Locator | undefined;
|
|
23
|
+
}
|
|
24
|
+
export interface UseDomAnchorResult {
|
|
25
|
+
/** Whether the anchor was located. `false` ⇒ the doc opened unhighlighted. */
|
|
26
|
+
hit: boolean;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* The container must render its content as React children or be written
|
|
30
|
+
* imperatively (as docx-preview does). A container using
|
|
31
|
+
* `dangerouslySetInnerHTML` re-applies that HTML on re-render and would discard
|
|
32
|
+
* the overlay — a property of that API, not of this hook.
|
|
33
|
+
*
|
|
34
|
+
* @param containerRef the element wrapping the viewer's rendered content
|
|
35
|
+
* @param anchor what to locate; `undefined` ⇒ do nothing at all
|
|
36
|
+
* @param ready re-runs the search when this changes — pass whatever
|
|
37
|
+
* signals the content has painted (parsed rows, loaded text).
|
|
38
|
+
* Searching before paint finds nothing.
|
|
39
|
+
*/
|
|
40
|
+
export declare function useDomAnchor(containerRef: RefObject<HTMLElement | null>, anchor: Anchor | undefined, ready?: unknown): UseDomAnchorResult;
|
|
41
|
+
//# sourceMappingURL=useDomAnchor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDomAnchor.d.ts","sourceRoot":"","sources":["../../../../src/components/shared/viewers/useDomAnchor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAuB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAKzD,YAAY,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAEzD,MAAM,WAAW,MAAM;IACrB,gFAAgF;IAChF,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,6DAA6D;IAC7D,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B;AA8DD,MAAM,WAAW,kBAAkB;IACjC,8EAA8E;IAC9E,GAAG,EAAE,OAAO,CAAC;CACd;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAC1B,YAAY,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EAC3C,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,KAAK,CAAC,EAAE,OAAO,GACd,kBAAkB,CA+CpB"}
|