@eternalheart/react-file-preview 1.3.10 → 1.3.11
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/lib/RequestContext.d.ts +1 -1
- package/lib/RequestContext.d.ts.map +1 -1
- package/lib/chunks/RendererError-BH6fzLrN.mjs +15 -0
- package/lib/chunks/RendererError-BH6fzLrN.mjs.map +1 -0
- package/lib/chunks/avifLoader-BP3fgcMm-BnpxLhxp.mjs +56 -0
- package/lib/chunks/avifLoader-BP3fgcMm-BnpxLhxp.mjs.map +1 -0
- package/lib/chunks/heicLoader-CH_raQNn-1fBLaICM.mjs +37 -0
- package/lib/chunks/heicLoader-CH_raQNn-1fBLaICM.mjs.map +1 -0
- package/lib/chunks/index-B57rEPin.mjs +54 -0
- package/lib/chunks/index-B57rEPin.mjs.map +1 -0
- package/lib/chunks/index-BCuRRLYt.mjs +222 -0
- package/lib/chunks/index-BCuRRLYt.mjs.map +1 -0
- package/lib/chunks/{index-DSAXdrgU.mjs → index-BJ6vTNxc.mjs} +76 -75
- package/lib/chunks/index-BJ6vTNxc.mjs.map +1 -0
- package/lib/chunks/{index-C5YHI0Zs.mjs → index-BYdqrqnR.mjs} +52 -51
- package/lib/chunks/index-BYdqrqnR.mjs.map +1 -0
- package/lib/chunks/index-BiyghBxu.mjs +136 -0
- package/lib/chunks/index-BiyghBxu.mjs.map +1 -0
- package/lib/chunks/{index-CwmZQ-JO.mjs → index-C8CyS_sj.mjs} +67 -64
- package/lib/chunks/index-C8CyS_sj.mjs.map +1 -0
- package/lib/chunks/index-C8OrFLd5.mjs +594 -0
- package/lib/chunks/index-C8OrFLd5.mjs.map +1 -0
- package/lib/chunks/{index-DveR0rOk.mjs → index-CCkHAeLh.mjs} +41 -38
- package/lib/chunks/index-CCkHAeLh.mjs.map +1 -0
- package/lib/chunks/index-CdmkF0CO.mjs +105 -0
- package/lib/chunks/index-CdmkF0CO.mjs.map +1 -0
- package/lib/chunks/index-CuAALtwC.mjs +2299 -0
- package/lib/chunks/index-CuAALtwC.mjs.map +1 -0
- package/lib/chunks/index-D660ENHx.mjs +114 -0
- package/lib/chunks/index-D660ENHx.mjs.map +1 -0
- package/lib/chunks/{index-DN8BQIqo.mjs → index-DBEG73K1.mjs} +79 -78
- package/lib/chunks/index-DBEG73K1.mjs.map +1 -0
- package/lib/chunks/index-DaFlk9dd.mjs +13097 -0
- package/lib/chunks/index-DaFlk9dd.mjs.map +1 -0
- package/lib/chunks/index-_mP0FkqE.mjs +113 -0
- package/lib/chunks/index-_mP0FkqE.mjs.map +1 -0
- package/lib/chunks/{index-tecGXW2S.mjs → index-nLTQXCV7.mjs} +85 -83
- package/lib/chunks/index-nLTQXCV7.mjs.map +1 -0
- package/lib/chunks/index-nVblatyi.mjs +55 -0
- package/lib/chunks/index-nVblatyi.mjs.map +1 -0
- package/lib/chunks/{index-DPpUj8Yy.mjs → index-ow-nGpuu.mjs} +99 -98
- package/lib/chunks/index-ow-nGpuu.mjs.map +1 -0
- package/lib/chunks/index-qOC5xQyK.mjs +96 -0
- package/lib/chunks/index-qOC5xQyK.mjs.map +1 -0
- package/lib/chunks/index-rUfsiVR8.mjs +12335 -0
- package/lib/chunks/index-rUfsiVR8.mjs.map +1 -0
- package/lib/chunks/jp2Loader-Bn-qPMbD-Bn-qPMbD.mjs +122 -0
- package/lib/chunks/jp2Loader-Bn-qPMbD-Bn-qPMbD.mjs.map +1 -0
- package/lib/chunks/psdLoader-Doxw3mWm-DVOGFSlh.mjs +73 -0
- package/lib/chunks/psdLoader-Doxw3mWm-DVOGFSlh.mjs.map +1 -0
- package/lib/chunks/rawLoader-0mLvxCNp-CJmERiK7.mjs +82 -0
- package/lib/chunks/rawLoader-0mLvxCNp-CJmERiK7.mjs.map +1 -0
- package/lib/chunks/tiffLoader-CTFKVLqJ-B84NfwhR.mjs +60 -0
- package/lib/chunks/tiffLoader-CTFKVLqJ-B84NfwhR.mjs.map +1 -0
- package/lib/chunks/{useShikiHighlight-DHFYu0BU.mjs → useShikiHighlight-ClbUXJ2p.mjs} +2 -2
- package/lib/chunks/{useShikiHighlight-DHFYu0BU.mjs.map → useShikiHighlight-ClbUXJ2p.mjs.map} +1 -1
- package/lib/index.cjs +31 -22
- package/lib/index.cjs.map +1 -1
- package/lib/index.css +1 -1
- package/lib/index.mjs +8 -8
- package/lib/renderers/Audio/index.d.ts.map +1 -1
- 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/Font/index.d.ts.map +1 -1
- package/lib/renderers/Image/index.d.ts +2 -0
- package/lib/renderers/Image/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/Pdf/index.d.ts.map +1 -1
- package/lib/renderers/Pptx/index.d.ts.map +1 -1
- package/lib/renderers/RendererError.d.ts +8 -0
- package/lib/renderers/RendererError.d.ts.map +1 -0
- package/lib/renderers/Subtitle/index.d.ts.map +1 -1
- package/lib/renderers/Text/index.d.ts.map +1 -1
- package/lib/renderers/Video/index.d.ts +1 -0
- package/lib/renderers/Video/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/package.json +13 -5
- package/lib/chunks/index-B0JUZ5rS.mjs +0 -110
- package/lib/chunks/index-B0JUZ5rS.mjs.map +0 -1
- package/lib/chunks/index-BAYc4aBz.mjs +0 -129
- package/lib/chunks/index-BAYc4aBz.mjs.map +0 -1
- package/lib/chunks/index-BOQJNL71.mjs +0 -103
- package/lib/chunks/index-BOQJNL71.mjs.map +0 -1
- package/lib/chunks/index-BkU8rK-0.mjs +0 -51
- package/lib/chunks/index-BkU8rK-0.mjs.map +0 -1
- package/lib/chunks/index-BnDoXBnH.mjs +0 -257
- package/lib/chunks/index-BnDoXBnH.mjs.map +0 -1
- package/lib/chunks/index-C5YHI0Zs.mjs.map +0 -1
- package/lib/chunks/index-CGNWXFy3.mjs +0 -2081
- package/lib/chunks/index-CGNWXFy3.mjs.map +0 -1
- package/lib/chunks/index-CwmZQ-JO.mjs.map +0 -1
- package/lib/chunks/index-CzflrElZ.mjs +0 -52
- package/lib/chunks/index-CzflrElZ.mjs.map +0 -1
- package/lib/chunks/index-CztCCF7q.mjs +0 -116
- package/lib/chunks/index-CztCCF7q.mjs.map +0 -1
- package/lib/chunks/index-DKEcGewg.mjs +0 -96
- package/lib/chunks/index-DKEcGewg.mjs.map +0 -1
- package/lib/chunks/index-DN8BQIqo.mjs.map +0 -1
- package/lib/chunks/index-DPpUj8Yy.mjs.map +0 -1
- package/lib/chunks/index-DSAXdrgU.mjs.map +0 -1
- package/lib/chunks/index-DveR0rOk.mjs.map +0 -1
- package/lib/chunks/index-QfO-sASN.mjs +0 -152
- package/lib/chunks/index-QfO-sASN.mjs.map +0 -1
- package/lib/chunks/index-h9bO9wmq.mjs +0 -99
- package/lib/chunks/index-h9bO9wmq.mjs.map +0 -1
- package/lib/chunks/index-mvSVNKlQ.mjs +0 -228
- package/lib/chunks/index-mvSVNKlQ.mjs.map +0 -1
- package/lib/chunks/index-tecGXW2S.mjs.map +0 -1
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { jsxs as E, jsx as i } from "react/jsx-runtime";
|
|
2
|
+
import { useState as y, useRef as c, useCallback as D, useEffect as T } from "react";
|
|
3
|
+
import N from "exceljs";
|
|
4
|
+
import z from "x-data-spreadsheet";
|
|
5
|
+
/* empty css */
|
|
6
|
+
import { u as W, a as j, I as H } from "./index-CuAALtwC.mjs";
|
|
7
|
+
import { R as L } from "./RendererError-BH6fzLrN.mjs";
|
|
8
|
+
const q = ({ url: m }) => {
|
|
9
|
+
const u = W(), k = j(), [w, x] = y(!0), [b, v] = y(null), e = c(null), g = c(null), f = c(null), d = c(null), a = c(null), R = c({ width: 0, height: 0 }), l = D(() => {
|
|
10
|
+
if (!e.current) return { width: 800, height: 600 };
|
|
11
|
+
const t = e.current.clientWidth, s = e.current.clientHeight, n = t > 100 ? t : 800, r = s > 100 ? s : 600;
|
|
12
|
+
return { width: n, height: r };
|
|
13
|
+
}, []), h = D(() => {
|
|
14
|
+
if (!e.current || !f.current) return;
|
|
15
|
+
e.current.innerHTML = "", g.current = null;
|
|
16
|
+
const { width: t, height: s } = l(), n = t < 640, r = new z(e.current, {
|
|
17
|
+
mode: "read",
|
|
18
|
+
showToolbar: !1,
|
|
19
|
+
showContextmenu: !1,
|
|
20
|
+
showGrid: !0,
|
|
21
|
+
row: {
|
|
22
|
+
len: 100,
|
|
23
|
+
height: 25
|
|
24
|
+
},
|
|
25
|
+
col: {
|
|
26
|
+
len: 26,
|
|
27
|
+
width: n ? 80 : 100,
|
|
28
|
+
indexWidth: n ? 40 : 60,
|
|
29
|
+
minWidth: n ? 40 : 60
|
|
30
|
+
},
|
|
31
|
+
view: {
|
|
32
|
+
height: () => s,
|
|
33
|
+
width: () => t
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
r.loadData(f.current), g.current = r;
|
|
37
|
+
}, [l]);
|
|
38
|
+
return T(() => {
|
|
39
|
+
if (!e.current) return;
|
|
40
|
+
let t = !0;
|
|
41
|
+
const s = () => {
|
|
42
|
+
if (t) {
|
|
43
|
+
t = !1, R.current = l();
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const n = l(), r = R.current, o = Math.abs(r.width - n.width), p = Math.abs(r.height - n.height);
|
|
47
|
+
o < 10 && p < 10 || (R.current = n, a.current && clearTimeout(a.current), a.current = window.setTimeout(() => {
|
|
48
|
+
f.current && h();
|
|
49
|
+
}, 500));
|
|
50
|
+
};
|
|
51
|
+
return d.current = new ResizeObserver(() => {
|
|
52
|
+
s();
|
|
53
|
+
}), d.current.observe(e.current), () => {
|
|
54
|
+
d.current && d.current.disconnect(), a.current && clearTimeout(a.current);
|
|
55
|
+
};
|
|
56
|
+
}, [l, h]), T(() => {
|
|
57
|
+
if (!m) return;
|
|
58
|
+
let t = !0;
|
|
59
|
+
const s = async () => {
|
|
60
|
+
if (e.current) {
|
|
61
|
+
x(!0), v(null);
|
|
62
|
+
try {
|
|
63
|
+
const r = await k(m, {
|
|
64
|
+
mode: "cors",
|
|
65
|
+
credentials: "omit",
|
|
66
|
+
redirect: "follow"
|
|
67
|
+
});
|
|
68
|
+
if (!r.ok)
|
|
69
|
+
throw r.status === 404 ? new Error(u("xlsx.not_found")) : r.status === 403 ? new Error("无权限访问此文件") : new Error(`文件加载失败 (${r.status})`);
|
|
70
|
+
const o = await r.arrayBuffer();
|
|
71
|
+
if (o.byteLength === 0)
|
|
72
|
+
throw new Error("文件为空");
|
|
73
|
+
const p = new N.Workbook();
|
|
74
|
+
await p.xlsx.load(o);
|
|
75
|
+
const M = H(p);
|
|
76
|
+
if (!t) return;
|
|
77
|
+
f.current = M, h(), x(!1);
|
|
78
|
+
} catch (r) {
|
|
79
|
+
if (t) {
|
|
80
|
+
console.error("Excel 解析错误:", r);
|
|
81
|
+
let o = u("xlsx.parse_failed");
|
|
82
|
+
r instanceof Error && (o = r.message), v(o), x(!1);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}, n = setTimeout(() => {
|
|
87
|
+
requestAnimationFrame(() => {
|
|
88
|
+
s();
|
|
89
|
+
});
|
|
90
|
+
}, 100);
|
|
91
|
+
return () => {
|
|
92
|
+
t = !1, clearTimeout(n), f.current = null, e.current && (e.current.innerHTML = ""), g.current = null;
|
|
93
|
+
};
|
|
94
|
+
}, [m, h]), /* @__PURE__ */ E("div", { className: "rfp-relative rfp-flex rfp-flex-col rfp-items-center rfp-w-full rfp-h-full", children: [
|
|
95
|
+
w && /* @__PURE__ */ i("div", { className: "rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-bg-surface-toolbar rfp-backdrop-blur-sm rfp-z-10", children: /* @__PURE__ */ E("div", { className: "rfp-text-center", children: [
|
|
96
|
+
/* @__PURE__ */ i("div", { className: "rfp-w-10 rfp-h-10 md:rfp-w-12 md:rfp-h-12 rfp-mx-auto rfp-mb-3 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin" }),
|
|
97
|
+
/* @__PURE__ */ i("p", { className: "rfp-text-xs md:rfp-text-sm rfp-text-fg-secondary rfp-font-medium", children: u("xlsx.loading") })
|
|
98
|
+
] }) }),
|
|
99
|
+
b && !w && /* @__PURE__ */ i("div", { className: "rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-bg-surface-toolbar rfp-backdrop-blur-sm rfp-z-10", children: /* @__PURE__ */ i(L, { message: u("xlsx.load_failed"), detail: b }) }),
|
|
100
|
+
!b && /* @__PURE__ */ i(
|
|
101
|
+
"div",
|
|
102
|
+
{
|
|
103
|
+
ref: e,
|
|
104
|
+
className: "xlsx-spreadsheet-container rfp-w-full rfp-h-full",
|
|
105
|
+
style: { opacity: w ? 0 : 1 }
|
|
106
|
+
}
|
|
107
|
+
)
|
|
108
|
+
] });
|
|
109
|
+
};
|
|
110
|
+
export {
|
|
111
|
+
q as XlsxRenderer
|
|
112
|
+
};
|
|
113
|
+
//# sourceMappingURL=index-_mP0FkqE.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-_mP0FkqE.mjs","sources":["../../src/renderers/Xlsx/index.tsx"],"sourcesContent":["import { useState, useEffect, useRef, useCallback } from 'react';\nimport ExcelJS from 'exceljs';\nimport Spreadsheet from 'x-data-spreadsheet';\nimport 'x-data-spreadsheet/dist/xspreadsheet.css';\nimport { convertWorkbookToSpreadsheetData } from '../../utils/excelDataConverter';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { useFetcher } from '../../RequestContext';\nimport { RendererError } from '../RendererError';\n\ninterface XlsxRendererProps {\n url: string;\n}\n\nexport const XlsxRenderer: React.FC<XlsxRendererProps> = ({ url }) => {\n const t = useTranslator();\n const fetcher = useFetcher();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const spreadsheetRef = useRef<Spreadsheet | null>(null);\n const sheetDataRef = useRef<Record<string, unknown>[] | null>(null);\n const resizeObserverRef = useRef<ResizeObserver | null>(null);\n const resizeTimeoutRef = useRef<number | null>(null);\n const lastDimensionsRef = useRef({ width: 0, height: 0 });\n\n const calculateDimensions = useCallback(() => {\n if (!containerRef.current) return { width: 800, height: 600 };\n const rawWidth = containerRef.current.clientWidth;\n const rawHeight = containerRef.current.clientHeight;\n const width = rawWidth > 100 ? rawWidth : 800;\n const height = rawHeight > 100 ? rawHeight : 600;\n return { width, height };\n }, []);\n\n const mountSpreadsheet = useCallback(() => {\n if (!containerRef.current || !sheetDataRef.current) return;\n\n // 清空容器\n containerRef.current.innerHTML = '';\n spreadsheetRef.current = null;\n\n const { width, height } = calculateDimensions();\n const isMobile = width < 640;\n\n const s = new Spreadsheet(containerRef.current, {\n mode: 'read',\n showToolbar: false,\n showContextmenu: false,\n showGrid: true,\n row: {\n len: 100,\n height: 25,\n },\n col: {\n len: 26,\n width: isMobile ? 80 : 100,\n indexWidth: isMobile ? 40 : 60,\n minWidth: isMobile ? 40 : 60,\n },\n view: {\n height: () => height,\n width: () => width,\n },\n });\n\n s.loadData(sheetDataRef.current as unknown as Record<string, unknown>);\n spreadsheetRef.current = s;\n }, [calculateDimensions]);\n\n // 监听容器尺寸变化\n useEffect(() => {\n if (!containerRef.current) return;\n\n let isInitialRender = true;\n\n const updateDimensions = () => {\n if (isInitialRender) {\n isInitialRender = false;\n lastDimensionsRef.current = calculateDimensions();\n return;\n }\n\n const newDimensions = calculateDimensions();\n const lastDimensions = lastDimensionsRef.current;\n const widthDiff = Math.abs(lastDimensions.width - newDimensions.width);\n const heightDiff = Math.abs(lastDimensions.height - newDimensions.height);\n\n if (widthDiff < 10 && heightDiff < 10) return;\n\n lastDimensionsRef.current = newDimensions;\n\n if (resizeTimeoutRef.current) {\n clearTimeout(resizeTimeoutRef.current);\n }\n\n resizeTimeoutRef.current = window.setTimeout(() => {\n if (sheetDataRef.current) {\n mountSpreadsheet();\n }\n }, 500);\n };\n\n resizeObserverRef.current = new ResizeObserver(() => {\n updateDimensions();\n });\n\n resizeObserverRef.current.observe(containerRef.current);\n\n return () => {\n if (resizeObserverRef.current) {\n resizeObserverRef.current.disconnect();\n }\n if (resizeTimeoutRef.current) {\n clearTimeout(resizeTimeoutRef.current);\n }\n };\n }, [calculateDimensions, mountSpreadsheet]);\n\n useEffect(() => {\n // 只有 URL 有效时才加载(避免空字符串或已 revoke 的 blob URL)\n if (!url) return;\n\n let isMounted = true;\n\n const loadExcel = async () => {\n if (!containerRef.current) return;\n\n setLoading(true);\n setError(null);\n\n try {\n const response = await fetcher(url, {\n mode: 'cors',\n credentials: 'omit',\n redirect: 'follow',\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error(t('xlsx.not_found'));\n } else if (response.status === 403) {\n throw new Error('无权限访问此文件');\n } else {\n throw new Error(`文件加载失败 (${response.status})`);\n }\n }\n\n const arrayBuffer = await response.arrayBuffer();\n\n if (arrayBuffer.byteLength === 0) {\n throw new Error('文件为空');\n }\n\n // 使用 exceljs 解析\n const workbook = new ExcelJS.Workbook();\n await workbook.xlsx.load(arrayBuffer);\n\n // 转换为 x-data-spreadsheet 数据格式\n const sheetData = convertWorkbookToSpreadsheetData(workbook);\n\n if (!isMounted) return;\n\n sheetDataRef.current = sheetData as unknown as Record<string, unknown>[];\n\n // 挂载 x-data-spreadsheet\n mountSpreadsheet();\n\n setLoading(false);\n } catch (err) {\n if (isMounted) {\n console.error('Excel 解析错误:', err);\n let errorMsg = t('xlsx.parse_failed');\n if (err instanceof Error) {\n errorMsg = err.message;\n }\n setError(errorMsg);\n setLoading(false);\n }\n }\n };\n\n const timer = setTimeout(() => {\n requestAnimationFrame(() => {\n loadExcel();\n });\n }, 100);\n\n return () => {\n isMounted = false;\n clearTimeout(timer);\n sheetDataRef.current = null;\n if (containerRef.current) {\n containerRef.current.innerHTML = '';\n }\n spreadsheetRef.current = null;\n };\n }, [url, mountSpreadsheet]);\n\n return (\n <div className=\"rfp-relative rfp-flex rfp-flex-col rfp-items-center rfp-w-full rfp-h-full\">\n {/* 加载状态 */}\n {loading && (\n <div className=\"rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-bg-surface-toolbar rfp-backdrop-blur-sm rfp-z-10\">\n <div className=\"rfp-text-center\">\n <div className=\"rfp-w-10 rfp-h-10 md:rfp-w-12 md:rfp-h-12 rfp-mx-auto rfp-mb-3 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n <p className=\"rfp-text-xs md:rfp-text-sm rfp-text-fg-secondary rfp-font-medium\">{t('xlsx.loading')}</p>\n </div>\n </div>\n )}\n\n {/* 错误状态 */}\n {error && !loading && (\n <div className=\"rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-bg-surface-toolbar rfp-backdrop-blur-sm rfp-z-10\">\n <RendererError message={t('xlsx.load_failed')} detail={error} />\n </div>\n )}\n\n {/* Spreadsheet 容器 */}\n {!error && (\n <div\n ref={containerRef}\n className=\"xlsx-spreadsheet-container rfp-w-full rfp-h-full\"\n style={{ opacity: loading ? 0 : 1 }}\n />\n )}\n </div>\n );\n};\n"],"names":["XlsxRenderer","url","t","useTranslator","fetcher","useFetcher","loading","setLoading","useState","error","setError","containerRef","useRef","spreadsheetRef","sheetDataRef","resizeObserverRef","resizeTimeoutRef","lastDimensionsRef","calculateDimensions","useCallback","rawWidth","rawHeight","width","height","mountSpreadsheet","isMobile","s","Spreadsheet","useEffect","isInitialRender","updateDimensions","newDimensions","lastDimensions","widthDiff","heightDiff","isMounted","loadExcel","response","arrayBuffer","workbook","ExcelJS","sheetData","convertWorkbookToSpreadsheetData","err","errorMsg","timer","jsxs","jsx","RendererError"],"mappings":"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"}
|
|
@@ -1,26 +1,27 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import { useRef as Z, useState as
|
|
1
|
+
import { jsxs as j, jsx as e, Fragment as O } from "react/jsx-runtime";
|
|
2
|
+
import { useRef as Z, useState as o, useEffect as z, useCallback as F, useMemo as J, Suspense as Q, lazy as V } from "react";
|
|
3
3
|
import { createPortal as K } from "react-dom";
|
|
4
4
|
import { ChevronRight as ee, FolderOpen as re, Folder as te, FileImage as ne, FileText as fe, FileCode as se, File as le } from "lucide-react";
|
|
5
|
-
import {
|
|
6
|
-
|
|
5
|
+
import { R as ie } from "./RendererError-BH6fzLrN.mjs";
|
|
6
|
+
import { u as pe, a as oe, c as H, R as ae, j as ce, D as de, A as ue, C as me, F as he } from "./index-CuAALtwC.mjs";
|
|
7
|
+
const xe = ({
|
|
7
8
|
left: t,
|
|
8
9
|
right: l,
|
|
9
10
|
initialLeftWidth: w = 280,
|
|
10
11
|
minLeftWidth: v = 160,
|
|
11
12
|
maxLeftWidth: b = 640,
|
|
12
13
|
minRightWidth: d = 200,
|
|
13
|
-
storageKey:
|
|
14
|
+
storageKey: a,
|
|
14
15
|
desktopMedia: p = "(min-width: 768px)",
|
|
15
|
-
className:
|
|
16
|
+
className: g = ""
|
|
16
17
|
}) => {
|
|
17
|
-
const
|
|
18
|
-
if (
|
|
19
|
-
const s = Number(window.localStorage.getItem(
|
|
18
|
+
const y = Z(null), [u, N] = o(() => {
|
|
19
|
+
if (a && typeof window < "u") {
|
|
20
|
+
const s = Number(window.localStorage.getItem(a));
|
|
20
21
|
if (!isNaN(s) && s > 0) return s;
|
|
21
22
|
}
|
|
22
23
|
return w;
|
|
23
|
-
}), [c,
|
|
24
|
+
}), [c, L] = o(!1), [m, n] = o(!1);
|
|
24
25
|
z(() => {
|
|
25
26
|
if (typeof window > "u") return;
|
|
26
27
|
const s = window.matchMedia(p), h = () => n(s.matches);
|
|
@@ -28,30 +29,30 @@ const he = ({
|
|
|
28
29
|
}, [p]), z(() => {
|
|
29
30
|
if (!c) return;
|
|
30
31
|
const s = (E) => {
|
|
31
|
-
if (!
|
|
32
|
-
const
|
|
33
|
-
N(
|
|
34
|
-
}, h = () =>
|
|
32
|
+
if (!y.current) return;
|
|
33
|
+
const U = y.current.getBoundingClientRect(), x = E.clientX - U.left, S = U.width - d - 6, $ = Math.min(b, S), C = Math.max(v, Math.min($, x));
|
|
34
|
+
N(C);
|
|
35
|
+
}, h = () => L(!1);
|
|
35
36
|
window.addEventListener("mousemove", s), window.addEventListener("mouseup", h);
|
|
36
|
-
const
|
|
37
|
+
const R = document.body.style.cursor, M = document.body.style.userSelect;
|
|
37
38
|
return document.body.style.cursor = "col-resize", document.body.style.userSelect = "none", () => {
|
|
38
|
-
window.removeEventListener("mousemove", s), window.removeEventListener("mouseup", h), document.body.style.cursor =
|
|
39
|
+
window.removeEventListener("mousemove", s), window.removeEventListener("mouseup", h), document.body.style.cursor = R, document.body.style.userSelect = M;
|
|
39
40
|
};
|
|
40
41
|
}, [c, v, b, d]), z(() => {
|
|
41
|
-
if (!(!
|
|
42
|
+
if (!(!a || c))
|
|
42
43
|
try {
|
|
43
|
-
window.localStorage.setItem(
|
|
44
|
+
window.localStorage.setItem(a, String(u));
|
|
44
45
|
} catch {
|
|
45
46
|
}
|
|
46
|
-
}, [u,
|
|
47
|
-
const
|
|
48
|
-
s.preventDefault(),
|
|
47
|
+
}, [u, a, c]);
|
|
48
|
+
const T = F((s) => {
|
|
49
|
+
s.preventDefault(), L(!0);
|
|
49
50
|
}, []);
|
|
50
|
-
return /* @__PURE__ */
|
|
51
|
+
return /* @__PURE__ */ j(
|
|
51
52
|
"div",
|
|
52
53
|
{
|
|
53
|
-
ref:
|
|
54
|
-
className: `rfp-w-full rfp-h-full rfp-flex rfp-flex-col md:rfp-flex-row rfp-min-h-0 rfp-min-w-0 ${
|
|
54
|
+
ref: y,
|
|
55
|
+
className: `rfp-w-full rfp-h-full rfp-flex rfp-flex-col md:rfp-flex-row rfp-min-h-0 rfp-min-w-0 ${g}`,
|
|
55
56
|
children: [
|
|
56
57
|
/* @__PURE__ */ e(
|
|
57
58
|
"div",
|
|
@@ -66,7 +67,7 @@ const he = ({
|
|
|
66
67
|
{
|
|
67
68
|
role: "separator",
|
|
68
69
|
"aria-orientation": "vertical",
|
|
69
|
-
onMouseDown:
|
|
70
|
+
onMouseDown: T,
|
|
70
71
|
className: `rfp-hidden md:rfp-block rfp-relative rfp-w-1.5 rfp-flex-shrink-0 rfp-cursor-col-resize rfp-transition-colors ${c ? "rfp-bg-surface-toolbar" : "rfp-bg-surface-2 hover:rfp-bg-surface-3"}`,
|
|
71
72
|
children: /* @__PURE__ */ e("span", { className: "rfp-absolute rfp-inset-y-0 -rfp-left-1 -rfp-right-1" })
|
|
72
73
|
}
|
|
@@ -75,10 +76,10 @@ const he = ({
|
|
|
75
76
|
]
|
|
76
77
|
}
|
|
77
78
|
);
|
|
78
|
-
},
|
|
79
|
-
() => import("./index-
|
|
80
|
-
),
|
|
81
|
-
const l =
|
|
79
|
+
}, we = V(
|
|
80
|
+
() => import("./index-CuAALtwC.mjs").then((t) => t.i).then((t) => ({ default: t.FilePreviewContent }))
|
|
81
|
+
), ve = (t) => {
|
|
82
|
+
const l = he({ name: t, type: "" });
|
|
82
83
|
return l === "image" ? ne : l === "text" || l === "markdown" || l === "json" || l === "csv" || l === "xml" || l === "subtitle" ? t.endsWith(".md") || t.endsWith(".markdown") ? fe : se : le;
|
|
83
84
|
}, _ = ({
|
|
84
85
|
node: t,
|
|
@@ -87,17 +88,17 @@ const he = ({
|
|
|
87
88
|
expanded: v,
|
|
88
89
|
onToggle: b,
|
|
89
90
|
onSelect: d,
|
|
90
|
-
onHover:
|
|
91
|
+
onHover: a,
|
|
91
92
|
onLeave: p
|
|
92
93
|
}) => {
|
|
93
|
-
var
|
|
94
|
-
const
|
|
94
|
+
var L;
|
|
95
|
+
const g = v.has(t.path), y = w === t.path, u = { paddingLeft: `${l * 14 + 10}px` }, N = (m) => {
|
|
95
96
|
const n = m.currentTarget.getBoundingClientRect();
|
|
96
|
-
|
|
97
|
+
a(t.name || "/", n);
|
|
97
98
|
};
|
|
98
99
|
if (t.isDir)
|
|
99
|
-
return /* @__PURE__ */
|
|
100
|
-
/* @__PURE__ */
|
|
100
|
+
return /* @__PURE__ */ j(O, { children: [
|
|
101
|
+
/* @__PURE__ */ j(
|
|
101
102
|
"button",
|
|
102
103
|
{
|
|
103
104
|
type: "button",
|
|
@@ -110,15 +111,15 @@ const he = ({
|
|
|
110
111
|
/* @__PURE__ */ e(
|
|
111
112
|
ee,
|
|
112
113
|
{
|
|
113
|
-
className: `rfp-w-3.5 rfp-h-3.5 rfp-flex-shrink-0 rfp-transition-transform ${
|
|
114
|
+
className: `rfp-w-3.5 rfp-h-3.5 rfp-flex-shrink-0 rfp-transition-transform ${g ? "rfp-rotate-90" : ""}`
|
|
114
115
|
}
|
|
115
116
|
),
|
|
116
|
-
|
|
117
|
+
g ? /* @__PURE__ */ e(re, { className: "rfp-w-4 rfp-h-4 rfp-flex-shrink-0 rfp-text-amber-300/80" }) : /* @__PURE__ */ e(te, { className: "rfp-w-4 rfp-h-4 rfp-flex-shrink-0 rfp-text-amber-300/80" }),
|
|
117
118
|
/* @__PURE__ */ e("span", { className: "rfp-truncate rfp-flex-1 rfp-min-w-0", children: t.name || "/" })
|
|
118
119
|
]
|
|
119
120
|
}
|
|
120
121
|
),
|
|
121
|
-
|
|
122
|
+
g && ((L = t.children) == null ? void 0 : L.map((m) => /* @__PURE__ */ e(
|
|
122
123
|
_,
|
|
123
124
|
{
|
|
124
125
|
node: m,
|
|
@@ -127,49 +128,50 @@ const he = ({
|
|
|
127
128
|
expanded: v,
|
|
128
129
|
onToggle: b,
|
|
129
130
|
onSelect: d,
|
|
130
|
-
onHover:
|
|
131
|
+
onHover: a,
|
|
131
132
|
onLeave: p
|
|
132
133
|
},
|
|
133
134
|
m.path
|
|
134
135
|
)))
|
|
135
136
|
] });
|
|
136
|
-
const c =
|
|
137
|
-
return /* @__PURE__ */
|
|
137
|
+
const c = ve(t.name);
|
|
138
|
+
return /* @__PURE__ */ j(
|
|
138
139
|
"button",
|
|
139
140
|
{
|
|
140
141
|
type: "button",
|
|
141
142
|
onClick: () => d(t),
|
|
142
143
|
onMouseEnter: N,
|
|
143
144
|
onMouseLeave: p,
|
|
144
|
-
className: `rfp-w-full rfp-flex rfp-items-center rfp-gap-1.5 rfp-py-1.5 rfp-pr-2 rfp-text-left rfp-text-sm ${
|
|
145
|
+
className: `rfp-w-full rfp-flex rfp-items-center rfp-gap-1.5 rfp-py-1.5 rfp-pr-2 rfp-text-left rfp-text-sm ${y ? "rfp-bg-surface-2 rfp-text-fg-primary" : "rfp-text-fg-secondary hover:rfp-bg-surface-1"}`,
|
|
145
146
|
style: u,
|
|
146
147
|
children: [
|
|
147
148
|
/* @__PURE__ */ e("span", { className: "rfp-w-3.5 rfp-h-3.5 rfp-flex-shrink-0" }),
|
|
148
149
|
/* @__PURE__ */ e(c, { className: "rfp-w-4 rfp-h-4 rfp-flex-shrink-0 rfp-text-fg-tertiary" }),
|
|
149
150
|
/* @__PURE__ */ e("span", { className: "rfp-flex-1 rfp-truncate rfp-min-w-0", children: t.name }),
|
|
150
|
-
/* @__PURE__ */ e("span", { className: "rfp-text-xs rfp-text-fg-disabled rfp-flex-shrink-0 rfp-ml-2", children:
|
|
151
|
+
/* @__PURE__ */ e("span", { className: "rfp-text-xs rfp-text-fg-disabled rfp-flex-shrink-0 rfp-ml-2", children: me(t.size) })
|
|
151
152
|
]
|
|
152
153
|
}
|
|
153
154
|
);
|
|
154
|
-
},
|
|
155
|
+
}, ze = ({ url: t, nestingDepth: l = 0, onStatsChange: w }) => {
|
|
155
156
|
var W;
|
|
156
|
-
const v =
|
|
157
|
+
const v = pe(), b = oe(), [d, a] = o(null), [p, g] = o(null), [y, u] = o(!0), [N, c] = o(null), [L, m] = o(/* @__PURE__ */ new Set([""])), [n, T] = o(null), [s, h] = o(!1), [R, M] = o(null), [E, U] = o(null), x = Z(w);
|
|
157
158
|
z(() => {
|
|
158
159
|
x.current = w;
|
|
159
160
|
}, [w]), z(() => {
|
|
161
|
+
if (!t) return;
|
|
160
162
|
let r = !1;
|
|
161
163
|
return (async () => {
|
|
162
164
|
try {
|
|
163
165
|
u(!0), c(null);
|
|
164
166
|
const i = await b(t);
|
|
165
167
|
if (!i.ok) throw new Error("加载失败");
|
|
166
|
-
const
|
|
168
|
+
const D = await i.arrayBuffer(), k = await ce(D);
|
|
167
169
|
if (r) return;
|
|
168
|
-
const
|
|
169
|
-
|
|
170
|
+
const I = de(k), P = ue(I);
|
|
171
|
+
a(k), g(P);
|
|
170
172
|
const B = /* @__PURE__ */ new Set([""]);
|
|
171
|
-
if (
|
|
172
|
-
for (const
|
|
173
|
+
if (P.children)
|
|
174
|
+
for (const A of P.children) A.isDir && B.add(A.path);
|
|
173
175
|
m(B);
|
|
174
176
|
} catch (i) {
|
|
175
177
|
console.error(i), r || c(v("zip.load_failed"));
|
|
@@ -182,44 +184,44 @@ const he = ({
|
|
|
182
184
|
}, [t]), z(() => () => {
|
|
183
185
|
n != null && n.blobUrl && URL.revokeObjectURL(n.blobUrl);
|
|
184
186
|
}, [n]);
|
|
185
|
-
const
|
|
187
|
+
const S = J(() => {
|
|
186
188
|
if (!p) return null;
|
|
187
189
|
let r = 0, f = 0, i = 0;
|
|
188
|
-
const
|
|
189
|
-
var
|
|
190
|
-
|
|
190
|
+
const D = (k) => {
|
|
191
|
+
var I;
|
|
192
|
+
k.isDir ? (k.path && f++, (I = k.children) == null || I.forEach(D)) : (r++, i += k.size);
|
|
191
193
|
};
|
|
192
|
-
return
|
|
194
|
+
return D(p), { files: r, dirs: f, size: i };
|
|
193
195
|
}, [p]);
|
|
194
196
|
z(() => {
|
|
195
197
|
var r;
|
|
196
|
-
return (r = x.current) == null || r.call(x,
|
|
198
|
+
return (r = x.current) == null || r.call(x, S), () => {
|
|
197
199
|
var f;
|
|
198
200
|
(f = x.current) == null || f.call(x, null);
|
|
199
201
|
};
|
|
200
|
-
}, [
|
|
201
|
-
const $ =
|
|
202
|
+
}, [S]);
|
|
203
|
+
const $ = F((r) => {
|
|
202
204
|
m((f) => {
|
|
203
205
|
const i = new Set(f);
|
|
204
206
|
return i.has(r) ? i.delete(r) : i.add(r), i;
|
|
205
207
|
});
|
|
206
|
-
}, []),
|
|
207
|
-
|
|
208
|
+
}, []), C = F((r, f) => {
|
|
209
|
+
U({
|
|
208
210
|
text: r,
|
|
209
211
|
x: f.right + 8,
|
|
210
212
|
y: f.top + f.height / 2
|
|
211
213
|
});
|
|
212
|
-
}, []),
|
|
213
|
-
|
|
214
|
-
}, []),
|
|
214
|
+
}, []), q = F(() => {
|
|
215
|
+
U(null);
|
|
216
|
+
}, []), X = F(
|
|
215
217
|
async (r) => {
|
|
216
218
|
if (!(!d || r.isDir)) {
|
|
217
|
-
n != null && n.blobUrl && URL.revokeObjectURL(n.blobUrl), h(!0),
|
|
219
|
+
n != null && n.blobUrl && URL.revokeObjectURL(n.blobUrl), h(!0), M(null);
|
|
218
220
|
try {
|
|
219
|
-
const f = H(r.name), i = await ae(d, r.path, f !== "application/octet-stream" ? f : void 0),
|
|
220
|
-
|
|
221
|
+
const f = H(r.name), i = await ae(d, r.path, f !== "application/octet-stream" ? f : void 0), D = URL.createObjectURL(i);
|
|
222
|
+
T({ path: r.path, name: r.name, size: r.size, blobUrl: D });
|
|
221
223
|
} catch (f) {
|
|
222
|
-
console.error(f),
|
|
224
|
+
console.error(f), M("条目读取失败");
|
|
223
225
|
} finally {
|
|
224
226
|
h(!1);
|
|
225
227
|
}
|
|
@@ -227,33 +229,33 @@ const he = ({
|
|
|
227
229
|
},
|
|
228
230
|
[d, n]
|
|
229
231
|
);
|
|
230
|
-
if (
|
|
232
|
+
if (y)
|
|
231
233
|
return /* @__PURE__ */ e("div", { className: "rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full", children: /* @__PURE__ */ e("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" }) });
|
|
232
234
|
if (N || !p)
|
|
233
|
-
return /* @__PURE__ */ e(
|
|
234
|
-
const
|
|
235
|
+
return /* @__PURE__ */ e(ie, { message: N || v("zip.parse_failed") });
|
|
236
|
+
const Y = /* @__PURE__ */ e("div", { className: "rfp-w-full rfp-h-full rfp-overflow-auto", children: (W = p.children) == null ? void 0 : W.map((r) => /* @__PURE__ */ e(
|
|
235
237
|
_,
|
|
236
238
|
{
|
|
237
239
|
node: r,
|
|
238
240
|
depth: 0,
|
|
239
241
|
selectedPath: (n == null ? void 0 : n.path) ?? null,
|
|
240
|
-
expanded:
|
|
242
|
+
expanded: L,
|
|
241
243
|
onToggle: $,
|
|
242
|
-
onSelect:
|
|
243
|
-
onHover:
|
|
244
|
-
onLeave:
|
|
244
|
+
onSelect: X,
|
|
245
|
+
onHover: C,
|
|
246
|
+
onLeave: q
|
|
245
247
|
},
|
|
246
248
|
r.path
|
|
247
|
-
)) }), G = /* @__PURE__ */
|
|
249
|
+
)) }), G = /* @__PURE__ */ j("div", { className: "rfp-w-full rfp-h-full rfp-flex rfp-flex-col", children: [
|
|
248
250
|
!n && /* @__PURE__ */ e("div", { className: "rfp-flex-1 rfp-flex rfp-items-center rfp-justify-center rfp-text-fg-muted rfp-text-sm rfp-p-6", children: "从左侧选择一个文件以预览" }),
|
|
249
251
|
n && s && /* @__PURE__ */ e("div", { className: "rfp-flex-1 rfp-flex rfp-items-center rfp-justify-center", children: /* @__PURE__ */ e("div", { className: "rfp-w-8 rfp-h-8 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin" }) }),
|
|
250
|
-
n && !s &&
|
|
251
|
-
n && !s && !
|
|
252
|
+
n && !s && R && /* @__PURE__ */ e("div", { className: "rfp-flex-1 rfp-flex rfp-items-center rfp-justify-center rfp-text-fg-secondary", children: R }),
|
|
253
|
+
n && !s && !R && /* @__PURE__ */ e(O, { children: /* @__PURE__ */ e("div", { className: "rfp-flex-1 rfp-min-h-0 rfp-overflow-hidden rfp-flex rfp-relative rfp-z-0", children: /* @__PURE__ */ e(
|
|
252
254
|
Q,
|
|
253
255
|
{
|
|
254
256
|
fallback: /* @__PURE__ */ e("div", { className: "rfp-flex-1 rfp-flex rfp-items-center rfp-justify-center", children: /* @__PURE__ */ e("div", { className: "rfp-w-8 rfp-h-8 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin" }) }),
|
|
255
257
|
children: /* @__PURE__ */ e(
|
|
256
|
-
|
|
258
|
+
we,
|
|
257
259
|
{
|
|
258
260
|
mode: "embed",
|
|
259
261
|
files: [{ name: n.name, url: n.blobUrl, type: H(n.name) }],
|
|
@@ -264,11 +266,11 @@ const he = ({
|
|
|
264
266
|
}
|
|
265
267
|
) }) })
|
|
266
268
|
] });
|
|
267
|
-
return /* @__PURE__ */
|
|
269
|
+
return /* @__PURE__ */ j(O, { children: [
|
|
268
270
|
/* @__PURE__ */ e(
|
|
269
|
-
|
|
271
|
+
xe,
|
|
270
272
|
{
|
|
271
|
-
left:
|
|
273
|
+
left: Y,
|
|
272
274
|
right: G,
|
|
273
275
|
initialLeftWidth: 280,
|
|
274
276
|
minLeftWidth: 180,
|
|
@@ -294,6 +296,6 @@ const he = ({
|
|
|
294
296
|
] });
|
|
295
297
|
};
|
|
296
298
|
export {
|
|
297
|
-
|
|
299
|
+
ze as ZipRenderer
|
|
298
300
|
};
|
|
299
|
-
//# sourceMappingURL=index-
|
|
301
|
+
//# sourceMappingURL=index-nLTQXCV7.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-nLTQXCV7.mjs","sources":["../../src/components/ResizableSplit.tsx","../../src/renderers/Zip/index.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState, useCallback } from 'react';\n\nexport interface ResizableSplitProps {\n /** 左侧内容 */\n left: React.ReactNode;\n /** 右侧内容 */\n right: React.ReactNode;\n /** 左侧初始宽度(px);传入 storageKey 时会从 localStorage 读取 */\n initialLeftWidth?: number;\n /** 左侧最小宽度(px) */\n minLeftWidth?: number;\n /** 左侧最大宽度(px),同时不超过 `容器宽 - minRightWidth - 分隔线宽` */\n maxLeftWidth?: number;\n /** 右侧至少保留的宽度(px) */\n minRightWidth?: number;\n /** localStorage 持久化 key;不传则不持久化 */\n storageKey?: string;\n /** 启用横向拖动的媒体查询,默认 `(min-width: 768px)` */\n desktopMedia?: string;\n /** 容器额外类名 */\n className?: string;\n}\n\n/**\n * 通用可拖动分隔布局:\n * - 桌面端(由 `desktopMedia` 判定)横向分两栏,中间分隔线可左右拖动调整左栏宽度\n * - 移动端退化为上下堆叠,不显示分隔线\n * - 可选 `storageKey` 将宽度持久化到 localStorage\n */\nexport const ResizableSplit: React.FC<ResizableSplitProps> = ({\n left,\n right,\n initialLeftWidth = 280,\n minLeftWidth = 160,\n maxLeftWidth = 640,\n minRightWidth = 200,\n storageKey,\n desktopMedia = '(min-width: 768px)',\n className = '',\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [leftWidth, setLeftWidth] = useState<number>(() => {\n if (storageKey && typeof window !== 'undefined') {\n const saved = Number(window.localStorage.getItem(storageKey));\n if (!isNaN(saved) && saved > 0) return saved;\n }\n return initialLeftWidth;\n });\n const [dragging, setDragging] = useState(false);\n const [isDesktop, setIsDesktop] = useState(false);\n\n // 响应式:监听媒体查询\n useEffect(() => {\n if (typeof window === 'undefined') return;\n const mq = window.matchMedia(desktopMedia);\n const handler = () => setIsDesktop(mq.matches);\n handler();\n mq.addEventListener('change', handler);\n return () => mq.removeEventListener('change', handler);\n }, [desktopMedia]);\n\n // 拖动\n useEffect(() => {\n if (!dragging) return;\n const handleMove = (e: MouseEvent) => {\n if (!containerRef.current) return;\n const rect = containerRef.current.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const cap = rect.width - minRightWidth - 6;\n const effectiveMax = Math.min(maxLeftWidth, cap);\n const newW = Math.max(minLeftWidth, Math.min(effectiveMax, x));\n setLeftWidth(newW);\n };\n const handleUp = () => setDragging(false);\n window.addEventListener('mousemove', handleMove);\n window.addEventListener('mouseup', handleUp);\n const prevCursor = document.body.style.cursor;\n const prevSelect = document.body.style.userSelect;\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n return () => {\n window.removeEventListener('mousemove', handleMove);\n window.removeEventListener('mouseup', handleUp);\n document.body.style.cursor = prevCursor;\n document.body.style.userSelect = prevSelect;\n };\n }, [dragging, minLeftWidth, maxLeftWidth, minRightWidth]);\n\n // 持久化\n useEffect(() => {\n if (!storageKey || dragging) return;\n try {\n window.localStorage.setItem(storageKey, String(leftWidth));\n } catch {\n // ignore\n }\n }, [leftWidth, storageKey, dragging]);\n\n const handleDividerDown = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n setDragging(true);\n }, []);\n\n return (\n <div\n ref={containerRef}\n className={`rfp-w-full rfp-h-full rfp-flex rfp-flex-col md:rfp-flex-row rfp-min-h-0 rfp-min-w-0 ${className}`}\n >\n <div\n className=\"rfp-min-h-0 rfp-min-w-0 rfp-flex-shrink-0 rfp-w-full rfp-max-h-60 md:rfp-h-full md:rfp-max-h-none\"\n style={isDesktop ? { width: `${leftWidth}px` } : undefined}\n >\n {left}\n </div>\n {/* 分隔线:仅桌面显示 */}\n <div\n role=\"separator\"\n aria-orientation=\"vertical\"\n onMouseDown={handleDividerDown}\n className={`rfp-hidden md:rfp-block rfp-relative rfp-w-1.5 rfp-flex-shrink-0 rfp-cursor-col-resize rfp-transition-colors ${\n dragging ? 'rfp-bg-surface-toolbar' : 'rfp-bg-surface-2 hover:rfp-bg-surface-3'\n }`}\n >\n {/* 加宽命中区,改善拖动体验 */}\n <span className=\"rfp-absolute rfp-inset-y-0 -rfp-left-1 -rfp-right-1\" />\n </div>\n <div className=\"rfp-flex-1 rfp-min-w-0 rfp-min-h-0 rfp-overflow-hidden\">{right}</div>\n </div>\n );\n};\n","import { useState, useEffect, useMemo, useCallback, useRef, lazy, Suspense } from 'react';\nimport React from 'react';\nimport { createPortal } from 'react-dom';\nimport {\n Folder,\n FolderOpen,\n FileText,\n FileImage,\n FileCode,\n File as FileIcon,\n ChevronRight,\n} from 'lucide-react';\nimport { RendererError } from '../RendererError';\nimport type JSZip from 'jszip';\nimport {\n loadZip,\n listZipEntries,\n buildZipTree,\n readZipEntryBlob,\n formatFileSize,\n getFileType,\n inferMimeType,\n type ZipTreeNode,\n} from '@eternalheart/file-preview-core';\nimport { ResizableSplit } from '../../components/ResizableSplit';\nimport type { ZipToolbarStats } from './toolbar';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { useFetcher } from '../../RequestContext';\n\n// 懒加载 FilePreviewContent 以打破循环依赖\nconst LazyFilePreviewContent = lazy(() =>\n import('../../FilePreviewContent').then(m => ({ default: m.FilePreviewContent }))\n);\n\ninterface ZipRendererProps {\n url: string;\n /** ZIP 嵌套深度(由 FilePreviewContent 传入) */\n nestingDepth?: number;\n /** 解析完成后向外回报统计信息(files / dirs / size),供工具栏展示 */\n onStatsChange?: (stats: ZipToolbarStats | null) => void;\n}\n\ninterface SelectedPreview {\n path: string;\n name: string;\n size: number;\n blobUrl: string;\n}\n\n/** 根据文件类型返回树节点图标 */\nconst resolveIcon = (name: string) => {\n const ft = getFileType({ id: '', name, url: '', type: '' });\n if (ft === 'image') return FileImage;\n if (ft === 'text' || ft === 'markdown' || ft === 'json' || ft === 'csv' || ft === 'xml' || ft === 'subtitle') {\n return name.endsWith('.md') || name.endsWith('.markdown') ? FileText : FileCode;\n }\n return FileIcon;\n};\n\n// ---------- Tooltip via portal ----------\n\ninterface HoverTipState {\n text: string;\n x: number;\n y: number;\n}\n\n// ---------- Tree item ----------\n\ninterface TreeItemProps {\n node: ZipTreeNode;\n depth: number;\n selectedPath: string | null;\n expanded: Set<string>;\n onToggle: (path: string) => void;\n onSelect: (node: ZipTreeNode) => void;\n onHover: (text: string, rect: DOMRect) => void;\n onLeave: () => void;\n}\n\nconst TreeItem: React.FC<TreeItemProps> = ({\n node,\n depth,\n selectedPath,\n expanded,\n onToggle,\n onSelect,\n onHover,\n onLeave,\n}) => {\n const isOpen = expanded.has(node.path);\n const isSelected = selectedPath === node.path;\n const pad = { paddingLeft: `${depth * 14 + 10}px` };\n const handleEnter = (e: React.MouseEvent<HTMLElement>) => {\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n onHover(node.name || '/', rect);\n };\n\n if (node.isDir) {\n return (\n <>\n <button\n type=\"button\"\n onClick={() => onToggle(node.path)}\n onMouseEnter={handleEnter}\n onMouseLeave={onLeave}\n className=\"rfp-w-full rfp-flex rfp-items-center rfp-gap-1.5 rfp-py-1.5 rfp-pr-2 rfp-text-left rfp-text-fg-secondary hover:rfp-bg-surface-1 rfp-text-sm\"\n style={pad}\n >\n <ChevronRight\n className={`rfp-w-3.5 rfp-h-3.5 rfp-flex-shrink-0 rfp-transition-transform ${\n isOpen ? 'rfp-rotate-90' : ''\n }`}\n />\n {isOpen ? (\n <FolderOpen className=\"rfp-w-4 rfp-h-4 rfp-flex-shrink-0 rfp-text-amber-300/80\" />\n ) : (\n <Folder className=\"rfp-w-4 rfp-h-4 rfp-flex-shrink-0 rfp-text-amber-300/80\" />\n )}\n <span className=\"rfp-truncate rfp-flex-1 rfp-min-w-0\">{node.name || '/'}</span>\n </button>\n {isOpen &&\n node.children?.map((child) => (\n <TreeItem\n key={child.path}\n node={child}\n depth={depth + 1}\n selectedPath={selectedPath}\n expanded={expanded}\n onToggle={onToggle}\n onSelect={onSelect}\n onHover={onHover}\n onLeave={onLeave}\n />\n ))}\n </>\n );\n }\n\n const Icon = resolveIcon(node.name);\n\n return (\n <button\n type=\"button\"\n onClick={() => onSelect(node)}\n onMouseEnter={handleEnter}\n onMouseLeave={onLeave}\n className={`rfp-w-full rfp-flex rfp-items-center rfp-gap-1.5 rfp-py-1.5 rfp-pr-2 rfp-text-left rfp-text-sm ${\n isSelected ? 'rfp-bg-surface-2 rfp-text-fg-primary' : 'rfp-text-fg-secondary hover:rfp-bg-surface-1'\n }`}\n style={pad}\n >\n <span className=\"rfp-w-3.5 rfp-h-3.5 rfp-flex-shrink-0\" />\n <Icon className=\"rfp-w-4 rfp-h-4 rfp-flex-shrink-0 rfp-text-fg-tertiary\" />\n <span className=\"rfp-flex-1 rfp-truncate rfp-min-w-0\">{node.name}</span>\n <span className=\"rfp-text-xs rfp-text-fg-disabled rfp-flex-shrink-0 rfp-ml-2\">\n {formatFileSize(node.size)}\n </span>\n </button>\n );\n};\n\n// ---------- Main Zip Renderer ----------\n\nexport const ZipRenderer: React.FC<ZipRendererProps> = ({ url, nestingDepth = 0, onStatsChange }) => {\n const t = useTranslator();\n const fetcher = useFetcher();\n const [zip, setZip] = useState<JSZip | null>(null);\n const [tree, setTree] = useState<ZipTreeNode | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [expanded, setExpanded] = useState<Set<string>>(new Set(['']));\n const [selected, setSelected] = useState<SelectedPreview | null>(null);\n const [previewLoading, setPreviewLoading] = useState(false);\n const [previewError, setPreviewError] = useState<string | null>(null);\n const [hoverTip, setHoverTip] = useState<HoverTipState | null>(null);\n const onStatsChangeRef = useRef(onStatsChange);\n\n useEffect(() => {\n onStatsChangeRef.current = onStatsChange;\n }, [onStatsChange]);\n\n useEffect(() => {\n // 只有 URL 有效时才加载(避免空字符串或已 revoke 的 blob URL)\n if (!url) return;\n\n let cancelled = false;\n const load = async () => {\n try {\n setLoading(true);\n setError(null);\n const res = await fetcher(url);\n if (!res.ok) throw new Error('加载失败');\n const buf = await res.arrayBuffer();\n const z = await loadZip(buf);\n if (cancelled) return;\n const entries = listZipEntries(z);\n const root = buildZipTree(entries);\n setZip(z);\n setTree(root);\n const init = new Set<string>(['']);\n if (root.children) {\n for (const c of root.children) if (c.isDir) init.add(c.path);\n }\n setExpanded(init);\n } catch (err) {\n console.error(err);\n if (!cancelled) setError(t('zip.load_failed'));\n } finally {\n if (!cancelled) setLoading(false);\n }\n };\n load();\n return () => {\n cancelled = true;\n };\n }, [url]);\n\n // 切换文件时回收 blob URL\n useEffect(() => {\n return () => {\n if (selected?.blobUrl) URL.revokeObjectURL(selected.blobUrl);\n };\n }, [selected]);\n\n const totalStats = useMemo<ZipToolbarStats | null>(() => {\n if (!tree) return null;\n let files = 0;\n let dirs = 0;\n let size = 0;\n const walk = (n: ZipTreeNode) => {\n if (n.isDir) {\n if (n.path) dirs++;\n n.children?.forEach(walk);\n } else {\n files++;\n size += n.size;\n }\n };\n walk(tree);\n return { files, dirs, size };\n }, [tree]);\n\n // 向外回报 stats\n useEffect(() => {\n onStatsChangeRef.current?.(totalStats);\n return () => {\n onStatsChangeRef.current?.(null);\n };\n }, [totalStats]);\n\n const handleToggle = useCallback((path: string) => {\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(path)) next.delete(path);\n else next.add(path);\n return next;\n });\n }, []);\n\n const handleHover = useCallback((text: string, rect: DOMRect) => {\n setHoverTip({\n text,\n x: rect.right + 8,\n y: rect.top + rect.height / 2,\n });\n }, []);\n\n const handleLeave = useCallback(() => {\n setHoverTip(null);\n }, []);\n\n const handleSelect = useCallback(\n async (node: ZipTreeNode) => {\n if (!zip || node.isDir) return;\n if (selected?.blobUrl) URL.revokeObjectURL(selected.blobUrl);\n setPreviewLoading(true);\n setPreviewError(null);\n\n try {\n const mime = inferMimeType(node.name);\n const blob = await readZipEntryBlob(zip, node.path, mime !== 'application/octet-stream' ? mime : undefined);\n const blobUrl = URL.createObjectURL(blob);\n setSelected({ path: node.path, name: node.name, size: node.size, blobUrl });\n } catch (err) {\n console.error(err);\n setPreviewError('条目读取失败');\n } finally {\n setPreviewLoading(false);\n }\n },\n [zip, selected]\n );\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 || !tree) {\n return <RendererError message={error || t('zip.parse_failed')} />;\n }\n\n // 左侧:文件树\n const leftPane = (\n <div className=\"rfp-w-full rfp-h-full rfp-overflow-auto\">\n {tree.children?.map((child) => (\n <TreeItem\n key={child.path}\n node={child}\n depth={0}\n selectedPath={selected?.path ?? null}\n expanded={expanded}\n onToggle={handleToggle}\n onSelect={handleSelect}\n onHover={handleHover}\n onLeave={handleLeave}\n />\n ))}\n </div>\n );\n\n // 右侧:预览区\n const rightPane = (\n <div className=\"rfp-w-full rfp-h-full rfp-flex rfp-flex-col\">\n {!selected && (\n <div className=\"rfp-flex-1 rfp-flex rfp-items-center rfp-justify-center rfp-text-fg-muted rfp-text-sm rfp-p-6\">\n 从左侧选择一个文件以预览\n </div>\n )}\n {selected && previewLoading && (\n <div className=\"rfp-flex-1 rfp-flex rfp-items-center rfp-justify-center\">\n <div className=\"rfp-w-8 rfp-h-8 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n )}\n {selected && !previewLoading && previewError && (\n <div className=\"rfp-flex-1 rfp-flex rfp-items-center rfp-justify-center rfp-text-fg-secondary\">\n {previewError}\n </div>\n )}\n {selected && !previewLoading && !previewError && (\n <>\n <div className=\"rfp-flex-1 rfp-min-h-0 rfp-overflow-hidden rfp-flex rfp-relative rfp-z-0\">\n <Suspense\n fallback={\n <div className=\"rfp-flex-1 rfp-flex rfp-items-center rfp-justify-center\">\n <div className=\"rfp-w-8 rfp-h-8 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n }\n >\n <LazyFilePreviewContent\n mode=\"embed\"\n files={[{ name: selected.name, url: selected.blobUrl, type: inferMimeType(selected.name) }]}\n currentIndex={0}\n zipNestingDepth={nestingDepth + 1}\n />\n </Suspense>\n </div>\n </>\n )}\n </div>\n );\n\n return (\n <>\n <ResizableSplit\n left={leftPane}\n right={rightPane}\n initialLeftWidth={280}\n minLeftWidth={180}\n maxLeftWidth={560}\n storageKey=\"rfp-zip-split-left\"\n />\n {/* 文件名 hover tooltip(portal 到 body,避免被滚动区裁剪) */}\n {hoverTip &&\n typeof document !== 'undefined' &&\n createPortal(\n <div\n className=\"rfp-fixed rfp-z-[9999] rfp-pointer-events-none rfp-px-2 rfp-py-1 rfp-bg-[rgba(0,0,0,0.85)] rfp-text-fg-primary rfp-text-xs rfp-rounded rfp-whitespace-nowrap rfp-shadow-lg\"\n style={{\n left: `${hoverTip.x}px`,\n top: `${hoverTip.y}px`,\n transform: 'translateY(-50%)',\n }}\n >\n {hoverTip.text}\n </div>,\n document.body\n )}\n </>\n );\n};\n"],"names":["ResizableSplit","left","right","initialLeftWidth","minLeftWidth","maxLeftWidth","minRightWidth","storageKey","desktopMedia","className","containerRef","useRef","leftWidth","setLeftWidth","useState","saved","dragging","setDragging","isDesktop","setIsDesktop","useEffect","mq","handler","handleMove","e","rect","cap","effectiveMax","newW","handleUp","prevCursor","prevSelect","handleDividerDown","useCallback","jsxs","jsx","LazyFilePreviewContent","lazy","n","m","resolveIcon","name","ft","getFileType","FileImage","FileText","FileCode","FileIcon","TreeItem","node","depth","selectedPath","expanded","onToggle","onSelect","onHover","onLeave","isOpen","isSelected","pad","handleEnter","Fragment","ChevronRight","FolderOpen","Folder","_a","child","Icon","formatFileSize","ZipRenderer","url","nestingDepth","onStatsChange","t","useTranslator","fetcher","useFetcher","zip","setZip","tree","setTree","loading","setLoading","error","setError","setExpanded","selected","setSelected","previewLoading","setPreviewLoading","previewError","setPreviewError","hoverTip","setHoverTip","onStatsChangeRef","cancelled","res","buf","z","loadZip","entries","listZipEntries","root","buildZipTree","init","c","err","totalStats","useMemo","files","dirs","size","walk","handleToggle","path","prev","next","handleHover","text","handleLeave","handleSelect","mime","inferMimeType","blob","readZipEntryBlob","blobUrl","RendererError","leftPane","rightPane","Suspense","createPortal"],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { jsx as r } from "react/jsx-runtime";
|
|
2
|
+
import { useState as s, useEffect as b } from "react";
|
|
3
|
+
import { u as x, a as y, y as v, E } from "./index-CuAALtwC.mjs";
|
|
4
|
+
import { u as N } from "./useShikiHighlight-ClbUXJ2p.mjs";
|
|
5
|
+
import { R as T } from "./RendererError-BH6fzLrN.mjs";
|
|
6
|
+
const C = ({
|
|
7
|
+
url: l,
|
|
8
|
+
fileName: f,
|
|
9
|
+
wordWrap: n = !0,
|
|
10
|
+
htmlPreview: m = !1
|
|
11
|
+
}) => {
|
|
12
|
+
const d = x(), h = y(), [o, g] = s(""), [w, a] = s(!0), [p, i] = s(null), e = v(f), { html: c } = N(
|
|
13
|
+
e !== "text" ? o : "",
|
|
14
|
+
e
|
|
15
|
+
);
|
|
16
|
+
return b(() => {
|
|
17
|
+
const u = new AbortController();
|
|
18
|
+
return (async () => {
|
|
19
|
+
try {
|
|
20
|
+
a(!0), i(null);
|
|
21
|
+
const t = await E(l, { fetcher: h, signal: u.signal });
|
|
22
|
+
g(t);
|
|
23
|
+
} catch (t) {
|
|
24
|
+
if (t.name === "AbortError") return;
|
|
25
|
+
i(d("text.load_failed")), console.error(t);
|
|
26
|
+
} finally {
|
|
27
|
+
a(!1);
|
|
28
|
+
}
|
|
29
|
+
})(), () => u.abort();
|
|
30
|
+
}, [l]), w ? /* @__PURE__ */ r("div", { className: "rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full", children: /* @__PURE__ */ r("div", { className: "rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin" }) }) : p ? /* @__PURE__ */ r(T, { message: p }) : m && e === "html" ? /* @__PURE__ */ r("div", { className: "rfp-w-full rfp-h-full rfp-bg-surface-toolbar", children: /* @__PURE__ */ r(
|
|
31
|
+
"iframe",
|
|
32
|
+
{
|
|
33
|
+
srcDoc: o,
|
|
34
|
+
sandbox: "allow-same-origin",
|
|
35
|
+
className: "rfp-w-full rfp-h-full rfp-border-0",
|
|
36
|
+
title: f
|
|
37
|
+
}
|
|
38
|
+
) }) : /* @__PURE__ */ r("div", { className: "rfp-w-full rfp-h-full rfp-overflow-auto rfp-bg-code-bg", children: e === "text" || !c ? /* @__PURE__ */ r(
|
|
39
|
+
"pre",
|
|
40
|
+
{
|
|
41
|
+
className: `rfp-p-6 rfp-text-fg-primary rfp-font-mono rfp-text-sm ${n ? "rfp-whitespace-pre-wrap rfp-break-words" : "rfp-whitespace-pre"}`,
|
|
42
|
+
children: o
|
|
43
|
+
}
|
|
44
|
+
) : /* @__PURE__ */ r(
|
|
45
|
+
"div",
|
|
46
|
+
{
|
|
47
|
+
className: `rfp-shiki-wrapper with-line-numbers ${n ? "" : "no-wrap"}`,
|
|
48
|
+
dangerouslySetInnerHTML: { __html: c }
|
|
49
|
+
}
|
|
50
|
+
) });
|
|
51
|
+
};
|
|
52
|
+
export {
|
|
53
|
+
C as TextRenderer
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=index-nVblatyi.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-nVblatyi.mjs","sources":["../../src/renderers/Text/index.tsx"],"sourcesContent":["import { useState, useEffect } from 'react';\nimport { fetchTextUtf8, getLanguageFromFileName } from '@eternalheart/file-preview-core';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { useFetcher } from '../../RequestContext';\nimport { useShikiHighlight } from '../../hooks/useShikiHighlight';\nimport { RendererError } from '../RendererError';\n\ninterface TextRendererProps {\n url: string;\n fileName: string;\n wordWrap?: boolean;\n htmlPreview?: boolean;\n}\n\nexport const TextRenderer: React.FC<TextRendererProps> = ({\n url,\n fileName,\n wordWrap = true,\n htmlPreview = false,\n}) => {\n const t = useTranslator();\n const fetcher = useFetcher();\n const [content, setContent] = useState<string>('');\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const language = getLanguageFromFileName(fileName);\n const { html: highlighted } = useShikiHighlight(\n language !== 'text' ? content : '',\n language,\n );\n\n useEffect(() => {\n const controller = new AbortController();\n const loadText = async () => {\n try {\n setLoading(true);\n setError(null);\n const text = await fetchTextUtf8(url, { fetcher, signal: controller.signal });\n setContent(text);\n } catch (err: any) {\n if (err.name === 'AbortError') return;\n setError(t('text.load_failed'));\n console.error(err);\n } finally {\n setLoading(false);\n }\n };\n\n loadText();\n return () => controller.abort();\n }, [url]);\n\n if (loading) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n );\n }\n\n if (error) {\n return <RendererError message={error} />;\n }\n\n // HTML 预览模式\n if (htmlPreview && (language === 'html')) {\n return (\n <div className=\"rfp-w-full rfp-h-full rfp-bg-surface-toolbar\">\n <iframe\n srcDoc={content}\n sandbox=\"allow-same-origin\"\n className=\"rfp-w-full rfp-h-full rfp-border-0\"\n title={fileName}\n />\n </div>\n );\n }\n\n // 源码模式\n return (\n <div className=\"rfp-w-full rfp-h-full rfp-overflow-auto rfp-bg-code-bg\">\n {language === 'text' || !highlighted ? (\n <pre\n className={`rfp-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","fetcher","useFetcher","content","setContent","useState","loading","setLoading","error","setError","language","getLanguageFromFileName","highlighted","useShikiHighlight","useEffect","controller","text","fetchTextUtf8","err","jsx","RendererError"],"mappings":";;;;;AAcO,MAAMA,IAA4C,CAAC;AAAA,EACxD,KAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,aAAAC,IAAc;AAChB,MAAM;AACJ,QAAMC,IAAIC,EAAA,GACJC,IAAUC,EAAA,GACV,CAACC,GAASC,CAAU,IAAIC,EAAiB,EAAE,GAC3C,CAACC,GAASC,CAAU,IAAIF,EAAS,EAAI,GACrC,CAACG,GAAOC,CAAQ,IAAIJ,EAAwB,IAAI,GAChDK,IAAWC,EAAwBf,CAAQ,GAC3C,EAAE,MAAMgB,EAAA,IAAgBC;AAAA,IAC5BH,MAAa,SAASP,IAAU;AAAA,IAChCO;AAAA,EAAA;AAwBF,SArBAI,EAAU,MAAM;AACd,UAAMC,IAAa,IAAI,gBAAA;AAgBvB,YAfiB,YAAY;AAC3B,UAAI;AACF,QAAAR,EAAW,EAAI,GACfE,EAAS,IAAI;AACb,cAAMO,IAAO,MAAMC,EAActB,GAAK,EAAE,SAAAM,GAAS,QAAQc,EAAW,QAAQ;AAC5E,QAAAX,EAAWY,CAAI;AAAA,MACjB,SAASE,GAAU;AACjB,YAAIA,EAAI,SAAS,aAAc;AAC/B,QAAAT,EAASV,EAAE,kBAAkB,CAAC,GAC9B,QAAQ,MAAMmB,CAAG;AAAA,MACnB,UAAA;AACE,QAAAX,EAAW,EAAK;AAAA,MAClB;AAAA,IACF,GAEA,GACO,MAAMQ,EAAW,MAAA;AAAA,EAC1B,GAAG,CAACpB,CAAG,CAAC,GAEJW,IAEA,gBAAAa,EAAC,SAAI,WAAU,sEACb,4BAAC,OAAA,EAAI,WAAU,qHAAoH,EAAA,CACrI,IAIAX,IACK,gBAAAW,EAACC,GAAA,EAAc,SAASZ,EAAA,CAAO,IAIpCV,KAAgBY,MAAa,SAE7B,gBAAAS,EAAC,OAAA,EAAI,WAAU,gDACb,UAAA,gBAAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,QAAQhB;AAAA,MACR,SAAQ;AAAA,MACR,WAAU;AAAA,MACV,OAAOP;AAAA,IAAA;AAAA,EAAA,GAEX,sBAMD,OAAA,EAAI,WAAU,0DACZ,UAAAc,MAAa,UAAU,CAACE,IACvB,gBAAAO;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,yDACTtB,IAAW,4CAA4C,oBACzD;AAAA,MAEC,UAAAM;AAAA,IAAA;AAAA,EAAA,IAGH,gBAAAgB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,uCAAuCtB,IAAW,KAAK,SAAS;AAAA,MAC3E,yBAAyB,EAAE,QAAQe,EAAA;AAAA,IAAY;AAAA,EAAA,GAGrD;AAEJ;"}
|