@turinhub/atomix-common-ui 0.3.0 → 0.4.0
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/README.md +31 -16
- package/dist/PDFSidebar-BBtucLK6.js +232 -0
- package/dist/PDFSidebar-BBtucLK6.js.map +1 -0
- package/dist/PDFSidebar-Di0D-yPS.cjs +2 -0
- package/dist/PDFSidebar-Di0D-yPS.cjs.map +1 -0
- package/dist/component-types.cjs +2 -0
- package/dist/component-types.cjs.map +1 -0
- package/dist/component-types.d.ts +2 -0
- package/dist/component-types.d.ts.map +1 -0
- package/dist/component-types.js +2 -0
- package/dist/component-types.js.map +1 -0
- package/dist/components/MarkdownReader.d.ts +26 -0
- package/dist/components/MarkdownReader.d.ts.map +1 -0
- package/dist/components/PDFReader.d.ts +2 -2
- package/dist/components/PDFReader.d.ts.map +1 -1
- package/dist/components/PDFSidebar.d.ts +1 -1
- package/dist/components/PDFSidebar.d.ts.map +1 -1
- package/dist/components/SimplePDFReader.d.ts +1 -1
- package/dist/data-table.cjs +2 -0
- package/dist/data-table.cjs.map +1 -0
- package/dist/data-table.d.ts +3 -0
- package/dist/data-table.d.ts.map +1 -0
- package/dist/data-table.js +159 -0
- package/dist/data-table.js.map +1 -0
- package/dist/delete-confirm-dialog.cjs +2 -0
- package/dist/delete-confirm-dialog.cjs.map +1 -0
- package/dist/delete-confirm-dialog.d.ts +3 -0
- package/dist/delete-confirm-dialog.d.ts.map +1 -0
- package/dist/delete-confirm-dialog.js +109 -0
- package/dist/delete-confirm-dialog.js.map +1 -0
- package/dist/file-upload.cjs +2 -0
- package/dist/file-upload.cjs.map +1 -0
- package/dist/file-upload.d.ts +3 -0
- package/dist/file-upload.d.ts.map +1 -0
- package/dist/file-upload.js +354 -0
- package/dist/file-upload.js.map +1 -0
- package/dist/{index-miejqTjn.cjs → index-BiA_tnaq.cjs} +3 -3
- package/dist/{index-miejqTjn.cjs.map → index-BiA_tnaq.cjs.map} +1 -1
- package/dist/{index-DUxYhmkV.js → index-BypbGNpR.js} +2 -2
- package/dist/{index-DUxYhmkV.js.map → index-BypbGNpR.js.map} +1 -1
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +0 -20
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -12
- package/dist/jsx-runtime-B4hRZ52C.js +283 -0
- package/dist/jsx-runtime-B4hRZ52C.js.map +1 -0
- package/dist/jsx-runtime-BB_1_6y_.cjs +23 -0
- package/dist/jsx-runtime-BB_1_6y_.cjs.map +1 -0
- package/dist/markdown-reader.cjs +2 -0
- package/dist/markdown-reader.cjs.map +1 -0
- package/dist/markdown-reader.d.ts +3 -0
- package/dist/markdown-reader.d.ts.map +1 -0
- package/dist/markdown-reader.js +145 -0
- package/dist/markdown-reader.js.map +1 -0
- package/dist/pdf-reader.cjs +2 -0
- package/dist/pdf-reader.cjs.map +1 -0
- package/dist/pdf-reader.d.ts +3 -0
- package/dist/pdf-reader.d.ts.map +1 -0
- package/dist/pdf-reader.js +427 -0
- package/dist/pdf-reader.js.map +1 -0
- package/dist/pdf-sidebar.cjs +2 -0
- package/dist/pdf-sidebar.cjs.map +1 -0
- package/dist/pdf-sidebar.d.ts +3 -0
- package/dist/pdf-sidebar.d.ts.map +1 -0
- package/dist/pdf-sidebar.js +5 -0
- package/dist/pdf-sidebar.js.map +1 -0
- package/dist/simple-pdf-reader.cjs +2 -0
- package/dist/simple-pdf-reader.cjs.map +1 -0
- package/dist/simple-pdf-reader.d.ts +3 -0
- package/dist/simple-pdf-reader.d.ts.map +1 -0
- package/dist/simple-pdf-reader.js +268 -0
- package/dist/simple-pdf-reader.js.map +1 -0
- package/dist/table-header.cjs +2 -0
- package/dist/table-header.cjs.map +1 -0
- package/dist/table-header.d.ts +3 -0
- package/dist/table-header.d.ts.map +1 -0
- package/dist/table-header.js +63 -0
- package/dist/table-header.js.map +1 -0
- package/dist/table-pagination.cjs +2 -0
- package/dist/table-pagination.cjs.map +1 -0
- package/dist/table-pagination.d.ts +3 -0
- package/dist/table-pagination.d.ts.map +1 -0
- package/dist/table-pagination.js +172 -0
- package/dist/table-pagination.js.map +1 -0
- package/dist/theme-switcher-content.cjs +2 -0
- package/dist/theme-switcher-content.cjs.map +1 -0
- package/dist/theme-switcher-content.d.ts +3 -0
- package/dist/theme-switcher-content.d.ts.map +1 -0
- package/dist/theme-switcher-content.js +103 -0
- package/dist/theme-switcher-content.js.map +1 -0
- package/dist/theme-switcher.cjs +2 -0
- package/dist/theme-switcher.cjs.map +1 -0
- package/dist/theme-switcher.d.ts +3 -0
- package/dist/theme-switcher.d.ts.map +1 -0
- package/dist/theme-switcher.js +140 -0
- package/dist/theme-switcher.js.map +1 -0
- package/dist/utils-B6yFEsav.js +9 -0
- package/dist/utils-B6yFEsav.js.map +1 -0
- package/dist/utils-IjLH3w2e.cjs +2 -0
- package/dist/utils-IjLH3w2e.cjs.map +1 -0
- package/dist/utils.cjs +2 -0
- package/dist/utils.cjs.map +1 -0
- package/dist/utils.d.ts +2 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +5 -0
- package/dist/utils.js.map +1 -0
- package/package.json +161 -3
- package/dist/index-DJdfLA8M.js +0 -2140
- package/dist/index-DJdfLA8M.js.map +0 -1
- package/dist/index-tIca-Q_M.cjs +0 -23
- package/dist/index-tIca-Q_M.cjs.map +0 -1
- package/dist/index.c.js +0 -2
- package/dist/index.c.js.map +0 -1
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { j as e } from "./jsx-runtime-B4hRZ52C.js";
|
|
2
|
+
import { useState as i, useRef as T, useEffect as k, useMemo as U } from "react";
|
|
3
|
+
import { c as H } from "./utils-B6yFEsav.js";
|
|
4
|
+
const L = (o) => o ? o instanceof Error ? o : new Error(o) : null, I = (o) => o instanceof Error ? o : new Error("无法加载 Markdown 渲染依赖"), ee = "markdown-reader-content max-w-none text-sm leading-7 text-slate-800 dark:text-slate-100 [&_h1]:mb-4 [&_h1]:mt-0 [&_h1]:text-3xl [&_h1]:font-semibold [&_h2]:mb-3 [&_h2]:mt-8 [&_h2]:text-2xl [&_h2]:font-semibold [&_h3]:mb-2 [&_h3]:mt-6 [&_h3]:text-xl [&_h3]:font-semibold [&_p]:my-4 [&_ul]:my-4 [&_ol]:my-4 [&_li]:my-1 [&_ul]:list-disc [&_ol]:list-decimal [&_ul]:pl-6 [&_ol]:pl-6 [&_blockquote]:my-4 [&_blockquote]:border-l-4 [&_blockquote]:border-slate-300 [&_blockquote]:pl-4 [&_blockquote]:text-slate-600 dark:[&_blockquote]:border-slate-700 dark:[&_blockquote]:text-slate-300 [&_a]:font-medium [&_a]:text-cyan-700 [&_a]:underline-offset-4 hover:[&_a]:underline dark:[&_a]:text-cyan-300 [&_table]:my-4 [&_table]:w-full [&_table]:border-collapse [&_th]:border [&_td]:border [&_th]:border-slate-200 [&_td]:border-slate-200 [&_th]:bg-slate-100 [&_th]:px-3 [&_th]:py-2 [&_td]:px-3 [&_td]:py-2 dark:[&_th]:border-slate-700 dark:[&_td]:border-slate-700 dark:[&_th]:bg-slate-800 [&_pre]:my-4 [&_pre]:overflow-x-auto [&_pre]:rounded-lg [&_pre]:bg-slate-950 [&_pre]:p-4 [&_pre]:text-slate-50 [&_code]:rounded [&_code]:bg-slate-100 [&_code]:px-1.5 [&_code]:py-0.5 [&_code]:text-sm dark:[&_code]:bg-slate-800 [&_pre_code]:bg-transparent [&_pre_code]:p-0 [&_img]:my-4 [&_img]:max-w-full [&_img]:rounded-lg [&_hr]:my-8 [&_hr]:border-slate-200 dark:[&_hr]:border-slate-800";
|
|
5
|
+
function oe({
|
|
6
|
+
content: o,
|
|
7
|
+
sourceUrl: _,
|
|
8
|
+
components: q,
|
|
9
|
+
loading: z = !1,
|
|
10
|
+
error: G,
|
|
11
|
+
className: g,
|
|
12
|
+
contentClassName: P,
|
|
13
|
+
loadingText: A = "正在加载 Markdown 内容...",
|
|
14
|
+
errorText: B = "Markdown 加载失败",
|
|
15
|
+
emptyText: F = "暂无 Markdown 内容",
|
|
16
|
+
allowImages: w = !0,
|
|
17
|
+
openLinksInNewTab: x = !0,
|
|
18
|
+
transformLinkHref: u,
|
|
19
|
+
transformImageSrc: m,
|
|
20
|
+
onLoadError: h
|
|
21
|
+
}) {
|
|
22
|
+
const [y, O] = i(null), [$, j] = i(!0), [D, E] = i(null), [J, M] = i(""), [K, b] = i(!1), [Q, f] = i(null), a = T(h), { Card: v, CardContent: C, Skeleton: c } = q || {};
|
|
23
|
+
k(() => {
|
|
24
|
+
a.current = h;
|
|
25
|
+
}, [h]), k(() => {
|
|
26
|
+
let t = !0;
|
|
27
|
+
return (async () => {
|
|
28
|
+
var n;
|
|
29
|
+
j(!0), E(null);
|
|
30
|
+
try {
|
|
31
|
+
const [r, s] = await Promise.all([
|
|
32
|
+
import("react-markdown"),
|
|
33
|
+
import("remark-gfm")
|
|
34
|
+
]);
|
|
35
|
+
if (!t) return;
|
|
36
|
+
O({
|
|
37
|
+
ReactMarkdown: r.default,
|
|
38
|
+
remarkGfm: s.default
|
|
39
|
+
});
|
|
40
|
+
} catch (r) {
|
|
41
|
+
if (!t) return;
|
|
42
|
+
const s = I(r);
|
|
43
|
+
E(s), (n = a.current) == null || n.call(a, s);
|
|
44
|
+
} finally {
|
|
45
|
+
t && j(!1);
|
|
46
|
+
}
|
|
47
|
+
})(), () => {
|
|
48
|
+
t = !1;
|
|
49
|
+
};
|
|
50
|
+
}, []), k(() => {
|
|
51
|
+
if (o !== void 0 || !_) {
|
|
52
|
+
M(""), b(!1), f(null);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const t = new AbortController();
|
|
56
|
+
return (async () => {
|
|
57
|
+
var n;
|
|
58
|
+
b(!0), f(null);
|
|
59
|
+
try {
|
|
60
|
+
const r = await fetch(_, {
|
|
61
|
+
signal: t.signal
|
|
62
|
+
});
|
|
63
|
+
if (!r.ok)
|
|
64
|
+
throw new Error(`请求失败:${r.status}`);
|
|
65
|
+
const s = await r.text();
|
|
66
|
+
M(s);
|
|
67
|
+
} catch (r) {
|
|
68
|
+
if (t.signal.aborted) return;
|
|
69
|
+
const s = r instanceof Error ? r : new Error("无法加载 Markdown 内容");
|
|
70
|
+
f(s), (n = a.current) == null || n.call(a, s);
|
|
71
|
+
} finally {
|
|
72
|
+
t.signal.aborted || b(!1);
|
|
73
|
+
}
|
|
74
|
+
})(), () => {
|
|
75
|
+
t.abort();
|
|
76
|
+
};
|
|
77
|
+
}, [o, _]);
|
|
78
|
+
const R = o !== void 0 ? o : J, d = L(G) || D || Q, N = z || $ || K, V = !N && !d && R.trim().length === 0, W = U(
|
|
79
|
+
() => ({
|
|
80
|
+
a({ href: t, children: l, ...n }) {
|
|
81
|
+
const r = t ? (u == null ? void 0 : u(t)) ?? t : void 0;
|
|
82
|
+
return /* @__PURE__ */ e.jsx(
|
|
83
|
+
"a",
|
|
84
|
+
{
|
|
85
|
+
...n,
|
|
86
|
+
href: r,
|
|
87
|
+
target: x ? "_blank" : n.target,
|
|
88
|
+
rel: x ? "noreferrer noopener" : n.rel,
|
|
89
|
+
children: l
|
|
90
|
+
}
|
|
91
|
+
);
|
|
92
|
+
},
|
|
93
|
+
img({ src: t, alt: l, ...n }) {
|
|
94
|
+
if (!t) return null;
|
|
95
|
+
const r = (m == null ? void 0 : m(t)) ?? t;
|
|
96
|
+
return w ? /* @__PURE__ */ e.jsx("img", { ...n, src: r, alt: l || "", loading: "lazy" }) : /* @__PURE__ */ e.jsx("a", { href: r, target: "_blank", rel: "noreferrer noopener", children: l || r });
|
|
97
|
+
},
|
|
98
|
+
input({ checked: t, type: l, ...n }) {
|
|
99
|
+
return l !== "checkbox" ? /* @__PURE__ */ e.jsx("input", { ...n, type: l }) : /* @__PURE__ */ e.jsx(
|
|
100
|
+
"input",
|
|
101
|
+
{
|
|
102
|
+
...n,
|
|
103
|
+
type: "checkbox",
|
|
104
|
+
checked: !!t,
|
|
105
|
+
readOnly: !0,
|
|
106
|
+
disabled: !0
|
|
107
|
+
}
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
}),
|
|
111
|
+
[
|
|
112
|
+
w,
|
|
113
|
+
x,
|
|
114
|
+
m,
|
|
115
|
+
u
|
|
116
|
+
]
|
|
117
|
+
), X = () => /* @__PURE__ */ e.jsx("div", { className: "space-y-3 p-4", role: "status", "aria-live": "polite", children: c ? /* @__PURE__ */ e.jsxs(e.Fragment, { children: [
|
|
118
|
+
/* @__PURE__ */ e.jsx(c, { className: "h-5 w-2/3" }),
|
|
119
|
+
/* @__PURE__ */ e.jsx(c, { className: "h-4 w-full" }),
|
|
120
|
+
/* @__PURE__ */ e.jsx(c, { className: "h-4 w-5/6" }),
|
|
121
|
+
/* @__PURE__ */ e.jsx(c, { className: "h-28 w-full" })
|
|
122
|
+
] }) : /* @__PURE__ */ e.jsx("p", { className: "text-sm text-muted-foreground", children: A }) }), Y = () => /* @__PURE__ */ e.jsxs("div", { className: "p-4 text-sm text-destructive", role: "alert", children: [
|
|
123
|
+
/* @__PURE__ */ e.jsx("p", { className: "font-medium", children: B }),
|
|
124
|
+
d != null && d.message ? /* @__PURE__ */ e.jsx("p", { className: "mt-1 opacity-80", children: d.message }) : null
|
|
125
|
+
] }), Z = () => /* @__PURE__ */ e.jsx("div", { className: "p-4 text-sm text-muted-foreground", children: F }), S = () => {
|
|
126
|
+
if (N) return X();
|
|
127
|
+
if (d) return Y();
|
|
128
|
+
if (V) return Z();
|
|
129
|
+
if (!y) return null;
|
|
130
|
+
const { ReactMarkdown: t, remarkGfm: l } = y;
|
|
131
|
+
return /* @__PURE__ */ e.jsx(
|
|
132
|
+
t,
|
|
133
|
+
{
|
|
134
|
+
remarkPlugins: [l],
|
|
135
|
+
components: W,
|
|
136
|
+
children: R
|
|
137
|
+
}
|
|
138
|
+
);
|
|
139
|
+
}, p = /* @__PURE__ */ e.jsx("div", { className: H(ee, P), children: S() });
|
|
140
|
+
return v ? /* @__PURE__ */ e.jsx(v, { className: g, children: C ? /* @__PURE__ */ e.jsx(C, { children: p }) : p }) : /* @__PURE__ */ e.jsx("div", { className: g, children: p });
|
|
141
|
+
}
|
|
142
|
+
export {
|
|
143
|
+
oe as MarkdownReader
|
|
144
|
+
};
|
|
145
|
+
//# sourceMappingURL=markdown-reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-reader.js","sources":["../src/components/MarkdownReader.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from 'react';\nimport type { ComponentType, HTMLAttributes } from 'react';\n\nimport { cn } from '../lib/utils';\nimport type {\n CardComponent,\n SkeletonComponent,\n UIComponent,\n} from '../types/component-types';\n\nexport interface MarkdownReaderUIComponents {\n Card?: CardComponent;\n CardContent?: UIComponent<HTMLAttributes<HTMLDivElement>>;\n Skeleton?: SkeletonComponent;\n}\n\nexport interface MarkdownReaderProps {\n content?: string;\n sourceUrl?: string;\n components?: MarkdownReaderUIComponents;\n loading?: boolean;\n error?: Error | string | null;\n className?: string;\n contentClassName?: string;\n loadingText?: string;\n errorText?: string;\n emptyText?: string;\n allowImages?: boolean;\n openLinksInNewTab?: boolean;\n transformLinkHref?: (href: string) => string | undefined;\n transformImageSrc?: (src: string) => string | undefined;\n onLoadError?: (error: Error) => void;\n}\n\ninterface MarkdownRuntime {\n ReactMarkdown: ComponentType<any>;\n remarkGfm: unknown;\n}\n\nconst normalizeError = (error: Error | string | null | undefined) => {\n if (!error) return null;\n return error instanceof Error ? error : new Error(error);\n};\n\nconst getMarkdownLoadError = (error: unknown) =>\n error instanceof Error\n ? error\n : new Error('无法加载 Markdown 渲染依赖');\n\nconst defaultContentClassName =\n 'markdown-reader-content max-w-none text-sm leading-7 text-slate-800 dark:text-slate-100 ' +\n '[&_h1]:mb-4 [&_h1]:mt-0 [&_h1]:text-3xl [&_h1]:font-semibold ' +\n '[&_h2]:mb-3 [&_h2]:mt-8 [&_h2]:text-2xl [&_h2]:font-semibold ' +\n '[&_h3]:mb-2 [&_h3]:mt-6 [&_h3]:text-xl [&_h3]:font-semibold ' +\n '[&_p]:my-4 [&_ul]:my-4 [&_ol]:my-4 [&_li]:my-1 [&_ul]:list-disc [&_ol]:list-decimal ' +\n '[&_ul]:pl-6 [&_ol]:pl-6 [&_blockquote]:my-4 [&_blockquote]:border-l-4 ' +\n '[&_blockquote]:border-slate-300 [&_blockquote]:pl-4 [&_blockquote]:text-slate-600 ' +\n 'dark:[&_blockquote]:border-slate-700 dark:[&_blockquote]:text-slate-300 ' +\n '[&_a]:font-medium [&_a]:text-cyan-700 [&_a]:underline-offset-4 hover:[&_a]:underline ' +\n 'dark:[&_a]:text-cyan-300 [&_table]:my-4 [&_table]:w-full [&_table]:border-collapse ' +\n '[&_th]:border [&_td]:border [&_th]:border-slate-200 [&_td]:border-slate-200 ' +\n '[&_th]:bg-slate-100 [&_th]:px-3 [&_th]:py-2 [&_td]:px-3 [&_td]:py-2 ' +\n 'dark:[&_th]:border-slate-700 dark:[&_td]:border-slate-700 dark:[&_th]:bg-slate-800 ' +\n '[&_pre]:my-4 [&_pre]:overflow-x-auto [&_pre]:rounded-lg [&_pre]:bg-slate-950 ' +\n '[&_pre]:p-4 [&_pre]:text-slate-50 [&_code]:rounded [&_code]:bg-slate-100 ' +\n '[&_code]:px-1.5 [&_code]:py-0.5 [&_code]:text-sm dark:[&_code]:bg-slate-800 ' +\n '[&_pre_code]:bg-transparent [&_pre_code]:p-0 [&_img]:my-4 [&_img]:max-w-full ' +\n '[&_img]:rounded-lg [&_hr]:my-8 [&_hr]:border-slate-200 dark:[&_hr]:border-slate-800';\n\nexport function MarkdownReader({\n content,\n sourceUrl,\n components,\n loading = false,\n error,\n className,\n contentClassName,\n loadingText = '正在加载 Markdown 内容...',\n errorText = 'Markdown 加载失败',\n emptyText = '暂无 Markdown 内容',\n allowImages = true,\n openLinksInNewTab = true,\n transformLinkHref,\n transformImageSrc,\n onLoadError,\n}: MarkdownReaderProps) {\n const [runtime, setRuntime] = useState<MarkdownRuntime | null>(null);\n const [runtimeLoading, setRuntimeLoading] = useState(true);\n const [runtimeError, setRuntimeError] = useState<Error | null>(null);\n const [remoteContent, setRemoteContent] = useState('');\n const [remoteLoading, setRemoteLoading] = useState(false);\n const [remoteError, setRemoteError] = useState<Error | null>(null);\n const onLoadErrorRef = useRef(onLoadError);\n\n const { Card, CardContent, Skeleton } = components || {};\n\n useEffect(() => {\n onLoadErrorRef.current = onLoadError;\n }, [onLoadError]);\n\n useEffect(() => {\n let isMounted = true;\n\n const loadRuntime = async () => {\n setRuntimeLoading(true);\n setRuntimeError(null);\n\n try {\n const [markdownModule, gfmModule] = await Promise.all([\n import('react-markdown'),\n import('remark-gfm'),\n ]);\n\n if (!isMounted) return;\n\n setRuntime({\n ReactMarkdown: markdownModule.default,\n remarkGfm: gfmModule.default,\n });\n } catch (err) {\n if (!isMounted) return;\n\n const nextError = getMarkdownLoadError(err);\n setRuntimeError(nextError);\n onLoadErrorRef.current?.(nextError);\n } finally {\n if (isMounted) {\n setRuntimeLoading(false);\n }\n }\n };\n\n loadRuntime();\n\n return () => {\n isMounted = false;\n };\n }, []);\n\n useEffect(() => {\n if (content !== undefined || !sourceUrl) {\n setRemoteContent('');\n setRemoteLoading(false);\n setRemoteError(null);\n return;\n }\n\n const controller = new AbortController();\n\n const loadContent = async () => {\n setRemoteLoading(true);\n setRemoteError(null);\n\n try {\n const response = await fetch(sourceUrl, {\n signal: controller.signal,\n });\n\n if (!response.ok) {\n throw new Error(`请求失败:${response.status}`);\n }\n\n const text = await response.text();\n setRemoteContent(text);\n } catch (err) {\n if (controller.signal.aborted) return;\n\n const nextError =\n err instanceof Error ? err : new Error('无法加载 Markdown 内容');\n setRemoteError(nextError);\n onLoadErrorRef.current?.(nextError);\n } finally {\n if (!controller.signal.aborted) {\n setRemoteLoading(false);\n }\n }\n };\n\n loadContent();\n\n return () => {\n controller.abort();\n };\n }, [content, sourceUrl]);\n\n const markdown = content !== undefined ? content : remoteContent;\n const displayedError = normalizeError(error) || runtimeError || remoteError;\n const isLoading = loading || runtimeLoading || remoteLoading;\n const isEmpty = !isLoading && !displayedError && markdown.trim().length === 0;\n\n const markdownComponents = useMemo(\n () => ({\n a({ href, children, ...props }: any) {\n const nextHref = href ? transformLinkHref?.(href) ?? href : undefined;\n\n return (\n <a\n {...props}\n href={nextHref}\n target={openLinksInNewTab ? '_blank' : props.target}\n rel={openLinksInNewTab ? 'noreferrer noopener' : props.rel}\n >\n {children}\n </a>\n );\n },\n img({ src, alt, ...props }: any) {\n if (!src) return null;\n\n const nextSrc = transformImageSrc?.(src) ?? src;\n\n if (!allowImages) {\n return (\n <a href={nextSrc} target=\"_blank\" rel=\"noreferrer noopener\">\n {alt || nextSrc}\n </a>\n );\n }\n\n return <img {...props} src={nextSrc} alt={alt || ''} loading=\"lazy\" />;\n },\n input({ checked, type, ...props }: any) {\n if (type !== 'checkbox') {\n return <input {...props} type={type} />;\n }\n\n return (\n <input\n {...props}\n type=\"checkbox\"\n checked={Boolean(checked)}\n readOnly\n disabled\n />\n );\n },\n }),\n [\n allowImages,\n openLinksInNewTab,\n transformImageSrc,\n transformLinkHref,\n ]\n );\n\n const renderLoading = () => (\n <div className=\"space-y-3 p-4\" role=\"status\" aria-live=\"polite\">\n {Skeleton ? (\n <>\n <Skeleton className=\"h-5 w-2/3\" />\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-5/6\" />\n <Skeleton className=\"h-28 w-full\" />\n </>\n ) : (\n <p className=\"text-sm text-muted-foreground\">{loadingText}</p>\n )}\n </div>\n );\n\n const renderError = () => (\n <div className=\"p-4 text-sm text-destructive\" role=\"alert\">\n <p className=\"font-medium\">{errorText}</p>\n {displayedError?.message ? (\n <p className=\"mt-1 opacity-80\">{displayedError.message}</p>\n ) : null}\n </div>\n );\n\n const renderEmpty = () => (\n <div className=\"p-4 text-sm text-muted-foreground\">{emptyText}</div>\n );\n\n const renderContent = () => {\n if (isLoading) return renderLoading();\n if (displayedError) return renderError();\n if (isEmpty) return renderEmpty();\n if (!runtime) return null;\n\n const { ReactMarkdown, remarkGfm } = runtime;\n\n return (\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n components={markdownComponents}\n >\n {markdown}\n </ReactMarkdown>\n );\n };\n\n const body = (\n <div className={cn(defaultContentClassName, contentClassName)}>\n {renderContent()}\n </div>\n );\n\n if (Card) {\n return (\n <Card className={className}>\n {CardContent ? <CardContent>{body}</CardContent> : body}\n </Card>\n );\n }\n\n return <div className={className}>{body}</div>;\n}\n"],"names":["normalizeError","error","getMarkdownLoadError","defaultContentClassName","MarkdownReader","content","sourceUrl","components","loading","className","contentClassName","loadingText","errorText","emptyText","allowImages","openLinksInNewTab","transformLinkHref","transformImageSrc","onLoadError","runtime","setRuntime","useState","runtimeLoading","setRuntimeLoading","runtimeError","setRuntimeError","remoteContent","setRemoteContent","remoteLoading","setRemoteLoading","remoteError","setRemoteError","onLoadErrorRef","useRef","Card","CardContent","Skeleton","useEffect","isMounted","markdownModule","gfmModule","err","nextError","_a","controller","response","text","markdown","displayedError","isLoading","isEmpty","markdownComponents","useMemo","href","children","props","nextHref","jsx","src","alt","nextSrc","checked","type","renderLoading","jsxs","Fragment","renderError","renderEmpty","renderContent","ReactMarkdown","remarkGfm","body","cn"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./jsx-runtime-BB_1_6y_.cjs"),x=require("lucide-react"),n=require("react"),_e=require("./PDFSidebar-Di0D-yPS.cjs");function Be(f,h){const R=n.useRef(void 0);return n.useCallback((...I)=>{R.current&&clearTimeout(R.current),R.current=setTimeout(()=>f(...I),h)},[f,h])}function Ve({url:f,initialPage:h=1,initialScale:R=1,initialRotation:I=0,currentPage:J,onPageChange:C,scale:O,onScaleChange:w,rotation:$,onRotationChange:D,minScale:W=.5,maxScale:L=2.5,showToolbar:ue=!0,showSidebar:E=!0,showRotation:ae=!0,showModeToggle:xe=!0,showFullscreen:me=!0,enableHotkeys:Q=!0,enableMobileNav:de=!0,displayMode:fe="single",className:pe,toolbarClassName:je,contentClassName:he,contentHeight:Ee="80vh",pageClassName:H,workerUrl:q,cMapUrl:g,standardFontDataUrl:k,components:u,onLoadSuccess:P,onLoadError:p,onPageRender:v,loadingText:ve="正在加载PDF文档...",errorText:U="PDF加载失败"}){const[ee,G]=n.useState(null),[be,K]=n.useState(h),[Re,ge]=n.useState(R),[ke,ye]=n.useState(I),[Te,S]=n.useState(!1),[y,M]=n.useState(null),[m,_]=n.useState(0),[te,B]=n.useState(!1),[T,se]=n.useState(fe==="scroll"),[V,ne]=n.useState(E);n.useEffect(()=>{ne(E)},[E]);const[re,Ne]=n.useState(void 0),[ie,Ce]=n.useState(null),le=n.useRef(null),F=n.useRef(null),Z=n.useRef(new Map),i=J??be,j=O??Re,z=$??ke,b=J!==void 0,o=T,{Card:we,CardContent:De,Button:d,Input:Pe,Skeleton:Se}=u||{};n.useEffect(()=>{G(null),_(0),M(null),S(!1),b||K(Math.max(1,h))},[f,h,b]);const Me=n.useMemo(()=>{const e={withCredentials:!1};return g&&(e.cMapUrl=g,e.cMapPacked=!0),k&&(e.standardFontDataUrl=k),e},[g,k]);n.useEffect(()=>{let e=!0;return(async()=>{try{const l=await Promise.resolve().then(()=>require("./index-BiA_tnaq.cjs"));if(typeof window<"u"){const r=l.pdfjs,c=r==null?void 0:r.version;r!=null&&r.GlobalWorkerOptions&&c&&(q?r.GlobalWorkerOptions.workerSrc=q:r.GlobalWorkerOptions.workerSrc=`https://cdn.jsdelivr.net/npm/pdfjs-dist@${c}/build/pdf.worker.min.mjs`,!g&&r.GlobalWorkerOptions&&(r.GlobalWorkerOptions.cMapUrl=`https://unpkg.com/pdfjs-dist@${c}/cmaps/`),!k&&r.GlobalWorkerOptions&&(r.GlobalWorkerOptions.standardFontDataUrl=`https://unpkg.com/pdfjs-dist@${c}/standard_fonts/`))}e&&Ce(l)}catch(l){if(e){const r=l instanceof Error?l:new Error("无法加载 react-pdf 库");M(r),S(!1),p==null||p(r)}}})(),()=>{e=!1}},[q,g,k,p]);const Fe=n.useCallback(e=>{console.error("PDF加载失败:",e),console.error("PDF URL:",f),G(null),_(0),M(new Error(`${U}: ${e.message||"请检查文件路径或网络连接"}`)),S(!1),p==null||p(e)},[f,U,p]),ze=n.useCallback(e=>{G(e),_(e.numPages),M(null),S(!1),b||K(s=>Math.max(1,Math.min(s,Math.max(e.numPages,1)))),P==null||P(e)},[b,P]),a=n.useCallback(e=>{if(!Number.isFinite(e))return;const s=m>0?Math.max(1,Math.min(Math.trunc(e),m)):Math.max(1,Math.trunc(e));b||K(s),s!==i&&(C==null||C(s))},[m,b,i,C]),Ae=n.useCallback((e,s)=>{s?Z.current.set(e,s):Z.current.delete(e)},[]),Ie=n.useCallback(()=>{const e=F.current;if(!e||!o||m<=0)return;const s=e.getBoundingClientRect().top;let l=i,r=Number.POSITIVE_INFINITY;Z.current.forEach((c,A)=>{const oe=Math.abs(c.getBoundingClientRect().top-s);oe<r&&(r=oe,l=A)}),l!==i&&a(l)},[i,a,o,m]),N=n.useCallback(e=>{const s=Math.max(W,Math.min(L,j+e));O===void 0&&ge(s),w==null||w(s)},[j,W,L,O,w]),Oe=n.useCallback(()=>{const e=(z+90)%360;$===void 0&&ye(e),D==null||D(e)},[z,$,D]),ce=Be(e=>{Ne(e)},100);n.useEffect(()=>{if(!F.current)return;const e=F.current,s=()=>{ce(e.clientWidth)};s();const l=new ResizeObserver(()=>{s()});return l.observe(e),()=>{l.disconnect()}},[ce]),n.useEffect(()=>{if(!Q)return;const e=s=>{const l=s.target,r=typeof document<"u"?document.activeElement:null,c=l||r,A=c==null?void 0:c.getAttribute("role");c&&(c.tagName==="INPUT"||c.tagName==="TEXTAREA"||c.tagName==="SELECT"||c.isContentEditable||A==="textbox"||A==="spinbutton")||((s.ctrlKey||s.metaKey)&&(s.key==="="||s.key==="+")?(s.preventDefault(),N(.1)):(s.ctrlKey||s.metaKey)&&s.key==="-"?(s.preventDefault(),N(-.1)):!o&&s.key==="ArrowLeft"?(s.preventDefault(),a(i-1)):!o&&s.key==="ArrowRight"&&(s.preventDefault(),a(i+1)))};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}},[Q,i,a,o,N]);const $e=n.useCallback(async()=>{var e,s;if(!(typeof document>"u"))if(document.fullscreenElement)document.exitFullscreen&&(await document.exitFullscreen(),B(!1));else try{await((s=(e=le.current)==null?void 0:e.requestFullscreen)==null?void 0:s.call(e)),B(!0)}catch(l){console.error("Error attempting to enable fullscreen:",l)}},[]);n.useEffect(()=>{if(typeof document>"u")return;const e=()=>{B(!!document.fullscreenElement)};return document.addEventListener("fullscreenchange",e),()=>{document.removeEventListener("fullscreenchange",e)}},[]);const We=n.useCallback(e=>{a(e),se(!1)},[a]),Le=()=>ue?t.jsxRuntimeExports.jsxs("div",{className:`flex items-center justify-between gap-4 border-b px-4 py-2 ${je||""}`,children:[t.jsxRuntimeExports.jsxs("div",{className:"flex items-center gap-2",children:[E&&t.jsxRuntimeExports.jsx(d,{variant:"outline",size:"icon",onClick:()=>ne(!V),title:V?"隐藏侧边栏":"显示侧边栏",children:t.jsxRuntimeExports.jsx(x.PanelLeft,{})}),t.jsxRuntimeExports.jsx(d,{variant:"outline",size:"icon",onClick:()=>N(-.1),disabled:j<=W,children:t.jsxRuntimeExports.jsx(x.ZoomOut,{})}),t.jsxRuntimeExports.jsxs("span",{className:"min-w-[3rem] text-center text-sm",children:[Math.round(j*100),"%"]}),t.jsxRuntimeExports.jsx(d,{variant:"outline",size:"icon",onClick:()=>N(.1),disabled:j>=L,children:t.jsxRuntimeExports.jsx(x.ZoomIn,{})}),ae&&t.jsxRuntimeExports.jsx(d,{variant:"outline",size:"icon",onClick:Oe,children:t.jsxRuntimeExports.jsx(x.RotateCw,{})}),xe&&t.jsxRuntimeExports.jsx(d,{variant:"outline",size:"icon",onClick:()=>se(!T),title:T?"单页模式":"滚动模式",children:T?t.jsxRuntimeExports.jsx(x.ScrollText,{}):t.jsxRuntimeExports.jsx(x.FileText,{})}),me&&t.jsxRuntimeExports.jsx(d,{variant:"outline",size:"icon",onClick:$e,children:te?t.jsxRuntimeExports.jsx(x.Minimize2,{}):t.jsxRuntimeExports.jsx(x.Maximize2,{})})]}),t.jsxRuntimeExports.jsxs("div",{className:"flex items-center gap-2",children:[!o&&t.jsxRuntimeExports.jsx(d,{variant:"outline",size:"icon",onClick:()=>a(i-1),disabled:i<=1,children:t.jsxRuntimeExports.jsx(x.ChevronLeft,{})}),t.jsxRuntimeExports.jsx(Pe,{type:"number",min:1,max:m,value:i,onChange:e=>a(parseInt(e.target.value)||1),disabled:o,readOnly:o,title:o?"滚动模式下页码仅显示当前位置":void 0,className:"w-16 text-center"}),t.jsxRuntimeExports.jsxs("span",{className:"text-sm text-muted-foreground",children:["/ ",m]}),!o&&t.jsxRuntimeExports.jsx(d,{variant:"outline",size:"icon",onClick:()=>a(i+1),disabled:m>0&&i>=m,children:t.jsxRuntimeExports.jsx(x.ChevronRight,{})})]})]}):null,X=()=>t.jsxRuntimeExports.jsx("div",{className:"flex h-full items-center justify-center",children:t.jsxRuntimeExports.jsx("p",{className:"text-muted-foreground",children:ve})}),Y=()=>t.jsxRuntimeExports.jsx("div",{className:"flex h-full min-h-[400px] items-center justify-center px-4 text-center text-destructive",children:t.jsxRuntimeExports.jsxs("div",{className:"max-w-md",children:[t.jsxRuntimeExports.jsx("p",{className:"mb-2 text-lg font-medium",children:"文件加载失败"}),t.jsxRuntimeExports.jsx("p",{className:"text-sm opacity-80",children:y==null?void 0:y.message})]})}),qe=()=>{if(!ie)return X();const{Document:e,Page:s}=ie;return t.jsxRuntimeExports.jsx("div",{ref:F,onScroll:o?Ie:void 0,className:`pdf-container flex-1 overflow-y-auto ${he||""}`,children:t.jsxRuntimeExports.jsx("div",{className:"flex min-h-full justify-center px-4",children:t.jsxRuntimeExports.jsx(e,{file:f,onLoadError:Fe,options:Me,loading:X(),error:Y(),onLoadSuccess:ze,children:y?Y():T?Array.from(new Array(m),(l,r)=>t.jsxRuntimeExports.jsx("div",{ref:c=>Ae(r+1,c),"data-page-number":r+1,className:`mb-4 ${H||""}`,children:t.jsxRuntimeExports.jsx(s,{pageNumber:r+1,renderTextLayer:!1,renderAnnotationLayer:!1,width:re,scale:j,rotate:z,onRenderSuccess:()=>v==null?void 0:v(r+1)})},`page_${r+1}`)):t.jsxRuntimeExports.jsx("div",{className:H||"",children:t.jsxRuntimeExports.jsx(s,{pageNumber:i,renderTextLayer:!1,renderAnnotationLayer:!1,width:re,scale:j,rotate:z,onRenderSuccess:()=>v==null?void 0:v(i)})})},f)})})},Ge=()=>{if(!E||!V||!ee)return null;const e=_e.PDFSidebar;return t.jsxRuntimeExports.jsx(e,{pdfDocument:ee,currentPage:i,onPageClick:We,components:{Tabs:u.Tabs,TabsList:u.TabsList,TabsTrigger:u.TabsTrigger,TabsContent:u.TabsContent,ScrollArea:u.ScrollArea,Skeleton:Se}})},Ke=()=>!de||o?null:t.jsxRuntimeExports.jsxs("div",{className:"fixed bottom-4 left-1/2 z-50 flex -translate-x-1/2 gap-2 md:hidden",children:[t.jsxRuntimeExports.jsxs(d,{variant:"secondary",size:"sm",onClick:()=>a(i-1),disabled:o||i<=1,title:o?"滚动模式下通过滚动定位页面":void 0,children:[t.jsxRuntimeExports.jsx(x.ChevronLeft,{}),t.jsxRuntimeExports.jsx("span",{className:"ml-1",children:"上一页"})]}),t.jsxRuntimeExports.jsxs(d,{variant:"secondary",size:"sm",onClick:()=>a(i+1),disabled:o||i>=m,title:o?"滚动模式下通过滚动定位页面":void 0,children:[t.jsxRuntimeExports.jsx("span",{className:"mr-1",children:"下一页"}),t.jsxRuntimeExports.jsx(x.ChevronRight,{})]})]});if(!u)return t.jsxRuntimeExports.jsx("div",{className:"p-4 text-center text-destructive",children:"错误:请通过 components prop 注入 UI 组件"});if(E){const e=[];if(u.Tabs||e.push("Tabs"),u.TabsList||e.push("TabsList"),u.TabsTrigger||e.push("TabsTrigger"),u.TabsContent||e.push("TabsContent"),u.ScrollArea||e.push("ScrollArea"),e.length>0){const s=e.length===1?e[0]:`${e.slice(0,-1).join("、")} 和 ${e[e.length-1]}`;return t.jsxRuntimeExports.jsxs("div",{className:"p-4 text-center text-destructive",children:["错误:侧边栏功能需要注入 ",s," 组件"]})}}return t.jsxRuntimeExports.jsxs("div",{ref:le,children:[t.jsxRuntimeExports.jsxs(we,{className:pe,children:[Le(),t.jsxRuntimeExports.jsx(De,{className:"p-0",style:{height:te?"100vh":Ee},children:t.jsxRuntimeExports.jsx("div",{className:"flex h-full flex-col",children:t.jsxRuntimeExports.jsxs("div",{className:"flex flex-1 overflow-hidden",children:[Ge(),Te?X():y?Y():qe()]})})})]}),Ke()]})}exports.PDFReader=Ve;
|
|
2
|
+
//# sourceMappingURL=pdf-reader.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-reader.cjs","sources":["../src/components/PDFReader.tsx"],"sourcesContent":["import {\n ChevronLeft as ChevronLeftIcon,\n ChevronRight as ChevronRightIcon,\n FileText as FileTextIcon,\n Maximize2 as Maximize2Icon,\n Minimize2 as Minimize2Icon,\n PanelLeft as PanelLeftIcon,\n RotateCw as RotateCwIcon,\n ScrollText as ScrollTextIcon,\n ZoomIn as ZoomInIcon,\n ZoomOut as ZoomOutIcon,\n} from 'lucide-react';\nimport { useState, useCallback, useEffect, useMemo, useRef } from 'react';\nimport type { HTMLAttributes } from 'react';\n\nimport type {\n CardComponent,\n ButtonComponent,\n InputComponent,\n SkeletonComponent,\n} from '../types/component-types';\n\nimport type { PDFDocumentProxy } from './PDFSidebar';\nimport { PDFSidebar } from './PDFSidebar';\n\n/**\n * PDFReader UI 组件接口\n */\nexport interface PDFReaderUIComponents {\n /** Card 组件 (必需) */\n Card: CardComponent;\n /** CardContent 组件 (必需) */\n CardContent: React.ComponentType<HTMLAttributes<HTMLDivElement>>;\n /** Button 组件 (必需) */\n Button: ButtonComponent;\n /** Input 组件 (必需) */\n Input: InputComponent;\n /** Skeleton 组件 (必需) */\n Skeleton: SkeletonComponent;\n /** Tabs 组件 (showSidebar=true 时必需) */\n Tabs?: React.ComponentType<{\n value?: string;\n onValueChange?: (value: string) => void;\n children?: React.ReactNode;\n defaultValue?: string;\n }>;\n /** TabsList 组件 (showSidebar=true 时必需) */\n TabsList?: React.ComponentType<HTMLAttributes<HTMLDivElement>>;\n /** TabsTrigger 组件 (showSidebar=true 时必需) */\n TabsTrigger?: React.ComponentType<{\n value: string;\n children?: React.ReactNode;\n }>;\n /** TabsContent 组件 (showSidebar=true 时必需) */\n TabsContent?: React.ComponentType<{\n value: string;\n children?: React.ReactNode;\n }>;\n /** ScrollArea 组件 (showSidebar=true 时必需) */\n ScrollArea?: React.ComponentType<HTMLAttributes<HTMLDivElement>>;\n}\n\n/**\n * PDFReader 组件 Props\n */\nexport interface PDFReaderProps {\n // ==================== 基础配置 ====================\n /** PDF 文件 URL (必需) */\n url: string;\n\n // ==================== 初始状态 ====================\n /** 初始页码 (默认 1) */\n initialPage?: number;\n /** 初始缩放比例 (默认 1.0) */\n initialScale?: number;\n /** 初始旋转角度 (默认 0) */\n initialRotation?: number;\n\n // ==================== 受控模式 ====================\n /** 当前页码 (受控) */\n currentPage?: number;\n /** 页码变化回调 */\n onPageChange?: (page: number) => void;\n /** 缩放比例 (受控) */\n scale?: number;\n /** 缩放变化回调 */\n onScaleChange?: (scale: number) => void;\n /** 旋转角度 (受控) */\n rotation?: number;\n /** 旋转变化回调 */\n onRotationChange?: (rotation: number) => void;\n\n // ==================== 缩放限制 ====================\n /** 最小缩放比例 (默认 0.5) */\n minScale?: number;\n /** 最大缩放比例 (默认 2.5) */\n maxScale?: number;\n\n // ==================== 功能开关 ====================\n /** 显示工具栏 (默认 true) */\n showToolbar?: boolean;\n /** 显示侧边栏 (默认 true) */\n showSidebar?: boolean;\n /** 显示旋转按钮 (默认 true) */\n showRotation?: boolean;\n /** 显示模式切换按钮 (默认 true) */\n showModeToggle?: boolean;\n /** 显示全屏按钮 (默认 true) */\n showFullscreen?: boolean;\n /** 启用键盘快捷键 (默认 true) */\n enableHotkeys?: boolean;\n /** 启用移动端导航 (默认 true) */\n enableMobileNav?: boolean;\n\n // ==================== 显示模式 ====================\n /** 显示模式: 'scroll' 显示所有页面, 'single' 单页模式 (默认 'single') */\n displayMode?: 'scroll' | 'single';\n\n // ==================== 样式定制 ====================\n /** 容器类名 */\n className?: string;\n /** 工具栏类名 */\n toolbarClassName?: string;\n /** 内容区域类名 */\n contentClassName?: string;\n /** 阅读区域高度限制 (默认 '80vh') */\n contentHeight?: string | number;\n /** 页面类名 */\n pageClassName?: string;\n\n // ==================== Worker 配置 ====================\n /** Worker 文件 URL (可选,默认使用 CDN) */\n workerUrl?: string;\n /** CMap 文件 URL (可选,默认使用 CDN) */\n cMapUrl?: string;\n /** 标准字体数据 URL (可选,默认使用 CDN) */\n standardFontDataUrl?: string;\n\n // ==================== UI 组件注入 ====================\n /** UI 组件 */\n components: PDFReaderUIComponents;\n\n // ==================== 回调函数 ====================\n /** 加载成功回调 */\n onLoadSuccess?: (pdf: PDFDocumentProxy) => void;\n /** 加载错误回调 */\n onLoadError?: (error: Error) => void;\n /** 页面渲染回调 */\n onPageRender?: (pageIndex: number) => void;\n\n // ==================== 文本配置 ====================\n /** 加载文本 (默认 '正在加载PDF文档...') */\n loadingText?: string;\n /** 错误文本 (默认 'PDF加载失败') */\n errorText?: string;\n}\n\n/**\n * debounce hook (替代 lodash.debounce)\n */\nfunction useDebounce<T extends (...args: any[]) => any>(\n callback: T,\n delay: number\n): T {\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | undefined>(\n undefined\n );\n return useCallback(\n (...args: Parameters<T>) => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n timeoutRef.current = setTimeout(() => callback(...args), delay);\n },\n [callback, delay]\n ) as T;\n}\n\n/**\n * PDFReader 组件\n *\n * 功能完整的 PDF 阅读器组件,支持侧边栏导航、页面旋转、显示模式切换等高级特性。\n *\n * @example\n * ```tsx\n * import { PDFReader } from '@turinhub/atomix-common-ui/pdf-reader';\n * import { Card, Button, Input, Label, Skeleton } from '@/components/ui';\n * import { Tabs, ScrollArea } from '@/components/ui';\n *\n * <PDFReader\n * url=\"/documents/sample.pdf\"\n * components={{\n * Card,\n * CardContent: Card.Content,\n * Button,\n * Input,\n * Label,\n * Skeleton,\n * Tabs,\n * TabsList: Tabs.List,\n * TabsTrigger: Tabs.Trigger,\n * TabsContent: Tabs.Content,\n * ScrollArea,\n * }}\n * initialPage={1}\n * initialScale={1.0}\n * showSidebar={true}\n * showRotation={true}\n * showModeToggle={true}\n * enableHotkeys={true}\n * />\n * ```\n */\nexport function PDFReader({\n url,\n initialPage = 1,\n initialScale = 1.0,\n initialRotation = 0,\n currentPage: controlledPage,\n onPageChange,\n scale: controlledScale,\n onScaleChange,\n rotation: controlledRotation,\n onRotationChange,\n minScale = 0.5,\n maxScale = 2.5,\n showToolbar = true,\n showSidebar = true,\n showRotation = true,\n showModeToggle = true,\n showFullscreen = true,\n enableHotkeys = true,\n enableMobileNav = true,\n displayMode: initialDisplayMode = 'single',\n className,\n toolbarClassName,\n contentClassName,\n contentHeight = '80vh',\n pageClassName,\n workerUrl,\n cMapUrl,\n standardFontDataUrl,\n components,\n onLoadSuccess,\n onLoadError,\n onPageRender,\n loadingText = '正在加载PDF文档...',\n errorText = 'PDF加载失败',\n}: PDFReaderProps) {\n // ==================== 状态管理 ====================\n const [pdfDocument, setPdfDocument] = useState<PDFDocumentProxy | null>(null);\n const [internalPage, setInternalPage] = useState(initialPage);\n const [internalScale, setInternalScale] = useState(initialScale);\n const [internalRotation, setInternalRotation] = useState(initialRotation);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [totalPages, setTotalPages] = useState(0);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const [showAllPages, setShowAllPages] = useState(\n initialDisplayMode === 'scroll'\n );\n const [showSidebarState, setShowSidebarState] = useState(showSidebar);\n\n // Sync showSidebarState with prop changes\n useEffect(() => {\n setShowSidebarState(showSidebar);\n }, [showSidebar]);\n\n const [pageWidth, setPageWidth] = useState<number | undefined>(undefined);\n\n // 动态导入 react-pdf\n const [ReactPDF, setReactPDF] = useState<any>(null);\n\n const readerRef = useRef<HTMLDivElement>(null);\n const pdfContainerRef = useRef<HTMLDivElement>(null);\n const pageRefs = useRef<Map<number, HTMLDivElement>>(new Map());\n\n // 使用受控或非受控模式\n const currentPage = controlledPage ?? internalPage;\n const scale = controlledScale ?? internalScale;\n const rotation = controlledRotation ?? internalRotation;\n const isPageControlled = controlledPage !== undefined;\n const isScrollMode = showAllPages;\n\n // ==================== 组件解构 ====================\n const { Card, CardContent, Button, Input, Skeleton } = components || {};\n\n useEffect(() => {\n setPdfDocument(null);\n setTotalPages(0);\n setError(null);\n setIsLoading(false);\n if (!isPageControlled) {\n setInternalPage(Math.max(1, initialPage));\n }\n }, [url, initialPage, isPageControlled]);\n\n // ==================== PDF 选项 ====================\n const pdfOptions = useMemo(() => {\n const options: Record<string, unknown> = {\n withCredentials: false,\n };\n\n if (cMapUrl) {\n options.cMapUrl = cMapUrl;\n options.cMapPacked = true;\n }\n\n if (standardFontDataUrl) {\n options.standardFontDataUrl = standardFontDataUrl;\n }\n\n return options;\n }, [cMapUrl, standardFontDataUrl]);\n\n // ==================== 动态导入 react-pdf ====================\n useEffect(() => {\n let isMounted = true;\n\n const loadReactPDF = async () => {\n try {\n // 动态导入 react-pdf\n const pdfModule = await import('react-pdf');\n\n // 设置 worker\n if (typeof window !== 'undefined') {\n const pdfjs = (pdfModule as any).pdfjs;\n const workerVersion = pdfjs?.version;\n\n if (pdfjs?.GlobalWorkerOptions && workerVersion) {\n if (workerUrl) {\n pdfjs.GlobalWorkerOptions.workerSrc = workerUrl;\n } else {\n // 使用 CDN\n pdfjs.GlobalWorkerOptions.workerSrc = `https://cdn.jsdelivr.net/npm/pdfjs-dist@${workerVersion}/build/pdf.worker.min.mjs`;\n }\n\n // 如果没有提供自定义 URL,使用 CDN 默认值\n if (!cMapUrl && pdfjs.GlobalWorkerOptions) {\n (pdfjs.GlobalWorkerOptions as any).cMapUrl =\n `https://unpkg.com/pdfjs-dist@${workerVersion}/cmaps/`;\n }\n if (!standardFontDataUrl && pdfjs.GlobalWorkerOptions) {\n (pdfjs.GlobalWorkerOptions as any).standardFontDataUrl =\n `https://unpkg.com/pdfjs-dist@${workerVersion}/standard_fonts/`;\n }\n }\n }\n\n if (isMounted) {\n setReactPDF(pdfModule);\n }\n } catch (err) {\n if (isMounted) {\n const loadError =\n err instanceof Error ? err : new Error('无法加载 react-pdf 库');\n setError(loadError);\n setIsLoading(false);\n onLoadError?.(loadError);\n }\n }\n };\n\n loadReactPDF();\n\n return () => {\n isMounted = false;\n };\n }, [workerUrl, cMapUrl, standardFontDataUrl, onLoadError]);\n\n // ==================== 处理加载错误 ====================\n const onDocumentLoadError = useCallback(\n (err: Error) => {\n console.error('PDF加载失败:', err);\n console.error('PDF URL:', url);\n setPdfDocument(null);\n setTotalPages(0);\n setError(\n new Error(`${errorText}: ${err.message || '请检查文件路径或网络连接'}`)\n );\n setIsLoading(false);\n onLoadError?.(err);\n },\n [url, errorText, onLoadError]\n );\n\n const onDocumentLoadSuccess = useCallback(\n (pdf: PDFDocumentProxy) => {\n setPdfDocument(pdf);\n setTotalPages(pdf.numPages);\n setError(null);\n setIsLoading(false);\n\n if (!isPageControlled) {\n setInternalPage((page) =>\n Math.max(1, Math.min(page, Math.max(pdf.numPages, 1)))\n );\n }\n\n onLoadSuccess?.(pdf);\n },\n [isPageControlled, onLoadSuccess]\n );\n\n // ==================== 页面导航 ====================\n const goToPage = useCallback(\n (page: number) => {\n if (!Number.isFinite(page)) return;\n const newPage =\n totalPages > 0\n ? Math.max(1, Math.min(Math.trunc(page), totalPages))\n : Math.max(1, Math.trunc(page));\n if (!isPageControlled) {\n setInternalPage(newPage);\n }\n if (newPage !== currentPage) {\n onPageChange?.(newPage);\n }\n },\n [totalPages, isPageControlled, currentPage, onPageChange]\n );\n\n const setPageRef = useCallback(\n (pageNumber: number, element: HTMLDivElement | null) => {\n if (element) {\n pageRefs.current.set(pageNumber, element);\n } else {\n pageRefs.current.delete(pageNumber);\n }\n },\n []\n );\n\n const syncScrollModeCurrentPage = useCallback(() => {\n const container = pdfContainerRef.current;\n if (!container || !isScrollMode || totalPages <= 0) return;\n\n const containerTop = container.getBoundingClientRect().top;\n let closestPage = currentPage;\n let closestDistance = Number.POSITIVE_INFINITY;\n\n pageRefs.current.forEach((element, pageNumber) => {\n const distance = Math.abs(\n element.getBoundingClientRect().top - containerTop\n );\n if (distance < closestDistance) {\n closestDistance = distance;\n closestPage = pageNumber;\n }\n });\n\n if (closestPage !== currentPage) {\n goToPage(closestPage);\n }\n }, [currentPage, goToPage, isScrollMode, totalPages]);\n\n // ==================== 缩放控制 ====================\n const zoom = useCallback(\n (delta: number) => {\n const newScale = Math.max(minScale, Math.min(maxScale, scale + delta));\n if (controlledScale === undefined) {\n setInternalScale(newScale);\n }\n onScaleChange?.(newScale);\n },\n [scale, minScale, maxScale, controlledScale, onScaleChange]\n );\n\n // ==================== 旋转控制 ====================\n const rotate = useCallback(() => {\n const newRotation = (rotation + 90) % 360;\n if (controlledRotation === undefined) {\n setInternalRotation(newRotation);\n }\n onRotationChange?.(newRotation);\n }, [rotation, controlledRotation, onRotationChange]);\n\n // ==================== 处理窗口大小变化 ====================\n const debouncedUpdatePageWidth = useDebounce((width: number) => {\n setPageWidth(width);\n }, 100);\n\n // Use ResizeObserver to track container size changes\n useEffect(() => {\n if (!pdfContainerRef.current) return;\n\n const container = pdfContainerRef.current;\n const updateWidth = () => {\n debouncedUpdatePageWidth(container.clientWidth);\n };\n\n // Initial measurement\n updateWidth();\n\n // Set up ResizeObserver\n const resizeObserver = new ResizeObserver(() => {\n updateWidth();\n });\n\n resizeObserver.observe(container);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [debouncedUpdatePageWidth]);\n\n // ==================== 键盘快捷键 ====================\n useEffect(() => {\n if (!enableHotkeys) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement | null;\n const activeElement =\n typeof document !== 'undefined'\n ? (document.activeElement as HTMLElement | null)\n : null;\n const focusedElement = target || activeElement;\n const role = focusedElement?.getAttribute('role');\n\n if (\n focusedElement &&\n (focusedElement.tagName === 'INPUT' ||\n focusedElement.tagName === 'TEXTAREA' ||\n focusedElement.tagName === 'SELECT' ||\n focusedElement.isContentEditable ||\n role === 'textbox' ||\n role === 'spinbutton')\n ) {\n return;\n }\n\n // Ctrl/Cmd + 加号: 放大\n if ((e.ctrlKey || e.metaKey) && (e.key === '=' || e.key === '+')) {\n e.preventDefault();\n zoom(0.1);\n }\n // Ctrl/Cmd + 减号: 缩小\n else if ((e.ctrlKey || e.metaKey) && e.key === '-') {\n e.preventDefault();\n zoom(-0.1);\n }\n // 左箭头: 上一页\n else if (!isScrollMode && e.key === 'ArrowLeft') {\n e.preventDefault();\n goToPage(currentPage - 1);\n }\n // 右箭头: 下一页\n else if (!isScrollMode && e.key === 'ArrowRight') {\n e.preventDefault();\n goToPage(currentPage + 1);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [enableHotkeys, currentPage, goToPage, isScrollMode, zoom]);\n\n // ==================== 全屏切换 ====================\n const toggleFullscreen = useCallback(async () => {\n if (typeof document === 'undefined') return;\n\n if (!document.fullscreenElement) {\n try {\n await readerRef.current?.requestFullscreen?.();\n setIsFullscreen(true);\n } catch (err) {\n console.error('Error attempting to enable fullscreen:', err);\n }\n } else {\n if (document.exitFullscreen) {\n await document.exitFullscreen();\n setIsFullscreen(false);\n }\n }\n }, []);\n\n // ==================== 监听全屏状态变化 ====================\n useEffect(() => {\n if (typeof document === 'undefined') return;\n\n const handleFullscreenChange = () => {\n setIsFullscreen(!!document.fullscreenElement);\n };\n\n document.addEventListener('fullscreenchange', handleFullscreenChange);\n return () => {\n document.removeEventListener('fullscreenchange', handleFullscreenChange);\n };\n }, []);\n\n // ==================== 处理侧边栏页面点击 ====================\n const handleSidebarPageClick = useCallback(\n (pageNumber: number) => {\n goToPage(pageNumber);\n setShowAllPages(false);\n },\n [goToPage]\n );\n\n // ==================== 渲染工具栏 ====================\n const renderToolbar = () => {\n if (!showToolbar) return null;\n\n return (\n <div\n className={`flex items-center justify-between gap-4 border-b px-4 py-2 ${toolbarClassName || ''}`}\n >\n <div className=\"flex items-center gap-2\">\n {/* 侧边栏切换 */}\n {showSidebar && (\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={() => setShowSidebarState(!showSidebarState)}\n title={showSidebarState ? '隐藏侧边栏' : '显示侧边栏'}\n >\n <PanelLeftIcon />\n </Button>\n )}\n\n {/* 缩放控制 */}\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={() => zoom(-0.1)}\n disabled={scale <= minScale}\n >\n <ZoomOutIcon />\n </Button>\n <span className=\"min-w-[3rem] text-center text-sm\">\n {Math.round(scale * 100)}%\n </span>\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={() => zoom(0.1)}\n disabled={scale >= maxScale}\n >\n <ZoomInIcon />\n </Button>\n\n {/* 旋转控制 */}\n {showRotation && (\n <Button variant=\"outline\" size=\"icon\" onClick={rotate}>\n <RotateCwIcon />\n </Button>\n )}\n\n {/* 显示模式切换 */}\n {showModeToggle && (\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={() => setShowAllPages(!showAllPages)}\n title={showAllPages ? '单页模式' : '滚动模式'}\n >\n {showAllPages ? <ScrollTextIcon /> : <FileTextIcon />}\n </Button>\n )}\n\n {/* 全屏切换 */}\n {showFullscreen && (\n <Button variant=\"outline\" size=\"icon\" onClick={toggleFullscreen}>\n {isFullscreen ? <Minimize2Icon /> : <Maximize2Icon />}\n </Button>\n )}\n </div>\n\n <div className=\"flex items-center gap-2\">\n {!isScrollMode && (\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={() => goToPage(currentPage - 1)}\n disabled={currentPage <= 1}\n >\n <ChevronLeftIcon />\n </Button>\n )}\n\n <Input\n type=\"number\"\n min={1}\n max={totalPages}\n value={currentPage}\n onChange={(e) => goToPage(parseInt(e.target.value) || 1)}\n disabled={isScrollMode}\n readOnly={isScrollMode}\n title={isScrollMode ? '滚动模式下页码仅显示当前位置' : undefined}\n className=\"w-16 text-center\"\n />\n <span className=\"text-sm text-muted-foreground\">/ {totalPages}</span>\n\n {!isScrollMode && (\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={() => goToPage(currentPage + 1)}\n disabled={totalPages > 0 && currentPage >= totalPages}\n >\n <ChevronRightIcon />\n </Button>\n )}\n </div>\n </div>\n );\n };\n\n // ==================== 渲染加载状态 ====================\n const renderLoading = () => (\n <div className=\"flex h-full items-center justify-center\">\n <p className=\"text-muted-foreground\">{loadingText}</p>\n </div>\n );\n\n // ==================== 渲染错误状态 ====================\n const renderError = () => (\n <div className=\"flex h-full min-h-[400px] items-center justify-center px-4 text-center text-destructive\">\n <div className=\"max-w-md\">\n <p className=\"mb-2 text-lg font-medium\">文件加载失败</p>\n <p className=\"text-sm opacity-80\">{error?.message}</p>\n </div>\n </div>\n );\n\n // ==================== 渲染 PDF 文档 ====================\n const renderPDFDocument = () => {\n if (!ReactPDF) return renderLoading();\n\n const { Document, Page } = ReactPDF;\n\n return (\n <div\n ref={pdfContainerRef}\n onScroll={isScrollMode ? syncScrollModeCurrentPage : undefined}\n className={`pdf-container flex-1 overflow-y-auto ${contentClassName || ''}`}\n >\n <div className=\"flex min-h-full justify-center px-4\">\n <Document\n key={url}\n file={url}\n onLoadError={onDocumentLoadError}\n options={pdfOptions}\n loading={renderLoading()}\n error={renderError()}\n onLoadSuccess={onDocumentLoadSuccess}\n >\n {error ? (\n renderError()\n ) : showAllPages ? (\n // 显示所有页面模式\n Array.from(new Array(totalPages), (_el, index) => (\n <div\n key={`page_${index + 1}`}\n ref={(element) => setPageRef(index + 1, element)}\n data-page-number={index + 1}\n className={`mb-4 ${pageClassName || ''}`}\n >\n <Page\n pageNumber={index + 1}\n renderTextLayer={false}\n renderAnnotationLayer={false}\n width={pageWidth}\n scale={scale}\n rotate={rotation}\n onRenderSuccess={() => onPageRender?.(index + 1)}\n />\n </div>\n ))\n ) : (\n // 单页模式\n <div className={pageClassName || ''}>\n <Page\n pageNumber={currentPage}\n renderTextLayer={false}\n renderAnnotationLayer={false}\n width={pageWidth}\n scale={scale}\n rotate={rotation}\n onRenderSuccess={() => onPageRender?.(currentPage)}\n />\n </div>\n )}\n </Document>\n </div>\n </div>\n );\n };\n\n // ==================== 渲染侧边栏 ====================\n const renderSidebar = () => {\n if (!showSidebar || !showSidebarState || !pdfDocument) return null;\n\n // 使用导入的 PDFSidebar 组件\n const PDFSidebarComponent = PDFSidebar;\n\n return (\n <PDFSidebarComponent\n pdfDocument={pdfDocument}\n currentPage={currentPage}\n onPageClick={handleSidebarPageClick}\n components={{\n Tabs: components.Tabs!,\n TabsList: components.TabsList!,\n TabsTrigger: components.TabsTrigger!,\n TabsContent: components.TabsContent!,\n ScrollArea: components.ScrollArea!,\n Skeleton,\n }}\n />\n );\n };\n\n // ==================== 渲染移动端导航 ====================\n const renderMobileNav = () => {\n if (!enableMobileNav || isScrollMode) return null;\n\n return (\n <div className=\"fixed bottom-4 left-1/2 z-50 flex -translate-x-1/2 gap-2 md:hidden\">\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => goToPage(currentPage - 1)}\n disabled={isScrollMode || currentPage <= 1}\n title={isScrollMode ? '滚动模式下通过滚动定位页面' : undefined}\n >\n <ChevronLeftIcon />\n <span className=\"ml-1\">上一页</span>\n </Button>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => goToPage(currentPage + 1)}\n disabled={isScrollMode || currentPage >= totalPages}\n title={isScrollMode ? '滚动模式下通过滚动定位页面' : undefined}\n >\n <span className=\"mr-1\">下一页</span>\n <ChevronRightIcon />\n </Button>\n </div>\n );\n };\n\n // ==================== 组件验证 ====================\n if (!components) {\n return (\n <div className=\"p-4 text-center text-destructive\">\n 错误:请通过 components prop 注入 UI 组件\n </div>\n );\n }\n\n // 验证侧边栏所需的所有组件\n if (showSidebar) {\n const missingComponents: string[] = [];\n if (!components.Tabs) missingComponents.push('Tabs');\n if (!components.TabsList) missingComponents.push('TabsList');\n if (!components.TabsTrigger) missingComponents.push('TabsTrigger');\n if (!components.TabsContent) missingComponents.push('TabsContent');\n if (!components.ScrollArea) missingComponents.push('ScrollArea');\n\n if (missingComponents.length > 0) {\n const missingComponentsText =\n missingComponents.length === 1\n ? missingComponents[0]\n : `${missingComponents.slice(0, -1).join('、')} 和 ${missingComponents[missingComponents.length - 1]}`;\n return (\n <div className=\"p-4 text-center text-destructive\">\n 错误:侧边栏功能需要注入 {missingComponentsText} 组件\n </div>\n );\n }\n }\n\n return (\n <div ref={readerRef}>\n <Card className={className}>\n {renderToolbar()}\n <CardContent\n className=\"p-0\"\n style={{ height: isFullscreen ? '100vh' : contentHeight }}\n >\n <div className=\"flex h-full flex-col\">\n {/* PDF 显示区域 */}\n <div className=\"flex flex-1 overflow-hidden\">\n {renderSidebar()}\n {isLoading\n ? renderLoading()\n : error\n ? renderError()\n : renderPDFDocument()}\n </div>\n </div>\n </CardContent>\n </Card>\n {renderMobileNav()}\n </div>\n );\n}\n"],"names":["useDebounce","callback","delay","timeoutRef","useRef","useCallback","args","PDFReader","url","initialPage","initialScale","initialRotation","controlledPage","onPageChange","controlledScale","onScaleChange","controlledRotation","onRotationChange","minScale","maxScale","showToolbar","showSidebar","showRotation","showModeToggle","showFullscreen","enableHotkeys","enableMobileNav","initialDisplayMode","className","toolbarClassName","contentClassName","contentHeight","pageClassName","workerUrl","cMapUrl","standardFontDataUrl","components","onLoadSuccess","onLoadError","onPageRender","loadingText","errorText","pdfDocument","setPdfDocument","useState","internalPage","setInternalPage","internalScale","setInternalScale","internalRotation","setInternalRotation","isLoading","setIsLoading","error","setError","totalPages","setTotalPages","isFullscreen","setIsFullscreen","showAllPages","setShowAllPages","showSidebarState","setShowSidebarState","useEffect","pageWidth","setPageWidth","ReactPDF","setReactPDF","readerRef","pdfContainerRef","pageRefs","currentPage","scale","rotation","isPageControlled","isScrollMode","Card","CardContent","Button","Input","Skeleton","pdfOptions","useMemo","options","isMounted","pdfModule","pdfjs","workerVersion","err","loadError","onDocumentLoadError","onDocumentLoadSuccess","pdf","page","goToPage","newPage","setPageRef","pageNumber","element","syncScrollModeCurrentPage","container","containerTop","closestPage","closestDistance","distance","zoom","delta","newScale","rotate","newRotation","debouncedUpdatePageWidth","width","updateWidth","resizeObserver","handleKeyDown","e","target","activeElement","focusedElement","role","toggleFullscreen","_b","_a","handleFullscreenChange","handleSidebarPageClick","renderToolbar","jsxs","jsx","PanelLeftIcon","ZoomOutIcon","ZoomInIcon","RotateCwIcon","ScrollTextIcon","FileTextIcon","Minimize2Icon","Maximize2Icon","ChevronLeftIcon","ChevronRightIcon","renderLoading","renderError","renderPDFDocument","Document","Page","_el","index","renderSidebar","PDFSidebarComponent","PDFSidebar","renderMobileNav","missingComponents","missingComponentsText"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-reader.d.ts","sourceRoot":"","sources":["../src/pdf-reader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,YAAY,EACV,cAAc,EACd,qBAAqB,GACtB,MAAM,wBAAwB,CAAC"}
|