@eternalheart/react-file-preview 1.3.11 → 1.3.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. package/README.md +27 -0
  2. package/README.zh-CN.md +27 -0
  3. package/lib/chunks/{index-nVblatyi.mjs → index-8pqs-pW7.mjs} +3 -3
  4. package/lib/chunks/{index-nVblatyi.mjs.map → index-8pqs-pW7.mjs.map} +1 -1
  5. package/lib/chunks/{index-CCkHAeLh.mjs → index-B0QA380T.mjs} +2 -2
  6. package/lib/chunks/{index-CCkHAeLh.mjs.map → index-B0QA380T.mjs.map} +1 -1
  7. package/lib/chunks/{index-D660ENHx.mjs → index-B2IlXQPc.mjs} +2 -2
  8. package/lib/chunks/{index-D660ENHx.mjs.map → index-B2IlXQPc.mjs.map} +1 -1
  9. package/lib/chunks/{index-BiyghBxu.mjs → index-BgMhDDkd.mjs} +2 -2
  10. package/lib/chunks/{index-BiyghBxu.mjs.map → index-BgMhDDkd.mjs.map} +1 -1
  11. package/lib/chunks/{index-BYdqrqnR.mjs → index-BvjPzMFc.mjs} +2 -2
  12. package/lib/chunks/{index-BYdqrqnR.mjs.map → index-BvjPzMFc.mjs.map} +1 -1
  13. package/lib/chunks/{index-B57rEPin.mjs → index-C8r2-Evl.mjs} +3 -3
  14. package/lib/chunks/{index-B57rEPin.mjs.map → index-C8r2-Evl.mjs.map} +1 -1
  15. package/lib/chunks/{index-CdmkF0CO.mjs → index-CIqtwqgy.mjs} +2 -2
  16. package/lib/chunks/{index-CdmkF0CO.mjs.map → index-CIqtwqgy.mjs.map} +1 -1
  17. package/lib/chunks/{index-C8CyS_sj.mjs → index-CRn7LdHD.mjs} +3 -3
  18. package/lib/chunks/{index-C8CyS_sj.mjs.map → index-CRn7LdHD.mjs.map} +1 -1
  19. package/lib/chunks/{index-CuAALtwC.mjs → index-CWCNvV2X.mjs} +500 -476
  20. package/lib/chunks/index-CWCNvV2X.mjs.map +1 -0
  21. package/lib/chunks/{index-BJ6vTNxc.mjs → index-Ctf8mG_u.mjs} +2 -2
  22. package/lib/chunks/{index-BJ6vTNxc.mjs.map → index-Ctf8mG_u.mjs.map} +1 -1
  23. package/lib/chunks/{index-DBEG73K1.mjs → index-DN4Lc1dx.mjs} +2 -2
  24. package/lib/chunks/{index-DBEG73K1.mjs.map → index-DN4Lc1dx.mjs.map} +1 -1
  25. package/lib/chunks/{index-rUfsiVR8.mjs → index-DYNPnFww.mjs} +2 -2
  26. package/lib/chunks/{index-rUfsiVR8.mjs.map → index-DYNPnFww.mjs.map} +1 -1
  27. package/lib/chunks/{index-qOC5xQyK.mjs → index-DZxzCMp2.mjs} +2 -2
  28. package/lib/chunks/{index-qOC5xQyK.mjs.map → index-DZxzCMp2.mjs.map} +1 -1
  29. package/lib/chunks/index-DfkP0zX3.mjs +357 -0
  30. package/lib/chunks/index-DfkP0zX3.mjs.map +1 -0
  31. package/lib/chunks/{index-DaFlk9dd.mjs → index-DqXfw2eb.mjs} +2 -2
  32. package/lib/chunks/{index-DaFlk9dd.mjs.map → index-DqXfw2eb.mjs.map} +1 -1
  33. package/lib/chunks/index-DtZwBUd0.mjs +270 -0
  34. package/lib/chunks/index-DtZwBUd0.mjs.map +1 -0
  35. package/lib/chunks/{index-C8OrFLd5.mjs → index-_EpQHlUY.mjs} +2 -2
  36. package/lib/chunks/{index-C8OrFLd5.mjs.map → index-_EpQHlUY.mjs.map} +1 -1
  37. package/lib/chunks/{index-ow-nGpuu.mjs → index-p4mew8Hx.mjs} +2 -2
  38. package/lib/chunks/{index-ow-nGpuu.mjs.map → index-p4mew8Hx.mjs.map} +1 -1
  39. package/lib/chunks/{index-_mP0FkqE.mjs → index-sft0uUd7.mjs} +2 -2
  40. package/lib/chunks/{index-_mP0FkqE.mjs.map → index-sft0uUd7.mjs.map} +1 -1
  41. package/lib/chunks/{useShikiHighlight-ClbUXJ2p.mjs → useShikiHighlight-CDDi36pF.mjs} +2 -2
  42. package/lib/chunks/{useShikiHighlight-ClbUXJ2p.mjs.map → useShikiHighlight-CDDi36pF.mjs.map} +1 -1
  43. package/lib/components/ResizableSplit.d.ts +12 -2
  44. package/lib/components/ResizableSplit.d.ts.map +1 -1
  45. package/lib/index.cjs +29 -29
  46. package/lib/index.cjs.map +1 -1
  47. package/lib/index.css +1 -1
  48. package/lib/index.mjs +1 -1
  49. package/lib/renderers/Image/index.d.ts.map +1 -1
  50. package/lib/renderers/Zip/index.d.ts.map +1 -1
  51. package/package.json +1 -1
  52. package/lib/chunks/index-BCuRRLYt.mjs +0 -222
  53. package/lib/chunks/index-BCuRRLYt.mjs.map +0 -1
  54. package/lib/chunks/index-CuAALtwC.mjs.map +0 -1
  55. package/lib/chunks/index-nLTQXCV7.mjs +0 -301
  56. package/lib/chunks/index-nLTQXCV7.mjs.map +0 -1
  57. package/lib/pdfjs/cmaps/78-EUC-H.bcmap +0 -0
  58. package/lib/pdfjs/cmaps/78-EUC-V.bcmap +0 -0
  59. package/lib/pdfjs/cmaps/78-H.bcmap +0 -0
  60. package/lib/pdfjs/cmaps/78-RKSJ-H.bcmap +0 -0
  61. package/lib/pdfjs/cmaps/78-RKSJ-V.bcmap +0 -0
  62. package/lib/pdfjs/cmaps/78-V.bcmap +0 -0
  63. package/lib/pdfjs/cmaps/78ms-RKSJ-H.bcmap +0 -0
  64. package/lib/pdfjs/cmaps/78ms-RKSJ-V.bcmap +0 -0
  65. package/lib/pdfjs/cmaps/83pv-RKSJ-H.bcmap +0 -0
  66. package/lib/pdfjs/cmaps/90ms-RKSJ-H.bcmap +0 -0
  67. package/lib/pdfjs/cmaps/90ms-RKSJ-V.bcmap +0 -0
  68. package/lib/pdfjs/cmaps/90msp-RKSJ-H.bcmap +0 -0
  69. package/lib/pdfjs/cmaps/90msp-RKSJ-V.bcmap +0 -0
  70. package/lib/pdfjs/cmaps/90pv-RKSJ-H.bcmap +0 -0
  71. package/lib/pdfjs/cmaps/90pv-RKSJ-V.bcmap +0 -0
  72. package/lib/pdfjs/cmaps/Add-H.bcmap +0 -0
  73. package/lib/pdfjs/cmaps/Add-RKSJ-H.bcmap +0 -0
  74. package/lib/pdfjs/cmaps/Add-RKSJ-V.bcmap +0 -0
  75. package/lib/pdfjs/cmaps/Add-V.bcmap +0 -0
  76. package/lib/pdfjs/cmaps/Adobe-CNS1-0.bcmap +0 -0
  77. package/lib/pdfjs/cmaps/Adobe-CNS1-1.bcmap +0 -0
  78. package/lib/pdfjs/cmaps/Adobe-CNS1-2.bcmap +0 -0
  79. package/lib/pdfjs/cmaps/Adobe-CNS1-3.bcmap +0 -0
  80. package/lib/pdfjs/cmaps/Adobe-CNS1-4.bcmap +0 -0
  81. package/lib/pdfjs/cmaps/Adobe-CNS1-5.bcmap +0 -0
  82. package/lib/pdfjs/cmaps/Adobe-CNS1-6.bcmap +0 -0
  83. package/lib/pdfjs/cmaps/Adobe-CNS1-UCS2.bcmap +0 -0
  84. package/lib/pdfjs/cmaps/Adobe-GB1-0.bcmap +0 -0
  85. package/lib/pdfjs/cmaps/Adobe-GB1-1.bcmap +0 -0
  86. package/lib/pdfjs/cmaps/Adobe-GB1-2.bcmap +0 -0
  87. package/lib/pdfjs/cmaps/Adobe-GB1-3.bcmap +0 -0
  88. package/lib/pdfjs/cmaps/Adobe-GB1-4.bcmap +0 -0
  89. package/lib/pdfjs/cmaps/Adobe-GB1-5.bcmap +0 -0
  90. package/lib/pdfjs/cmaps/Adobe-GB1-UCS2.bcmap +0 -0
  91. package/lib/pdfjs/cmaps/Adobe-Japan1-0.bcmap +0 -0
  92. package/lib/pdfjs/cmaps/Adobe-Japan1-1.bcmap +0 -0
  93. package/lib/pdfjs/cmaps/Adobe-Japan1-2.bcmap +0 -0
  94. package/lib/pdfjs/cmaps/Adobe-Japan1-3.bcmap +0 -0
  95. package/lib/pdfjs/cmaps/Adobe-Japan1-4.bcmap +0 -0
  96. package/lib/pdfjs/cmaps/Adobe-Japan1-5.bcmap +0 -0
  97. package/lib/pdfjs/cmaps/Adobe-Japan1-6.bcmap +0 -0
  98. package/lib/pdfjs/cmaps/Adobe-Japan1-UCS2.bcmap +0 -0
  99. package/lib/pdfjs/cmaps/Adobe-Korea1-0.bcmap +0 -0
  100. package/lib/pdfjs/cmaps/Adobe-Korea1-1.bcmap +0 -0
  101. package/lib/pdfjs/cmaps/Adobe-Korea1-2.bcmap +0 -0
  102. package/lib/pdfjs/cmaps/Adobe-Korea1-UCS2.bcmap +0 -0
  103. package/lib/pdfjs/cmaps/B5-H.bcmap +0 -0
  104. package/lib/pdfjs/cmaps/B5-V.bcmap +0 -0
  105. package/lib/pdfjs/cmaps/B5pc-H.bcmap +0 -0
  106. package/lib/pdfjs/cmaps/B5pc-V.bcmap +0 -0
  107. package/lib/pdfjs/cmaps/CNS-EUC-H.bcmap +0 -0
  108. package/lib/pdfjs/cmaps/CNS-EUC-V.bcmap +0 -0
  109. package/lib/pdfjs/cmaps/CNS1-H.bcmap +0 -0
  110. package/lib/pdfjs/cmaps/CNS1-V.bcmap +0 -0
  111. package/lib/pdfjs/cmaps/CNS2-H.bcmap +0 -0
  112. package/lib/pdfjs/cmaps/CNS2-V.bcmap +0 -3
  113. package/lib/pdfjs/cmaps/ETHK-B5-H.bcmap +0 -0
  114. package/lib/pdfjs/cmaps/ETHK-B5-V.bcmap +0 -0
  115. package/lib/pdfjs/cmaps/ETen-B5-H.bcmap +0 -0
  116. package/lib/pdfjs/cmaps/ETen-B5-V.bcmap +0 -0
  117. package/lib/pdfjs/cmaps/ETenms-B5-H.bcmap +0 -3
  118. package/lib/pdfjs/cmaps/ETenms-B5-V.bcmap +0 -0
  119. package/lib/pdfjs/cmaps/EUC-H.bcmap +0 -0
  120. package/lib/pdfjs/cmaps/EUC-V.bcmap +0 -0
  121. package/lib/pdfjs/cmaps/Ext-H.bcmap +0 -0
  122. package/lib/pdfjs/cmaps/Ext-RKSJ-H.bcmap +0 -0
  123. package/lib/pdfjs/cmaps/Ext-RKSJ-V.bcmap +0 -0
  124. package/lib/pdfjs/cmaps/Ext-V.bcmap +0 -0
  125. package/lib/pdfjs/cmaps/GB-EUC-H.bcmap +0 -0
  126. package/lib/pdfjs/cmaps/GB-EUC-V.bcmap +0 -0
  127. package/lib/pdfjs/cmaps/GB-H.bcmap +0 -4
  128. package/lib/pdfjs/cmaps/GB-V.bcmap +0 -0
  129. package/lib/pdfjs/cmaps/GBK-EUC-H.bcmap +0 -0
  130. package/lib/pdfjs/cmaps/GBK-EUC-V.bcmap +0 -0
  131. package/lib/pdfjs/cmaps/GBK2K-H.bcmap +0 -0
  132. package/lib/pdfjs/cmaps/GBK2K-V.bcmap +0 -0
  133. package/lib/pdfjs/cmaps/GBKp-EUC-H.bcmap +0 -0
  134. package/lib/pdfjs/cmaps/GBKp-EUC-V.bcmap +0 -0
  135. package/lib/pdfjs/cmaps/GBT-EUC-H.bcmap +0 -0
  136. package/lib/pdfjs/cmaps/GBT-EUC-V.bcmap +0 -0
  137. package/lib/pdfjs/cmaps/GBT-H.bcmap +0 -0
  138. package/lib/pdfjs/cmaps/GBT-V.bcmap +0 -0
  139. package/lib/pdfjs/cmaps/GBTpc-EUC-H.bcmap +0 -0
  140. package/lib/pdfjs/cmaps/GBTpc-EUC-V.bcmap +0 -0
  141. package/lib/pdfjs/cmaps/GBpc-EUC-H.bcmap +0 -0
  142. package/lib/pdfjs/cmaps/GBpc-EUC-V.bcmap +0 -0
  143. package/lib/pdfjs/cmaps/H.bcmap +0 -0
  144. package/lib/pdfjs/cmaps/HKdla-B5-H.bcmap +0 -0
  145. package/lib/pdfjs/cmaps/HKdla-B5-V.bcmap +0 -0
  146. package/lib/pdfjs/cmaps/HKdlb-B5-H.bcmap +0 -0
  147. package/lib/pdfjs/cmaps/HKdlb-B5-V.bcmap +0 -0
  148. package/lib/pdfjs/cmaps/HKgccs-B5-H.bcmap +0 -0
  149. package/lib/pdfjs/cmaps/HKgccs-B5-V.bcmap +0 -0
  150. package/lib/pdfjs/cmaps/HKm314-B5-H.bcmap +0 -0
  151. package/lib/pdfjs/cmaps/HKm314-B5-V.bcmap +0 -0
  152. package/lib/pdfjs/cmaps/HKm471-B5-H.bcmap +0 -0
  153. package/lib/pdfjs/cmaps/HKm471-B5-V.bcmap +0 -0
  154. package/lib/pdfjs/cmaps/HKscs-B5-H.bcmap +0 -0
  155. package/lib/pdfjs/cmaps/HKscs-B5-V.bcmap +0 -0
  156. package/lib/pdfjs/cmaps/Hankaku.bcmap +0 -0
  157. package/lib/pdfjs/cmaps/Hiragana.bcmap +0 -0
  158. package/lib/pdfjs/cmaps/KSC-EUC-H.bcmap +0 -0
  159. package/lib/pdfjs/cmaps/KSC-EUC-V.bcmap +0 -0
  160. package/lib/pdfjs/cmaps/KSC-H.bcmap +0 -0
  161. package/lib/pdfjs/cmaps/KSC-Johab-H.bcmap +0 -0
  162. package/lib/pdfjs/cmaps/KSC-Johab-V.bcmap +0 -0
  163. package/lib/pdfjs/cmaps/KSC-V.bcmap +0 -0
  164. package/lib/pdfjs/cmaps/KSCms-UHC-H.bcmap +0 -0
  165. package/lib/pdfjs/cmaps/KSCms-UHC-HW-H.bcmap +0 -0
  166. package/lib/pdfjs/cmaps/KSCms-UHC-HW-V.bcmap +0 -0
  167. package/lib/pdfjs/cmaps/KSCms-UHC-V.bcmap +0 -0
  168. package/lib/pdfjs/cmaps/KSCpc-EUC-H.bcmap +0 -0
  169. package/lib/pdfjs/cmaps/KSCpc-EUC-V.bcmap +0 -0
  170. package/lib/pdfjs/cmaps/Katakana.bcmap +0 -0
  171. package/lib/pdfjs/cmaps/LICENSE +0 -36
  172. package/lib/pdfjs/cmaps/NWP-H.bcmap +0 -0
  173. package/lib/pdfjs/cmaps/NWP-V.bcmap +0 -0
  174. package/lib/pdfjs/cmaps/RKSJ-H.bcmap +0 -0
  175. package/lib/pdfjs/cmaps/RKSJ-V.bcmap +0 -0
  176. package/lib/pdfjs/cmaps/Roman.bcmap +0 -0
  177. package/lib/pdfjs/cmaps/UniCNS-UCS2-H.bcmap +0 -0
  178. package/lib/pdfjs/cmaps/UniCNS-UCS2-V.bcmap +0 -0
  179. package/lib/pdfjs/cmaps/UniCNS-UTF16-H.bcmap +0 -0
  180. package/lib/pdfjs/cmaps/UniCNS-UTF16-V.bcmap +0 -0
  181. package/lib/pdfjs/cmaps/UniCNS-UTF32-H.bcmap +0 -0
  182. package/lib/pdfjs/cmaps/UniCNS-UTF32-V.bcmap +0 -0
  183. package/lib/pdfjs/cmaps/UniCNS-UTF8-H.bcmap +0 -0
  184. package/lib/pdfjs/cmaps/UniCNS-UTF8-V.bcmap +0 -0
  185. package/lib/pdfjs/cmaps/UniGB-UCS2-H.bcmap +0 -0
  186. package/lib/pdfjs/cmaps/UniGB-UCS2-V.bcmap +0 -0
  187. package/lib/pdfjs/cmaps/UniGB-UTF16-H.bcmap +0 -0
  188. package/lib/pdfjs/cmaps/UniGB-UTF16-V.bcmap +0 -0
  189. package/lib/pdfjs/cmaps/UniGB-UTF32-H.bcmap +0 -0
  190. package/lib/pdfjs/cmaps/UniGB-UTF32-V.bcmap +0 -0
  191. package/lib/pdfjs/cmaps/UniGB-UTF8-H.bcmap +0 -0
  192. package/lib/pdfjs/cmaps/UniGB-UTF8-V.bcmap +0 -0
  193. package/lib/pdfjs/cmaps/UniJIS-UCS2-H.bcmap +0 -0
  194. package/lib/pdfjs/cmaps/UniJIS-UCS2-HW-H.bcmap +0 -0
  195. package/lib/pdfjs/cmaps/UniJIS-UCS2-HW-V.bcmap +0 -0
  196. package/lib/pdfjs/cmaps/UniJIS-UCS2-V.bcmap +0 -0
  197. package/lib/pdfjs/cmaps/UniJIS-UTF16-H.bcmap +0 -0
  198. package/lib/pdfjs/cmaps/UniJIS-UTF16-V.bcmap +0 -0
  199. package/lib/pdfjs/cmaps/UniJIS-UTF32-H.bcmap +0 -0
  200. package/lib/pdfjs/cmaps/UniJIS-UTF32-V.bcmap +0 -0
  201. package/lib/pdfjs/cmaps/UniJIS-UTF8-H.bcmap +0 -0
  202. package/lib/pdfjs/cmaps/UniJIS-UTF8-V.bcmap +0 -0
  203. package/lib/pdfjs/cmaps/UniJIS2004-UTF16-H.bcmap +0 -0
  204. package/lib/pdfjs/cmaps/UniJIS2004-UTF16-V.bcmap +0 -0
  205. package/lib/pdfjs/cmaps/UniJIS2004-UTF32-H.bcmap +0 -0
  206. package/lib/pdfjs/cmaps/UniJIS2004-UTF32-V.bcmap +0 -0
  207. package/lib/pdfjs/cmaps/UniJIS2004-UTF8-H.bcmap +0 -0
  208. package/lib/pdfjs/cmaps/UniJIS2004-UTF8-V.bcmap +0 -0
  209. package/lib/pdfjs/cmaps/UniJISPro-UCS2-HW-V.bcmap +0 -0
  210. package/lib/pdfjs/cmaps/UniJISPro-UCS2-V.bcmap +0 -0
  211. package/lib/pdfjs/cmaps/UniJISPro-UTF8-V.bcmap +0 -0
  212. package/lib/pdfjs/cmaps/UniJISX0213-UTF32-H.bcmap +0 -0
  213. package/lib/pdfjs/cmaps/UniJISX0213-UTF32-V.bcmap +0 -0
  214. package/lib/pdfjs/cmaps/UniJISX02132004-UTF32-H.bcmap +0 -0
  215. package/lib/pdfjs/cmaps/UniJISX02132004-UTF32-V.bcmap +0 -0
  216. package/lib/pdfjs/cmaps/UniKS-UCS2-H.bcmap +0 -0
  217. package/lib/pdfjs/cmaps/UniKS-UCS2-V.bcmap +0 -0
  218. package/lib/pdfjs/cmaps/UniKS-UTF16-H.bcmap +0 -0
  219. package/lib/pdfjs/cmaps/UniKS-UTF16-V.bcmap +0 -0
  220. package/lib/pdfjs/cmaps/UniKS-UTF32-H.bcmap +0 -0
  221. package/lib/pdfjs/cmaps/UniKS-UTF32-V.bcmap +0 -0
  222. package/lib/pdfjs/cmaps/UniKS-UTF8-H.bcmap +0 -0
  223. package/lib/pdfjs/cmaps/UniKS-UTF8-V.bcmap +0 -0
  224. package/lib/pdfjs/cmaps/V.bcmap +0 -0
  225. package/lib/pdfjs/cmaps/WP-Symbol.bcmap +0 -0
  226. package/lib/pdfjs/pdf.worker.min.mjs +0 -21
@@ -2,7 +2,7 @@ import { jsxs as T, jsx as o } from "react/jsx-runtime";
2
2
  import { useState as M, useRef as c, useCallback as y, useEffect as C } from "react";
3
3
  import z from "x-data-spreadsheet";
4
4
  /* empty css */
5
- import { u as N, a as j, E as H, S as W, M as k, U as A } from "./index-CuAALtwC.mjs";
5
+ import { u as N, a as j, E as H, S as W, M as k, U as A } from "./index-CWCNvV2X.mjs";
6
6
  import { R as L } from "./RendererError-BH6fzLrN.mjs";
7
7
  const V = ({ url: v, fileName: h }) => {
8
8
  const R = N(), E = j(), [m, w] = M(!0), [b, D] = M(null), r = c(null), g = c(null), a = c(null), u = c(null), f = c(null), x = c({ width: 0, height: 0 }), l = y(() => {
@@ -93,4 +93,4 @@ const V = ({ url: v, fileName: h }) => {
93
93
  export {
94
94
  V as CsvRenderer
95
95
  };
96
- //# sourceMappingURL=index-qOC5xQyK.mjs.map
96
+ //# sourceMappingURL=index-DZxzCMp2.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-qOC5xQyK.mjs","sources":["../../src/renderers/Csv/index.tsx"],"sourcesContent":["import { useState, useEffect, useRef, useCallback } from 'react';\nimport Spreadsheet from 'x-data-spreadsheet';\nimport 'x-data-spreadsheet/dist/xspreadsheet.css';\nimport {\n parseCsv,\n guessCsvDelimiter,\n fetchTextUtf8,\n convertCsvToSpreadsheetData,\n} from '@eternalheart/file-preview-core';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { useFetcher } from '../../RequestContext';\nimport { RendererError } from '../RendererError';\n\ninterface CsvRendererProps {\n url: string;\n fileName: string;\n}\n\nexport const CsvRenderer: React.FC<CsvRendererProps> = ({ url, fileName }) => {\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 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 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 let isMounted = true;\n const controller = new AbortController();\n\n const loadCsv = async () => {\n if (!containerRef.current) return;\n\n setLoading(true);\n setError(null);\n\n try {\n const text = await fetchTextUtf8(url, { fetcher, signal: controller.signal });\n const parsed = parseCsv(text, { delimiter: guessCsvDelimiter(fileName) });\n const sheetData = convertCsvToSpreadsheetData(parsed.header, parsed.rows, fileName);\n\n if (!isMounted) return;\n\n sheetDataRef.current = sheetData as unknown as Record<string, unknown>[];\n mountSpreadsheet();\n setLoading(false);\n } catch (err: any) {\n if (err.name === 'AbortError') return;\n if (isMounted) {\n console.error('CSV 解析错误:', err);\n setError(t('csv.load_failed'));\n setLoading(false);\n }\n }\n };\n\n const timer = setTimeout(() => {\n requestAnimationFrame(() => {\n loadCsv();\n });\n }, 100);\n\n return () => {\n isMounted = false;\n controller.abort();\n clearTimeout(timer);\n sheetDataRef.current = null;\n if (containerRef.current) {\n containerRef.current.innerHTML = '';\n }\n spreadsheetRef.current = null;\n };\n }, [url, fileName, mountSpreadsheet]);\n\n return (\n <div className=\"rfp-relative rfp-flex rfp-flex-col rfp-items-center rfp-w-full rfp-h-full\">\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('csv.loading')}</p>\n </div>\n </div>\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={error} />\n </div>\n )}\n\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":["CsvRenderer","url","fileName","t","useTranslator","fetcher","useFetcher","loading","setLoading","useState","error","setError","containerRef","useRef","spreadsheetRef","sheetDataRef","resizeObserverRef","resizeTimeoutRef","lastDimensionsRef","calculateDimensions","useCallback","rawWidth","rawHeight","width","height","mountSpreadsheet","isMobile","Spreadsheet","useEffect","isInitialRender","updateDimensions","newDimensions","lastDimensions","widthDiff","heightDiff","isMounted","controller","loadCsv","text","fetchTextUtf8","parsed","parseCsv","guessCsvDelimiter","sheetData","convertCsvToSpreadsheetData","err","timer","jsxs","jsx","RendererError"],"mappings":"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"}
1
+ {"version":3,"file":"index-DZxzCMp2.mjs","sources":["../../src/renderers/Csv/index.tsx"],"sourcesContent":["import { useState, useEffect, useRef, useCallback } from 'react';\nimport Spreadsheet from 'x-data-spreadsheet';\nimport 'x-data-spreadsheet/dist/xspreadsheet.css';\nimport {\n parseCsv,\n guessCsvDelimiter,\n fetchTextUtf8,\n convertCsvToSpreadsheetData,\n} from '@eternalheart/file-preview-core';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { useFetcher } from '../../RequestContext';\nimport { RendererError } from '../RendererError';\n\ninterface CsvRendererProps {\n url: string;\n fileName: string;\n}\n\nexport const CsvRenderer: React.FC<CsvRendererProps> = ({ url, fileName }) => {\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 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 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 let isMounted = true;\n const controller = new AbortController();\n\n const loadCsv = async () => {\n if (!containerRef.current) return;\n\n setLoading(true);\n setError(null);\n\n try {\n const text = await fetchTextUtf8(url, { fetcher, signal: controller.signal });\n const parsed = parseCsv(text, { delimiter: guessCsvDelimiter(fileName) });\n const sheetData = convertCsvToSpreadsheetData(parsed.header, parsed.rows, fileName);\n\n if (!isMounted) return;\n\n sheetDataRef.current = sheetData as unknown as Record<string, unknown>[];\n mountSpreadsheet();\n setLoading(false);\n } catch (err: any) {\n if (err.name === 'AbortError') return;\n if (isMounted) {\n console.error('CSV 解析错误:', err);\n setError(t('csv.load_failed'));\n setLoading(false);\n }\n }\n };\n\n const timer = setTimeout(() => {\n requestAnimationFrame(() => {\n loadCsv();\n });\n }, 100);\n\n return () => {\n isMounted = false;\n controller.abort();\n clearTimeout(timer);\n sheetDataRef.current = null;\n if (containerRef.current) {\n containerRef.current.innerHTML = '';\n }\n spreadsheetRef.current = null;\n };\n }, [url, fileName, mountSpreadsheet]);\n\n return (\n <div className=\"rfp-relative rfp-flex rfp-flex-col rfp-items-center rfp-w-full rfp-h-full\">\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('csv.loading')}</p>\n </div>\n </div>\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={error} />\n </div>\n )}\n\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":["CsvRenderer","url","fileName","t","useTranslator","fetcher","useFetcher","loading","setLoading","useState","error","setError","containerRef","useRef","spreadsheetRef","sheetDataRef","resizeObserverRef","resizeTimeoutRef","lastDimensionsRef","calculateDimensions","useCallback","rawWidth","rawHeight","width","height","mountSpreadsheet","isMobile","Spreadsheet","useEffect","isInitialRender","updateDimensions","newDimensions","lastDimensions","widthDiff","heightDiff","isMounted","controller","loadCsv","text","fetchTextUtf8","parsed","parseCsv","guessCsvDelimiter","sheetData","convertCsvToSpreadsheetData","err","timer","jsxs","jsx","RendererError"],"mappings":"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"}
@@ -0,0 +1,357 @@
1
+ import { jsxs as y, jsx as e, Fragment as _ } from "react/jsx-runtime";
2
+ import { forwardRef as V, useRef as q, useState as p, useImperativeHandle as K, useEffect as E, useCallback as U, useMemo as ee, Suspense as re, lazy as te } from "react";
3
+ import { createPortal as fe } from "react-dom";
4
+ import { ChevronRight as ne, FolderOpen as le, Folder as se, FileImage as ie, FileText as pe, FileCode as ae, File as oe } from "lucide-react";
5
+ import { R as ce } from "./RendererError-BH6fzLrN.mjs";
6
+ import { u as de, a as ue, c as G, R as me, j as he, D as xe, A as be, C as we, F as ve } from "./index-CWCNvV2X.mjs";
7
+ const J = V(({
8
+ left: r,
9
+ right: s,
10
+ initialLeftWidth: x = 280,
11
+ minLeftWidth: b = 160,
12
+ maxLeftWidth: g = 640,
13
+ minRightWidth: d = 200,
14
+ storageKey: c,
15
+ desktopMedia: a = "(min-width: 768px)",
16
+ className: w = "",
17
+ mobileTabMode: j = !1,
18
+ leftTabLabel: N = "文件树",
19
+ rightTabLabel: k = "预览"
20
+ }, R) => {
21
+ const u = q(null), [o, f] = p(() => {
22
+ if (c && typeof window < "u") {
23
+ const n = Number(window.localStorage.getItem(c));
24
+ if (!isNaN(n) && n > 0) return n;
25
+ }
26
+ return x;
27
+ }), [L, T] = p(!1), [M, S] = p(!1), [z, v] = p("left");
28
+ K(R, () => ({
29
+ switchTab: (n) => v(n)
30
+ }), []), E(() => {
31
+ if (typeof window > "u") return;
32
+ const n = window.matchMedia(a), m = () => S(n.matches);
33
+ return m(), n.addEventListener("change", m), () => n.removeEventListener("change", m);
34
+ }, [a]), E(() => {
35
+ if (!L) return;
36
+ const n = (W) => {
37
+ if (!u.current) return;
38
+ const C = u.current.getBoundingClientRect(), A = W.clientX - C.left, B = C.width - d - 6, H = Math.min(g, B), I = Math.max(b, Math.min(H, A));
39
+ f(I);
40
+ }, m = () => T(!1);
41
+ window.addEventListener("mousemove", n), window.addEventListener("mouseup", m);
42
+ const $ = document.body.style.cursor, O = document.body.style.userSelect;
43
+ return document.body.style.cursor = "col-resize", document.body.style.userSelect = "none", () => {
44
+ window.removeEventListener("mousemove", n), window.removeEventListener("mouseup", m), document.body.style.cursor = $, document.body.style.userSelect = O;
45
+ };
46
+ }, [L, b, g, d]), E(() => {
47
+ if (!(!c || L))
48
+ try {
49
+ window.localStorage.setItem(c, String(o));
50
+ } catch {
51
+ }
52
+ }, [o, c, L]);
53
+ const F = U((n) => {
54
+ n.preventDefault(), T(!0);
55
+ }, []);
56
+ return j && !M ? /* @__PURE__ */ y(
57
+ "div",
58
+ {
59
+ ref: u,
60
+ className: `rfp-w-full rfp-h-full rfp-flex rfp-flex-col rfp-min-h-0 rfp-min-w-0 ${w}`,
61
+ children: [
62
+ /* @__PURE__ */ y("div", { className: "rfp-flex rfp-flex-shrink-0 rfp-border-b rfp-border-line-weak rfp-bg-surface-toolbar", children: [
63
+ /* @__PURE__ */ e(
64
+ "button",
65
+ {
66
+ type: "button",
67
+ onClick: () => v("left"),
68
+ className: `rfp-flex-1 rfp-py-2.5 rfp-text-sm rfp-transition-colors ${z === "left" ? "rfp-text-fg-primary rfp-border-b-2 rfp-border-fg-primary -rfp-mb-px" : "rfp-text-fg-secondary"}`,
69
+ children: N
70
+ }
71
+ ),
72
+ /* @__PURE__ */ e(
73
+ "button",
74
+ {
75
+ type: "button",
76
+ onClick: () => v("right"),
77
+ className: `rfp-flex-1 rfp-py-2.5 rfp-text-sm rfp-transition-colors ${z === "right" ? "rfp-text-fg-primary rfp-border-b-2 rfp-border-fg-primary -rfp-mb-px" : "rfp-text-fg-secondary"}`,
78
+ children: k
79
+ }
80
+ )
81
+ ] }),
82
+ /* @__PURE__ */ e(
83
+ "div",
84
+ {
85
+ className: "rfp-flex-1 rfp-min-h-0 rfp-min-w-0 rfp-w-full rfp-overflow-hidden",
86
+ style: { display: z === "left" ? void 0 : "none" },
87
+ children: r
88
+ }
89
+ ),
90
+ /* @__PURE__ */ e(
91
+ "div",
92
+ {
93
+ className: "rfp-flex-1 rfp-min-h-0 rfp-min-w-0 rfp-w-full rfp-overflow-hidden",
94
+ style: { display: z === "right" ? void 0 : "none" },
95
+ children: s
96
+ }
97
+ )
98
+ ]
99
+ }
100
+ ) : /* @__PURE__ */ y(
101
+ "div",
102
+ {
103
+ ref: u,
104
+ className: `rfp-w-full rfp-h-full rfp-flex rfp-flex-col md:rfp-flex-row rfp-min-h-0 rfp-min-w-0 ${w}`,
105
+ children: [
106
+ /* @__PURE__ */ e(
107
+ "div",
108
+ {
109
+ 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",
110
+ style: M ? { width: `${o}px` } : void 0,
111
+ children: r
112
+ }
113
+ ),
114
+ /* @__PURE__ */ e(
115
+ "div",
116
+ {
117
+ role: "separator",
118
+ "aria-orientation": "vertical",
119
+ onMouseDown: F,
120
+ className: `rfp-hidden md:rfp-block rfp-relative rfp-w-1.5 rfp-flex-shrink-0 rfp-cursor-col-resize rfp-transition-colors ${L ? "rfp-bg-surface-toolbar" : "rfp-bg-surface-2 hover:rfp-bg-surface-3"}`,
121
+ children: /* @__PURE__ */ e("span", { className: "rfp-absolute rfp-inset-y-0 -rfp-left-1 -rfp-right-1" })
122
+ }
123
+ ),
124
+ /* @__PURE__ */ e("div", { className: "rfp-flex-1 rfp-min-w-0 rfp-min-h-0 rfp-overflow-hidden", children: s })
125
+ ]
126
+ }
127
+ );
128
+ });
129
+ J.displayName = "ResizableSplit";
130
+ const ye = te(
131
+ () => import("./index-CWCNvV2X.mjs").then((r) => r.i).then((r) => ({ default: r.FilePreviewContent }))
132
+ ), ge = (r) => {
133
+ const s = ve({ name: r, type: "" });
134
+ return s === "image" ? ie : s === "text" || s === "markdown" || s === "json" || s === "csv" || s === "xml" || s === "subtitle" ? r.endsWith(".md") || r.endsWith(".markdown") ? pe : ae : oe;
135
+ }, Q = ({
136
+ node: r,
137
+ depth: s,
138
+ selectedPath: x,
139
+ expanded: b,
140
+ onToggle: g,
141
+ onSelect: d,
142
+ onHover: c,
143
+ onLeave: a
144
+ }) => {
145
+ var u;
146
+ const w = b.has(r.path), j = x === r.path, N = { paddingLeft: `${s * 14 + 10}px` }, k = (o) => {
147
+ const f = o.currentTarget.getBoundingClientRect();
148
+ c(r.name || "/", f);
149
+ };
150
+ if (r.isDir)
151
+ return /* @__PURE__ */ y(_, { children: [
152
+ /* @__PURE__ */ y(
153
+ "button",
154
+ {
155
+ type: "button",
156
+ onClick: () => g(r.path),
157
+ onMouseEnter: k,
158
+ onMouseLeave: a,
159
+ 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",
160
+ style: N,
161
+ children: [
162
+ /* @__PURE__ */ e(
163
+ ne,
164
+ {
165
+ className: `rfp-w-3.5 rfp-h-3.5 rfp-flex-shrink-0 rfp-transition-transform ${w ? "rfp-rotate-90" : ""}`
166
+ }
167
+ ),
168
+ w ? /* @__PURE__ */ e(le, { className: "rfp-w-4 rfp-h-4 rfp-flex-shrink-0 rfp-text-amber-300/80" }) : /* @__PURE__ */ e(se, { className: "rfp-w-4 rfp-h-4 rfp-flex-shrink-0 rfp-text-amber-300/80" }),
169
+ /* @__PURE__ */ e("span", { className: "rfp-truncate rfp-flex-1 rfp-min-w-0", children: r.name || "/" })
170
+ ]
171
+ }
172
+ ),
173
+ w && ((u = r.children) == null ? void 0 : u.map((o) => /* @__PURE__ */ e(
174
+ Q,
175
+ {
176
+ node: o,
177
+ depth: s + 1,
178
+ selectedPath: x,
179
+ expanded: b,
180
+ onToggle: g,
181
+ onSelect: d,
182
+ onHover: c,
183
+ onLeave: a
184
+ },
185
+ o.path
186
+ )))
187
+ ] });
188
+ const R = ge(r.name);
189
+ return /* @__PURE__ */ y(
190
+ "button",
191
+ {
192
+ type: "button",
193
+ onClick: () => d(r),
194
+ onMouseEnter: k,
195
+ onMouseLeave: a,
196
+ 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 ${j ? "rfp-bg-surface-2 rfp-text-fg-primary" : "rfp-text-fg-secondary hover:rfp-bg-surface-1"}`,
197
+ style: N,
198
+ children: [
199
+ /* @__PURE__ */ e("span", { className: "rfp-w-3.5 rfp-h-3.5 rfp-flex-shrink-0" }),
200
+ /* @__PURE__ */ e(R, { className: "rfp-w-4 rfp-h-4 rfp-flex-shrink-0 rfp-text-fg-tertiary" }),
201
+ /* @__PURE__ */ e("span", { className: "rfp-flex-1 rfp-truncate rfp-min-w-0", children: r.name }),
202
+ /* @__PURE__ */ e("span", { className: "rfp-text-xs rfp-text-fg-disabled rfp-flex-shrink-0 rfp-ml-2", children: we(r.size) })
203
+ ]
204
+ }
205
+ );
206
+ }, Te = ({ url: r, nestingDepth: s = 0, onStatsChange: x }) => {
207
+ var I;
208
+ const b = de(), g = ue(), [d, c] = p(null), [a, w] = p(null), [j, N] = p(!0), [k, R] = p(null), [u, o] = p(/* @__PURE__ */ new Set([""])), [f, L] = p(null), [T, M] = p(!1), [S, z] = p(null), [v, F] = p(null), n = q(x), m = q(null);
209
+ E(() => {
210
+ n.current = x;
211
+ }, [x]), E(() => {
212
+ if (!r) return;
213
+ let t = !1;
214
+ return (async () => {
215
+ try {
216
+ N(!0), R(null);
217
+ const l = await g(r);
218
+ if (!l.ok) throw new Error("加载失败");
219
+ const D = await l.arrayBuffer(), h = await he(D);
220
+ if (t) return;
221
+ const P = xe(h), Z = be(P);
222
+ c(h), w(Z);
223
+ const X = /* @__PURE__ */ new Set([""]);
224
+ if (Z.children)
225
+ for (const Y of Z.children) Y.isDir && X.add(Y.path);
226
+ o(X);
227
+ } catch (l) {
228
+ console.error(l), t || R(b("zip.load_failed"));
229
+ } finally {
230
+ t || N(!1);
231
+ }
232
+ })(), () => {
233
+ t = !0;
234
+ };
235
+ }, [r]), E(() => () => {
236
+ f != null && f.blobUrl && URL.revokeObjectURL(f.blobUrl);
237
+ }, [f]);
238
+ const $ = ee(() => {
239
+ if (!a) return null;
240
+ let t = 0, i = 0, l = 0;
241
+ const D = (h) => {
242
+ var P;
243
+ h.isDir ? (h.path && i++, (P = h.children) == null || P.forEach(D)) : (t++, l += h.size);
244
+ };
245
+ return D(a), { files: t, dirs: i, size: l };
246
+ }, [a]);
247
+ E(() => {
248
+ var t;
249
+ return (t = n.current) == null || t.call(n, $), () => {
250
+ var i;
251
+ (i = n.current) == null || i.call(n, null);
252
+ };
253
+ }, [$]);
254
+ const O = U((t) => {
255
+ o((i) => {
256
+ const l = new Set(i);
257
+ return l.has(t) ? l.delete(t) : l.add(t), l;
258
+ });
259
+ }, []), W = U((t, i) => {
260
+ F({
261
+ text: t,
262
+ x: i.right + 8,
263
+ y: i.top + i.height / 2
264
+ });
265
+ }, []), C = U(() => {
266
+ F(null);
267
+ }, []), A = U(
268
+ async (t) => {
269
+ var i;
270
+ if (!(!d || t.isDir)) {
271
+ f != null && f.blobUrl && URL.revokeObjectURL(f.blobUrl), M(!0), z(null);
272
+ try {
273
+ const l = G(t.name), D = await me(d, t.path, l !== "application/octet-stream" ? l : void 0), h = URL.createObjectURL(D);
274
+ L({ path: t.path, name: t.name, size: t.size, blobUrl: h }), (i = m.current) == null || i.switchTab("right");
275
+ } catch (l) {
276
+ console.error(l), z("条目读取失败");
277
+ } finally {
278
+ M(!1);
279
+ }
280
+ }
281
+ },
282
+ [d, f]
283
+ );
284
+ if (j)
285
+ 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" }) });
286
+ if (k || !a)
287
+ return /* @__PURE__ */ e(ce, { message: k || b("zip.parse_failed") });
288
+ const B = /* @__PURE__ */ e("div", { className: "rfp-w-full rfp-h-full rfp-overflow-auto", children: (I = a.children) == null ? void 0 : I.map((t) => /* @__PURE__ */ e(
289
+ Q,
290
+ {
291
+ node: t,
292
+ depth: 0,
293
+ selectedPath: (f == null ? void 0 : f.path) ?? null,
294
+ expanded: u,
295
+ onToggle: O,
296
+ onSelect: A,
297
+ onHover: W,
298
+ onLeave: C
299
+ },
300
+ t.path
301
+ )) }), H = /* @__PURE__ */ y("div", { className: "rfp-w-full rfp-h-full rfp-flex rfp-flex-col", children: [
302
+ !f && /* @__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: "从左侧选择一个文件以预览" }),
303
+ f && T && /* @__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" }) }),
304
+ f && !T && S && /* @__PURE__ */ e("div", { className: "rfp-flex-1 rfp-flex rfp-items-center rfp-justify-center rfp-text-fg-secondary", children: S }),
305
+ f && !T && !S && /* @__PURE__ */ e(_, { 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(
306
+ re,
307
+ {
308
+ 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" }) }),
309
+ children: /* @__PURE__ */ e(
310
+ ye,
311
+ {
312
+ mode: "embed",
313
+ files: [{ name: f.name, url: f.blobUrl, type: G(f.name) }],
314
+ currentIndex: 0,
315
+ zipNestingDepth: s + 1
316
+ }
317
+ )
318
+ }
319
+ ) }) })
320
+ ] });
321
+ return /* @__PURE__ */ y(_, { children: [
322
+ /* @__PURE__ */ e(
323
+ J,
324
+ {
325
+ ref: m,
326
+ left: B,
327
+ right: H,
328
+ initialLeftWidth: 280,
329
+ minLeftWidth: 180,
330
+ maxLeftWidth: 560,
331
+ storageKey: "rfp-zip-split-left",
332
+ mobileTabMode: !0,
333
+ leftTabLabel: "文件树",
334
+ rightTabLabel: "预览"
335
+ }
336
+ ),
337
+ v && typeof document < "u" && fe(
338
+ /* @__PURE__ */ e(
339
+ "div",
340
+ {
341
+ 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",
342
+ style: {
343
+ left: `${v.x}px`,
344
+ top: `${v.y}px`,
345
+ transform: "translateY(-50%)"
346
+ },
347
+ children: v.text
348
+ }
349
+ ),
350
+ document.body
351
+ )
352
+ ] });
353
+ };
354
+ export {
355
+ Te as ZipRenderer
356
+ };
357
+ //# sourceMappingURL=index-DfkP0zX3.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-DfkP0zX3.mjs","sources":["../../src/components/ResizableSplit.tsx","../../src/renderers/Zip/index.tsx"],"sourcesContent":["import React, { useEffect, useImperativeHandle, useRef, useState, useCallback, forwardRef } 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 /** 移动端使用 Tab 切换而非上下堆叠 */\n mobileTabMode?: boolean;\n /** Tab 模式下左侧标题 */\n leftTabLabel?: string;\n /** Tab 模式下右侧标题 */\n rightTabLabel?: string;\n}\n\nexport interface ResizableSplitHandle {\n switchTab: (tab: 'left' | 'right') => void;\n}\n\n/**\n * 通用可拖动分隔布局:\n * - 桌面端(由 `desktopMedia` 判定)横向分两栏,中间分隔线可左右拖动调整左栏宽度\n * - 移动端默认退化为上下堆叠(不显示分隔线)\n * - 设置 `mobileTabMode` 时移动端使用 Tab 切换显示\n * - 可选 `storageKey` 将宽度持久化到 localStorage\n */\nexport const ResizableSplit = forwardRef<ResizableSplitHandle, 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 mobileTabMode = false,\n leftTabLabel = '文件树',\n rightTabLabel = '预览',\n}, ref) => {\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 const [activeTab, setActiveTab] = useState<'left' | 'right'>('left');\n\n useImperativeHandle(ref, () => ({\n switchTab: (tab) => setActiveTab(tab),\n }), []);\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 // 移动端 Tab 模式\n if (mobileTabMode && !isDesktop) {\n return (\n <div\n ref={containerRef}\n className={`rfp-w-full rfp-h-full rfp-flex rfp-flex-col rfp-min-h-0 rfp-min-w-0 ${className}`}\n >\n <div className=\"rfp-flex rfp-flex-shrink-0 rfp-border-b rfp-border-line-weak rfp-bg-surface-toolbar\">\n <button\n type=\"button\"\n onClick={() => setActiveTab('left')}\n className={`rfp-flex-1 rfp-py-2.5 rfp-text-sm rfp-transition-colors ${\n activeTab === 'left'\n ? 'rfp-text-fg-primary rfp-border-b-2 rfp-border-fg-primary -rfp-mb-px'\n : 'rfp-text-fg-secondary'\n }`}\n >\n {leftTabLabel}\n </button>\n <button\n type=\"button\"\n onClick={() => setActiveTab('right')}\n className={`rfp-flex-1 rfp-py-2.5 rfp-text-sm rfp-transition-colors ${\n activeTab === 'right'\n ? 'rfp-text-fg-primary rfp-border-b-2 rfp-border-fg-primary -rfp-mb-px'\n : 'rfp-text-fg-secondary'\n }`}\n >\n {rightTabLabel}\n </button>\n </div>\n <div\n className=\"rfp-flex-1 rfp-min-h-0 rfp-min-w-0 rfp-w-full rfp-overflow-hidden\"\n style={{ display: activeTab === 'left' ? undefined : 'none' }}\n >\n {left}\n </div>\n <div\n className=\"rfp-flex-1 rfp-min-h-0 rfp-min-w-0 rfp-w-full rfp-overflow-hidden\"\n style={{ display: activeTab === 'right' ? undefined : 'none' }}\n >\n {right}\n </div>\n </div>\n );\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\nResizableSplit.displayName = 'ResizableSplit';\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, type ResizableSplitHandle } 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 const splitRef = useRef<ResizableSplitHandle>(null);\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 // 移动端切换到预览 tab\n splitRef.current?.switchTab('right');\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 ref={splitRef}\n left={leftPane}\n right={rightPane}\n initialLeftWidth={280}\n minLeftWidth={180}\n maxLeftWidth={560}\n storageKey=\"rfp-zip-split-left\"\n mobileTabMode\n leftTabLabel=\"文件树\"\n rightTabLabel=\"预览\"\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","forwardRef","left","right","initialLeftWidth","minLeftWidth","maxLeftWidth","minRightWidth","storageKey","desktopMedia","className","mobileTabMode","leftTabLabel","rightTabLabel","ref","containerRef","useRef","leftWidth","setLeftWidth","useState","saved","dragging","setDragging","isDesktop","setIsDesktop","activeTab","setActiveTab","useImperativeHandle","tab","useEffect","mq","handler","handleMove","e","rect","x","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","splitRef","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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"}
@@ -1,7 +1,7 @@
1
1
  import { jsx as L, jsxs as G } from "react/jsx-runtime";
2
2
  import { useState as qe, useEffect as tr } from "react";
3
3
  import { User as rr, Users as ze, Calendar as mt, Clock as gt, Tag as wt, Mail as ir, Paperclip as nr, Hash as ar } from "lucide-react";
4
- import { u as sr, a as or } from "./index-CuAALtwC.mjs";
4
+ import { u as sr, a as or } from "./index-CWCNvV2X.mjs";
5
5
  import { R as cr } from "./RendererError-BH6fzLrN.mjs";
6
6
  var ie = typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : typeof global < "u" ? global : typeof self < "u" ? self : {};
7
7
  function fr(e) {
@@ -13094,4 +13094,4 @@ const se = {
13094
13094
  export {
13095
13095
  Ui as MsgRenderer
13096
13096
  };
13097
- //# sourceMappingURL=index-DaFlk9dd.mjs.map
13097
+ //# sourceMappingURL=index-DqXfw2eb.mjs.map