@eternalheart/react-file-preview 1.4.0 → 1.5.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.
Files changed (161) hide show
  1. package/README.md +437 -60
  2. package/README.zh-CN.md +437 -60
  3. package/lib/FilePreviewContent.d.ts +1 -0
  4. package/lib/FilePreviewContent.d.ts.map +1 -1
  5. package/lib/FilePreviewEmbed.d.ts +2 -0
  6. package/lib/FilePreviewEmbed.d.ts.map +1 -1
  7. package/lib/FilePreviewModal.d.ts +2 -0
  8. package/lib/FilePreviewModal.d.ts.map +1 -1
  9. package/lib/chunks/index-2sX2d4iv.mjs +291 -0
  10. package/lib/chunks/index-2sX2d4iv.mjs.map +1 -0
  11. package/lib/chunks/index-Bdj8_B80.mjs +120 -0
  12. package/lib/chunks/index-Bdj8_B80.mjs.map +1 -0
  13. package/lib/chunks/index-CCcZzLUM.mjs +107 -0
  14. package/lib/chunks/index-CCcZzLUM.mjs.map +1 -0
  15. package/lib/chunks/{index-CzM2mxrD.mjs → index-CKdQL1Bk.mjs} +130 -128
  16. package/lib/chunks/{index-CzM2mxrD.mjs.map → index-CKdQL1Bk.mjs.map} +1 -1
  17. package/lib/chunks/index-CQYrhe7Z.mjs +275 -0
  18. package/lib/chunks/index-CQYrhe7Z.mjs.map +1 -0
  19. package/lib/chunks/{index-DuP0Tlpo.mjs → index-CRZqNMQ7.mjs} +43 -41
  20. package/lib/chunks/index-CRZqNMQ7.mjs.map +1 -0
  21. package/lib/chunks/{index-Cp68OevR.mjs → index-CTghYlSh.mjs} +1299 -1297
  22. package/lib/chunks/{index-Cp68OevR.mjs.map → index-CTghYlSh.mjs.map} +1 -1
  23. package/lib/chunks/index-CuTz7dbd.mjs +313 -0
  24. package/lib/chunks/index-CuTz7dbd.mjs.map +1 -0
  25. package/lib/chunks/index-CuWzRQZw.mjs +116 -0
  26. package/lib/chunks/index-CuWzRQZw.mjs.map +1 -0
  27. package/lib/chunks/index-Cz23v-TW.mjs +2409 -0
  28. package/lib/chunks/index-Cz23v-TW.mjs.map +1 -0
  29. package/lib/chunks/{index-kALp0tqz.mjs → index-D-Is8qvU.mjs} +22 -20
  30. package/lib/chunks/index-D-Is8qvU.mjs.map +1 -0
  31. package/lib/chunks/index-Da3FN2-3.mjs +359 -0
  32. package/lib/chunks/index-Da3FN2-3.mjs.map +1 -0
  33. package/lib/chunks/index-Dc6q1OKl.mjs +78 -0
  34. package/lib/chunks/index-Dc6q1OKl.mjs.map +1 -0
  35. package/lib/chunks/{index-10O8tfTH.mjs → index-DoGKcq9y.mjs} +194 -192
  36. package/lib/chunks/index-DoGKcq9y.mjs.map +1 -0
  37. package/lib/chunks/{index-C_BJatqr.mjs → index-DzCLf1Db.mjs} +42 -40
  38. package/lib/chunks/index-DzCLf1Db.mjs.map +1 -0
  39. package/lib/chunks/index-FomaQSaL.mjs +329 -0
  40. package/lib/chunks/index-FomaQSaL.mjs.map +1 -0
  41. package/lib/chunks/{index-DaAXRBWL.mjs → index-OXjOFggq.mjs} +864 -862
  42. package/lib/chunks/{index-DaAXRBWL.mjs.map → index-OXjOFggq.mjs.map} +1 -1
  43. package/lib/chunks/index-WLepq2g2.mjs +200 -0
  44. package/lib/chunks/index-WLepq2g2.mjs.map +1 -0
  45. package/lib/chunks/{index-DoFsoBKL.mjs → index-_B5marES.mjs} +27 -25
  46. package/lib/chunks/index-_B5marES.mjs.map +1 -0
  47. package/lib/chunks/useShikiHighlight-Bbs8Fbqs.mjs +36 -0
  48. package/lib/chunks/useShikiHighlight-Bbs8Fbqs.mjs.map +1 -0
  49. package/lib/components/preview/FilePreviewToolbar.d.ts +1 -0
  50. package/lib/components/preview/FilePreviewToolbar.d.ts.map +1 -1
  51. package/lib/components/preview/ToolbarButton.d.ts +3 -1
  52. package/lib/components/preview/ToolbarButton.d.ts.map +1 -1
  53. package/lib/hooks/index.d.ts +0 -6
  54. package/lib/hooks/index.d.ts.map +1 -1
  55. package/lib/hooks/useShikiHighlight.d.ts +3 -1
  56. package/lib/hooks/useShikiHighlight.d.ts.map +1 -1
  57. package/lib/index.cjs +32 -30
  58. package/lib/index.cjs.map +1 -1
  59. package/lib/index.css +1 -1
  60. package/lib/index.mjs +1 -1
  61. package/lib/renderers/Audio/index.d.ts +2 -1
  62. package/lib/renderers/Audio/index.d.ts.map +1 -1
  63. package/lib/renderers/Csv/index.d.ts +2 -1
  64. package/lib/renderers/Csv/index.d.ts.map +1 -1
  65. package/lib/renderers/Docx/index.d.ts +2 -1
  66. package/lib/renderers/Docx/index.d.ts.map +1 -1
  67. package/lib/renderers/Epub/index.d.ts +2 -3
  68. package/lib/renderers/Epub/index.d.ts.map +1 -1
  69. package/lib/renderers/Font/index.d.ts +2 -1
  70. package/lib/renderers/Font/index.d.ts.map +1 -1
  71. package/lib/renderers/Image/index.d.ts +6 -7
  72. package/lib/renderers/Image/index.d.ts.map +1 -1
  73. package/lib/renderers/Json/index.d.ts +2 -1
  74. package/lib/renderers/Json/index.d.ts.map +1 -1
  75. package/lib/renderers/Markdown/index.d.ts +2 -2
  76. package/lib/renderers/Markdown/index.d.ts.map +1 -1
  77. package/lib/renderers/Mobi/index.d.ts +2 -3
  78. package/lib/renderers/Mobi/index.d.ts.map +1 -1
  79. package/lib/renderers/Msg/index.d.ts +2 -1
  80. package/lib/renderers/Msg/index.d.ts.map +1 -1
  81. package/lib/renderers/Pdf/index.d.ts +4 -8
  82. package/lib/renderers/Pdf/index.d.ts.map +1 -1
  83. package/lib/renderers/Pptx/index.d.ts +2 -1
  84. package/lib/renderers/Pptx/index.d.ts.map +1 -1
  85. package/lib/renderers/Subtitle/index.d.ts +2 -1
  86. package/lib/renderers/Subtitle/index.d.ts.map +1 -1
  87. package/lib/renderers/Text/index.d.ts +2 -3
  88. package/lib/renderers/Text/index.d.ts.map +1 -1
  89. package/lib/renderers/Video/index.d.ts +2 -1
  90. package/lib/renderers/Video/index.d.ts.map +1 -1
  91. package/lib/renderers/Xlsx/index.d.ts +2 -1
  92. package/lib/renderers/Xlsx/index.d.ts.map +1 -1
  93. package/lib/renderers/Xml/index.d.ts +2 -1
  94. package/lib/renderers/Xml/index.d.ts.map +1 -1
  95. package/lib/renderers/Zip/index.d.ts +7 -2
  96. package/lib/renderers/Zip/index.d.ts.map +1 -1
  97. package/lib/renderers/base.types.d.ts +38 -0
  98. package/lib/renderers/base.types.d.ts.map +1 -0
  99. package/lib/renderers/registry.d.ts +36 -0
  100. package/lib/renderers/registry.d.ts.map +1 -0
  101. package/lib/renderers/toolbar.types.d.ts +2 -0
  102. package/lib/renderers/toolbar.types.d.ts.map +1 -1
  103. package/lib/toolbar/renderItems.d.ts.map +1 -1
  104. package/package.json +3 -3
  105. package/lib/chunks/index-0v5STX5f.mjs +0 -105
  106. package/lib/chunks/index-0v5STX5f.mjs.map +0 -1
  107. package/lib/chunks/index-10O8tfTH.mjs.map +0 -1
  108. package/lib/chunks/index-BCyv1HM9.mjs +0 -175
  109. package/lib/chunks/index-BCyv1HM9.mjs.map +0 -1
  110. package/lib/chunks/index-Bo90aGhy.mjs +0 -114
  111. package/lib/chunks/index-Bo90aGhy.mjs.map +0 -1
  112. package/lib/chunks/index-CEeKt7L3.mjs +0 -2808
  113. package/lib/chunks/index-CEeKt7L3.mjs.map +0 -1
  114. package/lib/chunks/index-CWKbnvW6.mjs +0 -270
  115. package/lib/chunks/index-CWKbnvW6.mjs.map +0 -1
  116. package/lib/chunks/index-C_BJatqr.mjs.map +0 -1
  117. package/lib/chunks/index-Cbz5Z6ZK.mjs +0 -263
  118. package/lib/chunks/index-Cbz5Z6ZK.mjs.map +0 -1
  119. package/lib/chunks/index-DTYBFuAH.mjs +0 -357
  120. package/lib/chunks/index-DTYBFuAH.mjs.map +0 -1
  121. package/lib/chunks/index-DoFsoBKL.mjs.map +0 -1
  122. package/lib/chunks/index-DuP0Tlpo.mjs.map +0 -1
  123. package/lib/chunks/index-Dv3RQz86.mjs +0 -270
  124. package/lib/chunks/index-Dv3RQz86.mjs.map +0 -1
  125. package/lib/chunks/index-QfpHck8N.mjs +0 -55
  126. package/lib/chunks/index-QfpHck8N.mjs.map +0 -1
  127. package/lib/chunks/index-gjSQeou7.mjs +0 -194
  128. package/lib/chunks/index-gjSQeou7.mjs.map +0 -1
  129. package/lib/chunks/index-kALp0tqz.mjs.map +0 -1
  130. package/lib/chunks/index-kCeSnFs-.mjs +0 -54
  131. package/lib/chunks/index-kCeSnFs-.mjs.map +0 -1
  132. package/lib/chunks/useShikiHighlight-BA9qgdGA.mjs +0 -23
  133. package/lib/chunks/useShikiHighlight-BA9qgdGA.mjs.map +0 -1
  134. package/lib/hooks/rendererReducer.d.ts +0 -10
  135. package/lib/hooks/rendererReducer.d.ts.map +0 -1
  136. package/lib/hooks/types.d.ts +0 -152
  137. package/lib/hooks/types.d.ts.map +0 -1
  138. package/lib/hooks/useBookRenderer.d.ts +0 -14
  139. package/lib/hooks/useBookRenderer.d.ts.map +0 -1
  140. package/lib/hooks/useFilePreviewState.d.ts +0 -10
  141. package/lib/hooks/useFilePreviewState.d.ts.map +0 -1
  142. package/lib/hooks/useImageAutoFit.d.ts +0 -13
  143. package/lib/hooks/useImageAutoFit.d.ts.map +0 -1
  144. package/lib/hooks/useToolbarConfig.d.ts +0 -25
  145. package/lib/hooks/useToolbarConfig.d.ts.map +0 -1
  146. package/lib/renderers/Epub/toolbar.d.ts +0 -13
  147. package/lib/renderers/Epub/toolbar.d.ts.map +0 -1
  148. package/lib/renderers/Image/toolbar.d.ts +0 -15
  149. package/lib/renderers/Image/toolbar.d.ts.map +0 -1
  150. package/lib/renderers/Markdown/toolbar.d.ts +0 -9
  151. package/lib/renderers/Markdown/toolbar.d.ts.map +0 -1
  152. package/lib/renderers/Mobi/toolbar.d.ts +0 -13
  153. package/lib/renderers/Mobi/toolbar.d.ts.map +0 -1
  154. package/lib/renderers/Pdf/toolbar.d.ts +0 -16
  155. package/lib/renderers/Pdf/toolbar.d.ts.map +0 -1
  156. package/lib/renderers/Text/toolbar.d.ts +0 -12
  157. package/lib/renderers/Text/toolbar.d.ts.map +0 -1
  158. package/lib/renderers/Zip/toolbar.d.ts +0 -13
  159. package/lib/renderers/Zip/toolbar.d.ts.map +0 -1
  160. package/lib/toolbar/registry.d.ts +0 -51
  161. package/lib/toolbar/registry.d.ts.map +0 -1
@@ -1,270 +0,0 @@
1
- import { jsxs as v, jsx as f } from "react/jsx-runtime";
2
- import { useState as k, useRef as b, useCallback as h, useEffect as y } from "react";
3
- import { u as W } from "./index-CEeKt7L3.mjs";
4
- import { R as D } from "./RendererError-D5i8eSpN.mjs";
5
- import { X as ee } from "lucide-react";
6
- import * as re from "pdfjs-dist/build/pdf.mjs";
7
- const ce = ({
8
- url: N,
9
- zoom: C,
10
- currentPage: w,
11
- showOutline: R = !1,
12
- onPageChange: T,
13
- onTotalPagesChange: V,
14
- onPageWidthChange: L,
15
- onToggleOutline: M
16
- }) => {
17
- const j = W(), [E, O] = k(0), [I, q] = k(null), [Q, $] = k(!0), [B, U] = k([]), [S, X] = k(null), A = b(/* @__PURE__ */ new Map()), Y = b(null), u = b(null), a = b(null), o = b(/* @__PURE__ */ new Map()), p = b(null), F = h(async (t, r) => {
18
- if (!a.current) return;
19
- const e = o.current.get(t);
20
- if (!(!e || e.rendering)) {
21
- e.rendering = !0;
22
- try {
23
- const n = await a.current.getPage(t), c = n.getViewport({ scale: r }), s = document.createElement("canvas");
24
- s.width = c.width, s.height = c.height, s.style.maxWidth = "100%", s.style.height = "auto", s.style.borderRadius = "0", s.style.display = "block";
25
- const i = s.getContext("2d");
26
- if (!i) return;
27
- const l = n.render({ canvasContext: i, viewport: c });
28
- if (e.renderTask = l, await l.promise, t === 1 && L) {
29
- const x = n.getViewport({ scale: 1 });
30
- L(x.width);
31
- }
32
- e.element.innerHTML = "", e.element.appendChild(s), e.rendered = !0;
33
- } catch (n) {
34
- (n == null ? void 0 : n.name) !== "RenderingCancelledException" && console.error(`渲染页面 ${t} 失败:`, n);
35
- } finally {
36
- e.rendering = !1, e.renderTask = null;
37
- }
38
- }
39
- }, [L]), P = h((t) => {
40
- const r = o.current.get(t);
41
- if (!r) return;
42
- r.renderTask && (r.renderTask.cancel(), r.renderTask = null);
43
- const e = r.element.querySelector("canvas");
44
- if (e) {
45
- const n = e.getContext("2d");
46
- n && n.clearRect(0, 0, e.width, e.height), e.remove();
47
- }
48
- r.element.innerHTML = "", r.rendered = !1, r.rendering = !1;
49
- }, []), K = async (t, r, e = 0) => {
50
- var n, c, s;
51
- for (let i = 0; i < t.length; i++) {
52
- const l = t[i], x = `${l.title}-${i}-${e}`;
53
- try {
54
- let d = null;
55
- const m = l.dest;
56
- if (typeof m == "string") {
57
- const g = await ((n = r.getDestination) == null ? void 0 : n.call(r, m));
58
- g && g[0] && typeof g[0] == "object" && (d = await ((c = r.getPageIndex) == null ? void 0 : c.call(r, g[0])) + 1);
59
- } else Array.isArray(m) && m[0] && typeof m[0] == "object" && (d = await ((s = r.getPageIndex) == null ? void 0 : s.call(r, m[0])) + 1);
60
- d !== null && d > 0 && A.current.set(x, d), l.items && l.items.length > 0 && await K(l.items, r, e + 1);
61
- } catch {
62
- }
63
- }
64
- }, z = h((t) => {
65
- let r = null, e = 1 / 0;
66
- A.current.forEach((n, c) => {
67
- if (n <= t) {
68
- const s = t - n;
69
- s < e && (e = s, r = c);
70
- }
71
- }), r !== S && X(r);
72
- }, [S]);
73
- y(() => {
74
- w > 0 && A.current.size > 0 && z(w);
75
- }, [w, z]);
76
- const _ = h(() => {
77
- if (!a.current || !u.current) return;
78
- const t = u.current.querySelector(".pdf-pages");
79
- if (t) {
80
- t.innerHTML = "", o.current.clear();
81
- for (let r = 1; r <= E; r++) {
82
- const e = document.createElement("div");
83
- e.className = "rfp-relative rfp-flex rfp-justify-center rfp-min-h-[800px]", e.setAttribute("data-page-number", String(r)), t.appendChild(e), o.current.set(r, {
84
- element: e,
85
- rendered: !1,
86
- rendering: !1,
87
- renderTask: null
88
- }), p.current && p.current.observe(e);
89
- }
90
- }
91
- }, [E]), G = h(async () => {
92
- if (q(null), $(!0), O(0), a.current) {
93
- try {
94
- a.current.destroy();
95
- } catch {
96
- }
97
- a.current = null;
98
- }
99
- try {
100
- const t = re.getDocument({ url: N });
101
- a.current = await t.promise;
102
- const r = a.current.numPages;
103
- O(r), V(r), T(1);
104
- try {
105
- const e = await a.current.getOutline();
106
- e && (U(e), A.current.clear(), await K(e, a.current));
107
- } catch (e) {
108
- console.warn("PDF 大纲提取失败:", e);
109
- }
110
- $(!1);
111
- } catch (t) {
112
- console.error("PDF 加载错误:", t), q(j("pdf.load_failed")), $(!1);
113
- }
114
- }, [N, V, T, j]), H = h(() => {
115
- if (!u.current || o.current.size === 0) return;
116
- const t = u.current, r = t.scrollTop, e = t.clientHeight, n = r + e / 2;
117
- let c = 1, s = 1 / 0;
118
- o.current.forEach((i, l) => {
119
- const x = i.element.getBoundingClientRect(), d = t.getBoundingClientRect(), m = x.top - d.top + x.height / 2 + r, g = Math.abs(m - n);
120
- g < s && (s = g, c = l);
121
- }), c !== w && T(c);
122
- }, [w, T]);
123
- y(() => (p.current = new IntersectionObserver(
124
- (t) => {
125
- t.forEach((r) => {
126
- const e = Number(r.target.getAttribute("data-page-number"));
127
- if (e)
128
- if (r.isIntersecting)
129
- F(e, C);
130
- else {
131
- const n = o.current.get(e);
132
- n && n.rendered && P(e);
133
- }
134
- });
135
- },
136
- {
137
- root: u.current,
138
- rootMargin: "500px 0px",
139
- threshold: 0
140
- }
141
- ), () => {
142
- p.current && (p.current.disconnect(), p.current = null);
143
- }), [C, F, P]), y(() => {
144
- N && G();
145
- }, [N, G]), y(() => {
146
- E > 0 && setTimeout(() => {
147
- _();
148
- }, 0);
149
- }, [E, _]), y(() => {
150
- const t = setTimeout(() => {
151
- o.current.forEach((r, e) => {
152
- r.rendered && P(e);
153
- }), p.current && u.current && o.current.forEach((r) => {
154
- var e, n;
155
- (e = p.current) == null || e.unobserve(r.element), (n = p.current) == null || n.observe(r.element);
156
- });
157
- }, 150);
158
- return () => clearTimeout(t);
159
- }, [C, P]), y(() => {
160
- const t = u.current;
161
- if (t)
162
- return t.addEventListener("scroll", H), () => t.removeEventListener("scroll", H);
163
- }, [H]), y(() => () => {
164
- if (o.current.forEach((t) => {
165
- t.renderTask && t.renderTask.cancel();
166
- }), o.current.clear(), a.current) {
167
- try {
168
- a.current.destroy();
169
- } catch {
170
- }
171
- a.current = null;
172
- }
173
- }, []);
174
- const Z = h(async (t, r, e) => {
175
- if (!(!a.current || !u.current))
176
- try {
177
- let n;
178
- if (typeof t == "string") {
179
- const i = await a.current.getDestination(t);
180
- if (i && i[0]) {
181
- const l = i[0];
182
- n = await a.current.getPageIndex(l) + 1;
183
- } else
184
- return;
185
- } else if (Array.isArray(t) && t[0]) {
186
- const i = t[0];
187
- n = await a.current.getPageIndex(i) + 1;
188
- } else
189
- return;
190
- X(r);
191
- const s = u.current.querySelectorAll("[data-page-number]")[n - 1];
192
- s && s.scrollIntoView({ behavior: "smooth", block: "start" }), e && setTimeout(() => e(), 300);
193
- } catch (n) {
194
- console.error("大纲跳转失败:", n);
195
- }
196
- }, []), J = (t, r = 0, e) => /* @__PURE__ */ f("ul", { style: { marginLeft: r > 0 ? 16 : 0 }, children: t.map((n, c) => {
197
- const s = `${n.title}-${c}-${r}`;
198
- return /* @__PURE__ */ v("li", { children: [
199
- /* @__PURE__ */ f(
200
- "button",
201
- {
202
- onClick: () => Z(n.dest, s, e),
203
- className: `rfp-w-full rfp-text-left rfp-py-2 rfp-px-3 rfp-text-sm rfp-rounded rfp-transition-all rfp-truncate ${S === s ? "rfp-bg-surface-2 rfp-text-fg-primary rfp-font-medium" : "rfp-text-fg-secondary hover:rfp-text-fg-primary hover:rfp-bg-surface-2"}`,
204
- title: n.title,
205
- children: n.title
206
- }
207
- ),
208
- n.items && n.items.length > 0 && J(n.items, r + 1, e)
209
- ] }, s);
210
- }) });
211
- return /* @__PURE__ */ v("div", { ref: Y, className: "rfp-relative rfp-w-full rfp-h-full", children: [
212
- B.length > 0 && /* @__PURE__ */ v(
213
- "div",
214
- {
215
- className: "rfp-absolute rfp-inset-0 rfp-z-20 rfp-flex rfp-transition-opacity rfp-duration-300",
216
- style: {
217
- opacity: R ? 1 : 0,
218
- pointerEvents: R ? "auto" : "none"
219
- },
220
- children: [
221
- /* @__PURE__ */ v(
222
- "div",
223
- {
224
- className: "rfp-w-72 rfp-max-w-[80%] rfp-h-full rfp-bg-surface-overlay rfp-backdrop-blur-xl rfp-border-r rfp-border-line-weak rfp-flex rfp-flex-col rfp-shadow-2xl rfp-transition-transform rfp-duration-300",
225
- style: { transform: R ? "translateX(0)" : "translateX(-100%)" },
226
- children: [
227
- /* @__PURE__ */ v("div", { className: "rfp-flex rfp-items-center rfp-justify-between rfp-px-4 rfp-py-3 rfp-border-b rfp-border-line-weak rfp-flex-shrink-0", children: [
228
- /* @__PURE__ */ f("span", { className: "rfp-text-fg-primary rfp-font-medium rfp-text-sm", children: j("toolbar.outline") }),
229
- /* @__PURE__ */ f(
230
- "button",
231
- {
232
- onClick: M,
233
- className: "rfp-text-fg-tertiary hover:rfp-text-fg-primary rfp-transition-colors",
234
- children: /* @__PURE__ */ f(ee, { className: "rfp-w-4 rfp-h-4" })
235
- }
236
- )
237
- ] }),
238
- /* @__PURE__ */ f("div", { className: "rfp-flex-1 rfp-overflow-y-auto rfp-py-4 rfp-px-1", children: J(B, 0, M) })
239
- ]
240
- }
241
- ),
242
- /* @__PURE__ */ f(
243
- "div",
244
- {
245
- className: "rfp-flex-1 rfp-transition-opacity rfp-duration-300",
246
- style: { background: R ? "rgba(0,0,0,0.3)" : "transparent" },
247
- onClick: M
248
- }
249
- )
250
- ]
251
- }
252
- ),
253
- /* @__PURE__ */ v(
254
- "div",
255
- {
256
- ref: u,
257
- className: "rfp-w-full rfp-h-full rfp-overflow-auto rfp-py-6 rfp-px-4",
258
- children: [
259
- I && /* @__PURE__ */ f(D, { message: I }),
260
- !I && Q && /* @__PURE__ */ f("div", { className: "rfp-flex rfp-items-center rfp-justify-center rfp-min-h-screen", children: /* @__PURE__ */ f("div", { className: "rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin" }) }),
261
- !I && /* @__PURE__ */ f("div", { className: "rfp-flex rfp-flex-col rfp-items-center", children: /* @__PURE__ */ f("div", { className: "pdf-pages rfp-flex rfp-flex-col rfp-gap-4" }) })
262
- ]
263
- }
264
- )
265
- ] });
266
- };
267
- export {
268
- ce as PdfRenderer
269
- };
270
- //# sourceMappingURL=index-Dv3RQz86.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-Dv3RQz86.mjs","sources":["../../src/renderers/Pdf/index.tsx"],"sourcesContent":["import { useState, useEffect, useRef, useCallback } from 'react';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { RendererError } from '../RendererError';\nimport { X } from 'lucide-react';\n// @ts-ignore - pdfjs-dist 类型路径\nimport * as pdfjsLib from 'pdfjs-dist/build/pdf.mjs';\n\ninterface PdfOutlineItem {\n title: string;\n dest: any;\n items?: PdfOutlineItem[];\n}\n\ninterface PdfPageProxy {\n getViewport(opts: { scale: number }): { width: number; height: number };\n render(opts: { canvasContext: CanvasRenderingContext2D; viewport: { width: number; height: number } }): {\n promise: Promise<void>;\n cancel(): void;\n };\n}\n\ninterface PdfDocumentProxy {\n numPages: number;\n getPage(pageNumber: number): Promise<PdfPageProxy>;\n getOutline(): Promise<PdfOutlineItem[] | null>;\n destroy(): void;\n}\n\ninterface PageState {\n element: HTMLDivElement;\n rendered: boolean;\n rendering: boolean;\n renderTask: { cancel(): void } | null;\n}\n\ninterface PdfRendererProps {\n url: string;\n zoom: number;\n currentPage: number;\n showOutline?: boolean;\n onPageChange: (page: number) => void;\n onTotalPagesChange: (total: number) => void;\n onPageWidthChange?: (width: number) => void;\n onToggleOutline?: () => void;\n}\n\nexport const PdfRenderer: React.FC<PdfRendererProps> = ({\n url,\n zoom,\n currentPage,\n showOutline = false,\n onPageChange,\n onTotalPagesChange,\n onPageWidthChange,\n onToggleOutline,\n}) => {\n const t = useTranslator();\n const [numPages, setNumPages] = useState<number>(0);\n const [error, setError] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState<boolean>(true);\n const [outline, setOutline] = useState<PdfOutlineItem[]>([]);\n const [activeOutlineItem, setActiveOutlineItem] = useState<string | null>(null);\n const outlinePageMapRef = useRef<Map<string, number>>(new Map());\n const containerRef = useRef<HTMLDivElement>(null);\n const scrollContainerRef = useRef<HTMLDivElement>(null);\n const pdfDocRef = useRef<PdfDocumentProxy | null>(null);\n const pageStatesRef = useRef<Map<number, PageState>>(new Map());\n const observerRef = useRef<IntersectionObserver | null>(null);\n\n // 渲染单个页面\n const renderPage = useCallback(async (pageNumber: number, scale: number) => {\n if (!pdfDocRef.current) return;\n const state = pageStatesRef.current.get(pageNumber);\n if (!state || state.rendering) return;\n\n state.rendering = true;\n\n try {\n const page = await pdfDocRef.current.getPage(pageNumber);\n const viewport = page.getViewport({ scale });\n\n const canvas = document.createElement('canvas');\n canvas.width = viewport.width;\n canvas.height = viewport.height;\n canvas.style.maxWidth = '100%';\n canvas.style.height = 'auto';\n canvas.style.borderRadius = '0';\n canvas.style.display = 'block';\n\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const renderTask = page.render({ canvasContext: ctx, viewport });\n state.renderTask = renderTask;\n await renderTask.promise;\n\n // 上报第一页原始宽度\n if (pageNumber === 1 && onPageWidthChange) {\n const baseViewport = page.getViewport({ scale: 1 });\n onPageWidthChange(baseViewport.width);\n }\n\n state.element.innerHTML = '';\n state.element.appendChild(canvas);\n\n state.rendered = true;\n } catch (err: any) {\n if (err?.name !== 'RenderingCancelledException') {\n console.error(`渲染页面 ${pageNumber} 失败:`, err);\n }\n } finally {\n state.rendering = false;\n state.renderTask = null;\n }\n }, [onPageWidthChange]);\n\n // 清理页面 canvas\n const clearPageCanvas = useCallback((pageNumber: number) => {\n const state = pageStatesRef.current.get(pageNumber);\n if (!state) return;\n\n // 取消正在进行的渲染\n if (state.renderTask) {\n state.renderTask.cancel();\n state.renderTask = null;\n }\n\n // 清理 canvas\n const canvas = state.element.querySelector('canvas');\n if (canvas) {\n const ctx = canvas.getContext('2d');\n if (ctx) {\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n }\n canvas.remove();\n }\n\n state.element.innerHTML = '';\n state.rendered = false;\n state.rendering = false;\n }, []);\n\n // 初始化页面占位符\n // 构建大纲-页码映射\n const buildOutlinePageMap = async (items: PdfOutlineItem[], pdfDoc: PdfDocumentProxy, depth = 0) => {\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n const itemKey = `${item.title}-${i}-${depth}`;\n\n try {\n let pageNumber: number | null = null;\n const dest = item.dest;\n\n if (typeof dest === 'string') {\n const namedDest = await (pdfDoc as any).getDestination?.(dest);\n if (namedDest && namedDest[0] && typeof namedDest[0] === 'object') {\n pageNumber = await (pdfDoc as any).getPageIndex?.(namedDest[0]) + 1;\n }\n } else if (Array.isArray(dest) && dest[0] && typeof dest[0] === 'object') {\n pageNumber = await (pdfDoc as any).getPageIndex?.(dest[0]) + 1;\n }\n\n if (pageNumber !== null && pageNumber > 0) {\n outlinePageMapRef.current.set(itemKey, pageNumber);\n }\n\n if (item.items && item.items.length > 0) {\n await buildOutlinePageMap(item.items, pdfDoc, depth + 1);\n }\n } catch (err) {\n // 静默失败,某些大纲项可能无法映射到页码\n }\n }\n };\n\n // 根据当前页码更新激活的大纲项\n const updateActiveOutlineByPage = useCallback((page: number) => {\n let closestItem: string | null = null;\n let closestDistance = Infinity;\n\n outlinePageMapRef.current.forEach((itemPage, itemKey) => {\n if (itemPage <= page) {\n const distance = page - itemPage;\n if (distance < closestDistance) {\n closestDistance = distance;\n closestItem = itemKey;\n }\n }\n });\n\n if (closestItem !== activeOutlineItem) {\n setActiveOutlineItem(closestItem);\n }\n }, [activeOutlineItem]);\n\n // 监听页码变化,更新大纲高亮\n useEffect(() => {\n if (currentPage > 0 && outlinePageMapRef.current.size > 0) {\n updateActiveOutlineByPage(currentPage);\n }\n }, [currentPage, updateActiveOutlineByPage]);\n\n const initPagePlaceholders = useCallback(() => {\n if (!pdfDocRef.current || !scrollContainerRef.current) return;\n\n const wrapper = scrollContainerRef.current.querySelector('.pdf-pages') as HTMLDivElement | null;\n if (!wrapper) return;\n\n wrapper.innerHTML = '';\n pageStatesRef.current.clear();\n\n for (let i = 1; i <= numPages; i++) {\n const pageDiv = document.createElement('div');\n pageDiv.className = 'rfp-relative rfp-flex rfp-justify-center rfp-min-h-[800px]';\n pageDiv.setAttribute('data-page-number', String(i));\n wrapper.appendChild(pageDiv);\n\n pageStatesRef.current.set(i, {\n element: pageDiv,\n rendered: false,\n rendering: false,\n renderTask: null,\n });\n\n // 观察页面元素\n if (observerRef.current) {\n observerRef.current.observe(pageDiv);\n }\n }\n }, [numPages]);\n\n // 加载 PDF 文档\n const loadPdf = useCallback(async () => {\n setError(null);\n setIsLoading(true);\n setNumPages(0);\n\n if (pdfDocRef.current) {\n try {\n pdfDocRef.current.destroy();\n } catch {\n // ignore\n }\n pdfDocRef.current = null;\n }\n\n try {\n const loadingTask = pdfjsLib.getDocument({ url });\n pdfDocRef.current = (await loadingTask.promise) as PdfDocumentProxy;\n const total = pdfDocRef.current.numPages;\n\n setNumPages(total);\n onTotalPagesChange(total);\n onPageChange(1);\n\n // 提取大纲\n try {\n const outlineData = await pdfDocRef.current.getOutline();\n if (outlineData) {\n setOutline(outlineData);\n // 构建大纲-页码映射\n outlinePageMapRef.current.clear();\n await buildOutlinePageMap(outlineData, pdfDocRef.current);\n }\n } catch (err) {\n console.warn('PDF 大纲提取失败:', err);\n }\n\n setIsLoading(false);\n } catch (err) {\n console.error('PDF 加载错误:', err);\n setError(t('pdf.load_failed'));\n setIsLoading(false);\n }\n }, [url, onTotalPagesChange, onPageChange, t]);\n\n // 滚动处理\n const handleScroll = useCallback(() => {\n if (!scrollContainerRef.current || pageStatesRef.current.size === 0) return;\n\n const container = scrollContainerRef.current;\n const scrollTop = container.scrollTop;\n const containerHeight = container.clientHeight;\n const scrollCenter = scrollTop + containerHeight / 2;\n\n let currentVisiblePage = 1;\n let minDistance = Infinity;\n\n pageStatesRef.current.forEach((state, pageNumber) => {\n const rect = state.element.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect();\n const pageCenter = rect.top - containerRect.top + rect.height / 2 + scrollTop;\n const distance = Math.abs(pageCenter - scrollCenter);\n\n if (distance < minDistance) {\n minDistance = distance;\n currentVisiblePage = pageNumber;\n }\n });\n\n if (currentVisiblePage !== currentPage) {\n onPageChange(currentVisiblePage);\n }\n }, [currentPage, onPageChange]);\n\n // 初始化 IntersectionObserver\n useEffect(() => {\n observerRef.current = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n const pageNumber = Number(entry.target.getAttribute('data-page-number'));\n if (!pageNumber) return;\n\n if (entry.isIntersecting) {\n // 页面进入视口,渲染\n renderPage(pageNumber, zoom);\n } else {\n // 页面离开视口,清理\n const state = pageStatesRef.current.get(pageNumber);\n if (state && state.rendered) {\n clearPageCanvas(pageNumber);\n }\n }\n });\n },\n {\n root: scrollContainerRef.current,\n rootMargin: '500px 0px',\n threshold: 0,\n }\n );\n\n return () => {\n if (observerRef.current) {\n observerRef.current.disconnect();\n observerRef.current = null;\n }\n };\n }, [zoom, renderPage, clearPageCanvas]);\n\n // 监听 URL 变化\n useEffect(() => {\n // 只有 URL 有效时才加载(避免空字符串或已 revoke 的 blob URL)\n if (url) {\n loadPdf();\n }\n }, [url, loadPdf]);\n\n // 监听 numPages 变化,初始化占位符\n useEffect(() => {\n if (numPages > 0) {\n // 等待 DOM 更新后初始化占位符\n setTimeout(() => {\n initPagePlaceholders();\n }, 0);\n }\n }, [numPages, initPagePlaceholders]);\n\n // 监听 zoom 变化(防抖)\n useEffect(() => {\n const timer = setTimeout(() => {\n // 清理所有已渲染页面\n pageStatesRef.current.forEach((state, pageNumber) => {\n if (state.rendered) {\n clearPageCanvas(pageNumber);\n }\n });\n\n // 触发重新渲染\n if (observerRef.current && scrollContainerRef.current) {\n pageStatesRef.current.forEach((state) => {\n observerRef.current?.unobserve(state.element);\n observerRef.current?.observe(state.element);\n });\n }\n }, 150);\n\n return () => clearTimeout(timer);\n }, [zoom, clearPageCanvas]);\n\n // 监听滚动事件\n useEffect(() => {\n const container = scrollContainerRef.current;\n if (!container) return;\n\n container.addEventListener('scroll', handleScroll);\n return () => container.removeEventListener('scroll', handleScroll);\n }, [handleScroll]);\n\n // 清理\n useEffect(() => {\n return () => {\n // 清理所有渲染任务\n pageStatesRef.current.forEach((state) => {\n if (state.renderTask) {\n state.renderTask.cancel();\n }\n });\n pageStatesRef.current.clear();\n\n if (pdfDocRef.current) {\n try {\n pdfDocRef.current.destroy();\n } catch {\n // ignore\n }\n pdfDocRef.current = null;\n }\n };\n }, []);\n\n // 处理大纲点击跳转\n const handleOutlineClick = useCallback(async (dest: any, itemKey: string, onClose?: () => void) => {\n if (!pdfDocRef.current || !scrollContainerRef.current) return;\n\n try {\n let pageNumber: number;\n\n if (typeof dest === 'string') {\n // 命名目标\n const namedDest = await (pdfDocRef.current as any).getDestination(dest);\n if (namedDest && namedDest[0]) {\n const pageRef = namedDest[0];\n pageNumber = await (pdfDocRef.current as any).getPageIndex(pageRef) + 1;\n } else {\n return;\n }\n } else if (Array.isArray(dest) && dest[0]) {\n // 直接页面引用\n const pageRef = dest[0];\n pageNumber = await (pdfDocRef.current as any).getPageIndex(pageRef) + 1;\n } else {\n return;\n }\n\n // 设置激活项\n setActiveOutlineItem(itemKey);\n\n // 滚动到目标页面\n const pages = scrollContainerRef.current.querySelectorAll('[data-page-number]');\n const targetPage = pages[pageNumber - 1];\n if (targetPage) {\n targetPage.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n\n // 跳转后自动关闭侧边栏\n if (onClose) {\n setTimeout(() => onClose(), 300);\n }\n } catch (err) {\n console.error('大纲跳转失败:', err);\n }\n }, []);\n\n // 渲染大纲项\n const renderOutlineItems = (items: PdfOutlineItem[], depth = 0, onClose?: () => void): React.ReactNode => {\n return (\n <ul style={{ marginLeft: depth > 0 ? 16 : 0 }}>\n {items.map((item, i) => {\n const itemKey = `${item.title}-${i}-${depth}`;\n const isActive = activeOutlineItem === itemKey;\n return (\n <li key={itemKey}>\n <button\n onClick={() => handleOutlineClick(item.dest, itemKey, onClose)}\n className={`rfp-w-full rfp-text-left rfp-py-2 rfp-px-3 rfp-text-sm rfp-rounded rfp-transition-all rfp-truncate ${\n isActive\n ? 'rfp-bg-surface-2 rfp-text-fg-primary rfp-font-medium'\n : 'rfp-text-fg-secondary hover:rfp-text-fg-primary hover:rfp-bg-surface-2'\n }`}\n title={item.title}\n >\n {item.title}\n </button>\n {item.items && item.items.length > 0 && renderOutlineItems(item.items, depth + 1, onClose)}\n </li>\n );\n })}\n </ul>\n );\n };\n\n return (\n <div ref={containerRef} className=\"rfp-relative rfp-w-full rfp-h-full\">\n {/* 大纲侧边栏 */}\n {outline.length > 0 && (\n <div\n className=\"rfp-absolute rfp-inset-0 rfp-z-20 rfp-flex rfp-transition-opacity rfp-duration-300\"\n style={{\n opacity: showOutline ? 1 : 0,\n pointerEvents: showOutline ? 'auto' : 'none',\n }}\n >\n <div\n className=\"rfp-w-72 rfp-max-w-[80%] rfp-h-full rfp-bg-surface-overlay rfp-backdrop-blur-xl rfp-border-r rfp-border-line-weak rfp-flex rfp-flex-col rfp-shadow-2xl rfp-transition-transform rfp-duration-300\"\n style={{ transform: showOutline ? 'translateX(0)' : 'translateX(-100%)' }}\n >\n <div className=\"rfp-flex rfp-items-center rfp-justify-between rfp-px-4 rfp-py-3 rfp-border-b rfp-border-line-weak rfp-flex-shrink-0\">\n <span className=\"rfp-text-fg-primary rfp-font-medium rfp-text-sm\">{t('toolbar.outline')}</span>\n <button\n onClick={onToggleOutline}\n className=\"rfp-text-fg-tertiary hover:rfp-text-fg-primary rfp-transition-colors\"\n >\n <X className=\"rfp-w-4 rfp-h-4\" />\n </button>\n </div>\n <div className=\"rfp-flex-1 rfp-overflow-y-auto rfp-py-4 rfp-px-1\">\n {renderOutlineItems(outline, 0, onToggleOutline)}\n </div>\n </div>\n <div\n className=\"rfp-flex-1 rfp-transition-opacity rfp-duration-300\"\n style={{ background: showOutline ? 'rgba(0,0,0,0.3)' : 'transparent' }}\n onClick={onToggleOutline}\n />\n </div>\n )}\n\n <div\n ref={scrollContainerRef}\n className=\"rfp-w-full rfp-h-full rfp-overflow-auto rfp-py-6 rfp-px-4\"\n >\n {error && (\n <RendererError message={error} />\n )}\n\n {!error && isLoading && (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-min-h-screen\">\n <div className=\"rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n )}\n\n {!error && (\n <div className=\"rfp-flex rfp-flex-col rfp-items-center\">\n <div className=\"pdf-pages rfp-flex rfp-flex-col rfp-gap-4\" />\n </div>\n )}\n </div>\n </div>\n );\n};\n"],"names":["PdfRenderer","url","zoom","currentPage","showOutline","onPageChange","onTotalPagesChange","onPageWidthChange","onToggleOutline","t","useTranslator","numPages","setNumPages","useState","error","setError","isLoading","setIsLoading","outline","setOutline","activeOutlineItem","setActiveOutlineItem","outlinePageMapRef","useRef","containerRef","scrollContainerRef","pdfDocRef","pageStatesRef","observerRef","renderPage","useCallback","pageNumber","scale","state","page","viewport","canvas","ctx","renderTask","baseViewport","err","clearPageCanvas","buildOutlinePageMap","items","pdfDoc","depth","item","itemKey","dest","namedDest","_a","_b","_c","updateActiveOutlineByPage","closestItem","closestDistance","itemPage","distance","useEffect","initPagePlaceholders","wrapper","i","pageDiv","loadPdf","loadingTask","pdfjsLib","total","outlineData","handleScroll","container","scrollTop","containerHeight","scrollCenter","currentVisiblePage","minDistance","rect","containerRect","pageCenter","entries","entry","timer","handleOutlineClick","onClose","pageRef","targetPage","renderOutlineItems","jsx","jsxs","X","RendererError"],"mappings":"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"}
@@ -1,55 +0,0 @@
1
- import { jsx as r } from "react/jsx-runtime";
2
- import { useState as s, useEffect as b } from "react";
3
- import { u as x, a as y, y as v, E } from "./index-CEeKt7L3.mjs";
4
- import { u as N } from "./useShikiHighlight-BA9qgdGA.mjs";
5
- import { R as T } from "./RendererError-D5i8eSpN.mjs";
6
- const C = ({
7
- url: l,
8
- fileName: f,
9
- wordWrap: n = !0,
10
- htmlPreview: m = !1
11
- }) => {
12
- const d = x(), h = y(), [o, g] = s(""), [w, a] = s(!0), [p, i] = s(null), e = v(f), { html: c } = N(
13
- e !== "text" ? o : "",
14
- e
15
- );
16
- return b(() => {
17
- const u = new AbortController();
18
- return (async () => {
19
- try {
20
- a(!0), i(null);
21
- const t = await E(l, { fetcher: h, signal: u.signal });
22
- g(t);
23
- } catch (t) {
24
- if (t.name === "AbortError") return;
25
- i(d("text.load_failed")), console.error(t);
26
- } finally {
27
- a(!1);
28
- }
29
- })(), () => u.abort();
30
- }, [l]), w ? /* @__PURE__ */ r("div", { className: "rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full", children: /* @__PURE__ */ r("div", { className: "rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin" }) }) : p ? /* @__PURE__ */ r(T, { message: p }) : m && e === "html" ? /* @__PURE__ */ r("div", { className: "rfp-w-full rfp-h-full rfp-bg-surface-toolbar", children: /* @__PURE__ */ r(
31
- "iframe",
32
- {
33
- srcDoc: o,
34
- sandbox: "allow-same-origin",
35
- className: "rfp-w-full rfp-h-full rfp-border-0",
36
- title: f
37
- }
38
- ) }) : /* @__PURE__ */ r("div", { className: "rfp-w-full rfp-h-full rfp-overflow-auto rfp-bg-code-bg", children: e === "text" || !c ? /* @__PURE__ */ r(
39
- "pre",
40
- {
41
- className: `rfp-py-6 rfp-px-4 rfp-text-fg-primary rfp-font-mono rfp-text-sm ${n ? "rfp-whitespace-pre-wrap rfp-break-words" : "rfp-whitespace-pre"}`,
42
- children: o
43
- }
44
- ) : /* @__PURE__ */ r(
45
- "div",
46
- {
47
- className: `rfp-shiki-wrapper with-line-numbers ${n ? "" : "no-wrap"}`,
48
- dangerouslySetInnerHTML: { __html: c }
49
- }
50
- ) });
51
- };
52
- export {
53
- C as TextRenderer
54
- };
55
- //# sourceMappingURL=index-QfpHck8N.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-QfpHck8N.mjs","sources":["../../src/renderers/Text/index.tsx"],"sourcesContent":["import { useState, useEffect } from 'react';\nimport { fetchTextUtf8, getLanguageFromFileName } from '@eternalheart/file-preview-core';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { useFetcher } from '../../RequestContext';\nimport { useShikiHighlight } from '../../hooks/useShikiHighlight';\nimport { RendererError } from '../RendererError';\n\ninterface TextRendererProps {\n url: string;\n fileName: string;\n wordWrap?: boolean;\n htmlPreview?: boolean;\n}\n\nexport const TextRenderer: React.FC<TextRendererProps> = ({\n url,\n fileName,\n wordWrap = true,\n htmlPreview = false,\n}) => {\n const t = useTranslator();\n const fetcher = useFetcher();\n const [content, setContent] = useState<string>('');\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const language = getLanguageFromFileName(fileName);\n const { html: highlighted } = useShikiHighlight(\n language !== 'text' ? content : '',\n language,\n );\n\n useEffect(() => {\n const controller = new AbortController();\n const loadText = async () => {\n try {\n setLoading(true);\n setError(null);\n const text = await fetchTextUtf8(url, { fetcher, signal: controller.signal });\n setContent(text);\n } catch (err: any) {\n if (err.name === 'AbortError') return;\n setError(t('text.load_failed'));\n console.error(err);\n } finally {\n setLoading(false);\n }\n };\n\n loadText();\n return () => controller.abort();\n }, [url]);\n\n if (loading) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n );\n }\n\n if (error) {\n return <RendererError message={error} />;\n }\n\n // HTML 预览模式\n if (htmlPreview && (language === 'html')) {\n return (\n <div className=\"rfp-w-full rfp-h-full rfp-bg-surface-toolbar\">\n <iframe\n srcDoc={content}\n sandbox=\"allow-same-origin\"\n className=\"rfp-w-full rfp-h-full rfp-border-0\"\n title={fileName}\n />\n </div>\n );\n }\n\n // 源码模式\n return (\n <div className=\"rfp-w-full rfp-h-full rfp-overflow-auto rfp-bg-code-bg\">\n {language === 'text' || !highlighted ? (\n <pre\n className={`rfp-py-6 rfp-px-4 rfp-text-fg-primary rfp-font-mono rfp-text-sm ${\n wordWrap ? 'rfp-whitespace-pre-wrap rfp-break-words' : 'rfp-whitespace-pre'\n }`}\n >\n {content}\n </pre>\n ) : (\n <div\n className={`rfp-shiki-wrapper with-line-numbers ${wordWrap ? '' : 'no-wrap'}`}\n dangerouslySetInnerHTML={{ __html: highlighted }}\n />\n )}\n </div>\n );\n};\n"],"names":["TextRenderer","url","fileName","wordWrap","htmlPreview","t","useTranslator","fetcher","useFetcher","content","setContent","useState","loading","setLoading","error","setError","language","getLanguageFromFileName","highlighted","useShikiHighlight","useEffect","controller","text","fetchTextUtf8","err","jsx","RendererError"],"mappings":";;;;;AAcO,MAAMA,IAA4C,CAAC;AAAA,EACxD,KAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,aAAAC,IAAc;AAChB,MAAM;AACJ,QAAMC,IAAIC,EAAA,GACJC,IAAUC,EAAA,GACV,CAACC,GAASC,CAAU,IAAIC,EAAiB,EAAE,GAC3C,CAACC,GAASC,CAAU,IAAIF,EAAS,EAAI,GACrC,CAACG,GAAOC,CAAQ,IAAIJ,EAAwB,IAAI,GAChDK,IAAWC,EAAwBf,CAAQ,GAC3C,EAAE,MAAMgB,EAAA,IAAgBC;AAAA,IAC5BH,MAAa,SAASP,IAAU;AAAA,IAChCO;AAAA,EAAA;AAwBF,SArBAI,EAAU,MAAM;AACd,UAAMC,IAAa,IAAI,gBAAA;AAgBvB,YAfiB,YAAY;AAC3B,UAAI;AACF,QAAAR,EAAW,EAAI,GACfE,EAAS,IAAI;AACb,cAAMO,IAAO,MAAMC,EAActB,GAAK,EAAE,SAAAM,GAAS,QAAQc,EAAW,QAAQ;AAC5E,QAAAX,EAAWY,CAAI;AAAA,MACjB,SAASE,GAAU;AACjB,YAAIA,EAAI,SAAS,aAAc;AAC/B,QAAAT,EAASV,EAAE,kBAAkB,CAAC,GAC9B,QAAQ,MAAMmB,CAAG;AAAA,MACnB,UAAA;AACE,QAAAX,EAAW,EAAK;AAAA,MAClB;AAAA,IACF,GAEA,GACO,MAAMQ,EAAW,MAAA;AAAA,EAC1B,GAAG,CAACpB,CAAG,CAAC,GAEJW,IAEA,gBAAAa,EAAC,SAAI,WAAU,sEACb,4BAAC,OAAA,EAAI,WAAU,qHAAoH,EAAA,CACrI,IAIAX,IACK,gBAAAW,EAACC,GAAA,EAAc,SAASZ,EAAA,CAAO,IAIpCV,KAAgBY,MAAa,SAE7B,gBAAAS,EAAC,OAAA,EAAI,WAAU,gDACb,UAAA,gBAAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,QAAQhB;AAAA,MACR,SAAQ;AAAA,MACR,WAAU;AAAA,MACV,OAAOP;AAAA,IAAA;AAAA,EAAA,GAEX,sBAMD,OAAA,EAAI,WAAU,0DACZ,UAAAc,MAAa,UAAU,CAACE,IACvB,gBAAAO;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,mEACTtB,IAAW,4CAA4C,oBACzD;AAAA,MAEC,UAAAM;AAAA,IAAA;AAAA,EAAA,IAGH,gBAAAgB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,uCAAuCtB,IAAW,KAAK,SAAS;AAAA,MAC3E,yBAAyB,EAAE,QAAQe,EAAA;AAAA,IAAY;AAAA,EAAA,GAGrD;AAEJ;"}
@@ -1,194 +0,0 @@
1
- import { jsxs as x, jsx as o } from "react/jsx-runtime";
2
- import { forwardRef as lr, useRef as p, useState as d, useCallback as c, useImperativeHandle as cr, useEffect as pr } from "react";
3
- import { X as dr } from "lucide-react";
4
- import "foliate-js/view.js";
5
- import { u as ur, a as mr } from "./index-CEeKt7L3.mjs";
6
- import { R as hr } from "./RendererError-D5i8eSpN.mjs";
7
- const br = `
8
- @namespace epub "http://www.idpf.org/2007/ops";
9
- html { color-scheme: light; }
10
- body {
11
- background: #ffffff !important;
12
- color: #1a1a1a !important;
13
- font-family: "Noto Serif SC", "Source Han Serif SC", Georgia, "Times New Roman", serif !important;
14
- font-size: 16px !important;
15
- line-height: 2 !important;
16
- max-width: 100% !important;
17
- box-sizing: border-box !important;
18
- word-break: break-word !important;
19
- overflow-wrap: break-word !important;
20
- }
21
- p, li, blockquote, dd { line-height: 2; text-align: justify; }
22
- p { text-indent: 2em; margin: 0.8em 0; }
23
- h1 { text-align: center; margin: 1.5em 0 1em; }
24
- h2 { margin: 1.2em 0 0.8em; }
25
- h3 { margin: 1em 0 0.6em; }
26
- img { max-width: 100% !important; height: auto !important; }
27
- a { color: #2563eb; text-decoration: none; }
28
- pre { white-space: pre-wrap !important; }
29
- `, xr = 794, wr = lr(
30
- ({ url: w, onChapterChange: A, onFullWidthChange: j }, Q) => {
31
- const z = ur(), Y = mr(), C = p(null), i = p(null), g = p(A), y = p(j);
32
- g.current = A, y.current = j;
33
- const M = p(1), [Z, S] = d(!0), [v, F] = d(null), [H, I] = d([]), [k, u] = d(!1), [$, T] = d(""), [L, rr] = d(!1), P = p(!1);
34
- P.current = L;
35
- const N = c((e, t) => {
36
- var r;
37
- t > 0 && (M.current = t), (r = g.current) == null || r.call(g, Math.max(1, e + 1), M.current);
38
- }, []), W = c(() => {
39
- const e = i.current;
40
- e && e.prev().catch(() => {
41
- });
42
- }, []), X = c(() => {
43
- const e = i.current;
44
- e && e.next().catch(() => {
45
- });
46
- }, []), _ = c(() => u((e) => !e), []), D = c(() => {
47
- var m;
48
- const e = !P.current;
49
- rr(e), (m = y.current) == null || m.call(y, e);
50
- const t = i.current;
51
- if (!t) return;
52
- const r = t.renderer;
53
- r && r.setAttribute("max-inline-size", e ? "9999" : "720");
54
- }, []), er = c((e) => {
55
- var t;
56
- T(e), u(!1), (t = i.current) == null || t.goTo(e).catch(() => {
57
- });
58
- }, []);
59
- cr(Q, () => ({
60
- prevPage: W,
61
- nextPage: X,
62
- toggleFullWidth: D,
63
- toggleToc: _
64
- }), [W, X, D, _]), pr(() => {
65
- const e = C.current;
66
- if (!e || !w) return;
67
- S(!0), F(null), I([]), u(!1), T(""), e.replaceChildren();
68
- let t = !1, r = null;
69
- return (async () => {
70
- var a, s, h, q, G, V;
71
- try {
72
- if (t) return;
73
- r = document.createElement("foliate-view"), e.appendChild(r), i.current = r, r.addEventListener("relocate", (J) => {
74
- var K, O;
75
- const f = J.detail;
76
- if (!f) return;
77
- const b = f.location;
78
- if (b && typeof b.current == "number" && typeof b.total == "number")
79
- N(b.current, b.total);
80
- else {
81
- const ar = ((O = (K = i.current) == null ? void 0 : K.book) == null ? void 0 : O.sections) ?? [], sr = f.index ?? 0, ir = f.fraction ?? 0, E = Math.max(ar.length, 1), fr = Math.round((sr + ir) / E * E);
82
- N(fr, E);
83
- }
84
- const R = f.tocItem;
85
- R != null && R.href && T(R.href);
86
- });
87
- const l = await Y(w);
88
- if (!l.ok) throw new Error(`请求失败: ${l.status}`);
89
- const or = await l.blob();
90
- let B = "book.mobi";
91
- try {
92
- const f = new URL(w, window.location.href).pathname.split("/").pop();
93
- f && (B = decodeURIComponent(f));
94
- } catch {
95
- }
96
- const nr = new File([or], B);
97
- if (await r.open(nr), t) {
98
- (s = (a = r.book) == null ? void 0 : a.destroy) == null || s.call(a);
99
- return;
100
- }
101
- const n = r.renderer;
102
- n && (n.setAttribute("animated", ""), n.setAttribute("max-inline-size", "720"), n.setAttribute("margin", "48"), n.setAttribute("gap", "5%"), (h = n.setStyles) == null || h.call(n, br), await ((q = n.next) == null ? void 0 : q.call(n))), I(((G = r.book) == null ? void 0 : G.toc) ?? []), S(!1), N(0, ((V = r.book) == null ? void 0 : V.sections.length) ?? 1);
103
- } catch (l) {
104
- console.warn("[MobiRenderer] Failed to load ebook:", l instanceof Error ? l.message : String(l)), t || (F(z("mobi.load_failed")), S(!1));
105
- }
106
- })(), () => {
107
- var a, s, h;
108
- t = !0;
109
- try {
110
- (h = (s = (a = i.current) == null ? void 0 : a.book) == null ? void 0 : s.destroy) == null || h.call(s);
111
- } catch {
112
- }
113
- i.current = null, e.replaceChildren();
114
- };
115
- }, [w, N]);
116
- const tr = c(
117
- (e) => !!e && e === $,
118
- [$]
119
- ), U = (e, t = 0) => /* @__PURE__ */ o("ul", { style: { listStyle: "none", padding: 0, margin: t > 0 ? "0 0 0 16px" : 0 }, children: e.map((r, m) => {
120
- var a, s;
121
- return /* @__PURE__ */ x("li", { children: [
122
- r.href ? /* @__PURE__ */ o(
123
- "button",
124
- {
125
- onClick: () => er(r.href),
126
- className: `rfp-w-full rfp-text-left rfp-py-2 rfp-px-3 rfp-text-sm rfp-rounded rfp-transition-all rfp-truncate ${tr(r.href) ? "rfp-text-fg-primary rfp-bg-surface-3 rfp-font-medium" : "rfp-text-fg-secondary hover:rfp-text-fg-primary hover:rfp-bg-surface-2"}`,
127
- title: r.label,
128
- children: (a = r.label) == null ? void 0 : a.trim()
129
- }
130
- ) : /* @__PURE__ */ o("div", { className: "rfp-w-full rfp-py-2 rfp-px-3 rfp-text-sm rfp-text-fg-tertiary rfp-truncate", children: (s = r.label) == null ? void 0 : s.trim() }),
131
- r.subitems && r.subitems.length > 0 && U(r.subitems, t + 1)
132
- ] }, `${r.href ?? r.label}-${m}`);
133
- }) });
134
- return /* @__PURE__ */ x("div", { className: "rfp-relative rfp-w-full rfp-h-full rfp-flex rfp-justify-center rfp-bg-surface-1 rfp-overflow-hidden", children: [
135
- v && /* @__PURE__ */ o(hr, { message: v }),
136
- Z && !v && /* @__PURE__ */ o("div", { className: "rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-z-10", children: /* @__PURE__ */ o("div", { className: "rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin" }) }),
137
- H.length > 0 && /* @__PURE__ */ x(
138
- "div",
139
- {
140
- className: "rfp-absolute rfp-inset-0 rfp-z-20 rfp-flex rfp-transition-opacity rfp-duration-300",
141
- style: { opacity: k ? 1 : 0, pointerEvents: k ? "auto" : "none" },
142
- children: [
143
- /* @__PURE__ */ x(
144
- "div",
145
- {
146
- className: "rfp-w-72 rfp-max-w-[80%] rfp-h-full rfp-bg-surface-overlay rfp-backdrop-blur-xl rfp-border-r rfp-border-line-weak rfp-flex rfp-flex-col rfp-shadow-2xl rfp-transition-transform rfp-duration-300",
147
- style: { transform: k ? "translateX(0)" : "translateX(-100%)" },
148
- children: [
149
- /* @__PURE__ */ x("div", { className: "rfp-flex rfp-items-center rfp-justify-between rfp-px-4 rfp-py-3 rfp-border-b rfp-border-line-weak rfp-flex-shrink-0", children: [
150
- /* @__PURE__ */ o("span", { className: "rfp-text-fg-primary rfp-font-medium rfp-text-sm", children: z("toolbar.toc") }),
151
- /* @__PURE__ */ o(
152
- "button",
153
- {
154
- onClick: () => u(!1),
155
- className: "rfp-text-fg-tertiary hover:rfp-text-fg-primary rfp-transition-colors",
156
- children: /* @__PURE__ */ o(dr, { className: "rfp-w-4 rfp-h-4" })
157
- }
158
- )
159
- ] }),
160
- /* @__PURE__ */ o("div", { className: "rfp-flex-1 rfp-overflow-y-auto rfp-py-4 rfp-px-1", children: U(H) })
161
- ]
162
- }
163
- ),
164
- /* @__PURE__ */ o(
165
- "div",
166
- {
167
- className: "rfp-flex-1 rfp-transition-opacity rfp-duration-300",
168
- style: { background: k ? "rgba(0,0,0,0.3)" : "transparent" },
169
- onClick: () => u(!1)
170
- }
171
- )
172
- ]
173
- }
174
- ),
175
- !v && /* @__PURE__ */ o(
176
- "div",
177
- {
178
- ref: C,
179
- className: "rfp-h-full rfp-bg-surface-toolbar rfp-shadow-lg",
180
- style: {
181
- width: L ? "100%" : `${xr}px`,
182
- maxWidth: "100%",
183
- transition: "width 0.3s ease"
184
- }
185
- }
186
- )
187
- ] });
188
- }
189
- );
190
- wr.displayName = "MobiRenderer";
191
- export {
192
- wr as MobiRenderer
193
- };
194
- //# sourceMappingURL=index-gjSQeou7.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-gjSQeou7.mjs","sources":["../../src/renderers/Mobi/index.tsx"],"sourcesContent":["import {\n useEffect,\n useRef,\n useState,\n useCallback,\n useImperativeHandle,\n forwardRef,\n} from 'react';\nimport { X } from 'lucide-react';\nimport 'foliate-js/view.js';\nimport type { FoliateView, TocItem } from 'foliate-js/view.js';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { useFetcher } from '../../RequestContext';\nimport { RendererError } from '../RendererError';\n\nconst READER_CSS = `\n @namespace epub \"http://www.idpf.org/2007/ops\";\n html { color-scheme: light; }\n body {\n background: #ffffff !important;\n color: #1a1a1a !important;\n font-family: \"Noto Serif SC\", \"Source Han Serif SC\", Georgia, \"Times New Roman\", serif !important;\n font-size: 16px !important;\n line-height: 2 !important;\n max-width: 100% !important;\n box-sizing: border-box !important;\n word-break: break-word !important;\n overflow-wrap: break-word !important;\n }\n p, li, blockquote, dd { line-height: 2; text-align: justify; }\n p { text-indent: 2em; margin: 0.8em 0; }\n h1 { text-align: center; margin: 1.5em 0 1em; }\n h2 { margin: 1.2em 0 0.8em; }\n h3 { margin: 1em 0 0.6em; }\n img { max-width: 100% !important; height: auto !important; }\n a { color: #2563eb; text-decoration: none; }\n pre { white-space: pre-wrap !important; }\n`;\n\nconst A4_WIDTH = 794;\n\nexport interface MobiRendererHandle {\n prevPage: () => void;\n nextPage: () => void;\n toggleFullWidth: () => void;\n toggleToc: () => void;\n}\n\ninterface MobiRendererProps {\n url: string;\n onChapterChange?: (current: number, total: number) => void;\n onFullWidthChange?: (isFullWidth: boolean) => void;\n}\n\nexport const MobiRenderer = forwardRef<MobiRendererHandle, MobiRendererProps>(\n ({ url, onChapterChange, onFullWidthChange }, ref) => {\n const t = useTranslator();\n const fetcher = useFetcher();\n const hostRef = useRef<HTMLDivElement>(null);\n const viewRef = useRef<FoliateView | null>(null);\n const onChapterChangeRef = useRef(onChapterChange);\n const onFullWidthChangeRef = useRef(onFullWidthChange);\n onChapterChangeRef.current = onChapterChange;\n onFullWidthChangeRef.current = onFullWidthChange;\n\n // 模拟 epub.js 的 locations 显示\n const totalLocationsRef = useRef(1);\n\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [toc, setToc] = useState<TocItem[]>([]);\n const [showToc, setShowToc] = useState(false);\n const [activeTocHref, setActiveTocHref] = useState<string>('');\n const [isFullWidth, setIsFullWidth] = useState(false);\n const isFullWidthRef = useRef(false);\n isFullWidthRef.current = isFullWidth;\n\n const reportProgress = useCallback((current: number, total: number) => {\n if (total > 0) totalLocationsRef.current = total;\n onChapterChangeRef.current?.(Math.max(1, current + 1), totalLocationsRef.current);\n }, []);\n\n const handlePrev = useCallback(() => {\n const view = viewRef.current;\n if (!view) return;\n view.prev().catch(() => {});\n }, []);\n\n const handleNext = useCallback(() => {\n const view = viewRef.current;\n if (!view) return;\n view.next().catch(() => {});\n }, []);\n\n const toggleToc = useCallback(() => setShowToc((prev) => !prev), []);\n\n const toggleFullWidth = useCallback(() => {\n const newVal = !isFullWidthRef.current;\n setIsFullWidth(newVal);\n onFullWidthChangeRef.current?.(newVal);\n // 宽度改变后 paginator 需要重新分页\n const view = viewRef.current;\n if (!view) return;\n const renderer = (view as unknown as { renderer?: HTMLElement }).renderer;\n if (renderer) {\n renderer.setAttribute('max-inline-size', newVal ? '9999' : '720');\n }\n }, []);\n\n const handleTocClick = useCallback((href: string) => {\n setActiveTocHref(href);\n setShowToc(false);\n viewRef.current?.goTo(href).catch(() => {});\n }, []);\n\n useImperativeHandle(ref, () => ({\n prevPage: handlePrev,\n nextPage: handleNext,\n toggleFullWidth,\n toggleToc,\n }), [handlePrev, handleNext, toggleFullWidth, toggleToc]);\n\n useEffect(() => {\n const host = hostRef.current;\n // 只有 URL 有效时才加载(避免空字符串或已 revoke 的 blob URL)\n if (!host || !url) return;\n\n setLoading(true);\n setError(null);\n setToc([]);\n setShowToc(false);\n setActiveTocHref('');\n host.replaceChildren();\n\n let cancelled = false;\n let view: FoliateView | null = null;\n\n const load = async () => {\n try {\n if (cancelled) return;\n\n view = document.createElement('foliate-view') as FoliateView;\n host.appendChild(view);\n viewRef.current = view;\n\n // 先注册事件\n view.addEventListener('relocate', (e: Event) => {\n const detail = (e as CustomEvent).detail;\n if (!detail) return;\n // SectionProgress 返回的 location 对象: { current, next, total }\n const loc = detail.location as { current?: number; total?: number } | undefined;\n if (loc && typeof loc.current === 'number' && typeof loc.total === 'number') {\n reportProgress(loc.current, loc.total);\n } else {\n // fallback:用 section 级别估算\n const sections = viewRef.current?.book?.sections ?? [];\n const idx = detail.index ?? 0;\n const frac = detail.fraction ?? 0;\n const total = Math.max(sections.length, 1);\n const current = Math.round((idx + frac) / total * total);\n reportProgress(current, total);\n }\n const tocItem = detail.tocItem as { href?: string } | undefined;\n if (tocItem?.href) {\n setActiveTocHref(tocItem.href);\n }\n });\n\n const res = await fetcher(url);\n if (!res.ok) throw new Error(`请求失败: ${res.status}`);\n const blob = await res.blob();\n let name = 'book.mobi';\n try {\n const u = new URL(url, window.location.href);\n const base = u.pathname.split('/').pop();\n if (base) name = decodeURIComponent(base);\n } catch { /* blob: URL */ }\n const file = new File([blob], name);\n\n await view.open(file);\n if (cancelled) { view.book?.destroy?.(); return; }\n\n // 配置 paginator:paginated 模式(默认),带动画\n const renderer = (view as unknown as { renderer: HTMLElement & {\n setStyles?: (css: string) => void;\n next?: () => Promise<void>;\n } }).renderer;\n\n if (renderer) {\n // flow=\"paginated\" 是默认值,不需要显式设置\n renderer.setAttribute('animated', '');\n renderer.setAttribute('max-inline-size', '720');\n renderer.setAttribute('margin', '48');\n renderer.setAttribute('gap', '5%');\n renderer.setStyles?.(READER_CSS);\n // 必须调 next() 渲染首页\n await renderer.next?.();\n }\n\n setToc(view.book?.toc ?? []);\n setLoading(false);\n reportProgress(0, view.book?.sections.length ?? 1);\n } catch (err) {\n // MOBI/EPUB 加载错误通常是文件损坏或 DRM 保护,用 warn 级别记录\n console.warn('[MobiRenderer] Failed to load ebook:', err instanceof Error ? err.message : String(err));\n if (!cancelled) {\n setError(t('mobi.load_failed'));\n setLoading(false);\n }\n }\n };\n\n load();\n\n return () => {\n cancelled = true;\n try { viewRef.current?.book?.destroy?.(); } catch { /* ignore */ }\n viewRef.current = null;\n host.replaceChildren();\n };\n }, [url, reportProgress]);\n\n const isActive = useCallback(\n (href: string | undefined) => !!href && href === activeTocHref,\n [activeTocHref]\n );\n\n const renderTocItems = (items: TocItem[], depth = 0) => (\n <ul style={{ listStyle: 'none', padding: 0, margin: depth > 0 ? '0 0 0 16px' : 0 }}>\n {items.map((item, i) => (\n <li key={`${item.href ?? item.label}-${i}`}>\n {item.href ? (\n <button\n onClick={() => handleTocClick(item.href!)}\n className={`rfp-w-full rfp-text-left rfp-py-2 rfp-px-3 rfp-text-sm rfp-rounded rfp-transition-all rfp-truncate ${\n isActive(item.href)\n ? 'rfp-text-fg-primary rfp-bg-surface-3 rfp-font-medium'\n : 'rfp-text-fg-secondary hover:rfp-text-fg-primary hover:rfp-bg-surface-2'\n }`}\n title={item.label}\n >\n {item.label?.trim()}\n </button>\n ) : (\n <div className=\"rfp-w-full rfp-py-2 rfp-px-3 rfp-text-sm rfp-text-fg-tertiary rfp-truncate\">\n {item.label?.trim()}\n </div>\n )}\n {item.subitems && item.subitems.length > 0 && renderTocItems(item.subitems, depth + 1)}\n </li>\n ))}\n </ul>\n );\n\n return (\n <div className=\"rfp-relative rfp-w-full rfp-h-full rfp-flex rfp-justify-center rfp-bg-surface-1 rfp-overflow-hidden\">\n {error && <RendererError message={error} />}\n\n {loading && !error && (\n <div className=\"rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-z-10\">\n <div className=\"rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n )}\n\n {/* 目录侧栏 */}\n {toc.length > 0 && (\n <div\n className=\"rfp-absolute rfp-inset-0 rfp-z-20 rfp-flex rfp-transition-opacity rfp-duration-300\"\n style={{ opacity: showToc ? 1 : 0, pointerEvents: showToc ? 'auto' : 'none' }}\n >\n <div\n className=\"rfp-w-72 rfp-max-w-[80%] rfp-h-full rfp-bg-surface-overlay rfp-backdrop-blur-xl rfp-border-r rfp-border-line-weak rfp-flex rfp-flex-col rfp-shadow-2xl rfp-transition-transform rfp-duration-300\"\n style={{ transform: showToc ? 'translateX(0)' : 'translateX(-100%)' }}\n >\n <div className=\"rfp-flex rfp-items-center rfp-justify-between rfp-px-4 rfp-py-3 rfp-border-b rfp-border-line-weak rfp-flex-shrink-0\">\n <span className=\"rfp-text-fg-primary rfp-font-medium rfp-text-sm\">{t('toolbar.toc')}</span>\n <button\n onClick={() => setShowToc(false)}\n className=\"rfp-text-fg-tertiary hover:rfp-text-fg-primary rfp-transition-colors\"\n >\n <X className=\"rfp-w-4 rfp-h-4\" />\n </button>\n </div>\n <div className=\"rfp-flex-1 rfp-overflow-y-auto rfp-py-4 rfp-px-1\">\n {renderTocItems(toc)}\n </div>\n </div>\n <div\n className=\"rfp-flex-1 rfp-transition-opacity rfp-duration-300\"\n style={{ background: showToc ? 'rgba(0,0,0,0.3)' : 'transparent' }}\n onClick={() => setShowToc(false)}\n />\n </div>\n )}\n\n {!error && (\n <div\n ref={hostRef}\n className=\"rfp-h-full rfp-bg-surface-toolbar rfp-shadow-lg\"\n style={{\n width: isFullWidth ? '100%' : `${A4_WIDTH}px`,\n maxWidth: '100%',\n transition: 'width 0.3s ease',\n }}\n />\n )}\n </div>\n );\n }\n);\n\nMobiRenderer.displayName = 'MobiRenderer';\n"],"names":["READER_CSS","A4_WIDTH","MobiRenderer","forwardRef","url","onChapterChange","onFullWidthChange","ref","t","useTranslator","fetcher","useFetcher","hostRef","useRef","viewRef","onChapterChangeRef","onFullWidthChangeRef","totalLocationsRef","loading","setLoading","useState","error","setError","toc","setToc","showToc","setShowToc","activeTocHref","setActiveTocHref","isFullWidth","setIsFullWidth","isFullWidthRef","reportProgress","useCallback","current","total","_a","handlePrev","view","handleNext","toggleToc","prev","toggleFullWidth","newVal","renderer","handleTocClick","href","useImperativeHandle","useEffect","host","cancelled","e","detail","loc","sections","_b","idx","frac","tocItem","res","blob","name","base","file","_c","_d","_e","_f","err","isActive","renderTocItems","items","depth","item","i","jsxs","jsx","RendererError","X"],"mappings":"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"}