@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.
Files changed (154) hide show
  1. package/AGENTS.md +6 -0
  2. package/CHANGELOG.md +267 -0
  3. package/README.md +55 -0
  4. package/THIRD_PARTY_NOTICES.md +29 -0
  5. package/bin/business-ui-gate.mjs +171 -0
  6. package/dist/Alert.js +47 -0
  7. package/dist/AsyncDirectoryPicker.js +134 -0
  8. package/dist/AsyncSearchPicker.js +155 -0
  9. package/dist/AutoComplete.js +34 -0
  10. package/dist/Badge.js +14 -0
  11. package/dist/Button.js +54 -0
  12. package/dist/Cascader.js +141 -0
  13. package/dist/Combobox.js +106 -0
  14. package/dist/ConfirmDialog.js +48 -0
  15. package/dist/DataTableHorizontalScrollbar.js +38 -0
  16. package/dist/DataTableIcons.js +37 -0
  17. package/dist/DataTableMergedRows.js +45 -0
  18. package/dist/DataTableTheme.js +135 -0
  19. package/dist/DateInput.js +223 -0
  20. package/dist/DropdownMenu.js +130 -0
  21. package/dist/EmptyState.js +27 -0
  22. package/dist/ExplainableButton.js +68 -0
  23. package/dist/FileDropzone.js +70 -0
  24. package/dist/FilePreparationDialog.js +33 -0
  25. package/dist/FloatingControls.js +120 -0
  26. package/dist/FormField.js +143 -0
  27. package/dist/MetricCard.js +38 -0
  28. package/dist/ModalShell.js +139 -0
  29. package/dist/MultiSelect.js +137 -0
  30. package/dist/NumericInput.js +97 -0
  31. package/dist/OverlayContainer.js +9 -0
  32. package/dist/PageHeader.js +36 -0
  33. package/dist/Pagination.js +115 -0
  34. package/dist/PreparedFileDropzone.js +30 -0
  35. package/dist/RecoverableAsyncState.js +35 -0
  36. package/dist/RovingTabs.js +54 -0
  37. package/dist/SectionCard.js +35 -0
  38. package/dist/SegmentedControl.js +46 -0
  39. package/dist/Select.js +73 -0
  40. package/dist/Skeleton.js +25 -0
  41. package/dist/SortableList.js +55 -0
  42. package/dist/StructuredAddressInput.js +157 -0
  43. package/dist/Toast.js +100 -0
  44. package/dist/ToggleSwitch.js +34 -0
  45. package/dist/TreeSelect.js +444 -0
  46. package/dist/amount-format.js +20 -0
  47. package/dist/business-ui.js +44 -0
  48. package/dist/chinese-address-regions.js +15 -0
  49. package/dist/classNames.js +6 -0
  50. package/dist/data-table.js +257 -0
  51. package/dist/document-render-budget.js +22 -0
  52. package/dist/document-viewer/ContinuousPdfViewer.js +145 -0
  53. package/dist/document-viewer/DocumentViewer.js +123 -0
  54. package/dist/document-viewer/DocumentViewerViewport.js +36 -0
  55. package/dist/document-viewer/ImagePage.js +39 -0
  56. package/dist/document-viewer/PdfCanvasPage.js +26 -0
  57. package/dist/document-viewer/PdfThumbnailRail.js +116 -0
  58. package/dist/document-viewer/PdfToolbar.js +61 -0
  59. package/dist/document-viewer/PdfWorkspace.js +42 -0
  60. package/dist/document-viewer/pdf-render-budget.js +7 -0
  61. package/dist/document-viewer/usePdfCanvas.js +69 -0
  62. package/dist/document-viewer/usePdfViewport.js +48 -0
  63. package/dist/document-viewer-v2/DocumentViewerV2.js +171 -0
  64. package/dist/document-viewer-v2/HeadlessPdfViewer.js +420 -0
  65. package/dist/document-viewer-v2/HeadlessSearch.js +66 -0
  66. package/dist/document-viewer-v2.js +13 -0
  67. package/dist/document-viewer.js +12 -0
  68. package/dist/pdfium-viewer.js +18 -0
  69. package/dist/styles.css +2 -0
  70. package/dist/types/Alert.d.ts +11 -0
  71. package/dist/types/AmountFormat.d.ts +15 -0
  72. package/dist/types/AsyncDirectoryPicker.d.ts +32 -0
  73. package/dist/types/AsyncSearchPicker.d.ts +26 -0
  74. package/dist/types/AutoComplete.d.ts +9 -0
  75. package/dist/types/Badge.d.ts +13 -0
  76. package/dist/types/Button.d.ts +36 -0
  77. package/dist/types/Cascader.d.ts +57 -0
  78. package/dist/types/ChineseAddressRegions.d.ts +4 -0
  79. package/dist/types/Combobox.d.ts +37 -0
  80. package/dist/types/ConfirmDialog.d.ts +20 -0
  81. package/dist/types/DataTable.d.ts +68 -0
  82. package/dist/types/DataTableHorizontalScrollbar.d.ts +8 -0
  83. package/dist/types/DataTableIcons.d.ts +19 -0
  84. package/dist/types/DataTableMergedRows.d.ts +11 -0
  85. package/dist/types/DataTableTheme.d.ts +4 -0
  86. package/dist/types/DateInput.d.ts +25 -0
  87. package/dist/types/DocumentRenderBudget.d.ts +9 -0
  88. package/dist/types/DocumentViewer.d.ts +11 -0
  89. package/dist/types/DocumentViewerV2.d.ts +10 -0
  90. package/dist/types/DropdownMenu.d.ts +73 -0
  91. package/dist/types/EmptyState.d.ts +9 -0
  92. package/dist/types/ExplainableButton.d.ts +7 -0
  93. package/dist/types/FileDropzone.d.ts +20 -0
  94. package/dist/types/FilePreparationDialog.d.ts +12 -0
  95. package/dist/types/FloatingControls.d.ts +39 -0
  96. package/dist/types/FormField.d.ts +35 -0
  97. package/dist/types/MetricCard.d.ts +17 -0
  98. package/dist/types/ModalShell.d.ts +33 -0
  99. package/dist/types/MultiSelect.d.ts +12 -0
  100. package/dist/types/NumericInput.d.ts +54 -0
  101. package/dist/types/OverlayContainer.d.ts +2 -0
  102. package/dist/types/PageHeader.d.ts +23 -0
  103. package/dist/types/Pagination.d.ts +14 -0
  104. package/dist/types/PdfiumViewer.d.ts +5 -0
  105. package/dist/types/PreparedFileDropzone.d.ts +7 -0
  106. package/dist/types/RecoverableAsyncState.d.ts +11 -0
  107. package/dist/types/RovingTabs.d.ts +21 -0
  108. package/dist/types/SectionCard.d.ts +18 -0
  109. package/dist/types/SegmentedControl.d.ts +26 -0
  110. package/dist/types/Select.d.ts +31 -0
  111. package/dist/types/Skeleton.d.ts +11 -0
  112. package/dist/types/SortableList.d.ts +17 -0
  113. package/dist/types/StructuredAddressInput.d.ts +57 -0
  114. package/dist/types/Toast.d.ts +22 -0
  115. package/dist/types/ToggleSwitch.d.ts +15 -0
  116. package/dist/types/TreeSelect.d.ts +58 -0
  117. package/dist/types/classNames.d.ts +1 -0
  118. package/dist/types/document-viewer/ContinuousPdfViewer.d.ts +16 -0
  119. package/dist/types/document-viewer/DocumentViewer.d.ts +31 -0
  120. package/dist/types/document-viewer/DocumentViewerViewport.d.ts +23 -0
  121. package/dist/types/document-viewer/ImagePage.d.ts +9 -0
  122. package/dist/types/document-viewer/PdfCanvasPage.d.ts +7 -0
  123. package/dist/types/document-viewer/PdfThumbnailRail.d.ts +12 -0
  124. package/dist/types/document-viewer/PdfToolbar.d.ts +13 -0
  125. package/dist/types/document-viewer/PdfWorkspace.d.ts +5 -0
  126. package/dist/types/document-viewer/pdf-render-budget.d.ts +2 -0
  127. package/dist/types/document-viewer/usePdfCanvas.d.ts +22 -0
  128. package/dist/types/document-viewer/usePdfViewport.d.ts +14 -0
  129. package/dist/types/document-viewer-v2/DocumentViewerV2.d.ts +50 -0
  130. package/dist/types/document-viewer-v2/HeadlessPdfViewer.d.ts +39 -0
  131. package/dist/types/document-viewer-v2/HeadlessSearch.d.ts +9 -0
  132. package/dist/types/index.d.ts +41 -0
  133. package/dist/types/useDebouncedValue.d.ts +2 -0
  134. package/dist/types/useFilePreparation.d.ts +28 -0
  135. package/dist/types/useModalFocusTrap.d.ts +3 -0
  136. package/dist/useDebouncedValue.js +16 -0
  137. package/dist/useFilePreparation.js +51 -0
  138. package/dist/useModalFocusTrap.js +71 -0
  139. package/docs/agent-guide.md +145 -0
  140. package/docs/api.md +220 -0
  141. package/docs/cascader.md +56 -0
  142. package/docs/component-strategy.md +94 -0
  143. package/docs/data-table.md +123 -0
  144. package/docs/dependencies.md +57 -0
  145. package/docs/document-viewer-v2.md +259 -0
  146. package/docs/document-viewer.md +28 -0
  147. package/docs/file-preparation.md +11 -0
  148. package/docs/maturity-migration.md +62 -0
  149. package/docs/modal-shell-migration.md +43 -0
  150. package/docs/mrt-poc.md +205 -0
  151. package/docs/release.md +32 -0
  152. package/docs/viewport-qa.md +99 -0
  153. package/licenses/rc-cascader-MIT.txt +21 -0
  154. 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 };