@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.
Files changed (213) hide show
  1. package/dist/components/builder/AddStepButton.d.ts +6 -0
  2. package/dist/components/builder/AddStepButton.d.ts.map +1 -0
  3. package/dist/components/builder/AddStepButton.js +7 -0
  4. package/dist/components/builder/AddStepButton.js.map +1 -0
  5. package/dist/components/builder/BranchEdge.d.ts +3 -0
  6. package/dist/components/builder/BranchEdge.d.ts.map +1 -0
  7. package/dist/components/builder/BranchEdge.js +19 -0
  8. package/dist/components/builder/BranchEdge.js.map +1 -0
  9. package/dist/components/builder/BuilderToolbar.d.ts +10 -0
  10. package/dist/components/builder/BuilderToolbar.d.ts.map +1 -0
  11. package/dist/components/builder/BuilderToolbar.js +16 -0
  12. package/dist/components/builder/BuilderToolbar.js.map +1 -0
  13. package/dist/components/builder/StepConfigDrawer.d.ts +11 -0
  14. package/dist/components/builder/StepConfigDrawer.d.ts.map +1 -0
  15. package/dist/components/builder/StepConfigDrawer.js +21 -0
  16. package/dist/components/builder/StepConfigDrawer.js.map +1 -0
  17. package/dist/components/builder/StepNode.d.ts +15 -0
  18. package/dist/components/builder/StepNode.d.ts.map +1 -0
  19. package/dist/components/builder/StepNode.js +56 -0
  20. package/dist/components/builder/StepNode.js.map +1 -0
  21. package/dist/components/builder/StepPalette.d.ts +7 -0
  22. package/dist/components/builder/StepPalette.d.ts.map +1 -0
  23. package/dist/components/builder/StepPalette.js +83 -0
  24. package/dist/components/builder/StepPalette.js.map +1 -0
  25. package/dist/components/builder/StepPicker.d.ts +9 -0
  26. package/dist/components/builder/StepPicker.d.ts.map +1 -0
  27. package/dist/components/builder/StepPicker.js +95 -0
  28. package/dist/components/builder/StepPicker.js.map +1 -0
  29. package/dist/components/builder/TriggerConfigPanel.d.ts +10 -0
  30. package/dist/components/builder/TriggerConfigPanel.d.ts.map +1 -0
  31. package/dist/components/builder/TriggerConfigPanel.js +49 -0
  32. package/dist/components/builder/TriggerConfigPanel.js.map +1 -0
  33. package/dist/components/builder/TriggerNode.d.ts +9 -0
  34. package/dist/components/builder/TriggerNode.d.ts.map +1 -0
  35. package/dist/components/builder/TriggerNode.js +30 -0
  36. package/dist/components/builder/TriggerNode.js.map +1 -0
  37. package/dist/components/builder/TriggerPicker.d.ts +8 -0
  38. package/dist/components/builder/TriggerPicker.d.ts.map +1 -0
  39. package/dist/components/builder/TriggerPicker.js +61 -0
  40. package/dist/components/builder/TriggerPicker.js.map +1 -0
  41. package/dist/components/builder/WorkflowBuilder.d.ts +20 -0
  42. package/dist/components/builder/WorkflowBuilder.d.ts.map +1 -0
  43. package/dist/components/builder/WorkflowBuilder.js +157 -0
  44. package/dist/components/builder/WorkflowBuilder.js.map +1 -0
  45. package/dist/components/builder/edge-types.d.ts +3 -0
  46. package/dist/components/builder/edge-types.d.ts.map +1 -0
  47. package/dist/components/builder/edge-types.js +5 -0
  48. package/dist/components/builder/edge-types.js.map +1 -0
  49. package/dist/components/builder/node-types.d.ts +3 -0
  50. package/dist/components/builder/node-types.d.ts.map +1 -0
  51. package/dist/components/builder/node-types.js +11 -0
  52. package/dist/components/builder/node-types.js.map +1 -0
  53. package/dist/components/builder/v2/AddStepButton.d.ts +6 -0
  54. package/dist/components/builder/v2/AddStepButton.d.ts.map +1 -0
  55. package/dist/components/builder/v2/AddStepButton.js +6 -0
  56. package/dist/components/builder/v2/AddStepButton.js.map +1 -0
  57. package/dist/components/builder/v2/BranchEdge.d.ts +3 -0
  58. package/dist/components/builder/v2/BranchEdge.d.ts.map +1 -0
  59. package/dist/components/builder/v2/BranchEdge.js +46 -0
  60. package/dist/components/builder/v2/BranchEdge.js.map +1 -0
  61. package/dist/components/builder/v2/LoopBodyEdge.d.ts +7 -0
  62. package/dist/components/builder/v2/LoopBodyEdge.d.ts.map +1 -0
  63. package/dist/components/builder/v2/LoopBodyEdge.js +19 -0
  64. package/dist/components/builder/v2/LoopBodyEdge.js.map +1 -0
  65. package/dist/components/builder/v2/LoopbackEdge.d.ts +10 -0
  66. package/dist/components/builder/v2/LoopbackEdge.d.ts.map +1 -0
  67. package/dist/components/builder/v2/LoopbackEdge.js +26 -0
  68. package/dist/components/builder/v2/LoopbackEdge.js.map +1 -0
  69. package/dist/components/builder/v2/StepNode.d.ts +21 -0
  70. package/dist/components/builder/v2/StepNode.d.ts.map +1 -0
  71. package/dist/components/builder/v2/StepNode.js +36 -0
  72. package/dist/components/builder/v2/StepNode.js.map +1 -0
  73. package/dist/components/builder/v2/StepPicker.d.ts +8 -0
  74. package/dist/components/builder/v2/StepPicker.d.ts.map +1 -0
  75. package/dist/components/builder/v2/StepPicker.js +73 -0
  76. package/dist/components/builder/v2/StepPicker.js.map +1 -0
  77. package/dist/components/builder/v2/TerminalNode.d.ts +6 -0
  78. package/dist/components/builder/v2/TerminalNode.d.ts.map +1 -0
  79. package/dist/components/builder/v2/TerminalNode.js +7 -0
  80. package/dist/components/builder/v2/TerminalNode.js.map +1 -0
  81. package/dist/components/builder/v2/TriggerNode.d.ts +10 -0
  82. package/dist/components/builder/v2/TriggerNode.d.ts.map +1 -0
  83. package/dist/components/builder/v2/TriggerNode.js +20 -0
  84. package/dist/components/builder/v2/TriggerNode.js.map +1 -0
  85. package/dist/components/builder/v2/TriggerPicker.d.ts +7 -0
  86. package/dist/components/builder/v2/TriggerPicker.d.ts.map +1 -0
  87. package/dist/components/builder/v2/TriggerPicker.js +45 -0
  88. package/dist/components/builder/v2/TriggerPicker.js.map +1 -0
  89. package/dist/components/builder/v2/WorkflowBuilder.d.ts +14 -0
  90. package/dist/components/builder/v2/WorkflowBuilder.d.ts.map +1 -0
  91. package/dist/components/builder/v2/WorkflowBuilder.js +189 -0
  92. package/dist/components/builder/v2/WorkflowBuilder.js.map +1 -0
  93. package/dist/components/builder/v2/edge-types.d.ts +3 -0
  94. package/dist/components/builder/v2/edge-types.d.ts.map +1 -0
  95. package/dist/components/builder/v2/edge-types.js +9 -0
  96. package/dist/components/builder/v2/edge-types.js.map +1 -0
  97. package/dist/components/builder/v2/icons.d.ts +25 -0
  98. package/dist/components/builder/v2/icons.d.ts.map +1 -0
  99. package/dist/components/builder/v2/icons.js +43 -0
  100. package/dist/components/builder/v2/icons.js.map +1 -0
  101. package/dist/components/builder/v2/layout-engine.d.ts +76 -0
  102. package/dist/components/builder/v2/layout-engine.d.ts.map +1 -0
  103. package/dist/components/builder/v2/layout-engine.js +465 -0
  104. package/dist/components/builder/v2/layout-engine.js.map +1 -0
  105. package/dist/components/builder/v2/node-types.d.ts +3 -0
  106. package/dist/components/builder/v2/node-types.d.ts.map +1 -0
  107. package/dist/components/builder/v2/node-types.js +11 -0
  108. package/dist/components/builder/v2/node-types.js.map +1 -0
  109. package/dist/components/builder/v2/theme.d.ts +28 -0
  110. package/dist/components/builder/v2/theme.d.ts.map +1 -0
  111. package/dist/components/builder/v2/theme.js +63 -0
  112. package/dist/components/builder/v2/theme.js.map +1 -0
  113. package/dist/components/dashboard/WorkflowSummaryEditor.d.ts +11 -0
  114. package/dist/components/dashboard/WorkflowSummaryEditor.d.ts.map +1 -0
  115. package/dist/components/dashboard/WorkflowSummaryEditor.js +46 -0
  116. package/dist/components/dashboard/WorkflowSummaryEditor.js.map +1 -0
  117. package/dist/components/execution/CitationSourcePanel.d.ts +3 -2
  118. package/dist/components/execution/CitationSourcePanel.d.ts.map +1 -1
  119. package/dist/components/execution/CitationSourcePanel.js +6 -2
  120. package/dist/components/execution/CitationSourcePanel.js.map +1 -1
  121. package/dist/components/execution/ExecutionEdge.d.ts +4 -0
  122. package/dist/components/execution/ExecutionEdge.d.ts.map +1 -0
  123. package/dist/components/execution/ExecutionEdge.js +27 -0
  124. package/dist/components/execution/ExecutionEdge.js.map +1 -0
  125. package/dist/components/execution/ExecutionStepNode.d.ts +14 -0
  126. package/dist/components/execution/ExecutionStepNode.d.ts.map +1 -0
  127. package/dist/components/execution/ExecutionStepNode.js +47 -0
  128. package/dist/components/execution/ExecutionStepNode.js.map +1 -0
  129. package/dist/components/execution/ExecutionTriggerNode.d.ts +9 -0
  130. package/dist/components/execution/ExecutionTriggerNode.d.ts.map +1 -0
  131. package/dist/components/execution/ExecutionTriggerNode.js +15 -0
  132. package/dist/components/execution/ExecutionTriggerNode.js.map +1 -0
  133. package/dist/components/execution/ExecutionViewer.d.ts.map +1 -1
  134. package/dist/components/execution/ExecutionViewer.js +7 -1
  135. package/dist/components/execution/ExecutionViewer.js.map +1 -1
  136. package/dist/components/execution/StepAgentPanels.d.ts +9 -0
  137. package/dist/components/execution/StepAgentPanels.d.ts.map +1 -0
  138. package/dist/components/execution/StepAgentPanels.js +133 -0
  139. package/dist/components/execution/StepAgentPanels.js.map +1 -0
  140. package/dist/components/execution/execution-layout.d.ts +31 -0
  141. package/dist/components/execution/execution-layout.d.ts.map +1 -0
  142. package/dist/components/execution/execution-layout.js +90 -0
  143. package/dist/components/execution/execution-layout.js.map +1 -0
  144. package/dist/components/execution/journey-model.d.ts +5 -0
  145. package/dist/components/execution/journey-model.d.ts.map +1 -1
  146. package/dist/components/execution/journey-model.js +8 -0
  147. package/dist/components/execution/journey-model.js.map +1 -1
  148. package/dist/components/execution/origin/OriginTrace.d.ts.map +1 -1
  149. package/dist/components/execution/origin/OriginTrace.js +8 -1
  150. package/dist/components/execution/origin/OriginTrace.js.map +1 -1
  151. package/dist/components/execution/origin/citation-resolver.d.ts +50 -9
  152. package/dist/components/execution/origin/citation-resolver.d.ts.map +1 -1
  153. package/dist/components/execution/origin/citation-resolver.js +98 -18
  154. package/dist/components/execution/origin/citation-resolver.js.map +1 -1
  155. package/dist/components/execution/origin/origin-resolver.d.ts +6 -0
  156. package/dist/components/execution/origin/origin-resolver.d.ts.map +1 -1
  157. package/dist/components/execution/origin/origin-resolver.js +25 -0
  158. package/dist/components/execution/origin/origin-resolver.js.map +1 -1
  159. package/dist/components/shared/AttachmentCard.d.ts +4 -5
  160. package/dist/components/shared/AttachmentCard.d.ts.map +1 -1
  161. package/dist/components/shared/AttachmentCard.js +2 -2
  162. package/dist/components/shared/AttachmentCard.js.map +1 -1
  163. package/dist/components/shared/CitationArrow.d.ts.map +1 -1
  164. package/dist/components/shared/CitationArrow.js +67 -11
  165. package/dist/components/shared/CitationArrow.js.map +1 -1
  166. package/dist/components/shared/DocumentViewer.d.ts +3 -4
  167. package/dist/components/shared/DocumentViewer.d.ts.map +1 -1
  168. package/dist/components/shared/DocumentViewer.js +14 -6
  169. package/dist/components/shared/DocumentViewer.js.map +1 -1
  170. package/dist/components/shared/JsonTreeViewer.d.ts +9 -0
  171. package/dist/components/shared/JsonTreeViewer.d.ts.map +1 -0
  172. package/dist/components/shared/JsonTreeViewer.js +46 -0
  173. package/dist/components/shared/JsonTreeViewer.js.map +1 -0
  174. package/dist/components/shared/MarkdownCitation.js +1 -1
  175. package/dist/components/shared/MarkdownCitation.js.map +1 -1
  176. package/dist/components/shared/viewers/CsvView.d.ts +3 -1
  177. package/dist/components/shared/viewers/CsvView.d.ts.map +1 -1
  178. package/dist/components/shared/viewers/CsvView.js +16 -3
  179. package/dist/components/shared/viewers/CsvView.js.map +1 -1
  180. package/dist/components/shared/viewers/DocxView.d.ts +3 -1
  181. package/dist/components/shared/viewers/DocxView.d.ts.map +1 -1
  182. package/dist/components/shared/viewers/DocxView.js +5 -1
  183. package/dist/components/shared/viewers/DocxView.js.map +1 -1
  184. package/dist/components/shared/viewers/SheetView.d.ts +3 -1
  185. package/dist/components/shared/viewers/SheetView.d.ts.map +1 -1
  186. package/dist/components/shared/viewers/SheetView.js +18 -3
  187. package/dist/components/shared/viewers/SheetView.js.map +1 -1
  188. package/dist/components/shared/viewers/TextView.d.ts +3 -1
  189. package/dist/components/shared/viewers/TextView.d.ts.map +1 -1
  190. package/dist/components/shared/viewers/TextView.js +9 -4
  191. package/dist/components/shared/viewers/TextView.js.map +1 -1
  192. package/dist/components/shared/viewers/anchor-match.d.ts +44 -0
  193. package/dist/components/shared/viewers/anchor-match.d.ts.map +1 -0
  194. package/dist/components/shared/viewers/anchor-match.js +147 -0
  195. package/dist/components/shared/viewers/anchor-match.js.map +1 -0
  196. package/dist/components/shared/viewers/useDomAnchor.d.ts +41 -0
  197. package/dist/components/shared/viewers/useDomAnchor.d.ts.map +1 -0
  198. package/dist/components/shared/viewers/useDomAnchor.js +125 -0
  199. package/dist/components/shared/viewers/useDomAnchor.js.map +1 -0
  200. package/dist/styles.css +1 -1
  201. package/package.json +1 -1
  202. package/dist/components/schema-form/AttachmentField.d.ts +0 -16
  203. package/dist/components/schema-form/AttachmentField.d.ts.map +0 -1
  204. package/dist/components/schema-form/AttachmentField.js +0 -139
  205. package/dist/components/schema-form/AttachmentField.js.map +0 -1
  206. package/dist/components/share/ShareDialog.d.ts +0 -21
  207. package/dist/components/share/ShareDialog.d.ts.map +0 -1
  208. package/dist/components/share/ShareDialog.js +0 -98
  209. package/dist/components/share/ShareDialog.js.map +0 -1
  210. package/dist/utils/map-lanes.d.ts +0 -35
  211. package/dist/utils/map-lanes.d.ts.map +0 -1
  212. package/dist/utils/map-lanes.js +0 -48
  213. 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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"}
@@ -18,7 +18,7 @@ function toCitation(props) {
18
18
  return {
19
19
  kind: 'ref',
20
20
  ref: props.ref,
21
- ...(page !== undefined ? { page } : {}),
21
+ ...(page !== undefined ? { locator: { at: 'page', page } } : {}),
22
22
  ...(props.quote ? { quote: props.quote } : {}),
23
23
  };
24
24
  }
@@ -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;YACvC,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
+ {"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,4 +1,6 @@
1
- export default function CsvView({ url }: {
1
+ import { type Anchor } from './useDomAnchor.js';
2
+ export default function CsvView({ url, anchor }: {
2
3
  url: string;
4
+ anchor?: Anchor | undefined;
3
5
  }): import("react").JSX.Element;
4
6
  //# sourceMappingURL=CsvView.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CsvView.d.ts","sourceRoot":"","sources":["../../../../src/components/shared/viewers/CsvView.tsx"],"names":[],"mappings":"AAOA,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,EAAE,GAAG,EAAE,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,+BAkDvD"}
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":"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"}
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
- export default function DocxView({ url }: {
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":"AAOA,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAAE,GAAG,EAAE,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,+BAsCxD"}
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;AAE5C,gFAAgF;AAChF,gFAAgF;AAChF,2CAA2C;AAC3C,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAAE,GAAG,EAAmB;IACvD,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;IAE5C,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
+ {"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
- export default function SheetView({ url }: {
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":"AAUA,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,EAAE,GAAG,EAAE,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,+BA6EzD"}
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;AAC5C,OAAO,YAAY,EAAE,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,QAAQ,GAAG,IAAI,CAAC;AAGtB,gFAAgF;AAChF,+CAA+C;AAC/C,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,EAAE,GAAG,EAAmB;IACxD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAiB,IAAI,CAAC,CAAC;IAC3D,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACxC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE5C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,SAAS,CAAC,IAAI,CAAC,CAAC;QAChB,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,WAAW,EAAE,CAAC;QACzB,CAAC,CAAC;aACD,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YAClB,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;YACxC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAC9B,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CACtF,CAAC;YACF,IAAI,CAAC,SAAS;gBAAE,SAAS,CAAC,MAAM,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,mBAAmB,CAAC,CAAC;IACjD,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,KAAC,aAAa,KAAG,CAAC;IAE9C,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;IAC1C,IAAI,CAAC,KAAK;QAAE,OAAO,KAAC,aAAa,KAAG,CAAC;IACrC,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC;IACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACvC,MAAM,EAAE,GAAG,qIAAqI,CAAC;IACjJ,MAAM,EAAE,GAAG,sFAAsF,CAAC;IAElG,OAAO,CACL,eAAK,SAAS,EAAC,sBAAsB,aAClC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CACpB,cAAK,SAAS,EAAC,mFAAmF,YAC/F,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACpB,iBAEE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,EAC3B,SAAS,EAAE,EAAE,CACX,4DAA4D,EAC5D,CAAC,KAAK,MAAM;wBACV,CAAC,CAAC,8DAA8D;wBAChE,CAAC,CAAC,4DAA4D,CACjE,YAEA,CAAC,CAAC,IAAI,IAVF,CAAC,CAAC,IAAI,CAWJ,CACV,CAAC,GACE,CACP,EACD,eAAK,SAAS,EAAC,yBAAyB,aACtC,iBAAO,SAAS,EAAC,mDAAmD,aACjE,IAAI,IAAI,CACP,0BACE,uBAAM,IAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,aAAY,SAAS,EAAE,EAAE,YAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,IAAlC,CAAC,CAAuC,CAAC,GAAM,GACzF,CACT,EACD,0BACG,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CACvB,uBAAe,GAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,aAAa,SAAS,EAAE,EAAE,YAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,IAAnC,EAAE,CAAuC,CAAC,IAA1F,EAAE,CAA8F,CAC1G,CAAC,GACI,IACF,EACP,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,CAC9B,aAAG,SAAS,EAAC,6CAA6C,+BACzC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,UAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,cAC3D,CACL,IACG,IACF,CACP,CAAC;AACJ,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
- export default function TextView({ url, mode }: {
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":"AAOA,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,CAAA;CAAE,+BAmClG"}
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;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,gFAAgF;AAChF,0EAA0E;AAC1E,iFAAiF;AACjF,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAAE,GAAG,EAAE,IAAI,EAAuD;IACjG,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;IAE5C,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,SAAS,EAAC,4CAA4C,YACzD,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,SAAS,EAAC,wGAAwG,YACpH,IAAI,GACD,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"}
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"}