@jc-times/business-ui 0.2.43
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/AGENTS.md +6 -0
- package/CHANGELOG.md +267 -0
- package/README.md +55 -0
- package/THIRD_PARTY_NOTICES.md +29 -0
- package/bin/business-ui-gate.mjs +171 -0
- package/dist/Alert.js +47 -0
- package/dist/AsyncDirectoryPicker.js +134 -0
- package/dist/AsyncSearchPicker.js +155 -0
- package/dist/AutoComplete.js +34 -0
- package/dist/Badge.js +14 -0
- package/dist/Button.js +54 -0
- package/dist/Cascader.js +141 -0
- package/dist/Combobox.js +106 -0
- package/dist/ConfirmDialog.js +48 -0
- package/dist/DataTableHorizontalScrollbar.js +38 -0
- package/dist/DataTableIcons.js +37 -0
- package/dist/DataTableMergedRows.js +45 -0
- package/dist/DataTableTheme.js +135 -0
- package/dist/DateInput.js +223 -0
- package/dist/DropdownMenu.js +130 -0
- package/dist/EmptyState.js +27 -0
- package/dist/ExplainableButton.js +68 -0
- package/dist/FileDropzone.js +70 -0
- package/dist/FilePreparationDialog.js +33 -0
- package/dist/FloatingControls.js +120 -0
- package/dist/FormField.js +143 -0
- package/dist/MetricCard.js +38 -0
- package/dist/ModalShell.js +139 -0
- package/dist/MultiSelect.js +137 -0
- package/dist/NumericInput.js +97 -0
- package/dist/OverlayContainer.js +9 -0
- package/dist/PageHeader.js +36 -0
- package/dist/Pagination.js +115 -0
- package/dist/PreparedFileDropzone.js +30 -0
- package/dist/RecoverableAsyncState.js +35 -0
- package/dist/RovingTabs.js +54 -0
- package/dist/SectionCard.js +35 -0
- package/dist/SegmentedControl.js +46 -0
- package/dist/Select.js +73 -0
- package/dist/Skeleton.js +25 -0
- package/dist/SortableList.js +55 -0
- package/dist/StructuredAddressInput.js +157 -0
- package/dist/Toast.js +100 -0
- package/dist/ToggleSwitch.js +34 -0
- package/dist/TreeSelect.js +444 -0
- package/dist/amount-format.js +20 -0
- package/dist/business-ui.js +44 -0
- package/dist/chinese-address-regions.js +15 -0
- package/dist/classNames.js +6 -0
- package/dist/data-table.js +257 -0
- package/dist/document-render-budget.js +22 -0
- package/dist/document-viewer/ContinuousPdfViewer.js +145 -0
- package/dist/document-viewer/DocumentViewer.js +123 -0
- package/dist/document-viewer/DocumentViewerViewport.js +36 -0
- package/dist/document-viewer/ImagePage.js +39 -0
- package/dist/document-viewer/PdfCanvasPage.js +26 -0
- package/dist/document-viewer/PdfThumbnailRail.js +116 -0
- package/dist/document-viewer/PdfToolbar.js +61 -0
- package/dist/document-viewer/PdfWorkspace.js +42 -0
- package/dist/document-viewer/pdf-render-budget.js +7 -0
- package/dist/document-viewer/usePdfCanvas.js +69 -0
- package/dist/document-viewer/usePdfViewport.js +48 -0
- package/dist/document-viewer-v2/DocumentViewerV2.js +171 -0
- package/dist/document-viewer-v2/HeadlessPdfViewer.js +420 -0
- package/dist/document-viewer-v2/HeadlessSearch.js +66 -0
- package/dist/document-viewer-v2.js +13 -0
- package/dist/document-viewer.js +12 -0
- package/dist/pdfium-viewer.js +18 -0
- package/dist/styles.css +2 -0
- package/dist/types/Alert.d.ts +11 -0
- package/dist/types/AmountFormat.d.ts +15 -0
- package/dist/types/AsyncDirectoryPicker.d.ts +32 -0
- package/dist/types/AsyncSearchPicker.d.ts +26 -0
- package/dist/types/AutoComplete.d.ts +9 -0
- package/dist/types/Badge.d.ts +13 -0
- package/dist/types/Button.d.ts +36 -0
- package/dist/types/Cascader.d.ts +57 -0
- package/dist/types/ChineseAddressRegions.d.ts +4 -0
- package/dist/types/Combobox.d.ts +37 -0
- package/dist/types/ConfirmDialog.d.ts +20 -0
- package/dist/types/DataTable.d.ts +68 -0
- package/dist/types/DataTableHorizontalScrollbar.d.ts +8 -0
- package/dist/types/DataTableIcons.d.ts +19 -0
- package/dist/types/DataTableMergedRows.d.ts +11 -0
- package/dist/types/DataTableTheme.d.ts +4 -0
- package/dist/types/DateInput.d.ts +25 -0
- package/dist/types/DocumentRenderBudget.d.ts +9 -0
- package/dist/types/DocumentViewer.d.ts +11 -0
- package/dist/types/DocumentViewerV2.d.ts +10 -0
- package/dist/types/DropdownMenu.d.ts +73 -0
- package/dist/types/EmptyState.d.ts +9 -0
- package/dist/types/ExplainableButton.d.ts +7 -0
- package/dist/types/FileDropzone.d.ts +20 -0
- package/dist/types/FilePreparationDialog.d.ts +12 -0
- package/dist/types/FloatingControls.d.ts +39 -0
- package/dist/types/FormField.d.ts +35 -0
- package/dist/types/MetricCard.d.ts +17 -0
- package/dist/types/ModalShell.d.ts +33 -0
- package/dist/types/MultiSelect.d.ts +12 -0
- package/dist/types/NumericInput.d.ts +54 -0
- package/dist/types/OverlayContainer.d.ts +2 -0
- package/dist/types/PageHeader.d.ts +23 -0
- package/dist/types/Pagination.d.ts +14 -0
- package/dist/types/PdfiumViewer.d.ts +5 -0
- package/dist/types/PreparedFileDropzone.d.ts +7 -0
- package/dist/types/RecoverableAsyncState.d.ts +11 -0
- package/dist/types/RovingTabs.d.ts +21 -0
- package/dist/types/SectionCard.d.ts +18 -0
- package/dist/types/SegmentedControl.d.ts +26 -0
- package/dist/types/Select.d.ts +31 -0
- package/dist/types/Skeleton.d.ts +11 -0
- package/dist/types/SortableList.d.ts +17 -0
- package/dist/types/StructuredAddressInput.d.ts +57 -0
- package/dist/types/Toast.d.ts +22 -0
- package/dist/types/ToggleSwitch.d.ts +15 -0
- package/dist/types/TreeSelect.d.ts +58 -0
- package/dist/types/classNames.d.ts +1 -0
- package/dist/types/document-viewer/ContinuousPdfViewer.d.ts +16 -0
- package/dist/types/document-viewer/DocumentViewer.d.ts +31 -0
- package/dist/types/document-viewer/DocumentViewerViewport.d.ts +23 -0
- package/dist/types/document-viewer/ImagePage.d.ts +9 -0
- package/dist/types/document-viewer/PdfCanvasPage.d.ts +7 -0
- package/dist/types/document-viewer/PdfThumbnailRail.d.ts +12 -0
- package/dist/types/document-viewer/PdfToolbar.d.ts +13 -0
- package/dist/types/document-viewer/PdfWorkspace.d.ts +5 -0
- package/dist/types/document-viewer/pdf-render-budget.d.ts +2 -0
- package/dist/types/document-viewer/usePdfCanvas.d.ts +22 -0
- package/dist/types/document-viewer/usePdfViewport.d.ts +14 -0
- package/dist/types/document-viewer-v2/DocumentViewerV2.d.ts +50 -0
- package/dist/types/document-viewer-v2/HeadlessPdfViewer.d.ts +39 -0
- package/dist/types/document-viewer-v2/HeadlessSearch.d.ts +9 -0
- package/dist/types/index.d.ts +41 -0
- package/dist/types/useDebouncedValue.d.ts +2 -0
- package/dist/types/useFilePreparation.d.ts +28 -0
- package/dist/types/useModalFocusTrap.d.ts +3 -0
- package/dist/useDebouncedValue.js +16 -0
- package/dist/useFilePreparation.js +51 -0
- package/dist/useModalFocusTrap.js +71 -0
- package/docs/agent-guide.md +145 -0
- package/docs/api.md +220 -0
- package/docs/cascader.md +56 -0
- package/docs/component-strategy.md +94 -0
- package/docs/data-table.md +123 -0
- package/docs/dependencies.md +57 -0
- package/docs/document-viewer-v2.md +259 -0
- package/docs/document-viewer.md +28 -0
- package/docs/file-preparation.md +11 -0
- package/docs/maturity-migration.md +62 -0
- package/docs/modal-shell-migration.md +43 -0
- package/docs/mrt-poc.md +205 -0
- package/docs/release.md +32 -0
- package/docs/viewport-qa.md +99 -0
- package/licenses/rc-cascader-MIT.txt +21 -0
- package/package.json +163 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { Button as e } from "../Button.js";
|
|
2
|
+
import { NumericInput as t } from "../NumericInput.js";
|
|
3
|
+
import { usePdfCanvas as n } from "./usePdfCanvas.js";
|
|
4
|
+
import { useThumbnailRailCollapsed as r } from "./PdfWorkspace.js";
|
|
5
|
+
import { useEffect as i, useRef as a, useState as o } from "react";
|
|
6
|
+
import { Fragment as s, jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
7
|
+
//#region src/document-viewer/PdfThumbnailRail.tsx
|
|
8
|
+
function u({ document: n, currentPage: r, onCurrentPageChange: i }) {
|
|
9
|
+
let a = n.numPages, o = Math.floor((r - 1) / 12) * 12 + 1, s = Array.from({ length: Math.min(12, a - o + 1) }, (e, t) => o + t);
|
|
10
|
+
return /* @__PURE__ */ l("div", {
|
|
11
|
+
className: "ui-thumbnail-rail",
|
|
12
|
+
children: [
|
|
13
|
+
/* @__PURE__ */ c(t, {
|
|
14
|
+
"aria-label": "跳转到页面",
|
|
15
|
+
value: String(r),
|
|
16
|
+
min: "1",
|
|
17
|
+
max: String(a),
|
|
18
|
+
decimalPlaces: 0,
|
|
19
|
+
onValueCommit: (e) => {
|
|
20
|
+
let t = Number(e);
|
|
21
|
+
t >= 1 && t <= a && i(t);
|
|
22
|
+
}
|
|
23
|
+
}),
|
|
24
|
+
/* @__PURE__ */ c("div", {
|
|
25
|
+
className: "ui-thumbnail-list",
|
|
26
|
+
children: s.map((e) => /* @__PURE__ */ c(d, {
|
|
27
|
+
document: n,
|
|
28
|
+
page: e,
|
|
29
|
+
active: r === e,
|
|
30
|
+
onClick: () => i(e)
|
|
31
|
+
}, e))
|
|
32
|
+
}),
|
|
33
|
+
/* @__PURE__ */ l("div", {
|
|
34
|
+
className: "ui-thumbnail-pager",
|
|
35
|
+
children: [
|
|
36
|
+
/* @__PURE__ */ l("span", { children: [
|
|
37
|
+
o,
|
|
38
|
+
"–",
|
|
39
|
+
Math.min(o + 11, a),
|
|
40
|
+
" / ",
|
|
41
|
+
a
|
|
42
|
+
] }),
|
|
43
|
+
/* @__PURE__ */ c(e, {
|
|
44
|
+
variant: "secondary",
|
|
45
|
+
size: "compact",
|
|
46
|
+
disabled: o === 1,
|
|
47
|
+
onClick: () => i(Math.max(1, o - 12)),
|
|
48
|
+
children: "上一组"
|
|
49
|
+
}),
|
|
50
|
+
/* @__PURE__ */ c(e, {
|
|
51
|
+
variant: "secondary",
|
|
52
|
+
size: "compact",
|
|
53
|
+
disabled: o + 11 >= a,
|
|
54
|
+
onClick: () => i(o + 12),
|
|
55
|
+
children: "下一组"
|
|
56
|
+
})
|
|
57
|
+
]
|
|
58
|
+
})
|
|
59
|
+
]
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
function d({ document: t, page: n, active: s, onClick: u }) {
|
|
63
|
+
let d = a(null), [p, m] = o(s), h = r();
|
|
64
|
+
return i(() => {
|
|
65
|
+
if (h) {
|
|
66
|
+
m(!1);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
let e = d.current;
|
|
70
|
+
if (!e || typeof IntersectionObserver > "u") {
|
|
71
|
+
m(!0);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
let t = new IntersectionObserver(([e]) => m(e.isIntersecting), {
|
|
75
|
+
root: e.closest(".ui-thumbnail-list"),
|
|
76
|
+
rootMargin: "120px 0px"
|
|
77
|
+
});
|
|
78
|
+
return t.observe(e), () => t.disconnect();
|
|
79
|
+
}, [
|
|
80
|
+
h,
|
|
81
|
+
t,
|
|
82
|
+
n
|
|
83
|
+
]), /* @__PURE__ */ l(e, {
|
|
84
|
+
variant: "ghost",
|
|
85
|
+
ref: d,
|
|
86
|
+
className: "ui-page-thumbnail",
|
|
87
|
+
"aria-current": s ? "page" : void 0,
|
|
88
|
+
onClick: u,
|
|
89
|
+
"aria-label": `第 ${n} 页`,
|
|
90
|
+
children: [!h && (s || p) ? /* @__PURE__ */ c(f, {
|
|
91
|
+
document: t,
|
|
92
|
+
page: n
|
|
93
|
+
}) : /* @__PURE__ */ c("span", {
|
|
94
|
+
className: "ui-thumbnail-placeholder",
|
|
95
|
+
"aria-hidden": "true"
|
|
96
|
+
}), /* @__PURE__ */ l("span", { children: [
|
|
97
|
+
"第 ",
|
|
98
|
+
n,
|
|
99
|
+
" 页"
|
|
100
|
+
] })]
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
function f({ document: e, page: t }) {
|
|
104
|
+
let { canvasRef: r, error: i } = n({
|
|
105
|
+
kind: "thumbnail",
|
|
106
|
+
document: e,
|
|
107
|
+
page: t,
|
|
108
|
+
renderWidth: 112
|
|
109
|
+
});
|
|
110
|
+
return /* @__PURE__ */ l(s, { children: [/* @__PURE__ */ c("canvas", {
|
|
111
|
+
ref: r,
|
|
112
|
+
"aria-hidden": "true"
|
|
113
|
+
}), i && /* @__PURE__ */ c("span", { children: "预览不可用" })] });
|
|
114
|
+
}
|
|
115
|
+
//#endregion
|
|
116
|
+
export { d as PageThumbnail, u as PdfThumbnailRail };
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { Button as e } from "../Button.js";
|
|
2
|
+
import { Maximize2 as t, Minimize2 as n, RotateCw as r, ZoomIn as i, ZoomOut as a } from "lucide-react";
|
|
3
|
+
import { jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
4
|
+
//#region src/document-viewer/PdfToolbar.tsx
|
|
5
|
+
function c(c) {
|
|
6
|
+
return /* @__PURE__ */ s("div", {
|
|
7
|
+
className: "ui-viewer-tools",
|
|
8
|
+
"aria-label": "文档视图工具",
|
|
9
|
+
children: [
|
|
10
|
+
/* @__PURE__ */ o(e, {
|
|
11
|
+
variant: "ghost",
|
|
12
|
+
size: "compact",
|
|
13
|
+
className: "ui-viewer-tool",
|
|
14
|
+
type: "button",
|
|
15
|
+
"aria-label": "缩小文档",
|
|
16
|
+
title: "缩小",
|
|
17
|
+
disabled: c.disabled || !c.canZoomOut,
|
|
18
|
+
onClick: c.onZoomOut,
|
|
19
|
+
children: /* @__PURE__ */ o(a, { size: 16 })
|
|
20
|
+
}),
|
|
21
|
+
/* @__PURE__ */ s("span", {
|
|
22
|
+
"aria-live": "polite",
|
|
23
|
+
children: [Math.round(c.zoom * 100), "%"]
|
|
24
|
+
}),
|
|
25
|
+
/* @__PURE__ */ o(e, {
|
|
26
|
+
variant: "ghost",
|
|
27
|
+
size: "compact",
|
|
28
|
+
className: "ui-viewer-tool",
|
|
29
|
+
type: "button",
|
|
30
|
+
"aria-label": "放大文档",
|
|
31
|
+
title: "放大",
|
|
32
|
+
disabled: c.disabled || !c.canZoomIn,
|
|
33
|
+
onClick: c.onZoomIn,
|
|
34
|
+
children: /* @__PURE__ */ o(i, { size: 16 })
|
|
35
|
+
}),
|
|
36
|
+
/* @__PURE__ */ o(e, {
|
|
37
|
+
variant: "ghost",
|
|
38
|
+
size: "compact",
|
|
39
|
+
className: "ui-viewer-tool ui-viewer-tool-separated",
|
|
40
|
+
type: "button",
|
|
41
|
+
"aria-label": "顺时针旋转文档",
|
|
42
|
+
title: "顺时针旋转 90°",
|
|
43
|
+
disabled: c.disabled,
|
|
44
|
+
onClick: c.onRotate,
|
|
45
|
+
children: /* @__PURE__ */ o(r, { size: 16 })
|
|
46
|
+
}),
|
|
47
|
+
/* @__PURE__ */ o(e, {
|
|
48
|
+
variant: "ghost",
|
|
49
|
+
size: "compact",
|
|
50
|
+
className: "ui-viewer-tool",
|
|
51
|
+
type: "button",
|
|
52
|
+
"aria-label": c.fullscreen ? "退出全屏" : "全屏查看文档",
|
|
53
|
+
title: c.fullscreen ? "退出全屏" : "全屏",
|
|
54
|
+
onClick: c.onToggleFullscreen,
|
|
55
|
+
children: c.fullscreen ? /* @__PURE__ */ o(n, { size: 16 }) : /* @__PURE__ */ o(t, { size: 16 })
|
|
56
|
+
})
|
|
57
|
+
]
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
//#endregion
|
|
61
|
+
export { c as PdfToolbar };
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Button as e } from "../Button.js";
|
|
2
|
+
import { PanelLeftClose as t, PanelLeftOpen as n } from "lucide-react";
|
|
3
|
+
import { createContext as r, useContext as i, useEffect as a, useState as o } from "react";
|
|
4
|
+
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
5
|
+
//#region src/document-viewer/PdfWorkspace.tsx
|
|
6
|
+
var l = r(!1), u = () => i(l);
|
|
7
|
+
function d({ rail: r, children: i, className: u = "", ...d }) {
|
|
8
|
+
let [f, p] = o(() => typeof window < "u" && window.matchMedia("(max-width: 900px)").matches);
|
|
9
|
+
return a(() => {
|
|
10
|
+
let e = window.matchMedia("(max-width: 900px)"), t = () => p(e.matches);
|
|
11
|
+
return e.addEventListener("change", t), () => e.removeEventListener("change", t);
|
|
12
|
+
}, []), /* @__PURE__ */ c("div", {
|
|
13
|
+
...d,
|
|
14
|
+
className: `ui-pdf-workspace ${f ? "ui-rail-collapsed" : ""} ${u}`,
|
|
15
|
+
children: [
|
|
16
|
+
/* @__PURE__ */ s("aside", {
|
|
17
|
+
className: "ui-viewer-rail",
|
|
18
|
+
hidden: f,
|
|
19
|
+
"aria-label": "页面缩略图",
|
|
20
|
+
children: /* @__PURE__ */ s(l.Provider, {
|
|
21
|
+
value: f,
|
|
22
|
+
children: r
|
|
23
|
+
})
|
|
24
|
+
}),
|
|
25
|
+
/* @__PURE__ */ c(e, {
|
|
26
|
+
variant: "secondary",
|
|
27
|
+
size: "compact",
|
|
28
|
+
className: "ui-viewer-rail-toggle",
|
|
29
|
+
"aria-expanded": !f,
|
|
30
|
+
"aria-label": f ? "显示页面缩略图" : "隐藏页面缩略图",
|
|
31
|
+
onClick: () => p((e) => !e),
|
|
32
|
+
children: [s(f ? n : t, { size: 17 }), /* @__PURE__ */ s("span", { children: f ? "页面" : "收起" })]
|
|
33
|
+
}),
|
|
34
|
+
/* @__PURE__ */ s("div", {
|
|
35
|
+
className: "ui-viewer-stage",
|
|
36
|
+
children: i
|
|
37
|
+
})
|
|
38
|
+
]
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
//#endregion
|
|
42
|
+
export { d as PdfWorkspace, u as useThumbnailRailCollapsed };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { constrainedPixelRatio as e, getPdfRenderBudget as t } from "../document-render-budget.js";
|
|
2
|
+
//#region src/document-viewer/pdf-render-budget.ts
|
|
3
|
+
function n() {
|
|
4
|
+
return typeof window > "u" ? t(1280, !1) : t(window.innerWidth, window.matchMedia("(hover: none) and (pointer: coarse)").matches);
|
|
5
|
+
}
|
|
6
|
+
//#endregion
|
|
7
|
+
export { e as constrainedPixelRatio, t as getPdfRenderBudget, n as pdfRenderBudgetForWindow };
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { constrainedPixelRatio as e } from "../document-render-budget.js";
|
|
2
|
+
import { pdfRenderBudgetForWindow as t } from "./pdf-render-budget.js";
|
|
3
|
+
import { useEffect as n, useRef as r, useState as i } from "react";
|
|
4
|
+
//#region src/document-viewer/usePdfCanvas.ts
|
|
5
|
+
function a(a) {
|
|
6
|
+
let s = r(null), c = r(Promise.resolve()), [l, u] = i(""), [d, f] = i(1.414), { document: p, page: m, renderWidth: h, kind: g } = a, _ = g === "page" ? a.zoom : 1, v = g === "page" ? a.rotation : 0;
|
|
7
|
+
return n(() => {
|
|
8
|
+
let n = !1;
|
|
9
|
+
u("");
|
|
10
|
+
let r, i = c.current.catch(() => void 0).then(async () => {
|
|
11
|
+
let i = await p.getPage(m);
|
|
12
|
+
if (n || !s.current) return;
|
|
13
|
+
let a = g === "page" ? (i.rotate + v) % 360 : i.rotate, c = i.getViewport({
|
|
14
|
+
scale: 1,
|
|
15
|
+
rotation: a
|
|
16
|
+
}), l = g === "page" ? Math.min(3, h * _ / c.width) : h / c.width, d = i.getViewport({
|
|
17
|
+
scale: l,
|
|
18
|
+
rotation: a
|
|
19
|
+
}), y = g === "page" ? e(d.width, d.height, window.devicePixelRatio || 1, t()) : 1;
|
|
20
|
+
for (let e = 0; e < 2 && !n; e += 1) {
|
|
21
|
+
let t = s.current;
|
|
22
|
+
if (!t) return;
|
|
23
|
+
t.width = Math.ceil(d.width * y), t.height = Math.ceil(d.height * y), t.style.width = g === "thumbnail" ? "100%" : `${d.width}px`, t.style.height = g === "thumbnail" ? "auto" : `${d.height}px`, g === "page" && f(d.height / d.width), r = i.render({
|
|
24
|
+
canvas: t,
|
|
25
|
+
canvasContext: t.getContext("2d"),
|
|
26
|
+
viewport: d,
|
|
27
|
+
transform: y === 1 ? void 0 : [
|
|
28
|
+
y,
|
|
29
|
+
0,
|
|
30
|
+
0,
|
|
31
|
+
y,
|
|
32
|
+
0,
|
|
33
|
+
0
|
|
34
|
+
]
|
|
35
|
+
});
|
|
36
|
+
try {
|
|
37
|
+
await r.promise;
|
|
38
|
+
return;
|
|
39
|
+
} catch (t) {
|
|
40
|
+
if (n || o(t)) return;
|
|
41
|
+
e === 1 && !n && u(`第 ${m} 页加载失败`);
|
|
42
|
+
} finally {
|
|
43
|
+
r = void 0;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
return c.current = i.catch(() => {
|
|
48
|
+
n || u(`第 ${m} 页加载失败`);
|
|
49
|
+
}), () => {
|
|
50
|
+
n = !0, r?.cancel();
|
|
51
|
+
};
|
|
52
|
+
}, [
|
|
53
|
+
p,
|
|
54
|
+
m,
|
|
55
|
+
h,
|
|
56
|
+
_,
|
|
57
|
+
v,
|
|
58
|
+
g
|
|
59
|
+
]), {
|
|
60
|
+
canvasRef: s,
|
|
61
|
+
ratio: d,
|
|
62
|
+
error: l
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function o(e) {
|
|
66
|
+
return e instanceof Error && e.name === "RenderingCancelledException";
|
|
67
|
+
}
|
|
68
|
+
//#endregion
|
|
69
|
+
export { a as usePdfCanvas };
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { useEffect as e, useRef as t, useState as n } from "react";
|
|
2
|
+
//#region src/document-viewer/usePdfViewport.ts
|
|
3
|
+
var r = [
|
|
4
|
+
.5,
|
|
5
|
+
.75,
|
|
6
|
+
1,
|
|
7
|
+
1.25,
|
|
8
|
+
1.5,
|
|
9
|
+
2
|
|
10
|
+
];
|
|
11
|
+
function i(i) {
|
|
12
|
+
let a = t(null), [o, s] = n(1), [c, l] = n(0), [u, d] = n(!1), f = r.indexOf(o);
|
|
13
|
+
e(() => {
|
|
14
|
+
s(1), l(0);
|
|
15
|
+
}, [i]), e(() => {
|
|
16
|
+
let e = () => d(document.fullscreenElement === a.current);
|
|
17
|
+
return document.addEventListener("fullscreenchange", e), () => document.removeEventListener("fullscreenchange", e);
|
|
18
|
+
}, []), e(() => {
|
|
19
|
+
if (!u) return;
|
|
20
|
+
let e = (e) => {
|
|
21
|
+
e.key === "Escape" && (document.fullscreenElement === a.current ? document.exitFullscreen().catch(() => void 0) : d(!1));
|
|
22
|
+
};
|
|
23
|
+
return document.addEventListener("keydown", e), () => document.removeEventListener("keydown", e);
|
|
24
|
+
}, [u]);
|
|
25
|
+
async function p() {
|
|
26
|
+
try {
|
|
27
|
+
document.fullscreenElement === a.current ? await document.exitFullscreen() : a.current?.requestFullscreen ? await a.current.requestFullscreen() : d((e) => !e);
|
|
28
|
+
} catch {
|
|
29
|
+
d((e) => !e);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
containerRef: a,
|
|
34
|
+
zoom: o,
|
|
35
|
+
setZoom: s,
|
|
36
|
+
rotation: c,
|
|
37
|
+
setRotation: l,
|
|
38
|
+
fullscreen: u,
|
|
39
|
+
canZoomOut: f > 0,
|
|
40
|
+
canZoomIn: f < r.length - 1,
|
|
41
|
+
zoomOut: () => s(r[Math.max(0, f - 1)]),
|
|
42
|
+
zoomIn: () => s(r[Math.min(r.length - 1, f + 1)]),
|
|
43
|
+
rotate: () => l((e) => (e + 90) % 360),
|
|
44
|
+
toggleFullscreen: () => void p()
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
//#endregion
|
|
48
|
+
export { i as usePdfViewport };
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { DocumentViewer as e } from "../document-viewer/DocumentViewer.js";
|
|
2
|
+
import { Suspense as t, lazy as n, useCallback as r, useMemo as i } from "react";
|
|
3
|
+
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
4
|
+
//#region src/document-viewer-v2/DocumentViewerV2.tsx
|
|
5
|
+
var s = n(() => import("@embedpdf/react-pdf-viewer").then((e) => ({ default: e.PDFViewer }))), c = n(() => import("./HeadlessPdfViewer.js")), l = [
|
|
6
|
+
"annotation",
|
|
7
|
+
"redaction",
|
|
8
|
+
"insert",
|
|
9
|
+
"form"
|
|
10
|
+
], u = "data-business-ui-document-viewer-v2-toolbar", d = "\n[data-epdf-i=\"main-toolbar\"] {\n min-height: 52px;\n gap: 8px;\n padding: 7px 12px;\n border-bottom-color: var(--ui-border, #dde0eb);\n background: var(--ui-surface, #fff);\n box-shadow: 0 1px 0 color-mix(in srgb, var(--ui-text, #242837) 3%, transparent);\n}\n\n[data-epdf-i=\"main-toolbar\"] [data-epdf-i$=\"-group\"] {\n gap: 4px;\n}\n\n[data-epdf-i=\"main-toolbar\"] button:not([role=\"tab\"]) {\n width: 36px;\n min-width: 36px;\n height: 36px;\n padding: 7px;\n border: 1px solid transparent;\n border-radius: var(--ui-radius, 8px);\n color: var(--ui-muted, #70778b);\n background: transparent;\n box-shadow: none;\n transition:\n color var(--ui-motion-fast, 120ms) var(--ui-ease-standard, ease),\n background-color var(--ui-motion-fast, 120ms) var(--ui-ease-standard, ease),\n border-color var(--ui-motion-fast, 120ms) var(--ui-ease-standard, ease),\n box-shadow var(--ui-motion-fast, 120ms) var(--ui-ease-standard, ease);\n}\n\n[data-epdf-i=\"main-toolbar\"] button:not([role=\"tab\"]):hover:not(:disabled) {\n border-color: color-mix(in srgb, var(--ui-primary, #5965a8) 22%, var(--ui-border, #dde0eb));\n color: var(--ui-primary-hover, #414a78);\n background: var(--ui-primary-soft, #eef0fb);\n box-shadow: none;\n}\n\n[data-epdf-i=\"main-toolbar\"] button:not([role=\"tab\"]):focus-visible {\n border-color: var(--ui-primary, #5965a8);\n outline: 3px solid var(--ui-focus, rgb(89 101 168 / 28%));\n outline-offset: 1px;\n}\n\n[data-epdf-i=\"main-toolbar\"] button.bg-interactive-selected {\n border-color: color-mix(in srgb, var(--ui-primary, #5965a8) 42%, var(--ui-border, #dde0eb));\n color: var(--ui-primary-hover, #414a78);\n background: var(--ui-primary-soft, #eef0fb);\n box-shadow: 0 1px 3px color-mix(in srgb, var(--ui-primary, #5965a8) 16%, transparent);\n}\n\n[data-epdf-i=\"main-toolbar\"] button:disabled {\n opacity: .48;\n}\n\n[data-epdf-i=\"main-toolbar\"] button:not([role=\"tab\"]) > svg {\n width: 20px;\n height: 20px;\n}\n\n[data-epdf-i=\"zoom-toolbar\"] > .relative > .flex {\n height: 36px;\n padding-left: 8px;\n overflow: hidden;\n border: 1px solid var(--ui-border, #dde0eb);\n border-radius: var(--ui-radius, 8px);\n color: var(--ui-text, #242837);\n background: var(--ui-surface, #fff);\n}\n\n[data-epdf-i=\"zoom-toolbar\"] input[name=\"zoom\"] {\n width: 36px;\n color: var(--ui-text, #242837);\n font-weight: 700;\n}\n\n[data-epdf-i=\"zoom-toolbar\"] > .relative > .flex > button {\n width: 34px;\n min-width: 34px;\n height: 34px;\n padding: 7px;\n border: 0;\n border-radius: 6px;\n}\n\n[data-epdf-i=\"main-toolbar\"] [aria-hidden=\"true\"] > div {\n background: var(--ui-border, #dde0eb);\n}\n\n@container (max-width: 640px) {\n [data-epdf-i=\"main-toolbar\"] {\n min-height: 56px;\n padding: 7px 8px;\n }\n\n [data-epdf-i=\"main-toolbar\"] button:not([role=\"tab\"]) {\n width: 40px;\n min-width: 40px;\n height: 40px;\n }\n}\n";
|
|
11
|
+
function f(e) {
|
|
12
|
+
let { shadowRoot: t } = e;
|
|
13
|
+
if (!t || t.querySelector("[data-business-ui-document-viewer-v2-toolbar]")) return;
|
|
14
|
+
let n = t.ownerDocument.createElement("style");
|
|
15
|
+
n.setAttribute(u, ""), n.textContent = d, t.append(n);
|
|
16
|
+
}
|
|
17
|
+
var p = {
|
|
18
|
+
preference: "system",
|
|
19
|
+
light: {
|
|
20
|
+
background: {
|
|
21
|
+
app: "var(--ui-canvas, #f4f5f9)",
|
|
22
|
+
surface: "var(--ui-surface, #fff)",
|
|
23
|
+
surfaceAlt: "var(--ui-primary-soft, #eef0fb)",
|
|
24
|
+
elevated: "var(--ui-surface, #fff)",
|
|
25
|
+
overlay: "rgb(18 23 42 / 48%)",
|
|
26
|
+
input: "var(--ui-surface, #fff)"
|
|
27
|
+
},
|
|
28
|
+
foreground: {
|
|
29
|
+
primary: "var(--ui-text, #242837)",
|
|
30
|
+
secondary: "var(--ui-muted, #70778b)",
|
|
31
|
+
muted: "var(--ui-muted, #70778b)",
|
|
32
|
+
disabled: "color-mix(in srgb, var(--ui-muted, #70778b) 58%, transparent)",
|
|
33
|
+
onAccent: "#fff"
|
|
34
|
+
},
|
|
35
|
+
border: {
|
|
36
|
+
default: "var(--ui-border, #dde0eb)",
|
|
37
|
+
subtle: "color-mix(in srgb, var(--ui-border, #dde0eb) 72%, transparent)",
|
|
38
|
+
strong: "var(--ui-border-strong, #b8bfdc)"
|
|
39
|
+
},
|
|
40
|
+
accent: {
|
|
41
|
+
primary: "var(--ui-primary, #5965a8)",
|
|
42
|
+
primaryHover: "var(--ui-primary-hover, #414a78)",
|
|
43
|
+
primaryActive: "var(--ui-primary-hover, #414a78)",
|
|
44
|
+
primaryLight: "var(--ui-primary-soft, #eef0fb)",
|
|
45
|
+
primaryForeground: "#fff"
|
|
46
|
+
},
|
|
47
|
+
interactive: {
|
|
48
|
+
hover: "var(--ui-primary-soft, #eef0fb)",
|
|
49
|
+
active: "color-mix(in srgb, var(--ui-primary, #5965a8) 16%, var(--ui-surface, #fff))",
|
|
50
|
+
selected: "var(--ui-primary-soft, #eef0fb)",
|
|
51
|
+
focus: "var(--ui-primary, #5965a8)",
|
|
52
|
+
focusRing: "var(--ui-focus, rgb(89 101 168 / 28%))"
|
|
53
|
+
},
|
|
54
|
+
scrollbar: {
|
|
55
|
+
track: "transparent",
|
|
56
|
+
thumb: "var(--ui-border-strong, #b8bfdc)",
|
|
57
|
+
thumbHover: "var(--ui-muted, #70778b)"
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
function m(e) {
|
|
62
|
+
return {
|
|
63
|
+
...p,
|
|
64
|
+
...e,
|
|
65
|
+
light: {
|
|
66
|
+
...p.light,
|
|
67
|
+
...e?.light,
|
|
68
|
+
background: {
|
|
69
|
+
...p.light?.background,
|
|
70
|
+
...e?.light?.background
|
|
71
|
+
},
|
|
72
|
+
foreground: {
|
|
73
|
+
...p.light?.foreground,
|
|
74
|
+
...e?.light?.foreground
|
|
75
|
+
},
|
|
76
|
+
border: {
|
|
77
|
+
...p.light?.border,
|
|
78
|
+
...e?.light?.border
|
|
79
|
+
},
|
|
80
|
+
accent: {
|
|
81
|
+
...p.light?.accent,
|
|
82
|
+
...e?.light?.accent
|
|
83
|
+
},
|
|
84
|
+
interactive: {
|
|
85
|
+
...p.light?.interactive,
|
|
86
|
+
...e?.light?.interactive
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function h(e, t = {}) {
|
|
92
|
+
let { documentManager: n, disabledCategories: r, fonts: i, i18n: a, theme: o, ...s } = t, { id: c, kind: u, ...d } = e;
|
|
93
|
+
return {
|
|
94
|
+
worker: !0,
|
|
95
|
+
tabBar: "never",
|
|
96
|
+
fontFallback: null,
|
|
97
|
+
...s,
|
|
98
|
+
disabledCategories: r ?? [...l],
|
|
99
|
+
fonts: {
|
|
100
|
+
ui: null,
|
|
101
|
+
signature: null,
|
|
102
|
+
...i
|
|
103
|
+
},
|
|
104
|
+
i18n: {
|
|
105
|
+
defaultLocale: "zh-CN",
|
|
106
|
+
...a
|
|
107
|
+
},
|
|
108
|
+
theme: m(o),
|
|
109
|
+
documentManager: {
|
|
110
|
+
maxDocuments: 1,
|
|
111
|
+
...n,
|
|
112
|
+
initialDocuments: [{
|
|
113
|
+
...d,
|
|
114
|
+
documentId: c,
|
|
115
|
+
autoActivate: !0
|
|
116
|
+
}]
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
function g(n) {
|
|
121
|
+
return n.renderer === "headless" ? /* @__PURE__ */ a(t, {
|
|
122
|
+
fallback: /* @__PURE__ */ a("div", {
|
|
123
|
+
role: "status",
|
|
124
|
+
children: "正在加载 PDF 查看器…"
|
|
125
|
+
}),
|
|
126
|
+
children: /* @__PURE__ */ a(c, { ...n }, `${n.source.kind}:${n.source.id}`)
|
|
127
|
+
}) : _(n) ? /* @__PURE__ */ a(v, { ...n }) : /* @__PURE__ */ a(e, {
|
|
128
|
+
...n,
|
|
129
|
+
className: ["ui-document-viewer-v2-compat", n.className].filter(Boolean).join(" ")
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
function _(e) {
|
|
133
|
+
return e.source.kind === "url" || e.source.kind === "buffer";
|
|
134
|
+
}
|
|
135
|
+
function v({ source: e, config: n, className: c, style: l, ariaLabel: u = "PDF 文档查看器", onInit: d, onReady: p, title: m, toolbar: g, footer: _ }) {
|
|
136
|
+
let v = i(() => h(e, n), [e, n]), y = r((e) => {
|
|
137
|
+
f(e), d?.(e);
|
|
138
|
+
}, [d]);
|
|
139
|
+
return /* @__PURE__ */ o("section", {
|
|
140
|
+
className: ["ui-document-viewer-v2", c].filter(Boolean).join(" "),
|
|
141
|
+
style: l,
|
|
142
|
+
"aria-label": u,
|
|
143
|
+
children: [
|
|
144
|
+
(m !== void 0 || g !== void 0) && /* @__PURE__ */ o("div", {
|
|
145
|
+
className: "ui-viewer-toolbar",
|
|
146
|
+
children: [m !== void 0 && /* @__PURE__ */ a("div", {
|
|
147
|
+
className: "ui-viewer-title",
|
|
148
|
+
children: m
|
|
149
|
+
}), g]
|
|
150
|
+
}),
|
|
151
|
+
/* @__PURE__ */ a(t, {
|
|
152
|
+
fallback: /* @__PURE__ */ a("div", {
|
|
153
|
+
role: "status",
|
|
154
|
+
children: "正在加载 PDF 查看器…"
|
|
155
|
+
}),
|
|
156
|
+
children: /* @__PURE__ */ a(s, {
|
|
157
|
+
className: "ui-document-viewer-v2-engine",
|
|
158
|
+
config: v,
|
|
159
|
+
onInit: y,
|
|
160
|
+
onReady: p
|
|
161
|
+
}, e.id)
|
|
162
|
+
}),
|
|
163
|
+
_ !== void 0 && /* @__PURE__ */ a("div", {
|
|
164
|
+
className: "ui-viewer-footer",
|
|
165
|
+
children: _
|
|
166
|
+
})
|
|
167
|
+
]
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
//#endregion
|
|
171
|
+
export { l as DOCUMENT_VIEWER_V2_DISABLED_CATEGORIES, u as DOCUMENT_VIEWER_V2_TOOLBAR_STYLE_ATTRIBUTE, g as DocumentViewerV2, f as applyDocumentViewerV2ToolbarStyles, h as createDocumentViewerV2Config };
|