@eternalheart/react-file-preview 1.3.7 → 1.3.9
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 +1 -1
- package/lib/FilePreviewContent.d.ts +12 -1
- package/lib/FilePreviewContent.d.ts.map +1 -1
- package/lib/FilePreviewEmbed.d.ts +9 -1
- package/lib/FilePreviewEmbed.d.ts.map +1 -1
- package/lib/FilePreviewModal.d.ts +9 -1
- package/lib/FilePreviewModal.d.ts.map +1 -1
- package/lib/RequestContext.d.ts +24 -0
- package/lib/RequestContext.d.ts.map +1 -0
- package/lib/chunks/{index-BIg3vHQf.mjs → index-B-H9HQiI.mjs} +35 -35
- package/lib/chunks/index-B-H9HQiI.mjs.map +1 -0
- package/lib/chunks/{index-DOMMMe9f.mjs → index-BGeyzo6u.mjs} +2 -2
- package/lib/chunks/{index-DOMMMe9f.mjs.map → index-BGeyzo6u.mjs.map} +1 -1
- package/lib/chunks/{index-zDEwNk3h.mjs → index-BNUiNUWa.mjs} +35 -35
- package/lib/chunks/index-BNUiNUWa.mjs.map +1 -0
- package/lib/chunks/{index-DTH1IvOG.mjs → index-BSD3w5eG.mjs} +72 -72
- package/lib/chunks/index-BSD3w5eG.mjs.map +1 -0
- package/lib/chunks/{index-D_8IHm6o.mjs → index-BcBe6KW7.mjs} +11 -10
- package/lib/chunks/index-BcBe6KW7.mjs.map +1 -0
- package/lib/chunks/index-BdYkTSTt.mjs +51 -0
- package/lib/chunks/index-BdYkTSTt.mjs.map +1 -0
- package/lib/chunks/{index-BWbuffRN.mjs → index-BqEuP_8r.mjs} +8 -8
- package/lib/chunks/index-BqEuP_8r.mjs.map +1 -0
- package/lib/chunks/{index-LNXbKjrI.mjs → index-Bv93wiEK.mjs} +812 -681
- package/lib/chunks/index-Bv93wiEK.mjs.map +1 -0
- package/lib/chunks/{index-xTq9b3vw.mjs → index-CKirCT35.mjs} +13 -13
- package/lib/chunks/index-CKirCT35.mjs.map +1 -0
- package/lib/chunks/{index-BOEtlHD3.mjs → index-CgV8T0G5.mjs} +53 -53
- package/lib/chunks/index-CgV8T0G5.mjs.map +1 -0
- package/lib/chunks/{index-DinKO2op.mjs → index-D8GtNeDn.mjs} +2 -2
- package/lib/chunks/{index-DinKO2op.mjs.map → index-D8GtNeDn.mjs.map} +1 -1
- package/lib/chunks/{index-CQABwGVP.mjs → index-DGuiWJr7.mjs} +18 -18
- package/lib/chunks/index-DGuiWJr7.mjs.map +1 -0
- package/lib/chunks/{index-Yp36heK8.mjs → index-DV5Jd7Qe.mjs} +31 -31
- package/lib/chunks/index-DV5Jd7Qe.mjs.map +1 -0
- package/lib/chunks/{index-qxvk-6P6.mjs → index-DdOEWhrk.mjs} +33 -33
- package/lib/chunks/index-DdOEWhrk.mjs.map +1 -0
- package/lib/chunks/{index-w0tt7Myw.mjs → index-DmepcY31.mjs} +2 -2
- package/lib/chunks/{index-w0tt7Myw.mjs.map → index-DmepcY31.mjs.map} +1 -1
- package/lib/chunks/index-U3w45GW8.mjs +299 -0
- package/lib/chunks/index-U3w45GW8.mjs.map +1 -0
- package/lib/chunks/{index-BsSx9pGx.mjs → index-r3q2xCCI.mjs} +37 -36
- package/lib/chunks/index-r3q2xCCI.mjs.map +1 -0
- package/lib/chunks/{index-BEolw_uv.mjs → index-zEVVgWCH.mjs} +2 -2
- package/lib/chunks/{index-BEolw_uv.mjs.map → index-zEVVgWCH.mjs.map} +1 -1
- package/lib/chunks/{useShikiHighlight-DtWg9b8y.mjs → useShikiHighlight-DzEAK0S7.mjs} +7 -7
- package/lib/chunks/{useShikiHighlight-DtWg9b8y.mjs.map → useShikiHighlight-DzEAK0S7.mjs.map} +1 -1
- package/lib/index.cjs +20 -33
- package/lib/index.cjs.map +1 -1
- package/lib/index.css +1 -1
- package/lib/index.mjs +7 -7
- package/lib/renderers/Csv/index.d.ts.map +1 -1
- package/lib/renderers/Docx/index.d.ts.map +1 -1
- package/lib/renderers/Epub/index.d.ts.map +1 -1
- package/lib/renderers/Json/index.d.ts.map +1 -1
- package/lib/renderers/Markdown/index.d.ts.map +1 -1
- package/lib/renderers/Mobi/index.d.ts.map +1 -1
- package/lib/renderers/Msg/index.d.ts.map +1 -1
- package/lib/renderers/Pptx/index.d.ts.map +1 -1
- package/lib/renderers/Subtitle/index.d.ts.map +1 -1
- package/lib/renderers/Text/index.d.ts.map +1 -1
- package/lib/renderers/Xlsx/index.d.ts.map +1 -1
- package/lib/renderers/Xml/index.d.ts.map +1 -1
- package/lib/renderers/Zip/index.d.ts.map +1 -1
- package/lib/types.d.ts +1 -1
- package/lib/types.d.ts.map +1 -1
- package/package.json +4 -4
- package/lib/chunks/index--zZy1XpK.mjs +0 -299
- package/lib/chunks/index--zZy1XpK.mjs.map +0 -1
- package/lib/chunks/index-B5tBeF0g.mjs +0 -51
- package/lib/chunks/index-B5tBeF0g.mjs.map +0 -1
- package/lib/chunks/index-BIg3vHQf.mjs.map +0 -1
- package/lib/chunks/index-BOEtlHD3.mjs.map +0 -1
- package/lib/chunks/index-BWbuffRN.mjs.map +0 -1
- package/lib/chunks/index-BsSx9pGx.mjs.map +0 -1
- package/lib/chunks/index-CQABwGVP.mjs.map +0 -1
- package/lib/chunks/index-DTH1IvOG.mjs.map +0 -1
- package/lib/chunks/index-D_8IHm6o.mjs.map +0 -1
- package/lib/chunks/index-LNXbKjrI.mjs.map +0 -1
- package/lib/chunks/index-Yp36heK8.mjs.map +0 -1
- package/lib/chunks/index-qxvk-6P6.mjs.map +0 -1
- package/lib/chunks/index-xTq9b3vw.mjs.map +0 -1
- package/lib/chunks/index-zDEwNk3h.mjs.map +0 -1
- package/lib/chunks/xspreadsheet-CyBXARuf.mjs +0 -5215
- package/lib/chunks/xspreadsheet-CyBXARuf.mjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-LNXbKjrI.mjs","sources":["../../../file-preview-core/lib/index.mjs","../../src/i18n/LocaleContext.tsx","../../src/ThemeContext.tsx","../../src/renderers/Image/toolbar.tsx","../../src/renderers/Pdf/toolbar.tsx","../../src/renderers/Epub/toolbar.tsx","../../src/renderers/Mobi/toolbar.tsx","../../src/renderers/Zip/toolbar.tsx","../../src/renderers/Text/toolbar.tsx","../../src/renderers/Markdown/toolbar.tsx","../../src/renderers/lazy.tsx","../../src/renderers/Unsupported/index.tsx","../../src/renderers/RendererLoading.tsx","../../src/FilePreviewContent.tsx","../../src/FilePreviewModal.tsx","../../src/FilePreviewEmbed.tsx","../../src/utils/pdfConfig.ts","../../src/index.ts"],"sourcesContent":["import A from \"jszip\";\nfunction j(e) {\n try {\n const n = new URL(e).pathname.split(\"/\").pop() || \"file\";\n return decodeURIComponent(n);\n } catch {\n const t = e.split(\"/\").pop() || \"file\";\n return decodeURIComponent(t);\n }\n}\nfunction k(e) {\n var n;\n const t = ((n = e.split(\".\").pop()) == null ? void 0 : n.toLowerCase()) || \"\";\n return {\n // 图片\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n png: \"image/png\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n svg: \"image/svg+xml\",\n bmp: \"image/bmp\",\n ico: \"image/x-icon\",\n // 视频\n mp4: \"video/mp4\",\n webm: \"video/webm\",\n ogg: \"video/ogg\",\n ogv: \"video/ogg\",\n mov: \"video/quicktime\",\n avi: \"video/x-msvideo\",\n mkv: \"video/x-matroska\",\n m4v: \"video/x-m4v\",\n \"3gp\": \"video/3gpp\",\n flv: \"video/x-flv\",\n // 音频\n mp3: \"audio/mpeg\",\n wav: \"audio/wav\",\n m4a: \"audio/mp4\",\n aac: \"audio/aac\",\n flac: \"audio/flac\",\n // 文档\n pdf: \"application/pdf\",\n docx: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n xlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n pptx: \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n ppt: \"application/vnd.ms-powerpoint\",\n msg: \"application/vnd.ms-outlook\",\n mobi: \"application/x-mobipocket-ebook\",\n azw: \"application/vnd.amazon.ebook\",\n azw3: \"application/vnd.amazon.ebook\",\n kf8: \"application/vnd.amazon.ebook\",\n // 文本\n txt: \"text/plain\",\n md: \"text/markdown\",\n markdown: \"text/markdown\",\n json: \"application/json\",\n xml: \"application/xml\",\n html: \"text/html\",\n css: \"text/css\",\n js: \"text/javascript\",\n ts: \"text/typescript\",\n jsx: \"text/javascript\",\n tsx: \"text/typescript\",\n py: \"text/x-python\",\n java: \"text/x-java\",\n cpp: \"text/x-c++src\",\n c: \"text/x-csrc\",\n cs: \"text/x-csharp\",\n php: \"text/x-php\",\n rb: \"text/x-ruby\",\n go: \"text/x-go\",\n rs: \"text/x-rust\",\n yaml: \"text/yaml\",\n yml: \"text/yaml\",\n toml: \"text/toml\",\n ini: \"text/plain\",\n env: \"text/plain\",\n diff: \"text/x-diff\",\n patch: \"text/x-diff\",\n log: \"text/plain\",\n csv: \"text/csv\",\n tsv: \"text/tab-separated-values\",\n srt: \"application/x-subrip\",\n vtt: \"text/vtt\",\n zip: \"application/zip\"\n }[t] || \"application/octet-stream\";\n}\nfunction I(e, t = 0) {\n if (e instanceof File)\n return {\n id: `file-${Date.now()}-${t}`,\n name: e.name,\n url: URL.createObjectURL(e),\n type: e.type || k(e.name),\n size: e.size\n };\n if (typeof e == \"string\") {\n const o = j(e);\n return {\n id: `url-${Date.now()}-${t}`,\n name: o,\n url: e,\n type: k(o)\n };\n }\n return {\n id: e.id || `link-${Date.now()}-${t}`,\n name: e.name,\n url: e.url,\n type: e.type || k(e.name),\n size: e.size\n };\n}\nfunction lt(e) {\n return e.map((t, o) => I(t, o));\n}\nfunction ct(e) {\n var r;\n const t = ((r = e.name.split(\".\").pop()) == null ? void 0 : r.toLowerCase()) || \"\", o = e.type.toLowerCase();\n if (o.startsWith(\"image/\") || [\"jpg\", \"jpeg\", \"png\", \"gif\", \"webp\", \"svg\"].includes(t))\n return \"image\";\n if (o.includes(\"pdf\") || t === \"pdf\")\n return \"pdf\";\n if (o.includes(\"wordprocessingml\") || t === \"docx\")\n return \"docx\";\n if (o.includes(\"spreadsheetml\") || t === \"xlsx\")\n return \"xlsx\";\n if (o.includes(\"presentationml\") || t === \"pptx\" || t === \"ppt\")\n return \"pptx\";\n if (o.includes(\"ms-outlook\") || t === \"msg\")\n return \"msg\";\n if (o.includes(\"epub\") || t === \"epub\")\n return \"epub\";\n if ([\"mobi\", \"azw\", \"azw3\", \"kf8\"].includes(t) || o === \"application/x-mobipocket-ebook\" || o === \"application/vnd.amazon.ebook\")\n return \"mobi\";\n if ([\"csv\", \"tsv\"].includes(t) || o === \"text/csv\" || o === \"text/tab-separated-values\")\n return \"csv\";\n if (t === \"xml\" || o === \"application/xml\" || o === \"text/xml\")\n return \"xml\";\n if ([\"srt\", \"vtt\", \"lrc\", \"elrc\", \"ass\", \"ssa\", \"ttml\", \"dfxp\"].includes(t) || o === \"text/vtt\" || o === \"application/x-subrip\" || o === \"application/ttml+xml\")\n return \"subtitle\";\n if (t === \"zip\" || o === \"application/zip\" || o === \"application/x-zip-compressed\")\n return \"zip\";\n if (o.startsWith(\"video/\") || [\"mp4\", \"webm\", \"ogg\", \"ogv\", \"mov\", \"avi\", \"mkv\", \"m4v\", \"3gp\", \"flv\"].includes(t))\n return \"video\";\n if (o.startsWith(\"audio/\") || [\"mp3\", \"wav\", \"ogg\", \"m4a\", \"flac\", \"aac\"].includes(t))\n return \"audio\";\n if (t === \"md\" || t === \"markdown\")\n return \"markdown\";\n if (o === \"application/json\" || t === \"json\")\n return \"json\";\n const n = [\n \"txt\",\n \"log\",\n \"lock\",\n \"js\",\n \"jsx\",\n \"ts\",\n \"tsx\",\n \"py\",\n \"java\",\n \"cpp\",\n \"c\",\n \"h\",\n \"cs\",\n \"php\",\n \"rb\",\n \"go\",\n \"mod\",\n \"rs\",\n \"swift\",\n \"kt\",\n \"lua\",\n \"vim\",\n \"html\",\n \"css\",\n \"scss\",\n \"sass\",\n \"less\",\n \"yaml\",\n \"yml\",\n \"toml\",\n \"ini\",\n \"conf\",\n \"env\",\n \"diff\",\n \"patch\",\n \"sh\",\n \"bash\",\n \"zsh\",\n \"sql\"\n ];\n return o.startsWith(\"text/\") || n.includes(t) ? \"text\" : \"unsupported\";\n}\nfunction dt(e) {\n var n;\n const t = ((n = e.split(\".\").pop()) == null ? void 0 : n.toLowerCase()) || \"\";\n return {\n js: \"javascript\",\n jsx: \"jsx\",\n ts: \"typescript\",\n tsx: \"tsx\",\n py: \"python\",\n java: \"java\",\n cpp: \"cpp\",\n c: \"c\",\n cs: \"csharp\",\n php: \"php\",\n rb: \"ruby\",\n go: \"go\",\n mod: \"go\",\n rs: \"rust\",\n swift: \"swift\",\n kt: \"kotlin\",\n lua: \"lua\",\n vim: \"vim\",\n scala: \"scala\",\n sh: \"bash\",\n bash: \"bash\",\n zsh: \"bash\",\n json: \"json\",\n xml: \"xml\",\n html: \"html\",\n css: \"css\",\n scss: \"scss\",\n sass: \"sass\",\n less: \"less\",\n sql: \"sql\",\n yaml: \"yaml\",\n yml: \"yaml\",\n toml: \"toml\",\n ini: \"ini\",\n env: \"bash\",\n conf: \"nginx\",\n diff: \"diff\",\n patch: \"diff\",\n log: \"log\",\n md: \"markdown\",\n txt: \"text\"\n }[t] || \"text\";\n}\nfunction ut(e) {\n var n;\n const t = ((n = e.split(\".\").pop()) == null ? void 0 : n.toLowerCase().split(\"?\")[0]) || \"\";\n return {\n mp4: \"video/mp4\",\n webm: \"video/webm\",\n ogg: \"video/ogg\",\n ogv: \"video/ogg\",\n mov: \"video/quicktime\",\n avi: \"video/x-msvideo\",\n mkv: \"video/x-matroska\",\n m4v: \"video/mp4\",\n \"3gp\": \"video/3gpp\",\n flv: \"video/x-flv\"\n }[t] || \"video/mp4\";\n}\nfunction pt(e) {\n return e < 1024 ? `${e} B` : e < 1024 * 1024 ? `${(e / 1024).toFixed(1)} KB` : `${(e / (1024 * 1024)).toFixed(1)} MB`;\n}\nfunction ft(e) {\n if (!isFinite(e) || isNaN(e) || e < 0) return \"0:00\";\n const t = Math.floor(e / 60), o = Math.floor(e % 60);\n return `${t}:${o.toString().padStart(2, \"0\")}`;\n}\nfunction mt(e) {\n var o;\n return (((o = e.split(\".\").pop()) == null ? void 0 : o.toLowerCase()) || \"\") === \"tsv\" ? \"\t\" : \",\";\n}\nfunction gt(e, t = {}) {\n const o = t.delimiter ?? \",\", n = t.firstRowAsHeader ?? !0, r = [];\n let a = [], i = \"\", c = !1, s = 0;\n const l = e.length;\n for (; s < l; ) {\n const p = e[s];\n if (c) {\n if (p === '\"') {\n if (e[s + 1] === '\"') {\n i += '\"', s += 2;\n continue;\n }\n c = !1, s += 1;\n continue;\n }\n i += p, s += 1;\n continue;\n }\n if (p === '\"') {\n c = !0, s += 1;\n continue;\n }\n if (p === o) {\n a.push(i), i = \"\", s += 1;\n continue;\n }\n if (p === \"\\r\") {\n e[s + 1] === `\n` && (s += 1), a.push(i), r.push(a), a = [], i = \"\", s += 1;\n continue;\n }\n if (p === `\n`) {\n a.push(i), r.push(a), a = [], i = \"\", s += 1;\n continue;\n }\n i += p, s += 1;\n }\n for ((i.length > 0 || a.length > 0) && (a.push(i), r.push(a)); r.length > 0; ) {\n const p = r[r.length - 1];\n if (p.length === 1 && p[0] === \"\")\n r.pop();\n else\n break;\n }\n let d = [], f = r;\n n && r.length > 0 && (d = r[0], f = r.slice(1));\n const u = Math.max(\n d.length,\n ...f.map((p) => p.length),\n 0\n );\n for (const p of f)\n for (; p.length < u; ) p.push(\"\");\n return {\n header: d,\n rows: f,\n columnCount: u,\n delimiter: o\n };\n}\nfunction $(e) {\n const t = e instanceof Uint8Array ? e : new Uint8Array(e);\n if (t.length >= 3 && t[0] === 239 && t[1] === 187 && t[2] === 191)\n return new TextDecoder(\"utf-8\").decode(t);\n if (t.length >= 2 && t[0] === 255 && t[1] === 254)\n return new TextDecoder(\"utf-16le\").decode(t);\n if (t.length >= 2 && t[0] === 254 && t[1] === 255)\n return new TextDecoder(\"utf-16be\").decode(t);\n try {\n return new TextDecoder(\"utf-8\", { fatal: !0 }).decode(t);\n } catch {\n }\n try {\n return new TextDecoder(\"gbk\").decode(t);\n } catch {\n }\n return new TextDecoder(\"utf-8\", { fatal: !1 }).decode(t);\n}\nconst U = $;\nasync function ht(e, t) {\n const o = await fetch(e, t);\n if (!o.ok) throw new Error(`请求失败: ${o.status}`);\n const n = await o.arrayBuffer();\n return $(n);\n}\nfunction z(e) {\n const t = e.trim().replace(\",\", \".\"), o = t.split(\":\").map((n) => n.trim());\n if (o.length === 3) {\n const [n, r, a] = o;\n return Number(n) * 3600 + Number(r) * 60 + Number(a);\n }\n if (o.length === 2) {\n const [n, r] = o;\n return Number(n) * 60 + Number(r);\n }\n return Number(t) || 0;\n}\nfunction xt(e) {\n if (!isFinite(e) || e < 0) return \"00:00:00.000\";\n const t = Math.floor(e * 1e3), o = t % 1e3, n = Math.floor(t / 1e3) % 60, r = Math.floor(t / 6e4) % 60, a = Math.floor(t / 36e5), i = (c, s = 2) => c.toString().padStart(s, \"0\");\n return `${i(a)}:${i(r)}:${i(n)}.${i(o, 3)}`;\n}\nconst E = /(\\d{1,2}:)?\\d{1,2}:\\d{1,2}[.,]\\d{1,3}\\s*-->\\s*(\\d{1,2}:)?\\d{1,2}:\\d{1,2}[.,]\\d{1,3}/, B = /^\\s*\\[\\d{1,2}:\\d{1,2}(?:[.:]\\d{1,3})?\\]/;\nfunction W(e) {\n const t = e.replace(/^\\uFEFF/, \"\").trimStart();\n return /^WEBVTT/.test(t) ? \"vtt\" : /^<\\?xml/i.test(t) || /<tt\\b[^>]*>/i.test(t) ? \"ttml\" : /^\\[Script Info\\]/im.test(t) || /^Dialogue:/m.test(t) ? /ScriptType:\\s*v4\\.00\\s*$/im.test(t) ? \"ssa\" : \"ass\" : B.test(t) || /^\\[(ti|ar|al|au|by|length|offset|re|ve):/im.test(t) ? /<\\d{1,2}:\\d{1,2}(?:[.:]\\d{1,3})?>/.test(t) ? \"elrc\" : \"lrc\" : \"srt\";\n}\nfunction N(e, t) {\n const n = e.replace(/\\r\\n?/g, `\n`).replace(/^\\uFEFF/, \"\").split(`\n`), r = [];\n let a, i = 0;\n if (t === \"vtt\") {\n const c = [];\n for (; i < n.length && n[i].trim() !== \"\"; )\n c.push(n[i]), i++;\n for (a = c.join(`\n`); i < n.length && n[i].trim() === \"\"; ) i++;\n }\n for (; i < n.length; ) {\n for (; i < n.length && n[i].trim() === \"\"; ) i++;\n if (i >= n.length) break;\n let c, s = null;\n if (E.test(n[i]))\n s = n[i], i++;\n else if (c = n[i].trim() || void 0, i++, i < n.length && E.test(n[i]))\n s = n[i], i++;\n else\n continue;\n if (!s) continue;\n const l = s.match(/([\\d:.,]+)\\s*-->\\s*([\\d:.,]+)/);\n if (!l) continue;\n const d = z(l[1]), f = z(l[2]), u = [];\n for (; i < n.length && n[i].trim() !== \"\"; )\n u.push(n[i]), i++;\n r.push({ id: c, start: d, end: f, text: u.join(`\n`) });\n }\n return { format: t, cues: r, header: a };\n}\nfunction M(e, t, o) {\n const n = Number(e), r = Number(t);\n let a = 0;\n if (o) {\n const i = (o + \"000\").slice(0, 3);\n a = Number(i);\n }\n return n * 60 + r + a / 1e3;\n}\nfunction R(e, t) {\n const o = /^\\[(ti|ar|al|au|by|length|offset|re|ve):(.*)\\]$/i.exec(e.trim());\n if (!o) return !1;\n const n = o[1].toLowerCase(), r = o[2].trim();\n if (t.metadata[n] = r, n === \"offset\") {\n const a = Number(r);\n isNaN(a) || (t.offsetMs = a);\n }\n return !0;\n}\nfunction Z(e) {\n const o = e.replace(/\\r\\n?/g, `\n`).replace(/^\\uFEFF/, \"\").split(`\n`), n = { metadata: {}, offsetMs: 0 }, r = /\\[(\\d{1,2}):(\\d{1,2})(?:[.:](\\d{1,3}))?\\]/g, a = [];\n for (const s of o) {\n const l = s.trim();\n if (!l || R(l, n)) continue;\n const d = [];\n let f = 0;\n r.lastIndex = 0;\n let u;\n for (; (u = r.exec(l)) !== null && u.index === f; )\n d.push(M(u[1], u[2], u[3])), f = u.index + u[0].length;\n if (d.length === 0) continue;\n const p = l.slice(f).trim();\n for (const m of d)\n a.push({ start: m, text: p });\n }\n a.sort((s, l) => s.start - l.start);\n const i = n.offsetMs / 1e3;\n return { format: \"lrc\", cues: a.map((s, l) => {\n const d = Math.max(0, s.start - i), f = a[l + 1], u = f ? Math.max(d, f.start - i) : d + 5;\n return { start: d, end: u, text: s.text };\n }), metadata: n.metadata };\n}\nfunction O(e) {\n const o = e.replace(/\\r\\n?/g, `\n`).replace(/^\\uFEFF/, \"\").split(`\n`), n = { metadata: {}, offsetMs: 0 }, r = /\\[(\\d{1,2}):(\\d{1,2})(?:[.:](\\d{1,3}))?\\]/g, a = /<(\\d{1,2}):(\\d{1,2})(?:[.:](\\d{1,3}))?>/g, i = [];\n for (const l of o) {\n const d = l.trim();\n if (!d || R(d, n)) continue;\n const f = [];\n let u = 0;\n r.lastIndex = 0;\n let p;\n for (; (p = r.exec(d)) !== null && p.index === u; )\n f.push(M(p[1], p[2], p[3])), u = p.index + p[0].length;\n if (f.length === 0) continue;\n const m = d.slice(u);\n for (const g of f)\n i.push({ start: g, raw: m });\n }\n i.sort((l, d) => l.start - d.start);\n const c = n.offsetMs / 1e3;\n return { format: \"elrc\", cues: i.map((l, d) => {\n const f = [];\n let u = \"\", p = 0, m = null;\n a.lastIndex = 0;\n let g;\n for (; (g = a.exec(l.raw)) !== null; ) {\n const F = l.raw.slice(p, g.index);\n m !== null && F && f.push({ start: Math.max(0, m - c), text: F }), u += F, m = M(g[1], g[2], g[3]), p = g.index + g[0].length;\n }\n const b = l.raw.slice(p);\n m !== null && b && f.push({ start: Math.max(0, m - c), text: b }), u += b;\n const h = Math.max(0, l.start - c), x = i[d + 1], w = x ? Math.max(h, x.start - c) : h + 5;\n return {\n start: h,\n end: w,\n text: u.trim(),\n words: f.length ? f : void 0\n };\n }), metadata: n.metadata };\n}\nfunction D(e) {\n const t = e.trim().split(\":\");\n return t.length !== 3 ? 0 : Number(t[0]) * 3600 + Number(t[1]) * 60 + Number(t[2].replace(\",\", \".\"));\n}\nfunction L(e, t) {\n const n = e.replace(/\\r\\n?/g, `\n`).replace(/^\\uFEFF/, \"\").split(`\n`);\n let r = \"\", a = [];\n const i = [], c = [];\n for (const s of n) {\n const l = s.replace(/\\s+$/, \"\"), d = l.trim(), f = /^\\[([^\\]]+)\\]\\s*$/.exec(d);\n if (f) {\n r = f[1].toLowerCase(), c.push(l);\n continue;\n }\n if (r !== \"events\") {\n c.push(l);\n continue;\n }\n const u = /^Format:\\s*(.+)$/i.exec(d);\n if (u) {\n a = u[1].split(\",\").map((v) => v.trim());\n continue;\n }\n const p = /^(Dialogue|Comment):\\s*(.+)$/i.exec(d);\n if (!p || p[1].toLowerCase() === \"comment\" || a.length === 0) continue;\n const m = a.length, g = p[2].split(\",\"), b = g.slice(0, m - 1), h = g.slice(m - 1).join(\",\"), x = {};\n a.forEach((v, y) => {\n x[v] = y === m - 1 ? h : b[y] ?? \"\";\n });\n const w = D(x.Start || \"\"), F = D(x.End || \"\"), _ = (x.Text || \"\").replace(/\\\\N/g, `\n`).replace(/\\\\n/g, `\n`).replace(/\\\\h/g, \" \").replace(/\\{[^}]*\\}/g, \"\");\n i.push({ start: w, end: F, text: _, style: x.Style });\n }\n return i.sort((s, l) => s.start - l.start), {\n format: t,\n cues: i,\n header: c.join(`\n`).trim() || void 0\n };\n}\nfunction S(e) {\n const t = e.trim();\n if (!t) return 0;\n const o = /^(\\d+(?:\\.\\d+)?)(h|m|s|ms|f|t)$/i.exec(t);\n if (o) {\n const r = Number(o[1]), a = o[2].toLowerCase();\n return a === \"h\" ? r * 3600 : a === \"m\" ? r * 60 : a === \"ms\" ? r / 1e3 : r;\n }\n const n = t.split(\":\");\n return n.length === 3 ? Number(n[0]) * 3600 + Number(n[1]) * 60 + Number(n[2]) : n.length === 2 ? Number(n[0]) * 60 + Number(n[1]) : Number(t) || 0;\n}\nfunction V(e) {\n if (typeof DOMParser > \"u\")\n throw new Error(\"TTML parsing requires a DOMParser environment\");\n const t = new DOMParser().parseFromString(e, \"application/xml\");\n if (t.getElementsByTagName(\"parsererror\").length > 0)\n throw new Error(\"TTML XML parse error\");\n const n = t.getElementsByTagName(\"p\"), r = [];\n for (let a = 0; a < n.length; a++) {\n const i = n[a], c = i.getAttribute(\"begin\") || \"\", s = i.getAttribute(\"end\") || \"\", l = i.getAttribute(\"dur\") || \"\", d = S(c);\n let f;\n s ? f = S(s) : l ? f = d + S(l) : f = d + 5;\n let u = \"\";\n i.childNodes.forEach((m) => {\n if (m.nodeType === 3)\n u += m.nodeValue || \"\";\n else if (m.nodeType === 1) {\n const g = m;\n g.tagName.toLowerCase() === \"br\" ? u += `\n` : u += g.textContent || \"\";\n }\n });\n const p = u.replace(/[ \\t]+/g, \" \").replace(/\\n /g, `\n`).trim();\n (p || d || f) && r.push({ start: d, end: f, text: p });\n }\n return r.sort((a, i) => a.start - i.start), { format: \"ttml\", cues: r };\n}\nfunction bt(e, t) {\n switch (t ?? W(e)) {\n case \"lrc\":\n return Z(e);\n case \"elrc\":\n return O(e);\n case \"ass\":\n return L(e, \"ass\");\n case \"ssa\":\n return L(e, \"ssa\");\n case \"ttml\":\n return V(e);\n case \"vtt\":\n return N(e, \"vtt\");\n case \"srt\":\n default:\n return N(e, \"srt\");\n }\n}\nasync function Ft(e) {\n return A.loadAsync(e);\n}\nfunction vt(e) {\n const t = [];\n return e.forEach((o, n) => {\n var f;\n const r = n.dir, a = r && !o.endsWith(\"/\") ? o + \"/\" : o, i = r ? a.replace(/\\/$/, \"\") : a, c = i.lastIndexOf(\"/\"), s = c >= 0 ? i.slice(c + 1) : i, l = c >= 0 ? i.slice(0, c) : \"\", d = r ? 0 : ((f = n._data) == null ? void 0 : f.uncompressedSize) ?? 0;\n t.push({\n path: a,\n name: s,\n dir: l,\n isDir: r,\n size: d,\n date: n.date\n });\n }), t;\n}\nfunction wt(e) {\n const t = { name: \"\", path: \"\", isDir: !0, children: [], size: 0 }, o = /* @__PURE__ */ new Map();\n o.set(\"\", t);\n const n = (a) => {\n if (o.has(a)) return o.get(a);\n const i = a.split(\"/\").filter(Boolean);\n let c = t, s = \"\";\n for (const l of i) {\n s = s ? `${s}/${l}` : l;\n let d = o.get(s);\n d || (d = { name: l, path: s + \"/\", isDir: !0, children: [], size: 0 }, c.children.push(d), o.set(s, d)), c = d;\n }\n return c;\n };\n for (const a of e) {\n if (a.isDir) {\n n(a.path.replace(/\\/$/, \"\"));\n continue;\n }\n n(a.dir).children.push({\n name: a.name,\n path: a.path,\n isDir: !1,\n size: a.size\n });\n }\n const r = (a) => {\n if (a.children) {\n a.children.sort((i, c) => i.isDir !== c.isDir ? i.isDir ? -1 : 1 : i.name.localeCompare(c.name));\n for (const i of a.children) r(i);\n }\n };\n return r(t), t;\n}\nasync function yt(e, t) {\n const o = e.file(t);\n if (!o) throw new Error(`ZIP entry not found: ${t}`);\n const n = await o.async(\"arraybuffer\");\n return U(n);\n}\nasync function _t(e, t, o) {\n const n = e.file(t);\n if (!n) throw new Error(`ZIP entry not found: ${t}`);\n const r = await n.async(\"arraybuffer\");\n return new Blob([r], o ? { type: o } : void 0);\n}\nfunction q(e) {\n return e ? e.startsWith(\"#\") ? e : e.length === 8 ? \"#\" + e.substring(2) : e.length === 6 ? \"#\" + e : \"#000000\" : \"#000000\";\n}\nconst G = [\n \"FFFFFF\",\n \"000000\",\n \"E7E6E6\",\n \"44546A\",\n \"4472C4\",\n \"ED7D31\",\n \"A5A5A5\",\n \"FFC000\",\n \"5B9BD5\",\n \"70AD47\"\n], H = [\n \"000000\",\n \"FFFFFF\",\n \"FF0000\",\n \"00FF00\",\n \"0000FF\",\n \"FFFF00\",\n \"FF00FF\",\n \"00FFFF\",\n \"000000\",\n \"FFFFFF\",\n \"FF0000\",\n \"00FF00\",\n \"0000FF\",\n \"FFFF00\",\n \"FF00FF\",\n \"00FFFF\",\n \"800000\",\n \"008000\",\n \"000080\",\n \"808000\",\n \"800080\",\n \"008080\",\n \"C0C0C0\",\n \"808080\",\n \"9999FF\",\n \"993366\",\n \"FFFFCC\",\n \"CCFFFF\",\n \"660066\",\n \"FF8080\",\n \"0066CC\",\n \"CCCCFF\",\n \"000080\",\n \"FF00FF\",\n \"FFFF00\",\n \"00FFFF\",\n \"800080\",\n \"800000\",\n \"008080\",\n \"0000FF\",\n \"00CCFF\",\n \"CCFFFF\",\n \"CCFFCC\",\n \"FFFF99\",\n \"99CCFF\",\n \"FF99CC\",\n \"CC99FF\",\n \"FFCC99\",\n \"3366FF\",\n \"33CCCC\",\n \"99CC00\",\n \"FFCC00\",\n \"FF9900\",\n \"FF6600\",\n \"666699\",\n \"969696\",\n \"003366\",\n \"339966\",\n \"003300\",\n \"333300\",\n \"993300\",\n \"993366\",\n \"333399\",\n \"333333\"\n];\nfunction J(e, t) {\n const o = parseInt(e.substring(0, 2), 16), n = parseInt(e.substring(2, 4), 16), r = parseInt(e.substring(4, 6), 16), a = (l) => t < 0 ? Math.round(l * (1 + t)) : Math.round(l + (255 - l) * t), i = Math.min(255, Math.max(0, a(o))), c = Math.min(255, Math.max(0, a(n))), s = Math.min(255, Math.max(0, a(r)));\n return i.toString(16).padStart(2, \"0\") + c.toString(16).padStart(2, \"0\") + s.toString(16).padStart(2, \"0\");\n}\nfunction X(e) {\n if (e && e.type === \"pattern\" && e.pattern === \"solid\") {\n const t = e.fgColor;\n if (t)\n return T(t);\n }\n}\nfunction T(e) {\n if (e) {\n if (\"argb\" in e && typeof e.argb == \"string\" && e.argb)\n return q(e.argb);\n if (\"theme\" in e && typeof e.theme == \"number\") {\n const t = G[e.theme] || \"000000\", o = \"tint\" in e && typeof e.tint == \"number\" ? e.tint : 0;\n return \"#\" + (o !== 0 ? J(t, o) : t);\n }\n if (\"indexed\" in e && typeof e.indexed == \"number\") {\n const t = H[e.indexed];\n if (t) return \"#\" + t;\n }\n }\n}\nfunction K(e) {\n if (!e || !e.style) return;\n const t = T(e.color) || \"#000000\";\n return [e.style, t];\n}\nfunction Q(e) {\n const t = {};\n let o = !1;\n if (e.font) {\n const r = e.font;\n if ((r.name || r.size || r.bold || r.italic) && (o = !0, t.font = {}, r.name && (t.font.name = r.name), r.size && (t.font.size = r.size), r.bold && (t.font.bold = !0), r.italic && (t.font.italic = !0)), r.color) {\n const a = T(r.color);\n a && (o = !0, t.color = a);\n }\n r.underline && (o = !0, t.underline = !0), r.strike && (o = !0, t.strike = !0);\n }\n const n = X(e.fill);\n if (n && (o = !0, t.bgcolor = n), e.alignment) {\n const r = e.alignment;\n r.horizontal && (o = !0, t.align = r.horizontal), r.vertical && (o = !0, t.valign = r.vertical), r.wrapText && (o = !0, t.textwrap = !0);\n }\n if (e.border) {\n const r = {};\n let a = !1;\n const i = [\"top\", \"bottom\", \"left\", \"right\"];\n for (const c of i) {\n const s = K(e.border[c]);\n s && (r[c] = s, a = !0);\n }\n a && (o = !0, t.border = r);\n }\n return o ? t : null;\n}\nfunction Y(e) {\n return JSON.stringify(e);\n}\nfunction tt(e, t, o) {\n const n = Q(e);\n if (!n) return -1;\n const r = Y(n), a = o.get(r);\n if (a !== void 0) return a;\n const i = t.length;\n return t.push(n), o.set(r, i), i;\n}\nfunction et(e) {\n const t = e.value;\n if (t == null) return \"\";\n if (typeof t == \"string\") return t;\n if (typeof t == \"number\") return String(t);\n if (typeof t == \"boolean\") return t ? \"TRUE\" : \"FALSE\";\n if (t instanceof Date)\n return t.toLocaleDateString();\n if (typeof t == \"object\" && \"formula\" in t) {\n const o = t.result;\n return o != null ? String(o) : \"\";\n }\n return typeof t == \"object\" && \"richText\" in t ? t.richText.map((n) => n.text).join(\"\") : typeof t == \"object\" && \"hyperlink\" in t ? t.text || \"\" : typeof t == \"object\" && \"error\" in t ? String(t.error) : String(t);\n}\nfunction ot(e) {\n const t = e.split(\":\"), o = P(t[0]), n = t[1] ? P(t[1]) : o;\n return {\n top: o.row,\n left: o.col,\n bottom: n.row,\n right: n.col\n };\n}\nfunction P(e) {\n const t = e.match(/^([A-Z]+)(\\d+)$/);\n if (!t) return { row: 1, col: 1 };\n const o = t[1], n = parseInt(t[2], 10);\n let r = 0;\n for (let a = 0; a < o.length; a++)\n r = r * 26 + (o.charCodeAt(a) - 64);\n return { row: n, col: r };\n}\nfunction Ct(e) {\n const t = [];\n return e.eachSheet((o) => {\n const n = [], r = /* @__PURE__ */ new Map(), a = [], i = {}, c = {}, s = o.columnCount;\n for (let u = 1; u <= s; u++) {\n const p = o.getColumn(u);\n p.width && (c[String(u - 1)] = { width: Math.round(p.width * 7.5) });\n }\n c.len = Math.max(s, 26);\n const l = /* @__PURE__ */ new Map(), d = o.model, f = (d == null ? void 0 : d.merges) || [];\n for (const u of f) {\n a.push(u);\n const { top: p, left: m, bottom: g, right: b } = ot(u), h = g - p, x = b - m;\n l.set(`${p - 1},${m - 1}`, [h, x]);\n }\n o.eachRow({ includeEmpty: !0 }, (u, p) => {\n const m = p - 1, g = {};\n u.eachCell({ includeEmpty: !1 }, (h, x) => {\n const w = x - 1;\n if (h.isMerged && h.master !== h) return;\n const F = et(h), _ = tt(h, n, r), v = { text: F };\n _ !== -1 && (v.style = _);\n const y = `${m},${w}`;\n l.has(y) && (v.merge = l.get(y)), g[String(w)] = v;\n });\n const b = { cells: g };\n u.height && (b.height = Math.round(u.height * 1.333)), i[String(m)] = b;\n }), t.push({\n name: o.name,\n styles: n,\n merges: a,\n rows: i,\n cols: c\n });\n }), t;\n}\nfunction kt(e, t, o = \"Sheet1\") {\n const n = e.length > 0, a = n ? [{ font: { bold: !0 } }] : [], i = {};\n if (n) {\n const s = {};\n e.forEach((l, d) => {\n s[String(d)] = { text: l, style: 0 };\n }), i[0] = { cells: s };\n }\n const c = n ? 1 : 0;\n return t.forEach((s, l) => {\n const d = {};\n s.forEach((f, u) => {\n f !== void 0 && f !== \"\" && (d[String(u)] = { text: f });\n }), i[String(l + c)] = { cells: d };\n }), [{ name: o, styles: a, rows: i }];\n}\nfunction St(e, t) {\n var i;\n if (typeof window > \"u\") return;\n const o = (e == null ? void 0 : e.version) || ((i = e == null ? void 0 : e.GlobalWorkerOptions) == null ? void 0 : i.version) || \"\", {\n workerSrc: n = `https://unpkg.com/pdfjs-dist@${o}/build/pdf.worker.min.mjs`,\n cMapUrl: r = `https://unpkg.com/pdfjs-dist@${o}/cmaps/`,\n cMapPacked: a = !0\n } = t || {};\n e.GlobalWorkerOptions && (e.GlobalWorkerOptions.workerSrc = n, e.GlobalWorkerOptions.cMapUrl = r, e.GlobalWorkerOptions.cMapPacked = a);\n}\nconst nt = {\n // ─────── common ───────\n \"common.download\": \"下载\",\n \"common.close\": \"关闭\",\n \"common.loading\": \"加载中\",\n \"common.unknown_error\": \"未知错误\",\n \"common.unsupported_preview\": \"不支持预览此文件类型 ({type})\",\n // ─────── toolbar ───────\n \"toolbar.zoom_in\": \"放大\",\n \"toolbar.zoom_out\": \"缩小\",\n \"toolbar.rotate_left\": \"向左旋转\",\n \"toolbar.rotate_right\": \"向右旋转\",\n \"toolbar.reset\": \"复原\",\n \"toolbar.fit_to_window\": \"适应窗口\",\n \"toolbar.original_size\": \"原始尺寸\",\n \"toolbar.toc\": \"目录\",\n \"toolbar.prev_page\": \"上一页\",\n \"toolbar.next_page\": \"下一页\",\n \"toolbar.full_width\": \"全屏宽度\",\n \"toolbar.normal_width\": \"正常宽度\",\n \"toolbar.wrap_on\": \"自动换行\",\n \"toolbar.wrap_off\": \"不换行\",\n \"toolbar.source\": \"源码\",\n \"toolbar.preview\": \"预览\",\n // ─────── image ───────\n \"image.load_failed\": \"图片加载失败\",\n // ─────── pdf ───────\n \"pdf.load_failed\": \"PDF 文件加载失败\",\n // ─────── docx ───────\n \"docx.parse_failed\": \"Word 文档解析失败\",\n // ─────── xlsx ───────\n \"xlsx.loading\": \"加载 Excel 中...\",\n \"xlsx.load_failed\": \"Excel 加载失败\",\n \"xlsx.parse_failed\": \"Excel 文件解析失败\",\n \"xlsx.not_found\": \"Excel 文件不存在\",\n // ─────── pptx ───────\n \"pptx.loading\": \"加载 PPT 中...\",\n \"pptx.load_failed\": \"PPT 加载失败\",\n \"pptx.parse_failed\": \"PPT 文件解析失败\",\n \"pptx.not_found\": \"PPT 文件不存在\",\n \"pptx.invalid_format\": \"PPT 文件格式错误或已损坏\",\n \"pptx.no_pages\": \"PPT 文件无有效页面\",\n \"pptx.timeout\": \"加载超时,请检查网络或稍后重试\",\n // ─────── msg ───────\n \"msg.parse_failed\": \"Outlook 邮件解析失败\",\n \"msg.parse_failed_short\": \"邮件解析失败\",\n \"msg.empty_body\": \"(无邮件正文)\",\n // ─────── epub ───────\n \"epub.load_failed\": \"EPUB 文件加载失败\",\n // ─────── mobi ───────\n \"mobi.load_failed\": \"电子书加载失败,文件可能已损坏或带有 DRM 保护\",\n // ─────── video ───────\n \"video.loading\": \"加载视频中...\",\n \"video.load_failed\": \"视频加载失败\",\n \"video.load_failed_with_error\": \"视频加载失败: {error}\",\n // ─────── audio (aria-label) ───────\n \"audio.aria.play\": \"播放\",\n \"audio.aria.pause\": \"暂停\",\n \"audio.aria.forward_10\": \"前进 10 秒\",\n \"audio.aria.backward_10\": \"后退 10 秒\",\n \"audio.aria.mute\": \"静音\",\n \"audio.aria.unmute\": \"取消静音\",\n \"audio.aria.loop_on\": \"开启循环\",\n \"audio.aria.loop_off\": \"关闭循环\",\n \"audio.aria.progress\": \"播放进度\",\n \"audio.aria.volume\": \"音量\",\n // ─────── markdown ───────\n \"markdown.load_failed\": \"Markdown 文件加载失败\",\n \"markdown.copy_code\": \"复制代码\",\n \"markdown.copied\": \"已复制\",\n // ─────── json ───────\n \"json.load_failed\": \"JSON 文件加载失败\",\n \"json.items\": \"items\",\n \"json.keys\": \"keys\",\n // ─────── csv ───────\n \"csv.loading\": \"加载 CSV 中...\",\n \"csv.load_failed\": \"CSV 文件加载失败\",\n \"csv.parse_failed\": \"CSV 解析失败\",\n // ─────── xml ───────\n \"xml.load_failed\": \"XML 文件加载失败\",\n // ─────── subtitle / lyric ───────\n \"subtitle.load_failed\": \"字幕文件加载失败\",\n \"subtitle.parse_failed\": \"字幕解析失败\",\n \"subtitle.lines\": \"lines\",\n \"subtitle.cues\": \"cues\",\n \"subtitle.meta.title\": \"标题\",\n \"subtitle.meta.artist\": \"艺术家\",\n \"subtitle.meta.album\": \"专辑\",\n \"subtitle.meta.author\": \"作者\",\n \"subtitle.meta.by\": \"制作\",\n \"subtitle.meta.length\": \"时长\",\n \"subtitle.meta.offset\": \"偏移\",\n \"subtitle.meta.editor\": \"编辑器\",\n \"subtitle.meta.version\": \"版本\",\n // ─────── zip ───────\n \"zip.load_failed\": \"ZIP 文件加载失败\",\n \"zip.parse_failed\": \"ZIP 解析失败\",\n // ─────── text ───────\n \"text.load_failed\": \"文本文件加载失败\"\n}, rt = {\n // ─────── common ───────\n \"common.download\": \"Download\",\n \"common.close\": \"Close\",\n \"common.loading\": \"Loading\",\n \"common.unknown_error\": \"Unknown error\",\n \"common.unsupported_preview\": \"Preview not supported for this file type ({type})\",\n // ─────── toolbar ───────\n \"toolbar.zoom_in\": \"Zoom in\",\n \"toolbar.zoom_out\": \"Zoom out\",\n \"toolbar.rotate_left\": \"Rotate left\",\n \"toolbar.rotate_right\": \"Rotate right\",\n \"toolbar.reset\": \"Reset\",\n \"toolbar.fit_to_window\": \"Fit to window\",\n \"toolbar.original_size\": \"Original size\",\n \"toolbar.toc\": \"Table of contents\",\n \"toolbar.prev_page\": \"Previous page\",\n \"toolbar.next_page\": \"Next page\",\n \"toolbar.full_width\": \"Full width\",\n \"toolbar.normal_width\": \"Normal width\",\n \"toolbar.wrap_on\": \"Word wrap\",\n \"toolbar.wrap_off\": \"No wrap\",\n \"toolbar.source\": \"Source\",\n \"toolbar.preview\": \"Preview\",\n // ─────── image ───────\n \"image.load_failed\": \"Failed to load image\",\n // ─────── pdf ───────\n \"pdf.load_failed\": \"Failed to load PDF\",\n // ─────── docx ───────\n \"docx.parse_failed\": \"Failed to parse Word document\",\n // ─────── xlsx ───────\n \"xlsx.loading\": \"Loading Excel...\",\n \"xlsx.load_failed\": \"Failed to load Excel\",\n \"xlsx.parse_failed\": \"Failed to parse Excel file\",\n \"xlsx.not_found\": \"Excel file not found\",\n // ─────── pptx ───────\n \"pptx.loading\": \"Loading PPT...\",\n \"pptx.load_failed\": \"Failed to load PPT\",\n \"pptx.parse_failed\": \"Failed to parse PPT file\",\n \"pptx.not_found\": \"PPT file not found\",\n \"pptx.invalid_format\": \"PPT file format is invalid or corrupted\",\n \"pptx.no_pages\": \"PPT file has no valid pages\",\n \"pptx.timeout\": \"Loading timed out, please check your network and retry\",\n // ─────── msg ───────\n \"msg.parse_failed\": \"Failed to parse Outlook message\",\n \"msg.parse_failed_short\": \"Failed to parse message\",\n \"msg.empty_body\": \"(No message body)\",\n // ─────── epub ───────\n \"epub.load_failed\": \"Failed to load EPUB\",\n // ─────── mobi ───────\n \"mobi.load_failed\": \"Failed to load ebook — file may be corrupted or DRM-protected\",\n // ─────── video ───────\n \"video.loading\": \"Loading video...\",\n \"video.load_failed\": \"Failed to load video\",\n \"video.load_failed_with_error\": \"Failed to load video: {error}\",\n // ─────── audio (aria-label) ───────\n \"audio.aria.play\": \"Play\",\n \"audio.aria.pause\": \"Pause\",\n \"audio.aria.forward_10\": \"Forward 10 seconds\",\n \"audio.aria.backward_10\": \"Back 10 seconds\",\n \"audio.aria.mute\": \"Mute\",\n \"audio.aria.unmute\": \"Unmute\",\n \"audio.aria.loop_on\": \"Enable loop\",\n \"audio.aria.loop_off\": \"Disable loop\",\n \"audio.aria.progress\": \"Playback progress\",\n \"audio.aria.volume\": \"Volume\",\n // ─────── markdown ───────\n \"markdown.load_failed\": \"Failed to load Markdown\",\n \"markdown.copy_code\": \"Copy code\",\n \"markdown.copied\": \"Copied\",\n // ─────── json ───────\n \"json.load_failed\": \"Failed to load JSON\",\n \"json.items\": \"items\",\n \"json.keys\": \"keys\",\n // ─────── csv ───────\n \"csv.loading\": \"Loading CSV...\",\n \"csv.load_failed\": \"Failed to load CSV\",\n \"csv.parse_failed\": \"Failed to parse CSV\",\n // ─────── xml ───────\n \"xml.load_failed\": \"Failed to load XML\",\n // ─────── subtitle / lyric ───────\n \"subtitle.load_failed\": \"Failed to load subtitle\",\n \"subtitle.parse_failed\": \"Failed to parse subtitle\",\n \"subtitle.lines\": \"lines\",\n \"subtitle.cues\": \"cues\",\n \"subtitle.meta.title\": \"Title\",\n \"subtitle.meta.artist\": \"Artist\",\n \"subtitle.meta.album\": \"Album\",\n \"subtitle.meta.author\": \"Author\",\n \"subtitle.meta.by\": \"By\",\n \"subtitle.meta.length\": \"Length\",\n \"subtitle.meta.offset\": \"Offset\",\n \"subtitle.meta.editor\": \"Editor\",\n \"subtitle.meta.version\": \"Version\",\n // ─────── zip ───────\n \"zip.load_failed\": \"Failed to load ZIP\",\n \"zip.parse_failed\": \"Failed to parse ZIP\",\n // ─────── text ───────\n \"text.load_failed\": \"Failed to load text file\"\n}, C = {\n \"zh-CN\": nt,\n \"en-US\": rt\n}, it = /\\{(\\w+)\\}/g;\nfunction at(e, t) {\n return t ? e.replace(it, (o, n) => {\n const r = t[n];\n return r === void 0 ? `{${n}}` : String(r);\n }) : e;\n}\nfunction Mt(e) {\n var i;\n const t = e.fallbackLocale ?? \"zh-CN\", o = C[e.locale] ?? C[t] ?? C[\"zh-CN\"], n = (i = e.messages) == null ? void 0 : i[e.locale], r = n ? { ...o, ...n } : o, a = C[\"zh-CN\"];\n return (c, s) => {\n const l = r[c] ?? a[c] ?? c;\n return at(l, s);\n };\n}\nexport {\n wt as buildZipTree,\n C as builtInMessages,\n St as configurePdfWorker,\n kt as convertCsvToSpreadsheetData,\n Ct as convertWorkbookToSpreadsheetData,\n Mt as createTranslator,\n $ as decodeText,\n U as decodeUtf8,\n ht as fetchTextUtf8,\n pt as formatFileSize,\n xt as formatSubtitleTime,\n ft as formatTime,\n j as getFileNameFromUrl,\n ct as getFileType,\n dt as getLanguageFromFileName,\n ut as getVideoMimeType,\n mt as guessCsvDelimiter,\n k as inferMimeType,\n vt as listZipEntries,\n Ft as loadZip,\n I as normalizeFile,\n lt as normalizeFiles,\n gt as parseCsv,\n bt as parseSubtitle,\n _t as readZipEntryBlob,\n yt as readZipEntryText\n};\n//# sourceMappingURL=index.mjs.map\n","import React, { createContext, useContext, useMemo } from 'react';\nimport {\n createTranslator,\n type Locale,\n type Messages,\n type Translator,\n} from '@eternalheart/file-preview-core';\n\nexport interface LocaleContextValue {\n locale: Locale;\n t: Translator;\n}\n\nconst LocaleContext = createContext<LocaleContextValue | null>(null);\n\nexport interface LocaleProviderProps {\n /** 当前语言,默认 'zh-CN' */\n locale?: Locale;\n /** 用户自定义字典,浅合并到内置字典之上 */\n messages?: Partial<Record<Locale, Partial<Messages>>>;\n children: React.ReactNode;\n}\n\nexport const LocaleProvider: React.FC<LocaleProviderProps> = ({\n locale = 'zh-CN',\n messages,\n children,\n}) => {\n const value = useMemo<LocaleContextValue>(() => {\n const t = createTranslator({ locale, messages });\n return { locale, t };\n }, [locale, messages]);\n\n return <LocaleContext.Provider value={value}>{children}</LocaleContext.Provider>;\n};\n\n/**\n * 兜底 translator(当组件被脱离 LocaleProvider 直接使用时)\n * 保持模块级单例,避免每次调用重建\n */\nlet fallbackTranslator: Translator | null = null;\nfunction getFallbackTranslator(): Translator {\n if (!fallbackTranslator) {\n fallbackTranslator = createTranslator({ locale: 'zh-CN' });\n }\n return fallbackTranslator;\n}\n\n/**\n * 获取翻译函数。任意位置调用都安全:\n * - 在 LocaleProvider 下 → 用 provider 提供的 translator\n * - 否则 → 回落到 zh-CN 兜底 translator\n */\nexport function useTranslator(): Translator {\n const ctx = useContext(LocaleContext);\n return ctx?.t ?? getFallbackTranslator();\n}\n\n/**\n * 获取当前 locale。在 Provider 之外返回 'zh-CN'。\n */\nexport function useLocale(): Locale {\n const ctx = useContext(LocaleContext);\n return ctx?.locale ?? 'zh-CN';\n}\n","import React, { createContext, useContext } from 'react';\n\n/** 已解析的主题(auto 在 FilePreviewContent 里被解析过) */\nexport type ResolvedTheme = 'dark' | 'light';\n\nconst ThemeContext = createContext<ResolvedTheme | null>(null);\n\nexport interface ThemeProviderProps {\n theme: ResolvedTheme;\n children: React.ReactNode;\n}\n\nexport const ThemeProvider: React.FC<ThemeProviderProps> = ({ theme, children }) => {\n return <ThemeContext.Provider value={theme}>{children}</ThemeContext.Provider>;\n};\n\n/**\n * 获取已解析的主题('dark' | 'light')。\n * Provider 之外默认 'dark'(保持组件历史默认行为)。\n *\n * renderer 需要切第三方库的 theme prop(如 react-syntax-highlighter 的 style、\n * shiki 的 theme 选项)时使用;不要用它做 className 分支 —— class 由 CSS 变量\n * 通过根容器 [data-theme] 自动切换。\n */\nexport function useResolvedTheme(): ResolvedTheme {\n return useContext(ThemeContext) ?? 'dark';\n}\n","import React from 'react';\nimport { ZoomIn, ZoomOut, RotateCw, RotateCcw, Scan, RefreshCw } from 'lucide-react';\nimport type { ToolbarGroup } from '../toolbar.types';\nimport type { Translator } from '@eternalheart/file-preview-core';\n\nconst OriginalSizeIcon: React.FC<{ className?: string }> = ({ className }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <text x=\"12\" y=\"17.5\" textAnchor=\"middle\" fontSize=\"20\" fontWeight=\"bold\" fill=\"currentColor\" stroke=\"none\">\n 1:1\n </text>\n </svg>\n);\n\nexport interface ImageToolbarContext {\n zoom: number;\n onZoomIn: () => void;\n onZoomOut: () => void;\n onFitToWidth: () => void;\n onOriginalSize: () => void;\n onRotateLeft: () => void;\n onRotateRight: () => void;\n onReset: () => void;\n t: Translator;\n}\n\nexport function getImageToolbarGroups(ctx: ImageToolbarContext): ToolbarGroup[] {\n return [\n {\n items: [\n { type: 'button', icon: <ZoomOut className=\"rfp-w-4 rfp-h-4\" />, tooltip: ctx.t('toolbar.zoom_out'), action: ctx.onZoomOut, disabled: ctx.zoom <= 0.01 },\n { type: 'text', content: `${Math.round(ctx.zoom * 100)}%`, minWidth: '3rem' },\n { type: 'button', icon: <ZoomIn className=\"rfp-w-4 rfp-h-4\" />, tooltip: ctx.t('toolbar.zoom_in'), action: ctx.onZoomIn, disabled: ctx.zoom >= 10 },\n ],\n },\n {\n items: [\n { type: 'button', icon: <Scan className=\"rfp-w-4 rfp-h-4\" />, tooltip: ctx.t('toolbar.fit_to_window'), action: ctx.onFitToWidth },\n { type: 'button', icon: <OriginalSizeIcon className=\"rfp-w-4 rfp-h-4\" />, tooltip: ctx.t('toolbar.original_size'), action: ctx.onOriginalSize },\n ],\n },\n {\n items: [\n { type: 'button', icon: <RotateCcw className=\"rfp-w-4 rfp-h-4\" />, tooltip: ctx.t('toolbar.rotate_left'), action: ctx.onRotateLeft },\n { type: 'button', icon: <RotateCw className=\"rfp-w-4 rfp-h-4\" />, tooltip: ctx.t('toolbar.rotate_right'), action: ctx.onRotateRight },\n ],\n },\n {\n items: [\n { type: 'button', icon: <RefreshCw className=\"rfp-w-4 rfp-h-4\" />, tooltip: ctx.t('toolbar.reset'), action: ctx.onReset },\n ],\n },\n ];\n}\n","import { ZoomIn, ZoomOut, RefreshCw } from 'lucide-react';\nimport type { ToolbarGroup } from '../toolbar.types';\nimport type { Translator } from '@eternalheart/file-preview-core';\n\nexport interface PdfToolbarContext {\n zoom: number;\n onZoomIn: () => void;\n onZoomOut: () => void;\n onReset: () => void;\n t: Translator;\n}\n\nexport function getPdfToolbarGroups(ctx: PdfToolbarContext): ToolbarGroup[] {\n return [\n {\n items: [\n { type: 'button', icon: <ZoomOut className=\"rfp-w-4 rfp-h-4\" />, tooltip: ctx.t('toolbar.zoom_out'), action: ctx.onZoomOut, disabled: ctx.zoom <= 0.01 },\n { type: 'text', content: `${Math.round(ctx.zoom * 100)}%`, minWidth: '3rem' },\n { type: 'button', icon: <ZoomIn className=\"rfp-w-4 rfp-h-4\" />, tooltip: ctx.t('toolbar.zoom_in'), action: ctx.onZoomIn, disabled: ctx.zoom >= 10 },\n ],\n },\n {\n items: [\n { type: 'button', icon: <RefreshCw className=\"rfp-w-4 rfp-h-4\" />, tooltip: ctx.t('toolbar.reset'), action: ctx.onReset },\n ],\n },\n ];\n}\n","import React from 'react';\nimport { ChevronLeft, ChevronRight, List, Maximize2, Minimize2 } from 'lucide-react';\nimport type { ToolbarGroup } from '../toolbar.types';\nimport type { EpubRendererHandle } from './index';\nimport type { Translator } from '@eternalheart/file-preview-core';\n\nexport interface EpubToolbarContext {\n epubRef: React.RefObject<EpubRendererHandle | null>;\n current: number;\n total: number;\n fullWidth: boolean;\n t: Translator;\n}\n\nexport function getEpubToolbarGroups(ctx: EpubToolbarContext): ToolbarGroup[] {\n return [\n {\n items: [\n { type: 'button', icon: <List className=\"rfp-w-4 rfp-h-4\" />, tooltip: ctx.t('toolbar.toc'), action: () => ctx.epubRef.current?.toggleToc() },\n ],\n },\n {\n items: [\n { type: 'button', icon: <ChevronLeft className=\"rfp-w-4 rfp-h-4\" />, tooltip: ctx.t('toolbar.prev_page'), action: () => ctx.epubRef.current?.prevPage() },\n { type: 'text', content: `${ctx.current} / ${ctx.total}`, minWidth: '4rem' },\n { type: 'button', icon: <ChevronRight className=\"rfp-w-4 rfp-h-4\" />, tooltip: ctx.t('toolbar.next_page'), action: () => ctx.epubRef.current?.nextPage() },\n ],\n },\n {\n items: [\n {\n type: 'button',\n icon: ctx.fullWidth ? <Minimize2 className=\"rfp-w-4 rfp-h-4\" /> : <Maximize2 className=\"rfp-w-4 rfp-h-4\" />,\n tooltip: ctx.fullWidth ? ctx.t('toolbar.normal_width') : ctx.t('toolbar.full_width'),\n action: () => ctx.epubRef.current?.toggleFullWidth(),\n },\n ],\n },\n ];\n}\n","import React from 'react';\nimport { ChevronLeft, ChevronRight, List, Maximize2, Minimize2 } from 'lucide-react';\nimport type { ToolbarGroup } from '../toolbar.types';\nimport type { MobiRendererHandle } from './index';\nimport type { Translator } from '@eternalheart/file-preview-core';\n\nexport interface MobiToolbarContext {\n mobiRef: React.RefObject<MobiRendererHandle | null>;\n current: number;\n total: number;\n fullWidth: boolean;\n t: Translator;\n}\n\nexport function getMobiToolbarGroups(ctx: MobiToolbarContext): ToolbarGroup[] {\n return [\n {\n items: [\n {\n type: 'button',\n icon: <List className=\"rfp-w-4 rfp-h-4\" />,\n tooltip: ctx.t('toolbar.toc'),\n action: () => ctx.mobiRef.current?.toggleToc(),\n },\n ],\n },\n {\n items: [\n {\n type: 'button',\n icon: <ChevronLeft className=\"rfp-w-4 rfp-h-4\" />,\n tooltip: ctx.t('toolbar.prev_page'),\n action: () => ctx.mobiRef.current?.prevPage(),\n },\n {\n type: 'text',\n content: `${ctx.current} / ${ctx.total}`,\n minWidth: '4rem',\n },\n {\n type: 'button',\n icon: <ChevronRight className=\"rfp-w-4 rfp-h-4\" />,\n tooltip: ctx.t('toolbar.next_page'),\n action: () => ctx.mobiRef.current?.nextPage(),\n },\n ],\n },\n {\n items: [\n {\n type: 'button',\n icon: ctx.fullWidth\n ? <Minimize2 className=\"rfp-w-4 rfp-h-4\" />\n : <Maximize2 className=\"rfp-w-4 rfp-h-4\" />,\n tooltip: ctx.fullWidth ? ctx.t('toolbar.normal_width') : ctx.t('toolbar.full_width'),\n action: () => ctx.mobiRef.current?.toggleFullWidth(),\n },\n ],\n },\n ];\n}\n","import type { ToolbarGroup } from '../toolbar.types';\nimport { formatFileSize } from '@eternalheart/file-preview-core';\nimport type { Translator } from '@eternalheart/file-preview-core';\n\nexport interface ZipToolbarStats {\n files: number;\n dirs: number;\n size: number;\n}\n\nexport interface ZipToolbarContext {\n stats: ZipToolbarStats | null;\n t: Translator;\n}\n\nexport function getZipToolbarGroups({ stats }: ZipToolbarContext): ToolbarGroup[] {\n if (!stats) return [];\n return [\n {\n items: [\n {\n type: 'text',\n content: `${stats.files} files · ${stats.dirs} dirs · ${formatFileSize(stats.size)}`,\n minWidth: '10rem',\n },\n ],\n },\n ];\n}\n","import { WrapText, Eye, Code } from 'lucide-react';\nimport type { ToolbarGroup } from '../toolbar.types';\nimport type { Translator } from '@eternalheart/file-preview-core';\n\nexport interface TextToolbarContext {\n wordWrap: boolean;\n onToggleWrap: () => void;\n isHtml: boolean;\n htmlPreview: boolean;\n onToggleHtmlPreview: () => void;\n t: Translator;\n}\n\nexport function getTextToolbarGroups(ctx: TextToolbarContext): ToolbarGroup[] {\n const groups: ToolbarGroup[] = [\n {\n items: [\n {\n type: 'button',\n icon: <WrapText className=\"rfp-w-4 rfp-h-4\" />,\n tooltip: ctx.wordWrap ? ctx.t('toolbar.wrap_off') : ctx.t('toolbar.wrap_on'),\n action: ctx.onToggleWrap,\n },\n ],\n },\n ];\n\n if (ctx.isHtml) {\n groups.push({\n items: [\n {\n type: 'button',\n icon: ctx.htmlPreview\n ? <Code className=\"rfp-w-4 rfp-h-4\" />\n : <Eye className=\"rfp-w-4 rfp-h-4\" />,\n tooltip: ctx.htmlPreview ? ctx.t('toolbar.source') : ctx.t('toolbar.preview'),\n action: ctx.onToggleHtmlPreview,\n },\n ],\n });\n }\n\n return groups;\n}\n","import { Eye, Code } from 'lucide-react';\nimport type { ToolbarGroup } from '../toolbar.types';\nimport type { Translator } from '@eternalheart/file-preview-core';\n\nexport interface MarkdownToolbarContext {\n viewMode: 'preview' | 'source';\n onToggleViewMode: () => void;\n t: Translator;\n}\n\nexport function getMarkdownToolbarGroups(ctx: MarkdownToolbarContext): ToolbarGroup[] {\n return [\n {\n items: [\n {\n type: 'button',\n icon: ctx.viewMode === 'preview'\n ? <Code className=\"rfp-w-4 rfp-h-4\" />\n : <Eye className=\"rfp-w-4 rfp-h-4\" />,\n tooltip: ctx.viewMode === 'preview' ? ctx.t('toolbar.source') : ctx.t('toolbar.preview'),\n action: ctx.onToggleViewMode,\n },\n ],\n },\n ];\n}\n","// 集中的 lazy 装饰:把每个 renderer 转为 React.lazy(import).then(default),\n// 让 rollup 自动按 chunk 分割。\n// 显式声明 LazyExoticComponent 以避免 TS4023(要求把内部 Props 类型导入到当前文件作用域)。\nimport { lazy, type LazyExoticComponent, type ComponentType } from 'react';\nimport type { ImageRenderer as ImageRendererImpl } from './Image';\nimport type { PdfRenderer as PdfRendererImpl } from './Pdf';\nimport type { DocxRenderer as DocxRendererImpl } from './Docx';\nimport type { XlsxRenderer as XlsxRendererImpl } from './Xlsx';\nimport type { PptxRenderer as PptxRendererImpl } from './Pptx';\nimport type { MsgRenderer as MsgRendererImpl } from './Msg';\nimport type { EpubRenderer as EpubRendererImpl } from './Epub';\nimport type { MobiRenderer as MobiRendererImpl } from './Mobi';\nimport type { VideoRenderer as VideoRendererImpl } from './Video';\nimport type { AudioRenderer as AudioRendererImpl } from './Audio';\nimport type { MarkdownRenderer as MarkdownRendererImpl } from './Markdown';\nimport type { JsonRenderer as JsonRendererImpl } from './Json';\nimport type { CsvRenderer as CsvRendererImpl } from './Csv';\nimport type { XmlRenderer as XmlRendererImpl } from './Xml';\nimport type { SubtitleRenderer as SubtitleRendererImpl } from './Subtitle';\nimport type { ZipRenderer as ZipRendererImpl } from './Zip';\nimport type { TextRenderer as TextRendererImpl } from './Text';\n\ntype Lazy<T> = LazyExoticComponent<T extends ComponentType<infer P> ? ComponentType<P> : never>;\n\nexport const ImageRenderer: Lazy<typeof ImageRendererImpl> = lazy(() =>\n import('./Image').then((m) => ({ default: m.ImageRenderer })),\n);\n\nexport const PdfRenderer: Lazy<typeof PdfRendererImpl> = lazy(() =>\n import('./Pdf').then((m) => ({ default: m.PdfRenderer })),\n);\n\nexport const DocxRenderer: Lazy<typeof DocxRendererImpl> = lazy(() =>\n import('./Docx').then((m) => ({ default: m.DocxRenderer })),\n);\n\nexport const XlsxRenderer: Lazy<typeof XlsxRendererImpl> = lazy(() =>\n import('./Xlsx').then((m) => ({ default: m.XlsxRenderer })),\n);\n\nexport const PptxRenderer: Lazy<typeof PptxRendererImpl> = lazy(() =>\n import('./Pptx').then((m) => ({ default: m.PptxRenderer })),\n);\n\nexport const MsgRenderer: Lazy<typeof MsgRendererImpl> = lazy(() =>\n import('./Msg').then((m) => ({ default: m.MsgRenderer })),\n);\n\nexport const EpubRenderer: Lazy<typeof EpubRendererImpl> = lazy(() =>\n import('./Epub').then((m) => ({ default: m.EpubRenderer })),\n);\n\nexport const MobiRenderer: Lazy<typeof MobiRendererImpl> = lazy(() =>\n import('./Mobi').then((m) => ({ default: m.MobiRenderer })),\n);\n\nexport const VideoRenderer: Lazy<typeof VideoRendererImpl> = lazy(() =>\n import('./Video').then((m) => ({ default: m.VideoRenderer })),\n);\n\nexport const AudioRenderer: Lazy<typeof AudioRendererImpl> = lazy(() =>\n import('./Audio').then((m) => ({ default: m.AudioRenderer })),\n);\n\nexport const MarkdownRenderer: Lazy<typeof MarkdownRendererImpl> = lazy(() =>\n import('./Markdown').then((m) => ({ default: m.MarkdownRenderer })),\n);\n\nexport const JsonRenderer: Lazy<typeof JsonRendererImpl> = lazy(() =>\n import('./Json').then((m) => ({ default: m.JsonRenderer })),\n);\n\nexport const CsvRenderer: Lazy<typeof CsvRendererImpl> = lazy(() =>\n import('./Csv').then((m) => ({ default: m.CsvRenderer })),\n);\n\nexport const XmlRenderer: Lazy<typeof XmlRendererImpl> = lazy(() =>\n import('./Xml').then((m) => ({ default: m.XmlRenderer })),\n);\n\nexport const SubtitleRenderer: Lazy<typeof SubtitleRendererImpl> = lazy(() =>\n import('./Subtitle').then((m) => ({ default: m.SubtitleRenderer })),\n);\n\nexport const ZipRenderer: Lazy<typeof ZipRendererImpl> = lazy(() =>\n import('./Zip').then((m) => ({ default: m.ZipRenderer })),\n);\n\nexport const TextRenderer: Lazy<typeof TextRendererImpl> = lazy(() =>\n import('./Text').then((m) => ({ default: m.TextRenderer })),\n);\n","import { FileQuestion, Download } from 'lucide-react';\nimport { useTranslator } from '../../i18n/LocaleContext';\n\ninterface UnsupportedRendererProps {\n fileName: string;\n fileType: string;\n onDownload: () => void;\n}\n\nexport const UnsupportedRenderer: React.FC<UnsupportedRendererProps> = ({\n fileName,\n fileType,\n onDownload,\n}) => {\n const t = useTranslator();\n return (\n <div className=\"rfp-flex rfp-flex-col rfp-items-center rfp-justify-center rfp-w-full rfp-h-full rfp-p-8 rfp-gap-6\">\n <div className=\"rfp-w-32 rfp-h-32 rfp-rounded-full rfp-bg-surface-2 rfp-flex rfp-items-center rfp-justify-center\">\n <FileQuestion className=\"rfp-w-16 rfp-h-16 rfp-text-fg-secondary\" />\n </div>\n\n <div className=\"rfp-text-fg-primary rfp-text-center\">\n <p className=\"rfp-text-xl rfp-font-medium rfp-mb-2\">{fileName}</p>\n <p className=\"rfp-text-fg-secondary\">{t('common.unsupported_preview', { type: fileType })}</p>\n </div>\n\n <button\n onClick={onDownload}\n className=\"rfp-flex rfp-items-center rfp-gap-2 rfp-px-6 rfp-py-3 rfp-bg-surface-2 hover:rfp-bg-surface-3 rfp-backdrop-blur-sm rfp-rounded-lg rfp-text-fg-primary rfp-font-medium rfp-transition-all\"\n >\n <Download className=\"rfp-w-5 rfp-h-5\" />\n {t('common.download')}\n </button>\n </div>\n );\n};\n","import React from 'react';\nimport { useTranslator } from '../i18n/LocaleContext';\n\nexport const RendererLoading: React.FC = () => {\n const t = useTranslator();\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full rfp-text-fg-muted\">\n <div className=\"rfp-flex rfp-flex-col rfp-items-center rfp-gap-3\">\n <div className=\"rfp-w-8 rfp-h-8 rfp-rounded-full rfp-border-2 rfp-border-fg-muted rfp-border-t-transparent rfp-animate-spin\" />\n <span className=\"rfp-text-sm\">{t('common.loading') ?? 'Loading...'}</span>\n </div>\n </div>\n );\n};\n","import React, { useState, useEffect, useCallback, useMemo, useRef, Suspense } from 'react';\nimport { motion } from 'framer-motion';\nimport { X, Download, ChevronLeft, ChevronRight } from 'lucide-react';\nimport { getFileType, createTranslator, type Locale, type Messages, type Translator, type Theme } from '@eternalheart/file-preview-core';\nimport { LocaleProvider } from './i18n/LocaleContext';\nimport { ThemeProvider } from './ThemeContext';\nimport type { ToolbarGroup } from './renderers/toolbar.types';\nimport { getImageToolbarGroups } from './renderers/Image/toolbar';\nimport { getPdfToolbarGroups } from './renderers/Pdf/toolbar';\nimport { getEpubToolbarGroups } from './renderers/Epub/toolbar';\nimport { getMobiToolbarGroups } from './renderers/Mobi/toolbar';\nimport { getZipToolbarGroups, type ZipToolbarStats } from './renderers/Zip/toolbar';\nimport { getTextToolbarGroups } from './renderers/Text/toolbar';\nimport { getMarkdownToolbarGroups } from './renderers/Markdown/toolbar';\n\nimport { PreviewFileInput, CustomRenderer, CustomRendererContext } from './types';\nimport type { CustomRendererEventPayload } from '@eternalheart/file-preview-core';\nimport { normalizeFiles } from './utils/fileNormalizer';\n// Renderer 通过 React.lazy 动态加载,运行时按需下载对应 chunk\nimport {\n ImageRenderer,\n PdfRenderer,\n DocxRenderer,\n XlsxRenderer,\n PptxRenderer,\n MsgRenderer,\n EpubRenderer,\n MobiRenderer,\n VideoRenderer,\n AudioRenderer,\n MarkdownRenderer,\n JsonRenderer,\n CsvRenderer,\n XmlRenderer,\n SubtitleRenderer,\n ZipRenderer,\n TextRenderer,\n} from './renderers/lazy';\nimport type { EpubRendererHandle } from './renderers/Epub';\nimport type { MobiRendererHandle } from './renderers/Mobi';\n// 不支持类型回退;体积极小,仍静态打包到主入口\nimport { UnsupportedRenderer } from './renderers/Unsupported';\nimport { RendererLoading } from './renderers/RendererLoading';\n\nconst MAX_ZIP_NESTING_DEPTH = 3;\n\nexport interface FilePreviewContentProps {\n files: PreviewFileInput[];\n currentIndex: number;\n onNavigate?: (index: number) => void;\n customRenderers?: CustomRenderer[];\n /** 运行模式:modal(弹窗) 或 embed(嵌入) */\n mode?: 'modal' | 'embed';\n /** 关闭回调,仅 modal 模式使用 */\n onClose?: () => void;\n /** ZIP 嵌套深度(内部使用),超过上限时不再递归渲染 ZIP */\n zipNestingDepth?: number;\n /** 国际化语言,默认 'zh-CN' */\n locale?: Locale;\n /** 用户自定义翻译字典,浅合并到内置字典之上 */\n messages?: Partial<Record<Locale, Partial<Messages>>>;\n /** 无头模式:隐藏工具栏和导航箭头,仅渲染文件内容 */\n headless?: boolean;\n /** 主题模式,默认 'dark' */\n theme?: Theme;\n /** 自定义渲染器派发的事件出口,载荷为 `{ name, payload, file }` */\n onCustomEvent?: (event: CustomRendererEventPayload) => void;\n}\n\nexport const FilePreviewContent: React.FC<FilePreviewContentProps> = ({\n files,\n currentIndex,\n onNavigate,\n customRenderers = [],\n mode = 'modal',\n onClose,\n zipNestingDepth = 0,\n locale = 'zh-CN',\n messages: userMessages,\n headless = false,\n theme = 'dark',\n onCustomEvent,\n}) => {\n const t: Translator = useMemo(\n () => createTranslator({ locale, messages: userMessages }),\n [locale, userMessages],\n );\n\n const [systemDark, setSystemDark] = useState(() =>\n typeof window !== 'undefined'\n ? window.matchMedia('(prefers-color-scheme: dark)').matches\n : true,\n );\n\n useEffect(() => {\n if (theme !== 'auto') return;\n const mql = window.matchMedia('(prefers-color-scheme: dark)');\n const handler = (e: MediaQueryListEvent) => setSystemDark(e.matches);\n mql.addEventListener('change', handler);\n return () => mql.removeEventListener('change', handler);\n }, [theme]);\n\n const resolvedTheme = theme === 'auto' ? (systemDark ? 'dark' : 'light') : theme;\n\n const [zoom, setZoom] = useState(1);\n const [rotation, setRotation] = useState(0);\n const [currentPage, setCurrentPage] = useState(1);\n const [, setTotalPages] = useState(1);\n const [contentNaturalWidth, setContentNaturalWidth] = useState(0);\n const [contentNaturalHeight, setContentNaturalHeight] = useState(0);\n const [imageResetKey, setImageResetKey] = useState(0);\n const contentRef = useRef<HTMLDivElement>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n const epubRef = useRef<EpubRendererHandle>(null);\n const [epubCurrent, setEpubCurrent] = useState(0);\n const [epubTotal, setEpubTotal] = useState(0);\n const [epubFullWidth, setEpubFullWidth] = useState(false);\n const mobiRef = useRef<MobiRendererHandle>(null);\n const [mobiCurrent, setMobiCurrent] = useState(0);\n const [mobiTotal, setMobiTotal] = useState(0);\n const [mobiFullWidth, setMobiFullWidth] = useState(false);\n const [zipStats, setZipStats] = useState<ZipToolbarStats | null>(null);\n const [textWordWrap, setTextWordWrap] = useState(true);\n const [textHtmlPreview, setTextHtmlPreview] = useState(false);\n const [markdownViewMode, setMarkdownViewMode] = useState<'preview' | 'source'>('preview');\n\n // 导航箭头自动隐藏\n const [navVisible, setNavVisible] = useState(true);\n const navHideTimerRef = useRef<number | null>(null);\n const NAV_HIDE_DELAY = 2000;\n\n const resetNavTimer = useCallback(() => {\n setNavVisible(true);\n if (navHideTimerRef.current) {\n clearTimeout(navHideTimerRef.current);\n }\n navHideTimerRef.current = window.setTimeout(() => {\n setNavVisible(false);\n }, NAV_HIDE_DELAY);\n }, []);\n\n const handleMouseMove = useCallback(() => {\n resetNavTimer();\n }, [resetNavTimer]);\n\n // 标准化文件输入\n const normalizedFiles = useMemo(() => normalizeFiles(files), [files]);\n\n const currentFile = normalizedFiles[currentIndex];\n\n // 检查是否有自定义渲染器匹配当前文件\n const customRenderer = useMemo(() => {\n if (!currentFile) return null;\n return customRenderers.find(renderer => renderer.test(currentFile));\n }, [currentFile, customRenderers]);\n\n const fileType = currentFile ? getFileType(currentFile) : 'unsupported';\n\n // 自定义渲染器事件派发器:未绑定 onCustomEvent 时静默忽略\n const emitCustom = useCallback(\n (name: string, payload?: unknown) => {\n if (!currentFile) return;\n onCustomEvent?.({ name, payload, file: currentFile });\n },\n [currentFile, onCustomEvent],\n );\n\n // 自定义渲染器上下文:注入给 render / getToolbarGroups\n const customCtx = useMemo<CustomRendererContext>(\n () => ({\n emit: emitCustom,\n t,\n theme: resolvedTheme,\n locale,\n }),\n [emitCustom, t, resolvedTheme, locale],\n );\n\n // 重置状态当文件改变时\n useEffect(() => {\n setZoom(1);\n setRotation(0);\n setCurrentPage(1);\n setTotalPages(1);\n setContentNaturalWidth(0);\n setContentNaturalHeight(0);\n setNavVisible(true);\n if (navHideTimerRef.current) {\n clearTimeout(navHideTimerRef.current);\n }\n }, [currentIndex]);\n\n // 图片加载后默认适应窗口\n useEffect(() => {\n if (fileType === 'image' && contentNaturalWidth > 0 && contentNaturalHeight > 0 && contentRef.current) {\n const containerWidth = contentRef.current.clientWidth;\n const containerHeight = contentRef.current.clientHeight;\n const scaleX = containerWidth / contentNaturalWidth;\n const scaleY = containerHeight / contentNaturalHeight;\n const newZoom = Math.min(scaleX, scaleY);\n setZoom(Math.max(0.01, Math.min(10, newZoom)));\n }\n }, [fileType, contentNaturalWidth, contentNaturalHeight]);\n\n // 导航箭头自动隐藏计时器启动 & 清理\n useEffect(() => {\n if (normalizedFiles.length > 1) {\n resetNavTimer();\n }\n return () => {\n if (navHideTimerRef.current) {\n clearTimeout(navHideTimerRef.current);\n }\n };\n }, [normalizedFiles.length, resetNavTimer]);\n\n // 键盘导航\n // - modal 模式:全局监听(window)\n // - embed 模式:只在根容器 focus 时监听,避免影响外部页面交互\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && mode === 'modal') {\n onClose?.();\n } else if (e.key === 'ArrowLeft' && currentIndex > 0) {\n onNavigate?.(currentIndex - 1);\n } else if (e.key === 'ArrowRight' && currentIndex < normalizedFiles.length - 1) {\n onNavigate?.(currentIndex + 1);\n }\n };\n\n if (mode === 'modal') {\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n } else {\n const el = rootRef.current;\n if (!el) return;\n el.addEventListener('keydown', handleKeyDown as EventListener);\n return () => el.removeEventListener('keydown', handleKeyDown as EventListener);\n }\n }, [mode, currentIndex, normalizedFiles.length, onClose, onNavigate]);\n\n const handleZoomIn = useCallback(() => {\n setZoom((prev) => Math.min(prev + 0.1, 10));\n }, []);\n\n const handleZoomOut = useCallback(() => {\n setZoom((prev) => Math.max(prev - 0.1, 0.01));\n }, []);\n\n const handleRotate = useCallback(() => {\n setRotation((prev) => prev + 90);\n }, []);\n\n const handleRotateLeft = useCallback(() => {\n setRotation((prev) => prev - 90);\n }, []);\n\n const handleFitToWidth = useCallback(() => {\n if (contentRef.current && contentNaturalWidth > 0 && contentNaturalHeight > 0) {\n const containerWidth = contentRef.current.clientWidth;\n const containerHeight = contentRef.current.clientHeight;\n const scaleX = containerWidth / contentNaturalWidth;\n const scaleY = containerHeight / contentNaturalHeight;\n const newZoom = Math.min(scaleX, scaleY);\n setZoom(Math.max(0.01, Math.min(10, newZoom)));\n } else {\n setZoom(1);\n }\n setRotation(0);\n setImageResetKey(k => k + 1);\n }, [contentNaturalWidth, contentNaturalHeight]);\n\n const handleOriginalSize = useCallback(() => {\n setZoom(1);\n setRotation(0);\n setImageResetKey(k => k + 1);\n }, []);\n\n const handleZoomChange = useCallback((newZoom: number) => {\n setZoom(newZoom);\n }, []);\n\n const handleReset = useCallback(() => {\n setZoom(1);\n setRotation(0);\n setImageResetKey(k => k + 1);\n }, []);\n\n const handleDownload = useCallback(() => {\n if (!currentFile) return;\n const link = document.createElement('a');\n link.href = currentFile.url;\n link.download = currentFile.name;\n link.click();\n }, [currentFile]);\n\n const handleEpubChapterChange = useCallback((current: number, total: number) => {\n setEpubCurrent(current);\n setEpubTotal(total);\n }, []);\n\n const handleMobiChapterChange = useCallback((current: number, total: number) => {\n setMobiCurrent(current);\n setMobiTotal(total);\n }, []);\n\n const handleZipStatsChange = useCallback((stats: ZipToolbarStats | null) => {\n setZipStats(stats);\n }, []);\n\n if (!currentFile) return null;\n\n const showCloseButton = mode === 'modal' && !!onClose;\n\n // 工具栏配置 — 各 Renderer 自行声明。命中自定义渲染器时优先使用其 getToolbarGroups\n const toolGroups: ToolbarGroup[] = (() => {\n if (customRenderer) {\n return customRenderer.getToolbarGroups?.(currentFile, customCtx) ?? [];\n }\n if (fileType === 'image') {\n return getImageToolbarGroups({\n zoom,\n onZoomIn: handleZoomIn,\n onZoomOut: handleZoomOut,\n onFitToWidth: handleFitToWidth,\n onOriginalSize: handleOriginalSize,\n onRotateLeft: handleRotateLeft,\n onRotateRight: handleRotate,\n onReset: handleReset,\n t,\n });\n }\n if (fileType === 'pdf') {\n return getPdfToolbarGroups({\n zoom,\n onZoomIn: handleZoomIn,\n onZoomOut: handleZoomOut,\n onReset: handleReset,\n t,\n });\n }\n if (fileType === 'epub') {\n return getEpubToolbarGroups({\n epubRef,\n current: epubCurrent,\n total: epubTotal,\n fullWidth: epubFullWidth,\n t,\n });\n }\n if (fileType === 'mobi') {\n return getMobiToolbarGroups({\n mobiRef,\n current: mobiCurrent,\n total: mobiTotal,\n fullWidth: mobiFullWidth,\n t,\n });\n }\n if (fileType === 'zip') {\n return getZipToolbarGroups({ stats: zipStats, t });\n }\n if (fileType === 'text') {\n const ext = currentFile.name.split('.').pop()?.toLowerCase() || '';\n return getTextToolbarGroups({\n wordWrap: textWordWrap,\n onToggleWrap: () => setTextWordWrap(prev => !prev),\n isHtml: ext === 'html' || ext === 'htm',\n htmlPreview: textHtmlPreview,\n onToggleHtmlPreview: () => setTextHtmlPreview(prev => !prev),\n t,\n });\n }\n if (fileType === 'markdown') {\n return getMarkdownToolbarGroups({\n viewMode: markdownViewMode,\n onToggleViewMode: () => setMarkdownViewMode(prev => prev === 'preview' ? 'source' : 'preview'),\n t,\n });\n }\n return [];\n })();\n\n // 操作组:下载、关闭(通用,不属于任何 Renderer)\n const actionGroups: ToolbarGroup[] = [\n {\n items: [\n { type: 'button', icon: <Download className=\"rfp-w-4 rfp-h-4\" />, tooltip: t('common.download'), action: handleDownload },\n ],\n },\n ...(showCloseButton ? [{\n items: [\n { type: 'button' as const, icon: <X className=\"rfp-w-4 rfp-h-4\" />, tooltip: t('common.close'), action: onClose! },\n ],\n }] : []),\n ];\n\n const renderToolbarItems = (groups: ToolbarGroup[], dividerClass: string) =>\n groups.map((group, gi, arr) => (\n <React.Fragment key={gi}>\n {group.items.map((item, ii) =>\n item.type === 'button' ? (\n <ToolbarButton\n key={`${gi}-${ii}`}\n icon={item.icon}\n label={item.tooltip}\n onClick={item.action}\n disabled={item.disabled}\n />\n ) : (\n <span\n key={`${gi}-${ii}`}\n className=\"rfp-text-xs rfp-text-center rfp-font-medium rfp-tabular-nums rfp-text-fg-tertiary\"\n style={{ minWidth: item.minWidth || 'auto' }}\n >\n {item.content}\n </span>\n )\n )}\n {gi < arr.length - 1 && <div className={`rfp-w-px rfp-h-4 rfp-bg-divide ${dividerClass}`} />}\n </React.Fragment>\n ));\n\n return (\n <LocaleProvider locale={locale} messages={userMessages}>\n <ThemeProvider theme={resolvedTheme}>\n <div\n ref={rootRef}\n tabIndex={mode === 'embed' ? 0 : -1}\n data-theme={resolvedTheme}\n className=\"rfp-relative rfp-w-full rfp-h-full rfp-flex rfp-flex-col rfp-overflow-hidden rfp-outline-none\"\n >\n {/* 顶部工具栏 - 全屏融合式 */}\n {!headless && (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"rfp-flex-shrink-0 rfp-z-10 rfp-backdrop-blur-md rfp-border-b rfp-bg-surface-toolbar rfp-border-line\"\n style={{ paddingTop: 'env(safe-area-inset-top, 0px)' }}\n >\n {/* 第一行:文件名 + 分页 + 关闭/下载(移动端右侧)/ 全部按钮(桌面端) */}\n <div className=\"rfp-flex rfp-items-center rfp-justify-between rfp-px-3 md:rfp-px-5 rfp-py-1.5 md:rfp-py-2.5\">\n {/* 左侧:文件名 + 分页 */}\n <div className=\"rfp-flex rfp-items-center rfp-flex-1 rfp-min-w-0 rfp-mr-2 md:rfp-mr-3\">\n <h2 className=\"rfp-font-medium rfp-text-xs md:rfp-text-sm rfp-truncate rfp-text-fg-primary\">\n {currentFile.name}\n </h2>\n <span className=\"rfp-text-xs rfp-ml-2 rfp-flex-shrink-0 rfp-text-fg-muted\">\n {currentIndex + 1}/{normalizedFiles.length}\n </span>\n </div>\n\n {/* 移动端:仅显示下载+关闭 */}\n <div className=\"rfp-flex rfp-items-center rfp-gap-1 md:rfp-hidden rfp-flex-shrink-0\">\n {renderToolbarItems(actionGroups, 'rfp-mx-0.5')}\n </div>\n\n {/* 桌面端:所有工具按钮 */}\n <div className=\"rfp-hidden md:rfp-flex rfp-items-center rfp-gap-1 rfp-flex-shrink-0\">\n {renderToolbarItems(toolGroups, 'rfp-mx-1')}\n {toolGroups.length > 0 && <div className=\"rfp-w-px rfp-h-4 rfp-mx-1 rfp-bg-divide\" />}\n {renderToolbarItems(actionGroups, 'rfp-mx-1')}\n </div>\n </div>\n\n {/* 第二行:移动端工具按钮(image/pdf/epub) */}\n {toolGroups.length > 0 && (\n <div className=\"rfp-flex rfp-items-center rfp-gap-1 rfp-px-3 rfp-pb-1.5 rfp-overflow-x-auto scrollbar-hide md:rfp-hidden\">\n {renderToolbarItems(toolGroups, 'rfp-mx-0.5')}\n </div>\n )}\n </motion.div>\n )}\n\n {/* 内容区域 */}\n <div\n ref={contentRef}\n className=\"rfp-flex-1 rfp-flex rfp-items-center rfp-justify-center rfp-overflow-auto\"\n onMouseMove={handleMouseMove}\n >\n {customRenderer ? (\n customRenderer.render(currentFile, customCtx)\n ) : (\n <Suspense fallback={<RendererLoading />}>\n {fileType === 'image' && (\n <ImageRenderer\n url={currentFile.url}\n zoom={zoom}\n rotation={rotation}\n resetKey={imageResetKey}\n fileSize={currentFile.size}\n onZoomChange={handleZoomChange}\n onNaturalWidthChange={setContentNaturalWidth}\n onNaturalHeightChange={setContentNaturalHeight}\n />\n )}\n {fileType === 'pdf' && (\n <PdfRenderer\n url={currentFile.url}\n zoom={zoom}\n currentPage={currentPage}\n onPageChange={setCurrentPage}\n onTotalPagesChange={setTotalPages}\n onPageWidthChange={setContentNaturalWidth}\n />\n )}\n {fileType === 'docx' && <DocxRenderer url={currentFile.url} />}\n {fileType === 'xlsx' && <XlsxRenderer url={currentFile.url} />}\n {fileType === 'pptx' && <PptxRenderer url={currentFile.url} />}\n {fileType === 'msg' && <MsgRenderer url={currentFile.url} />}\n {fileType === 'epub' && (\n <EpubRenderer\n ref={epubRef}\n url={currentFile.url}\n onChapterChange={handleEpubChapterChange}\n onFullWidthChange={setEpubFullWidth}\n />\n )}\n {fileType === 'mobi' && (\n <MobiRenderer\n ref={mobiRef}\n url={currentFile.url}\n onChapterChange={handleMobiChapterChange}\n onFullWidthChange={setMobiFullWidth}\n />\n )}\n {fileType === 'video' && <VideoRenderer url={currentFile.url} />}\n {fileType === 'audio' && (\n <AudioRenderer url={currentFile.url} fileName={currentFile.name} />\n )}\n {fileType === 'markdown' && <MarkdownRenderer url={currentFile.url} viewMode={markdownViewMode} />}\n {fileType === 'json' && (\n <JsonRenderer url={currentFile.url} fileName={currentFile.name} />\n )}\n {fileType === 'csv' && (\n <CsvRenderer url={currentFile.url} fileName={currentFile.name} />\n )}\n {fileType === 'xml' && (\n <XmlRenderer url={currentFile.url} fileName={currentFile.name} />\n )}\n {fileType === 'subtitle' && (\n <SubtitleRenderer url={currentFile.url} fileName={currentFile.name} />\n )}\n {fileType === 'zip' && (\n zipNestingDepth >= MAX_ZIP_NESTING_DEPTH ? (\n <UnsupportedRenderer\n fileName={currentFile.name}\n fileType={currentFile.type}\n onDownload={handleDownload}\n />\n ) : (\n <ZipRenderer url={currentFile.url} onStatsChange={handleZipStatsChange} nestingDepth={zipNestingDepth} />\n )\n )}\n {fileType === 'text' && (\n <TextRenderer\n url={currentFile.url}\n fileName={currentFile.name}\n wordWrap={textWordWrap}\n htmlPreview={textHtmlPreview}\n />\n )}\n {fileType === 'unsupported' && (\n <UnsupportedRenderer\n fileName={currentFile.name}\n fileType={currentFile.type}\n onDownload={handleDownload}\n />\n )}\n </Suspense>\n )}\n </div>\n\n {/* 左右导航箭头 - 自动隐藏 */}\n {!headless && normalizedFiles.length > 1 && (\n <>\n {currentIndex > 0 && (\n <motion.button\n initial={{ opacity: 0 }}\n animate={{ opacity: navVisible ? 1 : 0, x: navVisible ? 0 : -20 }}\n transition={{ duration: 0.2 }}\n onClick={() => onNavigate?.(currentIndex - 1)}\n onMouseEnter={() => setNavVisible(true)}\n style={{ pointerEvents: navVisible ? 'auto' : 'none' }}\n className=\"rfp-absolute rfp-z-20 rfp-left-2 md:rfp-left-4 rfp-top-1/2 -rfp-translate-y-1/2 rfp-w-10 rfp-h-10 md:rfp-w-12 md:rfp-h-12 rfp-rounded-full rfp-backdrop-blur-xl rfp-border rfp-flex rfp-items-center rfp-justify-center rfp-transition-colors rfp-shadow-2xl rfp-bg-surface-nav rfp-border-line hover:rfp-bg-surface-nav-hover rfp-text-fg-primary\"\n >\n <ChevronLeft className=\"rfp-w-5 rfp-h-5 md:rfp-w-6 md:rfp-h-6\" />\n </motion.button>\n )}\n\n {currentIndex < normalizedFiles.length - 1 && (\n <motion.button\n initial={{ opacity: 0 }}\n animate={{ opacity: navVisible ? 1 : 0, x: navVisible ? 0 : 20 }}\n transition={{ duration: 0.2 }}\n onClick={() => onNavigate?.(currentIndex + 1)}\n onMouseEnter={() => setNavVisible(true)}\n style={{ pointerEvents: navVisible ? 'auto' : 'none' }}\n className=\"rfp-absolute rfp-z-20 rfp-right-2 md:rfp-right-4 rfp-top-1/2 -rfp-translate-y-1/2 rfp-w-10 rfp-h-10 md:rfp-w-12 md:rfp-h-12 rfp-rounded-full rfp-backdrop-blur-xl rfp-border rfp-flex rfp-items-center rfp-justify-center rfp-transition-colors rfp-shadow-2xl rfp-bg-surface-nav rfp-border-line hover:rfp-bg-surface-nav-hover rfp-text-fg-primary\"\n >\n <ChevronRight className=\"rfp-w-5 rfp-h-5 md:rfp-w-6 md:rfp-h-6\" />\n </motion.button>\n )}\n </>\n )}\n </div>\n </ThemeProvider>\n </LocaleProvider>\n );\n};\n\n// 工具栏按钮组件\ninterface ToolbarButtonProps {\n icon: React.ReactNode;\n label: string;\n onClick: () => void;\n disabled?: boolean;\n}\n\nconst ToolbarButton: React.FC<ToolbarButtonProps> = ({ icon, label, onClick, disabled }) => {\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n className={`rfp-relative rfp-group rfp-p-2 md:rfp-p-1.5 rfp-rounded-md rfp-transition-all rfp-select-none ${\n disabled\n ? 'rfp-text-fg-disabled rfp-cursor-not-allowed'\n : 'rfp-text-fg-primary hover:rfp-bg-surface-2 active:rfp-bg-surface-3'\n }`}\n >\n {icon}\n <span className=\"rfp-absolute rfp-left-1/2 -rfp-translate-x-1/2 rfp-top-full rfp-mt-1.5 rfp-px-2 rfp-py-1 rfp-text-xs rfp-rounded rfp-whitespace-nowrap rfp-pointer-events-none rfp-opacity-0 rfp-invisible group-hover:rfp-opacity-100 group-hover:rfp-visible rfp-transition-opacity rfp-duration-200 rfp-z-50 rfp-bg-fg-primary rfp-text-fg-inverse\">\n <span className=\"rfp-absolute rfp-left-1/2 -rfp-translate-x-1/2 -rfp-top-1 rfp-w-2 rfp-h-2 rfp-rotate-45 rfp-bg-fg-primary\" />\n <span className=\"rfp-relative\">{label}</span>\n </span>\n </button>\n );\n};\n","import { useEffect, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport { PreviewFileInput, CustomRenderer } from './types';\nimport { FilePreviewContent } from './FilePreviewContent';\nimport type { Locale, Messages, Theme, CustomRendererEventPayload } from '@eternalheart/file-preview-core';\n\ninterface FilePreviewModalProps {\n files: PreviewFileInput[];\n currentIndex: number;\n isOpen: boolean;\n onClose: () => void;\n onNavigate?: (index: number) => void;\n customRenderers?: CustomRenderer[];\n /** 国际化语言,默认 'zh-CN' */\n locale?: Locale;\n /** 用户自定义翻译字典 */\n messages?: Partial<Record<Locale, Partial<Messages>>>;\n /** 无头模式:隐藏工具栏和导航箭头 */\n headless?: boolean;\n /** 主题模式,默认 'dark' */\n theme?: Theme;\n /** 自定义渲染器派发的事件出口 */\n onCustomEvent?: (event: CustomRendererEventPayload) => void;\n}\n\nexport const FilePreviewModal: React.FC<FilePreviewModalProps> = ({\n files,\n currentIndex,\n isOpen,\n onClose,\n onNavigate,\n customRenderers = [],\n locale,\n messages,\n headless,\n theme = 'dark',\n onCustomEvent,\n}) => {\n const [systemDark, setSystemDark] = useState(() =>\n typeof window !== 'undefined'\n ? window.matchMedia('(prefers-color-scheme: dark)').matches\n : true,\n );\n\n useEffect(() => {\n if (theme !== 'auto') return;\n const mql = window.matchMedia('(prefers-color-scheme: dark)');\n const handler = (e: MediaQueryListEvent) => setSystemDark(e.matches);\n mql.addEventListener('change', handler);\n return () => mql.removeEventListener('change', handler);\n }, [theme]);\n\n const resolvedTheme = theme === 'auto' ? (systemDark ? 'dark' : 'light') : theme;\n\n // 锁定 body 滚动\n useEffect(() => {\n if (isOpen) {\n const originalOverflow = document.body.style.overflow;\n const originalPaddingRight = document.body.style.paddingRight;\n\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\n\n document.body.style.overflow = 'hidden';\n if (scrollbarWidth > 0) {\n document.body.style.paddingRight = `${scrollbarWidth}px`;\n }\n\n return () => {\n document.body.style.overflow = originalOverflow;\n document.body.style.paddingRight = originalPaddingRight;\n };\n }\n }, [isOpen]);\n\n if (!isOpen) return null;\n\n const modalContent = (\n <div className=\"rfp-root\" data-theme={resolvedTheme}>\n <AnimatePresence>\n {isOpen && (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"rfp-fixed rfp-inset-0 rfp-z-[9999] rfp-flex rfp-items-center rfp-justify-center rfp-backdrop-blur-md rfp-overflow-hidden rfp-bg-surface-overlay\"\n onClick={onClose}\n onWheel={(e) => e.stopPropagation()}\n >\n <div\n className=\"rfp-relative rfp-w-full rfp-h-full\"\n onClick={(e) => e.stopPropagation()}\n >\n <FilePreviewContent\n mode=\"modal\"\n files={files}\n currentIndex={currentIndex}\n onClose={onClose}\n onNavigate={onNavigate}\n customRenderers={customRenderers}\n locale={locale}\n messages={messages}\n headless={headless}\n theme={theme}\n onCustomEvent={onCustomEvent}\n />\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n );\n\n return createPortal(modalContent, document.body);\n};\n","import { useEffect, useState } from 'react';\nimport { PreviewFileInput, CustomRenderer } from './types';\nimport { FilePreviewContent } from './FilePreviewContent';\nimport type { Locale, Messages, Theme, CustomRendererEventPayload } from '@eternalheart/file-preview-core';\n\ninterface FilePreviewEmbedProps {\n files: PreviewFileInput[];\n currentIndex?: number;\n onNavigate?: (index: number) => void;\n customRenderers?: CustomRenderer[];\n /** 宽度,默认 100% 填充父容器 */\n width?: number | string;\n /** 高度,默认 100% 填充父容器 */\n height?: number | string;\n className?: string;\n style?: React.CSSProperties;\n /** 国际化语言,默认 'zh-CN' */\n locale?: Locale;\n /** 用户自定义翻译字典 */\n messages?: Partial<Record<Locale, Partial<Messages>>>;\n /** 无头模式:隐藏工具栏和导航箭头 */\n headless?: boolean;\n /** 主题模式,默认 'dark' */\n theme?: Theme;\n /** 自定义渲染器派发的事件出口 */\n onCustomEvent?: (event: CustomRendererEventPayload) => void;\n}\n\nexport const FilePreviewEmbed: React.FC<FilePreviewEmbedProps> = ({\n files,\n currentIndex = 0,\n onNavigate,\n customRenderers = [],\n width = '100%',\n height = '100%',\n className,\n style,\n locale,\n messages,\n headless,\n theme = 'dark',\n onCustomEvent,\n}) => {\n const [systemDark, setSystemDark] = useState(() =>\n typeof window !== 'undefined'\n ? window.matchMedia('(prefers-color-scheme: dark)').matches\n : true,\n );\n\n useEffect(() => {\n if (theme !== 'auto') return;\n const mql = window.matchMedia('(prefers-color-scheme: dark)');\n const handler = (e: MediaQueryListEvent) => setSystemDark(e.matches);\n mql.addEventListener('change', handler);\n return () => mql.removeEventListener('change', handler);\n }, [theme]);\n\n const resolvedTheme = theme === 'auto' ? (systemDark ? 'dark' : 'light') : theme;\n\n return (\n <div\n className={`rfp-root ${className ?? ''}`}\n style={{ width, height, ...style }}\n data-theme={resolvedTheme}\n >\n <div className=\"rfp-relative rfp-w-full rfp-h-full rfp-overflow-hidden rfp-bg-surface-overlay\">\n <FilePreviewContent\n mode=\"embed\"\n files={files}\n currentIndex={currentIndex}\n onNavigate={onNavigate}\n customRenderers={customRenderers}\n locale={locale}\n messages={messages}\n headless={headless}\n theme={theme}\n onCustomEvent={onCustomEvent}\n />\n </div>\n </div>\n );\n};\n","import { pdfjs } from 'react-pdf';\n\n/**\n * PDF.js Worker 配置选项\n */\nexport interface PdfConfigOptions {\n /**\n * PDF.js worker 文件路径\n * 默认使用 CDN: `https://unpkg.com/pdfjs-dist@${version}/build/pdf.worker.min.mjs`\n */\n workerSrc?: string;\n \n /**\n * CMap 文件目录路径\n * 默认使用 CDN: `https://unpkg.com/pdfjs-dist@${version}/cmaps/`\n */\n cMapUrl?: string;\n \n /**\n * 是否使用压缩的 CMap 文件\n * 默认: true\n */\n cMapPacked?: boolean;\n}\n\n/**\n * 配置 PDF.js\n *\n * @example\n * ```ts\n * // 使用本地静态文件(推荐用于生产环境)\n * configurePdfjs({\n * workerSrc: '/pdfjs/pdf.worker.min.mjs',\n * cMapUrl: '/pdfjs/cmaps/',\n * cMapPacked: true\n * });\n * ```\n *\n * @example\n * ```ts\n * // 使用 CDN(默认配置)\n * configurePdfjs(); // 自动使用 unpkg CDN\n * ```\n */\nexport function configurePdfjs(options?: PdfConfigOptions) {\n if (typeof window === 'undefined') return;\n\n const {\n workerSrc = `https://unpkg.com/pdfjs-dist@${pdfjs.version}/build/pdf.worker.min.mjs`,\n cMapUrl = `https://unpkg.com/pdfjs-dist@${pdfjs.version}/cmaps/`,\n cMapPacked = true\n } = options || {};\n\n pdfjs.GlobalWorkerOptions.workerSrc = workerSrc;\n // @ts-ignore - cMapUrl 和 cMapPacked 在 react-pdf 的类型定义中不存在,但在运行时可用\n pdfjs.GlobalWorkerOptions.cMapUrl = cMapUrl;\n // @ts-ignore\n pdfjs.GlobalWorkerOptions.cMapPacked = cMapPacked;\n}\n\n// 默认使用 CDN 配置\nconfigurePdfjs();\n\nexport { pdfjs };\n\n","// 导入样式\nimport './index.css';\n\n// 导入版本号\nimport packageJson from '../package.json';\n\n// 导出版本号\nexport const VERSION = packageJson.version;\n\n// 导出主组件\nexport { FilePreviewModal } from './FilePreviewModal';\nexport { FilePreviewEmbed } from './FilePreviewEmbed';\nexport { FilePreviewContent } from './FilePreviewContent';\n\n// 导出类型定义\nexport type {\n PreviewFile,\n PreviewFileLink,\n PreviewFileInput,\n FileType,\n ToolbarAction,\n PreviewState,\n CustomRenderer,\n CustomRendererContext,\n CustomRendererEventPayload,\n} from './types';\n\n// 导出工具函数\nexport { normalizeFile, normalizeFiles } from './utils/fileNormalizer';\n\n// 导出 PDF.js 配置函数和类型\nexport { configurePdfjs, pdfjs } from './utils/pdfConfig';\nexport type { PdfConfigOptions } from './utils/pdfConfig';\n\n// 导出 i18n 国际化\nexport { LocaleProvider, useTranslator, useLocale } from './i18n/LocaleContext';\nexport type { LocaleProviderProps, LocaleContextValue } from './i18n/LocaleContext';\nexport type {\n Locale,\n Messages,\n MessageKey,\n Translator,\n TranslateParams,\n CreateTranslatorOptions,\n Theme,\n} from '@eternalheart/file-preview-core';\n\n"],"names":["j","e","n","t","k","I","o","lt","ct","r","dt","pt","mt","gt","a","i","c","l","p","d","f","u","$","ht","z","xt","E","B","W","N","s","M","R","Z","O","g","F","b","h","x","w","D","L","v","m","y","_","S","V","bt","Ft","A","vt","wt","_t","q","G","H","J","X","T","K","Q","Y","tt","et","ot","P","Ct","kt","nt","rt","C","it","at","Mt","LocaleContext","createContext","LocaleProvider","locale","messages","children","value","useMemo","createTranslator","jsx","fallbackTranslator","getFallbackTranslator","useTranslator","ctx","useContext","useLocale","ThemeContext","ThemeProvider","theme","useResolvedTheme","OriginalSizeIcon","className","getImageToolbarGroups","ZoomOut","ZoomIn","Scan","RotateCcw","RotateCw","RefreshCw","getPdfToolbarGroups","getEpubToolbarGroups","List","_a","ChevronLeft","ChevronRight","Minimize2","Maximize2","getMobiToolbarGroups","getZipToolbarGroups","stats","formatFileSize","getTextToolbarGroups","groups","WrapText","Code","Eye","getMarkdownToolbarGroups","ImageRenderer","lazy","PdfRenderer","DocxRenderer","XlsxRenderer","PptxRenderer","MsgRenderer","EpubRenderer","MobiRenderer","VideoRenderer","AudioRenderer","MarkdownRenderer","JsonRenderer","CsvRenderer","XmlRenderer","SubtitleRenderer","ZipRenderer","TextRenderer","UnsupportedRenderer","fileName","fileType","onDownload","jsxs","FileQuestion","Download","RendererLoading","MAX_ZIP_NESTING_DEPTH","FilePreviewContent","files","currentIndex","onNavigate","customRenderers","mode","onClose","zipNestingDepth","userMessages","headless","onCustomEvent","systemDark","setSystemDark","useState","useEffect","mql","handler","resolvedTheme","zoom","setZoom","rotation","setRotation","currentPage","setCurrentPage","setTotalPages","contentNaturalWidth","setContentNaturalWidth","contentNaturalHeight","setContentNaturalHeight","imageResetKey","setImageResetKey","contentRef","useRef","rootRef","epubRef","epubCurrent","setEpubCurrent","epubTotal","setEpubTotal","epubFullWidth","setEpubFullWidth","mobiRef","mobiCurrent","setMobiCurrent","mobiTotal","setMobiTotal","mobiFullWidth","setMobiFullWidth","zipStats","setZipStats","textWordWrap","setTextWordWrap","textHtmlPreview","setTextHtmlPreview","markdownViewMode","setMarkdownViewMode","navVisible","setNavVisible","navHideTimerRef","NAV_HIDE_DELAY","resetNavTimer","useCallback","handleMouseMove","normalizedFiles","normalizeFiles","currentFile","customRenderer","renderer","getFileType","emitCustom","name","payload","customCtx","containerWidth","containerHeight","scaleX","scaleY","newZoom","handleKeyDown","el","handleZoomIn","prev","handleZoomOut","handleRotate","handleRotateLeft","handleFitToWidth","handleOriginalSize","handleZoomChange","handleReset","handleDownload","link","handleEpubChapterChange","current","total","handleMobiChapterChange","handleZipStatsChange","showCloseButton","toolGroups","ext","_b","actionGroups","renderToolbarItems","dividerClass","group","gi","arr","React","item","ii","ToolbarButton","motion","Suspense","Fragment","icon","label","onClick","disabled","FilePreviewModal","isOpen","originalOverflow","originalPaddingRight","scrollbarWidth","modalContent","AnimatePresence","createPortal","FilePreviewEmbed","width","height","style","configurePdfjs","options","workerSrc","pdfjs","cMapUrl","cMapPacked","VERSION","packageJson"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-Yp36heK8.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';\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 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 if (!host) 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 fetch(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 console.error('MOBI/AZW3 加载错误:', 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-[#f5f5f0] rfp-overflow-hidden\">\n {error && (\n <div className=\"rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-text-fg-secondary rfp-text-center rfp-p-6\">\n <p className=\"rfp-text-lg\">{error}</p>\n </div>\n )}\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","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","X"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-qxvk-6P6.mjs","sources":["../../src/renderers/Markdown/index.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport remarkMath from 'remark-math';\nimport rehypeKatex from 'rehype-katex';\nimport rehypeRaw from 'rehype-raw';\nimport { Copy, Check } from 'lucide-react';\nimport { fetchTextUtf8 } from '@eternalheart/file-preview-core';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { useShikiHighlight } from '../../hooks/useShikiHighlight';\nimport 'katex/dist/katex.min.css';\n\ninterface MarkdownRendererProps {\n url: string;\n viewMode?: 'preview' | 'source';\n}\n\nconst useCopy = (text: string) => {\n const [copied, setCopied] = useState(false);\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(text);\n } catch {\n const textarea = document.createElement('textarea');\n textarea.value = text;\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand('copy');\n document.body.removeChild(textarea);\n }\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }, [text]);\n return { copied, handleCopy };\n};\n\n/** 内联版复制按钮:放在代码块 header 行内,始终可见 */\nconst InlineCopyButton = ({ text }: { text: string }) => {\n const t = useTranslator();\n const { copied, handleCopy } = useCopy(text);\n return (\n <button\n onClick={handleCopy}\n className=\"rfp-p-1 rfp-rounded rfp-text-fg-muted hover:rfp-text-fg-secondary rfp-transition-colors rfp-flex rfp-items-center rfp-gap-1\"\n title={copied ? t('markdown.copied') : t('markdown.copy_code')}\n >\n {copied ? <Check size={13} /> : <Copy size={13} />}\n </button>\n );\n};\n\n/** 浮动版复制按钮:无 header 时绝对定位于代码块右上角(hover 显示) */\nconst FloatingCopyButton = ({ text }: { text: string }) => {\n const t = useTranslator();\n const { copied, handleCopy } = useCopy(text);\n return (\n <button\n onClick={handleCopy}\n className=\"rfp-absolute rfp-top-2 rfp-right-2 rfp-p-1.5 rfp-rounded-md rfp-bg-surface-2 hover:rfp-bg-surface-3 rfp-text-fg-tertiary hover:rfp-text-fg-secondary rfp-transition-colors rfp-opacity-0 group-hover:rfp-opacity-100 rfp-border rfp-border-line\"\n title={copied ? t('markdown.copied') : t('markdown.copy_code')}\n >\n {copied ? <Check size={14} /> : <Copy size={14} />}\n </button>\n );\n};\n\n/** 带语言标注的代码块:shiki 高亮 + header + 复制按钮 */\nconst ShikiCodeBlock = ({ code, lang }: { code: string; lang: string }) => {\n const { html } = useShikiHighlight(code, lang);\n return (\n <div className=\"rfp-relative rfp-group rfp-my-4\">\n <div className=\"rfp-flex rfp-items-center rfp-justify-between rfp-px-4 rfp-py-1.5 rfp-bg-surface-1 rfp-border rfp-border-line-weak rfp-rounded-t-md rfp-border-b-0\">\n <span className=\"rfp-text-xs rfp-text-fg-secondary rfp-font-mono rfp-select-none\">{lang}</span>\n <InlineCopyButton text={code} />\n </div>\n {html ? (\n <div\n className=\"rfp-shiki-wrapper rfp-rounded-b-md rfp-border rfp-border-line-weak rfp-border-t-0 rfp-overflow-x-auto\"\n dangerouslySetInnerHTML={{ __html: html }}\n />\n ) : (\n <pre\n className=\"rfp-m-0 rfp-rounded-b-md rfp-border rfp-border-line-weak rfp-border-t-0 rfp-overflow-x-auto rfp-p-4 rfp-bg-code-bg\"\n style={{ fontSize: '13px', lineHeight: '1.5' }}\n >\n <code className=\"rfp-font-mono rfp-text-code-fg rfp-text-sm\">{code}</code>\n </pre>\n )}\n </div>\n );\n};\n\nexport const MarkdownRenderer: React.FC<MarkdownRendererProps> = ({ url, viewMode = 'preview' }) => {\n const t = useTranslator();\n const [content, setContent] = useState<string>('');\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const { html: sourceHtml } = useShikiHighlight(\n viewMode === 'source' ? content : '',\n 'markdown',\n );\n\n useEffect(() => {\n const loadMarkdown = async () => {\n try {\n setLoading(true);\n setError(null);\n const text = await fetchTextUtf8(url);\n setContent(text);\n } catch (err) {\n setError(t('markdown.load_failed'));\n console.error(err);\n } finally {\n setLoading(false);\n }\n };\n\n loadMarkdown();\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 (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-text-fg-secondary rfp-text-center\">\n <p className=\"rfp-text-lg\">{error}</p>\n </div>\n </div>\n );\n }\n\n // 源码视图\n if (viewMode === 'source') {\n return (\n <div className=\"rfp-w-full rfp-h-full rfp-overflow-auto rfp-bg-code-bg\">\n {sourceHtml ? (\n <div\n className=\"rfp-shiki-wrapper with-line-numbers\"\n dangerouslySetInnerHTML={{ __html: sourceHtml }}\n />\n ) : (\n <pre className=\"rfp-p-6 rfp-text-fg-primary rfp-font-mono rfp-text-sm rfp-whitespace-pre-wrap rfp-break-words\">\n {content}\n </pre>\n )}\n </div>\n );\n }\n\n // 预览视图\n return (\n <div className=\"rfp-w-full rfp-h-full rfp-overflow-auto rfp-p-6 md:rfp-p-10\">\n <div className=\"rfp-max-w-full md:rfp-max-w-4xl rfp-mx-auto\">\n <ReactMarkdown\n remarkPlugins={[remarkGfm, remarkMath]}\n rehypePlugins={[rehypeRaw, rehypeKatex]}\n components={{\n code({ node, inline, className, children, ...props }: any) {\n const match = /language-(\\w+)/.exec(className || '');\n const codeString = String(children).replace(/\\n$/, '');\n if (!inline && match) {\n // 有语言标注的代码块 - shiki 高亮\n return <ShikiCodeBlock code={codeString} lang={match[1]} />;\n }\n if (!inline) {\n // 无语言标注的代码块 - 纯文本暗色显示\n return (\n <div className=\"rfp-relative rfp-group rfp-my-4\">\n <FloatingCopyButton text={codeString} />\n <pre\n className=\"rfp-m-0 rfp-rounded-md rfp-border rfp-border-line-weak rfp-overflow-x-auto rfp-p-4 rfp-bg-code-bg\"\n style={{ fontSize: '13px', lineHeight: '1.5' }}\n >\n <code className=\"rfp-font-mono rfp-text-code-fg rfp-text-sm\">{children}</code>\n </pre>\n </div>\n );\n }\n // 行内代码\n return (\n <code\n className=\"rfp-bg-surface-2 rfp-px-1.5 rfp-py-0.5 rfp-rounded rfp-text-sm rfp-font-mono rfp-text-fg-primary rfp-border rfp-border-line-weak\"\n {...props}\n >\n {children}\n </code>\n );\n },\n h1: ({ children }) => (\n <h1 className=\"rfp-text-3xl rfp-font-semibold rfp-mb-4 rfp-mt-6 rfp-text-fg-primary first:rfp-mt-0\">\n {children}\n </h1>\n ),\n h2: ({ children }) => (\n <h2 className=\"rfp-text-2xl rfp-font-semibold rfp-mb-3 rfp-mt-8 rfp-text-fg-primary\">\n {children}\n </h2>\n ),\n h3: ({ children }) => (\n <h3 className=\"rfp-text-xl rfp-font-semibold rfp-mb-2 rfp-mt-6 rfp-text-fg-primary\">{children}</h3>\n ),\n h4: ({ children }) => (\n <h4 className=\"rfp-text-lg rfp-font-semibold rfp-mb-2 rfp-mt-4 rfp-text-fg-primary\">{children}</h4>\n ),\n p: ({ children }) => (\n <p className=\"rfp-text-fg-secondary rfp-mb-4 rfp-leading-7 rfp-text-base\">{children}</p>\n ),\n a: ({ href, children }) => (\n <a\n href={href}\n className=\"rfp-text-indigo-400 hover:rfp-text-indigo-300 rfp-underline rfp-decoration-indigo-600 hover:rfp-decoration-indigo-400\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {children}\n </a>\n ),\n ul: ({ children }) => (\n <ul className=\"rfp-list-disc rfp-pl-6 rfp-mb-4 rfp-text-fg-secondary rfp-space-y-1\">{children}</ul>\n ),\n ol: ({ children }) => (\n <ol className=\"rfp-list-decimal rfp-pl-6 rfp-mb-4 rfp-text-fg-secondary rfp-space-y-1\">{children}</ol>\n ),\n li: ({ children }) => <li className=\"rfp-leading-7\">{children}</li>,\n blockquote: ({ children }) => (\n <blockquote className=\"rfp-border-l-4 rfp-border-line-strong rfp-pl-4 rfp-text-fg-tertiary rfp-my-4 rfp-italic\">\n {children}\n </blockquote>\n ),\n table: ({ children }) => (\n <div className=\"rfp-overflow-x-auto rfp-my-4 rfp-rounded-md rfp-border rfp-border-line\">\n <table className=\"rfp-min-w-full rfp-divide-y rfp-divide-divide\">{children}</table>\n </div>\n ),\n thead: ({ children }) => <thead className=\"rfp-bg-surface-1\">{children}</thead>,\n tbody: ({ children }) => (\n <tbody className=\"rfp-divide-y rfp-divide-divide rfp-bg-transparent\">{children}</tbody>\n ),\n tr: ({ children }) => (\n <tr className=\"hover:rfp-bg-surface-1 rfp-transition-colors\">{children}</tr>\n ),\n th: ({ children }) => (\n <th className=\"rfp-px-4 rfp-py-3 rfp-text-left rfp-text-xs rfp-font-semibold rfp-text-fg-tertiary rfp-uppercase rfp-tracking-wider\">\n {children}\n </th>\n ),\n td: ({ children }) => (\n <td className=\"rfp-px-4 rfp-py-3 rfp-text-sm rfp-text-fg-secondary\">{children}</td>\n ),\n hr: () => <hr className=\"rfp-border-line rfp-my-6\" />,\n img: ({ src, alt }) => (\n <img\n src={src}\n alt={alt}\n className=\"rfp-rounded-md rfp-max-w-full rfp-h-auto rfp-my-4 rfp-mx-auto rfp-block rfp-shadow-sm\"\n />\n ),\n input: ({ type, checked, ...props }) => {\n if (type === 'checkbox') {\n return (\n <input\n type=\"checkbox\"\n checked={checked}\n readOnly\n className=\"rfp-mr-2 rfp-rounded rfp-border-line\"\n {...props}\n />\n );\n }\n return <input type={type} {...props} />;\n },\n strong: ({ children }) => (\n <strong className=\"rfp-font-semibold rfp-text-fg-primary\">{children}</strong>\n ),\n em: ({ children }) => <em className=\"rfp-italic\">{children}</em>,\n del: ({ children }) => (\n <del className=\"rfp-text-fg-muted rfp-line-through\">{children}</del>\n ),\n }}\n >\n {content}\n </ReactMarkdown>\n </div>\n </div>\n );\n};\n"],"names":["useCopy","text","copied","setCopied","useState","handleCopy","useCallback","textarea","InlineCopyButton","t","useTranslator","jsx","Check","Copy","FloatingCopyButton","ShikiCodeBlock","code","lang","html","useShikiHighlight","jsxs","MarkdownRenderer","url","viewMode","content","setContent","loading","setLoading","error","setError","sourceHtml","useEffect","fetchTextUtf8","err","ReactMarkdown","remarkGfm","remarkMath","rehypeRaw","rehypeKatex","node","inline","className","children","props","match","codeString","href","src","alt","type","checked"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-xTq9b3vw.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 { useShikiHighlight } from '../../hooks/useShikiHighlight';\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 [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 loadText = async () => {\n try {\n setLoading(true);\n setError(null);\n const text = await fetchTextUtf8(url);\n setContent(text);\n } catch (err) {\n setError(t('text.load_failed'));\n console.error(err);\n } finally {\n setLoading(false);\n }\n };\n\n loadText();\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 (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-text-fg-secondary rfp-text-center\">\n <p className=\"rfp-text-lg\">{error}</p>\n </div>\n </div>\n );\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-p-6 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","content","setContent","useState","loading","setLoading","error","setError","language","getLanguageFromFileName","highlighted","useShikiHighlight","useEffect","text","fetchTextUtf8","err","jsx"],"mappings":";;;;AAYO,MAAMA,IAA4C,CAAC;AAAA,EACxD,KAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,aAAAC,IAAc;AAChB,MAAM;AACJ,QAAMC,IAAIC,EAAA,GACJ,CAACC,GAASC,CAAU,IAAIC,EAAiB,EAAE,GAC3C,CAACC,GAASC,CAAU,IAAIF,EAAS,EAAI,GACrC,CAACG,GAAOC,CAAQ,IAAIJ,EAAwB,IAAI,GAChDK,IAAWC,EAAwBb,CAAQ,GAC3C,EAAE,MAAMc,EAAA,IAAgBC;AAAA,IAC5BH,MAAa,SAASP,IAAU;AAAA,IAChCO;AAAA,EAAA;AAqBF,SAlBAI,EAAU,MAAM;AAed,KAdiB,YAAY;AAC3B,UAAI;AACF,QAAAP,EAAW,EAAI,GACfE,EAAS,IAAI;AACb,cAAMM,IAAO,MAAMC,EAAcnB,CAAG;AACpC,QAAAO,EAAWW,CAAI;AAAA,MACjB,SAASE,GAAK;AACZ,QAAAR,EAASR,EAAE,kBAAkB,CAAC,GAC9B,QAAQ,MAAMgB,CAAG;AAAA,MACnB,UAAA;AACE,QAAAV,EAAW,EAAK;AAAA,MAClB;AAAA,IACF,GAEA;AAAA,EACF,GAAG,CAACV,CAAG,CAAC,GAEJS,IAEA,gBAAAY,EAAC,SAAI,WAAU,sEACb,4BAAC,OAAA,EAAI,WAAU,qHAAoH,EAAA,CACrI,IAIAV,IAEA,gBAAAU,EAAC,OAAA,EAAI,WAAU,sEACb,4BAAC,OAAA,EAAI,WAAU,yCACb,UAAA,gBAAAA,EAAC,KAAA,EAAE,WAAU,eAAe,UAAAV,EAAA,CAAM,GACpC,GACF,IAKAR,KAAgBU,MAAa,SAE7B,gBAAAQ,EAAC,OAAA,EAAI,WAAU,gDACb,UAAA,gBAAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,QAAQf;AAAA,MACR,SAAQ;AAAA,MACR,WAAU;AAAA,MACV,OAAOL;AAAA,IAAA;AAAA,EAAA,GAEX,sBAMD,OAAA,EAAI,WAAU,0DACZ,UAAAY,MAAa,UAAU,CAACE,IACvB,gBAAAM;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,yDACTnB,IAAW,4CAA4C,oBACzD;AAAA,MAEC,UAAAI;AAAA,IAAA;AAAA,EAAA,IAGH,gBAAAe;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,uCAAuCnB,IAAW,KAAK,SAAS;AAAA,MAC3E,yBAAyB,EAAE,QAAQa,EAAA;AAAA,IAAY;AAAA,EAAA,GAGrD;AAEJ;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-zDEwNk3h.mjs","sources":["../../src/renderers/Docx/index.tsx"],"sourcesContent":["import { useState, useEffect, useRef, useCallback } from 'react';\nimport mammoth from 'mammoth';\nimport { useTranslator } from '../../i18n/LocaleContext';\n\ninterface DocxRendererProps {\n url: string;\n}\n\n// A4 page dimensions (96dpi)\nconst PAGE_HEIGHT = 1123;\nconst PAGE_PADDING_Y = 60;\nconst PAGE_PADDING_X = 50;\nconst PAGE_CONTENT_HEIGHT = PAGE_HEIGHT - PAGE_PADDING_Y * 2;\nconst PAGE_GAP = 24;\n\nconst contentStyle: React.CSSProperties = {\n fontFamily: 'system-ui, -apple-system, sans-serif',\n lineHeight: '1.8',\n color: '#333',\n};\n\nexport const DocxRenderer: React.FC<DocxRendererProps> = ({ url }) => {\n const t = useTranslator();\n const [html, setHtml] = useState<string>('');\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [pages, setPages] = useState<string[]>([]);\n const measureRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const loadDocx = async () => {\n setLoading(true);\n setError(null);\n setHtml('');\n\n try {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error('文件加载失败');\n }\n\n const arrayBuffer = await response.arrayBuffer();\n const result = await mammoth.convertToHtml({ arrayBuffer });\n setHtml(result.value);\n } catch (err) {\n console.error('Docx 解析错误:', err);\n setError(t('docx.parse_failed'));\n } finally {\n setLoading(false);\n }\n };\n\n loadDocx();\n }, [url]);\n\n const paginate = useCallback(() => {\n const container = measureRef.current;\n if (!container || !html) return;\n\n const children = Array.from(container.children) as HTMLElement[];\n if (children.length === 0) {\n setPages([html]);\n return;\n }\n\n const result: string[][] = [[]];\n let currentPageUsed = 0;\n\n for (const child of children) {\n const h = child.offsetHeight;\n\n // If adding this block would exceed page content area and page isn't empty,\n // start a new page\n if (currentPageUsed > 0 && currentPageUsed + h > PAGE_CONTENT_HEIGHT) {\n result.push([]);\n currentPageUsed = 0;\n }\n\n result[result.length - 1].push(child.outerHTML);\n currentPageUsed += h;\n }\n\n // At least one page\n if (result.length === 0) result.push([]);\n\n setPages(result.map(blocks => blocks.join('')));\n }, [html]);\n\n useEffect(() => {\n if (!html || !measureRef.current) return;\n requestAnimationFrame(() => {\n paginate();\n });\n }, [html, paginate]);\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 (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-text-fg-secondary rfp-text-center\">\n <p className=\"rfp-text-lg\">{error}</p>\n </div>\n </div>\n );\n }\n\n return (\n <div\n className=\"rfp-w-full rfp-h-full rfp-overflow-auto\"\n style={{ background: 'rgba(0, 0, 0, 0.15)' }}\n >\n {/* Hidden measurement div — same width as page content area */}\n <div\n ref={measureRef}\n dangerouslySetInnerHTML={{ __html: html }}\n style={{\n ...contentStyle,\n position: 'absolute',\n visibility: 'hidden',\n width: `${794 - PAGE_PADDING_X * 2}px`,\n pointerEvents: 'none',\n }}\n />\n\n {/* Visible pages */}\n <div\n className=\"rfp-py-6 md:rfp-py-10 rfp-flex rfp-flex-col rfp-items-center\"\n style={{ gap: `${PAGE_GAP}px` }}\n >\n {(pages.length > 0 ? pages : ['']).map((pageHtml, i) => (\n <div\n key={i}\n style={{\n width: '100%',\n maxWidth: '794px',\n minHeight: `${PAGE_HEIGHT}px`,\n background: 'white',\n boxShadow: '0 2px 12px rgba(0, 0, 0, 0.15)',\n flexShrink: 0,\n padding: `${PAGE_PADDING_Y}px ${PAGE_PADDING_X}px`,\n }}\n >\n <div\n dangerouslySetInnerHTML={{ __html: pageHtml }}\n style={contentStyle}\n />\n </div>\n ))}\n </div>\n </div>\n );\n};\n"],"names":["PAGE_HEIGHT","PAGE_PADDING_Y","PAGE_PADDING_X","PAGE_CONTENT_HEIGHT","PAGE_GAP","contentStyle","DocxRenderer","url","t","useTranslator","html","setHtml","useState","loading","setLoading","error","setError","pages","setPages","measureRef","useRef","useEffect","response","arrayBuffer","result","mammoth","err","paginate","useCallback","container","children","currentPageUsed","child","h","blocks","jsx","jsxs","pageHtml","i"],"mappings":"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"}
|