@xyne/workflow-ui 1.3.10 → 1.3.11
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/builder/v3/CitationEditor.d.ts.map +1 -1
- package/dist/components/builder/v3/CitationEditor.js +10 -1
- package/dist/components/builder/v3/CitationEditor.js.map +1 -1
- package/dist/components/builder/v3/VariablePickerPopover.d.ts +1 -1
- package/dist/components/builder/v3/VariablePickerPopover.d.ts.map +1 -1
- package/dist/components/builder/v3/VariablePickerPopover.js +3 -3
- package/dist/components/builder/v3/VariablePickerPopover.js.map +1 -1
- 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/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/ExecutionTabs.d.ts.map +1 -1
- package/dist/components/execution/ExecutionTabs.js +11 -2
- package/dist/components/execution/ExecutionTabs.js.map +1 -1
- 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.js +1 -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.map +1 -1
- package/dist/components/execution/journey-model.js +11 -5
- 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 +66 -29
- package/dist/components/execution/origin/OriginTrace.js.map +1 -1
- package/dist/components/shared/AttachmentCard.d.ts +6 -0
- package/dist/components/shared/AttachmentCard.d.ts.map +1 -1
- package/dist/components/shared/AttachmentCard.js +91 -1
- package/dist/components/shared/AttachmentCard.js.map +1 -1
- package/dist/components/shared/DocumentViewer.d.ts +4 -2
- package/dist/components/shared/DocumentViewer.d.ts.map +1 -1
- package/dist/components/shared/DocumentViewer.js +8 -8
- 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/viewers/PdfView.d.ts +38 -0
- package/dist/components/shared/viewers/PdfView.d.ts.map +1 -0
- package/dist/components/shared/viewers/PdfView.js +439 -0
- package/dist/components/shared/viewers/PdfView.js.map +1 -0
- package/dist/layout-engine/components.d.ts.map +1 -1
- package/dist/layout-engine/components.js +37 -3
- package/dist/layout-engine/components.js.map +1 -1
- package/dist/layout-engine/render.d.ts.map +1 -1
- package/dist/layout-engine/render.js +62 -1
- package/dist/layout-engine/render.js.map +1 -1
- package/dist/styles.css +8 -2
- package/package.json +2 -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/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,38 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
export interface PdfViewProps {
|
|
3
|
+
/** Same-origin URL for the raw PDF bytes (cookie auth). */
|
|
4
|
+
url: string;
|
|
5
|
+
/** Display name shown in the toolbar and used for the download filename. */
|
|
6
|
+
name?: string | undefined;
|
|
7
|
+
/** 1-indexed page to scroll to on first load (e.g. a citation's pageNumber). */
|
|
8
|
+
initialPage?: number | undefined;
|
|
9
|
+
/**
|
|
10
|
+
* Initial zoom. A number is a literal scale (1 = 100%); the named pdf.js
|
|
11
|
+
* modes fit the page to the container. Defaults to `'page-width'` because
|
|
12
|
+
* this viewer is embedded in a narrow, resizable side panel — a literal
|
|
13
|
+
* 100% would overflow horizontally. Named modes re-fit on container resize;
|
|
14
|
+
* once the user zooms manually we stop re-fitting.
|
|
15
|
+
*/
|
|
16
|
+
initialScale?: number | 'page-width' | 'page-fit' | 'page-actual' | 'auto' | undefined;
|
|
17
|
+
/**
|
|
18
|
+
* Bump this to re-jump to `initialPage` even when the value didn't change —
|
|
19
|
+
* lets a host pull the user back to the cited page on re-click. Also
|
|
20
|
+
* re-applies `highlightQuery`.
|
|
21
|
+
*/
|
|
22
|
+
navSeq?: number | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* When provided, prefills the Find input and pdf.js's findController
|
|
25
|
+
* highlights matches in the text layer.
|
|
26
|
+
*/
|
|
27
|
+
highlightQuery?: string | null | undefined;
|
|
28
|
+
/** Leading slot in the toolbar (e.g. a Back button). */
|
|
29
|
+
leading?: ReactNode;
|
|
30
|
+
/** Optional right-side companion rendered alongside the scroll area. */
|
|
31
|
+
rightSlot?: ReactNode;
|
|
32
|
+
/** Extreme-right Close button — only when the host wants a dismiss affordance. */
|
|
33
|
+
onClose?: (() => void) | undefined;
|
|
34
|
+
/** Hide the Download link. */
|
|
35
|
+
hideDownload?: boolean | undefined;
|
|
36
|
+
}
|
|
37
|
+
export default function PdfView({ url, name, initialPage, initialScale, navSeq, highlightQuery, leading, rightSlot, onClose, hideDownload, }: PdfViewProps): import("react").JSX.Element;
|
|
38
|
+
//# sourceMappingURL=PdfView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PdfView.d.ts","sourceRoot":"","sources":["../../../../src/components/shared/viewers/PdfView.tsx"],"names":[],"mappings":"AAyBA,OAAO,EAA4C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AA8FjF,MAAM,WAAW,YAAY;IAC3B,2DAA2D;IAC3D,GAAG,EAAE,MAAM,CAAC;IACZ,4EAA4E;IAC5E,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,gFAAgF;IAChF,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,UAAU,GAAG,aAAa,GAAG,MAAM,GAAG,SAAS,CAAC;IACvF;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC3C,wDAAwD;IACxD,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,wEAAwE;IACxE,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,kFAAkF;IAClF,OAAO,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IACnC,8BAA8B;IAC9B,YAAY,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACpC;AAKD,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,EAC9B,GAAG,EACH,IAAiB,EACjB,WAAW,EACX,YAA2B,EAC3B,MAAM,EACN,cAAc,EACd,OAAO,EACP,SAAS,EACT,OAAO,EACP,YAAoB,GACrB,EAAE,YAAY,+BA0ed"}
|
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
// PDF viewer built on pdf.js's native `PDFViewer` component (the same
|
|
3
|
+
// renderer Firefox ships) — ported from the xyne app's `PdfViewer` so the
|
|
4
|
+
// SDK renders documents exactly like the rest of the product.
|
|
5
|
+
//
|
|
6
|
+
// Why pdf.js's viewer (and not react-pdf): react-pdf flickers on
|
|
7
|
+
// virtualized scroll because page heights are estimated up-front and
|
|
8
|
+
// remeasured on mount, plus pages unmount on overscan (white flashes on
|
|
9
|
+
// scroll-back). pdf.js's PDFViewer pre-measures every page from the PDF's
|
|
10
|
+
// viewport, keeps a buffer of rendered pages, has built-in text-layer
|
|
11
|
+
// rendering, and ships its own findController.
|
|
12
|
+
//
|
|
13
|
+
// It also replaces the browser's native <iframe> plugin, which forces a
|
|
14
|
+
// dark chrome + page-thumbnail rail that can't be restyled.
|
|
15
|
+
//
|
|
16
|
+
// Styling is driven entirely by the SDK's `--wui-*` theme tokens, so
|
|
17
|
+
// whatever the host application defines flows into this viewer.
|
|
18
|
+
//
|
|
19
|
+
// React's job here is just:
|
|
20
|
+
// 1. Mount the viewer once when the file URL changes.
|
|
21
|
+
// 2. Bridge our toolbar (page input, zoom, search) to viewer events.
|
|
22
|
+
// 3. Tear down on unmount.
|
|
23
|
+
//
|
|
24
|
+
// Imperative wiring is small but unavoidable because the viewer manages
|
|
25
|
+
// its own DOM; we don't try to fight that.
|
|
26
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
27
|
+
import * as pdfjsLib from 'pdfjs-dist';
|
|
28
|
+
import { EventBus, PDFFindController, PDFLinkService, PDFViewer as PdfjsViewer, } from 'pdfjs-dist/web/pdf_viewer.mjs';
|
|
29
|
+
import { ChevronUp, ChevronDown, Download, Loader2, Minus, Plus, Search, X, } from 'lucide-react';
|
|
30
|
+
// Worker is served by the host app from its public root. pdf.js's default
|
|
31
|
+
// route-relative resolution 404s into an SPA fallback, so pin an absolute
|
|
32
|
+
// path. Re-asserted inside the component for bundler-tree-shaking safety.
|
|
33
|
+
const PDF_WORKER_URL = '/pdf.worker.mjs';
|
|
34
|
+
pdfjsLib.GlobalWorkerOptions.workerSrc = PDF_WORKER_URL;
|
|
35
|
+
// pdf.js FindState values — exported at runtime but absent from the type
|
|
36
|
+
// declarations, so mirrored here.
|
|
37
|
+
const FIND_NOT_FOUND = 1;
|
|
38
|
+
const FIND_PENDING = 3;
|
|
39
|
+
/**
|
|
40
|
+
* When a highlight phrase spans a page break, find where it splits: the
|
|
41
|
+
* longest word-boundary head that appears on one page whose tail appears on
|
|
42
|
+
* the following page. Returns the two fragments (both individually findable,
|
|
43
|
+
* so a `query: [head, tail]` array search highlights the value on BOTH
|
|
44
|
+
* pages), or null when the value doesn't split cleanly across two pages.
|
|
45
|
+
*/
|
|
46
|
+
async function computePageSplit(doc, value) {
|
|
47
|
+
const normWS = (s) => s.replace(/\s+/g, ' ').trim();
|
|
48
|
+
const v = normWS(value);
|
|
49
|
+
const words = v.split(' ');
|
|
50
|
+
if (words.length < 2)
|
|
51
|
+
return null;
|
|
52
|
+
// Text of each page, whitespace-normalized. Capped for very large docs —
|
|
53
|
+
// this only runs on the miss path, and a citation far past 50 pages can
|
|
54
|
+
// still fall back to the prefix ladder.
|
|
55
|
+
const pageTexts = [];
|
|
56
|
+
const maxPages = Math.min(doc.numPages, 50);
|
|
57
|
+
for (let i = 1; i <= maxPages; i++) {
|
|
58
|
+
const page = await doc.getPage(i);
|
|
59
|
+
const tc = await page.getTextContent();
|
|
60
|
+
pageTexts.push(normWS(tc.items.map((it) => ('str' in it ? it.str : '')).join(' ')));
|
|
61
|
+
}
|
|
62
|
+
// Whole value present on a single page → not a page-split problem.
|
|
63
|
+
if (pageTexts.some((p) => p.includes(v)))
|
|
64
|
+
return null;
|
|
65
|
+
for (let i = 0; i < pageTexts.length - 1; i++) {
|
|
66
|
+
for (let k = words.length - 1; k >= 1; k--) {
|
|
67
|
+
const head = words.slice(0, k).join(' ');
|
|
68
|
+
const tail = words.slice(k).join(' ');
|
|
69
|
+
if (pageTexts[i].includes(head) && pageTexts[i + 1].includes(tail)) {
|
|
70
|
+
return [head, tail];
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Progressively shorter prefixes of a highlight phrase, longest first.
|
|
78
|
+
*
|
|
79
|
+
* pdf.js's find controller matches within a single page's text, so a value
|
|
80
|
+
* that spans pages (or whose middle drifted in OCR) never matches as a
|
|
81
|
+
* whole. The page-split search above is tried first; this ladder is the
|
|
82
|
+
* last-resort fallback — the *start* of the value is on the cited page by
|
|
83
|
+
* definition, so shorter heads eventually highlight something.
|
|
84
|
+
*/
|
|
85
|
+
function buildQueryLadder(value) {
|
|
86
|
+
const words = value.trim().split(/\s+/);
|
|
87
|
+
const ladder = [];
|
|
88
|
+
for (const n of [words.length, 6, 4, 3, 2]) {
|
|
89
|
+
if (n < 2 || n > words.length)
|
|
90
|
+
continue;
|
|
91
|
+
const q = words.slice(0, n).join(' ');
|
|
92
|
+
if (q.length >= 4 && !ladder.includes(q))
|
|
93
|
+
ladder.push(q);
|
|
94
|
+
}
|
|
95
|
+
return ladder.length ? ladder : [value.trim()];
|
|
96
|
+
}
|
|
97
|
+
const iconBtn = 'grid h-7 w-7 place-items-center rounded-[var(--wui-radius-sm)] text-[var(--wui-fg-muted)] transition-colors hover:bg-[var(--wui-bg-subtle)] hover:text-[var(--wui-fg)] disabled:cursor-not-allowed disabled:opacity-40';
|
|
98
|
+
export default function PdfView({ url, name = 'Document', initialPage, initialScale = 'page-width', navSeq, highlightQuery, leading, rightSlot, onClose, hideDownload = false, }) {
|
|
99
|
+
pdfjsLib.GlobalWorkerOptions.workerSrc = PDF_WORKER_URL;
|
|
100
|
+
const containerRef = useRef(null);
|
|
101
|
+
// pdf.js requires a separate inner div with class `pdfViewer` to hold the
|
|
102
|
+
// page wrappers — the outer `containerRef` is the scroll element.
|
|
103
|
+
const viewerInnerRef = useRef(null);
|
|
104
|
+
const instanceRef = useRef(null);
|
|
105
|
+
// Last navSeq we honored so re-renders don't keep yanking the user back.
|
|
106
|
+
const lastJumpRef = useRef(null);
|
|
107
|
+
const lastHighlightRef = useRef(null);
|
|
108
|
+
// Read inside the viewer effect without making them dependencies (a change
|
|
109
|
+
// must not tear down and rebuild the viewer).
|
|
110
|
+
const initialScaleRef = useRef(initialScale);
|
|
111
|
+
initialScaleRef.current = initialScale;
|
|
112
|
+
const initialPageRef = useRef(initialPage);
|
|
113
|
+
initialPageRef.current = initialPage;
|
|
114
|
+
const navSeqRef = useRef(navSeq);
|
|
115
|
+
navSeqRef.current = navSeq;
|
|
116
|
+
// Auto-highlight fallback state: the query we injected (null once the user
|
|
117
|
+
// types their own), the full value for page-split detection, the remaining
|
|
118
|
+
// shorter prefixes to try, and guards for the async split attempt.
|
|
119
|
+
const autoQueryRef = useRef(null);
|
|
120
|
+
const autoFullRef = useRef(null);
|
|
121
|
+
const autoLadderRef = useRef([]);
|
|
122
|
+
const splitTriedRef = useRef(false);
|
|
123
|
+
const splitBusyRef = useRef(false);
|
|
124
|
+
const pdfDocRef = useRef(null);
|
|
125
|
+
const [numPages, setNumPages] = useState(0);
|
|
126
|
+
const [currentPage, setCurrentPage] = useState(1);
|
|
127
|
+
const [scalePct, setScalePct] = useState(100);
|
|
128
|
+
const [loadState, setLoadState] = useState('loading');
|
|
129
|
+
const [loadError, setLoadError] = useState(null);
|
|
130
|
+
const [pageInput, setPageInput] = useState('1');
|
|
131
|
+
const [pageInputFocused, setPageInputFocused] = useState(false);
|
|
132
|
+
const [query, setQuery] = useState('');
|
|
133
|
+
useEffect(() => {
|
|
134
|
+
if (!pageInputFocused)
|
|
135
|
+
setPageInput(String(currentPage));
|
|
136
|
+
}, [currentPage, pageInputFocused]);
|
|
137
|
+
const fileUrl = /^https?:/i.test(url) ? url : `${window.location.origin}${url}`;
|
|
138
|
+
// Drop the caller's highlight phrase into Find; re-apply on navSeq bump.
|
|
139
|
+
// Arms the split/prefix fallbacks so a phrase that spans a page break (or
|
|
140
|
+
// drifted in OCR) still highlights on the cited page. The signature
|
|
141
|
+
// includes the file URL so switching this instance to another document
|
|
142
|
+
// re-arms the auto-highlight for it.
|
|
143
|
+
useEffect(() => {
|
|
144
|
+
if (loadState !== 'ready')
|
|
145
|
+
return;
|
|
146
|
+
const sig = `${fileUrl}#${highlightQuery ?? ''}#${String(navSeq ?? 0)}`;
|
|
147
|
+
if (lastHighlightRef.current === sig)
|
|
148
|
+
return;
|
|
149
|
+
lastHighlightRef.current = sig;
|
|
150
|
+
if (highlightQuery && highlightQuery.length >= 2) {
|
|
151
|
+
const ladder = buildQueryLadder(highlightQuery);
|
|
152
|
+
const first = ladder[0] ?? highlightQuery;
|
|
153
|
+
autoQueryRef.current = first;
|
|
154
|
+
autoFullRef.current = highlightQuery;
|
|
155
|
+
autoLadderRef.current = ladder.slice(1);
|
|
156
|
+
splitTriedRef.current = false;
|
|
157
|
+
setQuery(first);
|
|
158
|
+
}
|
|
159
|
+
}, [fileUrl, highlightQuery, navSeq, loadState]);
|
|
160
|
+
// ── Viewer lifecycle ──────────────────────────────────────────────────
|
|
161
|
+
// Construct once per URL. The viewer owns its DOM subtree; we just hand it
|
|
162
|
+
// the container + scroll element. Destroy on unmount to release the
|
|
163
|
+
// worker-side document and any page render tasks.
|
|
164
|
+
useEffect(() => {
|
|
165
|
+
const container = containerRef.current;
|
|
166
|
+
const viewerInner = viewerInnerRef.current;
|
|
167
|
+
if (!container || !viewerInner)
|
|
168
|
+
return undefined;
|
|
169
|
+
setLoadState('loading');
|
|
170
|
+
setLoadError(null);
|
|
171
|
+
setNumPages(0);
|
|
172
|
+
setCurrentPage(1);
|
|
173
|
+
lastJumpRef.current = null;
|
|
174
|
+
const eventBus = new EventBus();
|
|
175
|
+
const linkService = new PDFLinkService({ eventBus });
|
|
176
|
+
const findController = new PDFFindController({ eventBus, linkService });
|
|
177
|
+
const viewer = new PdfjsViewer({
|
|
178
|
+
container,
|
|
179
|
+
viewer: viewerInner,
|
|
180
|
+
eventBus,
|
|
181
|
+
linkService,
|
|
182
|
+
findController,
|
|
183
|
+
// Hidden text layer is required for search highlighting.
|
|
184
|
+
textLayerMode: 2,
|
|
185
|
+
// Disable annotation editing/forms — this viewer is read-only.
|
|
186
|
+
annotationEditorMode: -1,
|
|
187
|
+
});
|
|
188
|
+
linkService.setViewer(viewer);
|
|
189
|
+
eventBus.on('pagesinit', () => {
|
|
190
|
+
// Fit-to-width by default: this viewer lives in a narrow side panel, so
|
|
191
|
+
// a literal 100% would overflow. Named modes also let us re-fit on
|
|
192
|
+
// resize. The centering CSS keeps the page middled when it's narrower.
|
|
193
|
+
viewer.currentScaleValue = String(initialScaleRef.current);
|
|
194
|
+
setScalePct(Math.round((viewer.currentScale ?? 1) * 100));
|
|
195
|
+
// Land directly on the cited page. Setting it here — inside pagesinit,
|
|
196
|
+
// before the first paint — means page 1 is never rendered; a post-ready
|
|
197
|
+
// React effect would jump only after page 1 had flashed. (This is how
|
|
198
|
+
// pdf.js's own viewer applies its #page= hash.) The jump effect below
|
|
199
|
+
// stays for navSeq re-jumps; marking lastJumpRef stops it re-firing.
|
|
200
|
+
const target = initialPageRef.current;
|
|
201
|
+
if (target && target >= 1 && target <= viewer.pagesCount) {
|
|
202
|
+
viewer.currentPageNumber = target;
|
|
203
|
+
lastJumpRef.current = `${String(target)}#${String(navSeqRef.current ?? 0)}`;
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
eventBus.on('pagechanging', (evt) => {
|
|
207
|
+
setCurrentPage(evt.pageNumber);
|
|
208
|
+
});
|
|
209
|
+
eventBus.on('scalechanging', (evt) => {
|
|
210
|
+
setScalePct(Math.round(evt.scale * 100));
|
|
211
|
+
});
|
|
212
|
+
// Auto-highlight fallback: when the query we injected finds nothing
|
|
213
|
+
// (value spans a page break / OCR drift), first try to SPLIT the value at
|
|
214
|
+
// the actual page boundary and search both fragments at once (pdf.js
|
|
215
|
+
// accepts a query array — highlights land on both pages); only if no
|
|
216
|
+
// clean split exists, step down the prefix ladder. User-typed queries
|
|
217
|
+
// never trigger any of this — typing clears autoQueryRef.
|
|
218
|
+
const stepLadder = () => {
|
|
219
|
+
const next = autoLadderRef.current.shift();
|
|
220
|
+
if (next) {
|
|
221
|
+
autoQueryRef.current = next;
|
|
222
|
+
setQuery(next);
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
autoQueryRef.current = null; // exhausted — leave Find as-is
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
const handleAutoNotFound = async () => {
|
|
229
|
+
if (splitBusyRef.current)
|
|
230
|
+
return;
|
|
231
|
+
if (!splitTriedRef.current && autoFullRef.current && pdfDocRef.current) {
|
|
232
|
+
splitTriedRef.current = true;
|
|
233
|
+
splitBusyRef.current = true;
|
|
234
|
+
try {
|
|
235
|
+
const frags = await computePageSplit(pdfDocRef.current, autoFullRef.current);
|
|
236
|
+
// Re-check auto mode — the user may have typed meanwhile.
|
|
237
|
+
if (frags && autoQueryRef.current) {
|
|
238
|
+
autoQueryRef.current = frags.join(' ');
|
|
239
|
+
eventBus.dispatch('find', {
|
|
240
|
+
source: null,
|
|
241
|
+
type: '',
|
|
242
|
+
query: frags,
|
|
243
|
+
highlightAll: true,
|
|
244
|
+
findPrevious: false,
|
|
245
|
+
caseSensitive: false,
|
|
246
|
+
entireWord: false,
|
|
247
|
+
});
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
catch {
|
|
252
|
+
/* split is best-effort — fall through to the ladder */
|
|
253
|
+
}
|
|
254
|
+
finally {
|
|
255
|
+
splitBusyRef.current = false;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
stepLadder();
|
|
259
|
+
};
|
|
260
|
+
eventBus.on('updatefindcontrolstate', (evt) => {
|
|
261
|
+
if (evt.state === FIND_PENDING)
|
|
262
|
+
return;
|
|
263
|
+
const auto = autoQueryRef.current;
|
|
264
|
+
if (!auto)
|
|
265
|
+
return;
|
|
266
|
+
if (typeof evt.rawQuery === 'string' && evt.rawQuery !== auto)
|
|
267
|
+
return;
|
|
268
|
+
if (evt.state === FIND_NOT_FOUND) {
|
|
269
|
+
void handleAutoNotFound();
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
autoLadderRef.current = []; // found — stop stepping down
|
|
273
|
+
}
|
|
274
|
+
});
|
|
275
|
+
const loadingTask = pdfjsLib.getDocument({
|
|
276
|
+
url: fileUrl,
|
|
277
|
+
withCredentials: true,
|
|
278
|
+
});
|
|
279
|
+
let cancelled = false;
|
|
280
|
+
void loadingTask.promise
|
|
281
|
+
.then((pdfDoc) => {
|
|
282
|
+
if (cancelled)
|
|
283
|
+
return;
|
|
284
|
+
viewer.setDocument(pdfDoc);
|
|
285
|
+
linkService.setDocument(pdfDoc, null);
|
|
286
|
+
pdfDocRef.current = pdfDoc;
|
|
287
|
+
setNumPages(pdfDoc.numPages);
|
|
288
|
+
setLoadState('ready');
|
|
289
|
+
instanceRef.current = {
|
|
290
|
+
viewer,
|
|
291
|
+
eventBus,
|
|
292
|
+
findController,
|
|
293
|
+
loadingTask: loadingTask,
|
|
294
|
+
pdfDoc: pdfDoc,
|
|
295
|
+
};
|
|
296
|
+
})
|
|
297
|
+
.catch((err) => {
|
|
298
|
+
if (cancelled)
|
|
299
|
+
return;
|
|
300
|
+
setLoadError(err instanceof Error ? err.message : String(err));
|
|
301
|
+
setLoadState('error');
|
|
302
|
+
});
|
|
303
|
+
return () => {
|
|
304
|
+
cancelled = true;
|
|
305
|
+
pdfDocRef.current = null;
|
|
306
|
+
const inst = instanceRef.current;
|
|
307
|
+
instanceRef.current = null;
|
|
308
|
+
// Best-effort cleanup — destroy() returns a promise but we don't wait.
|
|
309
|
+
void inst?.loadingTask?.destroy().catch(() => undefined);
|
|
310
|
+
void inst?.pdfDoc?.destroy().catch(() => undefined);
|
|
311
|
+
try {
|
|
312
|
+
viewer.cleanup();
|
|
313
|
+
}
|
|
314
|
+
catch {
|
|
315
|
+
/* no-op */
|
|
316
|
+
}
|
|
317
|
+
};
|
|
318
|
+
}, [fileUrl]);
|
|
319
|
+
// ── Re-jump to a page on navSeq bump ──────────────────────────────────
|
|
320
|
+
// The *initial* landing happens in pagesinit (pre-paint, no page-1 flash);
|
|
321
|
+
// this effect only handles later navSeq bumps (host re-clicks a citation),
|
|
322
|
+
// plus the fallback where pagesinit couldn't honor the target.
|
|
323
|
+
useEffect(() => {
|
|
324
|
+
if (loadState !== 'ready' || !initialPage || numPages === 0)
|
|
325
|
+
return;
|
|
326
|
+
const sig = `${String(initialPage)}#${String(navSeq ?? 0)}`;
|
|
327
|
+
if (lastJumpRef.current === sig)
|
|
328
|
+
return;
|
|
329
|
+
lastJumpRef.current = sig;
|
|
330
|
+
if (initialPage > numPages)
|
|
331
|
+
return;
|
|
332
|
+
const viewer = instanceRef.current?.viewer;
|
|
333
|
+
if (!viewer)
|
|
334
|
+
return;
|
|
335
|
+
viewer.currentPageNumber = initialPage;
|
|
336
|
+
}, [loadState, initialPage, navSeq, numPages]);
|
|
337
|
+
// ── Re-fit on container resize ────────────────────────────────────────
|
|
338
|
+
// The host panel is user-resizable. While the scale is a *named* pdf.js
|
|
339
|
+
// mode ('page-width' etc.), reassigning it recomputes the fit. Once the
|
|
340
|
+
// user zooms manually the value becomes numeric and we leave it alone.
|
|
341
|
+
useEffect(() => {
|
|
342
|
+
const container = containerRef.current;
|
|
343
|
+
if (!container)
|
|
344
|
+
return undefined;
|
|
345
|
+
const ro = new ResizeObserver(() => {
|
|
346
|
+
const viewer = instanceRef.current?.viewer;
|
|
347
|
+
const current = viewer?.currentScaleValue;
|
|
348
|
+
if (!viewer || !current || !Number.isNaN(Number(current)))
|
|
349
|
+
return;
|
|
350
|
+
viewer.currentScaleValue = current;
|
|
351
|
+
});
|
|
352
|
+
ro.observe(container);
|
|
353
|
+
return () => ro.disconnect();
|
|
354
|
+
}, []);
|
|
355
|
+
// ── Trackpad pinch-to-zoom + Ctrl/Cmd-wheel zoom ──────────────────────
|
|
356
|
+
// Browsers translate pinch gestures into `wheel` events with ctrlKey:true.
|
|
357
|
+
// Passive:false so preventDefault() fires — otherwise the page zooms.
|
|
358
|
+
useEffect(() => {
|
|
359
|
+
const container = containerRef.current;
|
|
360
|
+
if (!container)
|
|
361
|
+
return undefined;
|
|
362
|
+
const onWheel = (e) => {
|
|
363
|
+
if (!(e.ctrlKey || e.metaKey))
|
|
364
|
+
return;
|
|
365
|
+
e.preventDefault();
|
|
366
|
+
const viewer = instanceRef.current?.viewer;
|
|
367
|
+
if (!viewer)
|
|
368
|
+
return;
|
|
369
|
+
const current = viewer.currentScale ?? 1;
|
|
370
|
+
const step = Math.max(-0.5, Math.min(0.5, -e.deltaY * 0.01));
|
|
371
|
+
viewer.currentScaleValue = String(Math.max(0.25, Math.min(5, current + step)));
|
|
372
|
+
};
|
|
373
|
+
container.addEventListener('wheel', onWheel, { passive: false });
|
|
374
|
+
return () => container.removeEventListener('wheel', onWheel);
|
|
375
|
+
}, []);
|
|
376
|
+
// ── Find/search ───────────────────────────────────────────────────────
|
|
377
|
+
useEffect(() => {
|
|
378
|
+
if (loadState !== 'ready')
|
|
379
|
+
return;
|
|
380
|
+
const eb = instanceRef.current?.eventBus;
|
|
381
|
+
if (!eb)
|
|
382
|
+
return;
|
|
383
|
+
const trimmed = query.trim();
|
|
384
|
+
eb.dispatch('find', {
|
|
385
|
+
source: null,
|
|
386
|
+
type: '',
|
|
387
|
+
query: trimmed.length < 2 ? '' : trimmed,
|
|
388
|
+
highlightAll: trimmed.length >= 2,
|
|
389
|
+
findPrevious: false,
|
|
390
|
+
caseSensitive: false,
|
|
391
|
+
entireWord: false,
|
|
392
|
+
});
|
|
393
|
+
}, [query, loadState]);
|
|
394
|
+
// ── Toolbar handlers ──────────────────────────────────────────────────
|
|
395
|
+
const goToPage = useCallback((n) => {
|
|
396
|
+
const viewer = instanceRef.current?.viewer;
|
|
397
|
+
if (!viewer)
|
|
398
|
+
return;
|
|
399
|
+
viewer.currentPageNumber = Math.max(1, Math.min(viewer.pagesCount, n));
|
|
400
|
+
}, []);
|
|
401
|
+
const commitPageInput = useCallback(() => {
|
|
402
|
+
const n = Number(pageInput);
|
|
403
|
+
if (Number.isInteger(n) && n >= 1 && numPages > 0 && n <= numPages)
|
|
404
|
+
goToPage(n);
|
|
405
|
+
else
|
|
406
|
+
setPageInput(String(currentPage));
|
|
407
|
+
}, [pageInput, numPages, goToPage, currentPage]);
|
|
408
|
+
const zoom = useCallback((delta) => {
|
|
409
|
+
const viewer = instanceRef.current?.viewer;
|
|
410
|
+
if (!viewer)
|
|
411
|
+
return;
|
|
412
|
+
viewer.currentScaleValue = String(Math.max(0.25, Math.min(5, (viewer.currentScale ?? 1) + delta)));
|
|
413
|
+
}, []);
|
|
414
|
+
return (_jsxs("div", { className: "flex h-full min-h-0 flex-col bg-[var(--wui-bg)]", children: [_jsxs("div", { className: "wui-pdf-toolbar relative flex shrink-0 flex-wrap items-center justify-center gap-x-2 gap-y-1.5 border-b border-[var(--wui-border)] px-3 py-2", children: [leading && (_jsx("div", { className: "absolute left-3 top-1/2 flex min-w-0 -translate-y-1/2 items-center gap-2", children: leading })), _jsxs("div", { className: "relative shrink-0", children: [_jsx(Search, { className: "pointer-events-none absolute left-1.5 top-1/2 h-3 w-3 -translate-y-1/2 text-[var(--wui-fg-muted)]", "aria-hidden": true, strokeWidth: 1.75 }), _jsx("input", { type: "text", value: query, onChange: (e) => {
|
|
415
|
+
// The user took over the Find box — disarm the auto fallback.
|
|
416
|
+
autoQueryRef.current = null;
|
|
417
|
+
autoLadderRef.current = [];
|
|
418
|
+
setQuery(e.target.value);
|
|
419
|
+
}, placeholder: "Find", "aria-label": "Find in document",
|
|
420
|
+
// Reserve room for the clear button only while there is a query —
|
|
421
|
+
// buys back the pixels the cluster separators cost.
|
|
422
|
+
className: `h-7 w-[84px] rounded-[var(--wui-radius-sm)] border border-[var(--wui-border)] bg-[var(--wui-bg)] pl-6 ${query.length > 0 ? 'pr-6' : 'pr-2'} text-[12px] text-[var(--wui-fg)] outline-none transition placeholder:text-[var(--wui-fg-muted)] focus:border-[var(--wui-primary)]` }), query.length > 0 && (_jsx("button", { type: "button", "aria-label": "Clear search", onClick: () => setQuery(''), className: "absolute right-1 top-1/2 grid h-5 w-5 -translate-y-1/2 place-items-center rounded text-[var(--wui-fg-muted)] hover:bg-[var(--wui-bg-subtle)] hover:text-[var(--wui-fg)]", children: _jsx(X, { className: "h-3 w-3", "aria-hidden": true, strokeWidth: 1.75 }) }))] }), _jsx("span", { className: "wui-pdf-sep h-4 w-px shrink-0 bg-[var(--wui-border)]", "aria-hidden": true }), _jsxs("div", { className: "flex shrink-0 items-center gap-0.5", children: [_jsx("button", { type: "button", "aria-label": "Previous page", disabled: currentPage <= 1, onClick: () => goToPage(currentPage - 1), className: iconBtn, children: _jsx(ChevronUp, { className: "h-3.5 w-3.5", strokeWidth: 1.75 }) }), _jsxs("div", { className: "flex items-center gap-0.5 text-[12px] tabular-nums text-[var(--wui-fg-muted)]", children: [_jsx("input", { type: "text", inputMode: "numeric", value: pageInput, onChange: (e) => setPageInput(e.target.value.replace(/\D/g, '')), onFocus: (e) => {
|
|
423
|
+
setPageInputFocused(true);
|
|
424
|
+
e.target.select();
|
|
425
|
+
}, onBlur: () => {
|
|
426
|
+
setPageInputFocused(false);
|
|
427
|
+
commitPageInput();
|
|
428
|
+
}, onKeyDown: (e) => {
|
|
429
|
+
if (e.key === 'Enter') {
|
|
430
|
+
e.preventDefault();
|
|
431
|
+
e.currentTarget.blur();
|
|
432
|
+
}
|
|
433
|
+
else if (e.key === 'Escape') {
|
|
434
|
+
setPageInput(String(currentPage));
|
|
435
|
+
e.currentTarget.blur();
|
|
436
|
+
}
|
|
437
|
+
}, disabled: numPages === 0, "aria-label": "Go to page", className: "h-7 w-10 rounded-[var(--wui-radius-sm)] border border-[var(--wui-border)] bg-[var(--wui-bg)] text-center text-[12px] tabular-nums text-[var(--wui-fg)] outline-none transition focus:border-[var(--wui-primary)] disabled:opacity-40" }), _jsx("span", { "aria-hidden": true, children: "/" }), _jsx("span", { className: "min-w-[20px] text-center", children: numPages > 0 ? String(numPages) : '—' })] }), _jsx("button", { type: "button", "aria-label": "Next page", disabled: numPages > 0 && currentPage >= numPages, onClick: () => goToPage(currentPage + 1), className: iconBtn, children: _jsx(ChevronDown, { className: "h-3.5 w-3.5", strokeWidth: 1.75 }) })] }), _jsx("span", { className: "wui-pdf-sep h-4 w-px shrink-0 bg-[var(--wui-border)]", "aria-hidden": true }), _jsxs("div", { className: "flex shrink-0 items-center gap-1", children: [_jsx("button", { type: "button", "aria-label": "Zoom out", onClick: () => zoom(-0.1), className: iconBtn, children: _jsx(Minus, { className: "h-3.5 w-3.5", strokeWidth: 1.75 }) }), _jsx("span", { className: "wui-pdf-zoom-pct min-w-[44px] text-center text-[12px] tabular-nums text-[var(--wui-fg-muted)]", children: `${String(scalePct)}%` }), _jsx("button", { type: "button", "aria-label": "Zoom in", onClick: () => zoom(0.1), className: iconBtn, children: _jsx(Plus, { className: "h-3.5 w-3.5", strokeWidth: 1.75 }) }), !hideDownload && (_jsxs(_Fragment, { children: [_jsx("span", { className: "mx-0.5 h-4 w-px bg-[var(--wui-border)]", "aria-hidden": true }), _jsx("a", { href: url, download: name, "aria-label": "Download", className: iconBtn, children: _jsx(Download, { className: "h-3.5 w-3.5", strokeWidth: 1.75 }) })] })), onClose && (_jsxs(_Fragment, { children: [_jsx("span", { className: "mx-0.5 h-4 w-px bg-[var(--wui-border)]", "aria-hidden": true }), _jsx("button", { type: "button", "aria-label": "Close", onClick: onClose, className: iconBtn, children: _jsx(X, { className: "h-4 w-4", "aria-hidden": true, strokeWidth: 1.75 }) })] }))] })] }), _jsxs("div", { className: "flex min-h-0 flex-1", children: [_jsxs("div", { className: "relative min-w-0 flex-1 overflow-hidden", children: [_jsx("div", { ref: containerRef, className: "pdf-host absolute inset-0 overflow-auto bg-[var(--wui-bg-subtle)] [&_.pdfViewer]:min-w-full [&_.pdfViewer_.page]:!mx-auto", children: _jsx("div", { ref: viewerInnerRef, className: "pdfViewer" }) }), loadState === 'loading' && (_jsxs("div", { className: "pointer-events-none absolute inset-0 flex items-center justify-center gap-2 text-[13px] text-[var(--wui-fg-muted)]", children: [_jsx(Loader2, { className: "h-4 w-4 animate-spin", strokeWidth: 1.75 }), "Loading document\u2026"] })), loadState === 'error' && (_jsxs("div", { className: "absolute inset-0 flex flex-col items-center justify-center gap-1 px-6 text-center", children: [_jsx("p", { className: "text-[14px] font-medium text-[var(--wui-fg)]", children: "Could not display this file" }), _jsx("p", { className: "text-[12.5px] text-[var(--wui-fg-muted)]", children: loadError })] }))] }), rightSlot] })] }));
|
|
438
|
+
}
|
|
439
|
+
//# sourceMappingURL=PdfView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PdfView.js","sourceRoot":"","sources":["../../../../src/components/shared/viewers/PdfView.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../../src/layout-engine/components.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAgB,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGzD,OAAO,EAAE,EAAE,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../../src/layout-engine/components.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAgB,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGzD,OAAO,EAAE,EAAE,EAAE,MAAM,4BAA4B,CAAC;AAiMhD,eAAO,MAAM,gBAAgB,EAAE,QAiD9B,CAAC;AAEF,OAAO,EAAE,EAAE,EAAE,CAAC"}
|
|
@@ -33,7 +33,13 @@ function ValueView({ value }) {
|
|
|
33
33
|
if (value.length === 0)
|
|
34
34
|
return _jsx("span", { className: "text-[var(--wui-fg-muted)]", children: "None" });
|
|
35
35
|
if (value.every((v) => !isObj(v) && !Array.isArray(v))) {
|
|
36
|
-
|
|
36
|
+
const items = value.map((v) => String(v));
|
|
37
|
+
// Short scalars → tag chips; sentence-length strings → a readable bulleted list
|
|
38
|
+
// (a long sentence stuffed into a chip looks wrong).
|
|
39
|
+
if (items.every((s) => s.length <= 24)) {
|
|
40
|
+
return _jsx("div", { className: "flex flex-wrap gap-1.5", children: items.map((s, i) => _jsx("span", { className: "rounded-md bg-[color-mix(in_srgb,var(--wui-fg)_6%,transparent)] px-2 py-0.5 text-[12px] text-[var(--wui-fg)]", children: s }, i)) });
|
|
41
|
+
}
|
|
42
|
+
return _jsx("ul", { className: "flex flex-col gap-1.5", children: items.map((s, i) => _jsxs("li", { className: "flex gap-2 text-[13px] leading-relaxed text-[var(--wui-fg)]", children: [_jsx("span", { className: "mt-[7px] h-1 w-1 shrink-0 rounded-full bg-[var(--wui-fg-muted)]" }), s] }, i)) });
|
|
37
43
|
}
|
|
38
44
|
return _jsx("div", { className: "flex flex-col gap-2", children: value.map((v, i) => _jsx("div", { className: "rounded-lg border border-[var(--wui-border)] p-3", children: isObj(v) ? _jsx(KV, { data: v, dense: true }) : _jsx(ValueView, { value: v }) }, i)) });
|
|
39
45
|
}
|
|
@@ -75,7 +81,34 @@ function TableView({ data }) {
|
|
|
75
81
|
if (rows.length === 0)
|
|
76
82
|
return _jsx("div", { className: "text-[13px] italic text-[var(--wui-fg-muted)]", children: "No rows" });
|
|
77
83
|
const cols = [...new Set(rows.flatMap((r) => Object.keys(r)))];
|
|
78
|
-
|
|
84
|
+
// GitHub-style tables — mirrors MarkdownView: rounded bordered frame, filled header,
|
|
85
|
+
// column gridlines, zebra rows. Kept in sync so config <Table> and markdown tables match.
|
|
86
|
+
return (_jsx("div", { className: "overflow-x-auto rounded-lg border border-[var(--wui-border)]", children: _jsxs("table", { className: "w-full border-collapse text-[12px] [&_tbody_tr:nth-child(2n)]:bg-[color-mix(in_srgb,var(--wui-fg)_4%,transparent)] [&_tbody_tr:last-child_td]:border-b-0", children: [_jsx("thead", { children: _jsx("tr", { children: cols.map((c) => _jsx("th", { className: "border-b border-[var(--wui-border)] bg-[var(--wui-bg-muted)] px-3 py-2 text-left font-semibold text-[var(--wui-fg)] [&:not(:last-child)]:border-r [&:not(:last-child)]:border-[var(--wui-border)]", children: humanize(c) }, c)) }) }), _jsx("tbody", { children: rows.map((r, i) => (_jsx("tr", { children: cols.map((c) => _jsx("td", { className: "border-b border-[var(--wui-border)] px-3 py-2 align-top text-[var(--wui-fg)] [&:not(:last-child)]:border-r [&:not(:last-child)]:border-[var(--wui-border)]", children: _jsx(ValueView, { value: r[c] }) }, c)) }, i))) })] }) }));
|
|
87
|
+
}
|
|
88
|
+
// ─── Matrix — pivot [{label, values:{col:val}}] into label-rows × value-columns ───
|
|
89
|
+
// For metric/period tables (financials): each row is a metric, columns are the periods
|
|
90
|
+
// (union of the values-object keys). Same GitHub-style frame as Table; numeric cells right-aligned.
|
|
91
|
+
function MatrixView({ data, rowKey, sub, values }) {
|
|
92
|
+
const rows = Array.isArray(data) ? data.filter(isObj) : [];
|
|
93
|
+
if (rows.length === 0)
|
|
94
|
+
return _jsx("div", { className: "text-[13px] italic text-[var(--wui-fg-muted)]", children: "No rows" });
|
|
95
|
+
const rk = rowKey ?? 'label';
|
|
96
|
+
const vk = values ?? 'values';
|
|
97
|
+
const cols = [];
|
|
98
|
+
for (const r of rows) {
|
|
99
|
+
const v = r[vk];
|
|
100
|
+
if (isObj(v))
|
|
101
|
+
for (const k of Object.keys(v))
|
|
102
|
+
if (!cols.includes(k))
|
|
103
|
+
cols.push(k);
|
|
104
|
+
}
|
|
105
|
+
const th = 'border-b border-[var(--wui-border)] bg-[var(--wui-bg-muted)] px-3 py-2 font-semibold text-[var(--wui-fg)] [&:not(:last-child)]:border-r [&:not(:last-child)]:border-[var(--wui-border)]';
|
|
106
|
+
const td = 'border-b border-[var(--wui-border)] px-3 py-2 align-top [&:not(:last-child)]:border-r [&:not(:last-child)]:border-[var(--wui-border)]';
|
|
107
|
+
return (_jsx("div", { className: "overflow-x-auto rounded-lg border border-[var(--wui-border)]", children: _jsxs("table", { className: "w-full border-collapse text-[12px] [&_tbody_tr:nth-child(2n)]:bg-[color-mix(in_srgb,var(--wui-fg)_4%,transparent)] [&_tbody_tr:last-child_td]:border-b-0", children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { className: cn(th, 'text-left'), children: humanize(rk) }), cols.map((c) => _jsx("th", { className: cn(th, 'whitespace-nowrap text-right'), children: c }, c))] }) }), _jsx("tbody", { children: rows.map((r, i) => {
|
|
108
|
+
const v = isObj(r[vk]) ? r[vk] : {};
|
|
109
|
+
const subLabel = sub ? str(r[sub]) : undefined;
|
|
110
|
+
return (_jsxs("tr", { children: [_jsxs("td", { className: cn(td, 'text-left'), children: [_jsx("span", { className: "font-medium text-[var(--wui-fg)]", children: str(r[rk]) ?? '' }), subLabel ? _jsx("span", { className: "ml-1.5 text-[11px] text-[var(--wui-fg-muted)]", children: subLabel }) : null] }), cols.map((c) => _jsx("td", { className: cn(td, 'text-right tabular-nums text-[var(--wui-fg)]'), children: _jsx(ValueView, { value: v[c] }) }, c))] }, i));
|
|
111
|
+
}) })] }) }));
|
|
79
112
|
}
|
|
80
113
|
// ─── Preview — a document / image with sizing ───
|
|
81
114
|
function PreviewView({ src, height, width }) {
|
|
@@ -100,7 +133,7 @@ export const DEFAULT_REGISTRY = {
|
|
|
100
133
|
render: (p, kids, key) => {
|
|
101
134
|
const cols = num(p['cols']);
|
|
102
135
|
if (cols && cols > 1)
|
|
103
|
-
return _jsx("div", { className: "grid gap-x-8 gap-y-
|
|
136
|
+
return _jsx("div", { className: "grid gap-x-8 gap-y-2.5", style: { gridTemplateColumns: `repeat(${String(cols)}, minmax(0, 1fr))` }, children: kids }, key);
|
|
104
137
|
return _jsx("div", { className: "flex flex-wrap items-start gap-x-10 gap-y-4", children: kids }, key);
|
|
105
138
|
},
|
|
106
139
|
},
|
|
@@ -131,6 +164,7 @@ export const DEFAULT_REGISTRY = {
|
|
|
131
164
|
Code: { childMode: 'text', render: (p, kids, key) => _jsx(CodeBlock, { lang: str(p['lang']), children: str(p['value']) ?? (typeof kids === 'string' ? kids : '') }, key) },
|
|
132
165
|
Json: { childMode: 'none', render: (p, _k, key) => _jsx(JsonView, { data: p['data'] }, key) },
|
|
133
166
|
Table: { childMode: 'none', render: (p, _k, key) => _jsx(TableView, { data: p['data'] }, key) },
|
|
167
|
+
Matrix: { childMode: 'none', render: (p, _k, key) => _jsx(MatrixView, { data: p['data'], rowKey: str(p['rowKey']), sub: str(p['sub']), values: str(p['values']) }, key) },
|
|
134
168
|
Preview: { childMode: 'none', render: (p, _k, key) => _jsx(PreviewView, { src: p['src'], height: num(p['height']), width: num(p['width']) }, key) },
|
|
135
169
|
};
|
|
136
170
|
export { cn };
|