@eternalheart/react-file-preview 1.3.11 → 1.3.12

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 (215) hide show
  1. package/lib/chunks/{index-CdmkF0CO.mjs → index-BBvL23cc.mjs} +2 -2
  2. package/lib/chunks/{index-CdmkF0CO.mjs.map → index-BBvL23cc.mjs.map} +1 -1
  3. package/lib/chunks/{index-CuAALtwC.mjs → index-BCbSb9Ob.mjs} +500 -476
  4. package/lib/chunks/index-BCbSb9Ob.mjs.map +1 -0
  5. package/lib/chunks/{index-CCkHAeLh.mjs → index-BPsJtP6e.mjs} +2 -2
  6. package/lib/chunks/{index-CCkHAeLh.mjs.map → index-BPsJtP6e.mjs.map} +1 -1
  7. package/lib/chunks/{index-nVblatyi.mjs → index-CA8OvqPT.mjs} +3 -3
  8. package/lib/chunks/{index-nVblatyi.mjs.map → index-CA8OvqPT.mjs.map} +1 -1
  9. package/lib/chunks/{index-D660ENHx.mjs → index-CJGtdAy7.mjs} +2 -2
  10. package/lib/chunks/{index-D660ENHx.mjs.map → index-CJGtdAy7.mjs.map} +1 -1
  11. package/lib/chunks/{index-nLTQXCV7.mjs → index-CeQf1qNC.mjs} +3 -3
  12. package/lib/chunks/{index-nLTQXCV7.mjs.map → index-CeQf1qNC.mjs.map} +1 -1
  13. package/lib/chunks/{index-ow-nGpuu.mjs → index-Cxf4CLJZ.mjs} +2 -2
  14. package/lib/chunks/{index-ow-nGpuu.mjs.map → index-Cxf4CLJZ.mjs.map} +1 -1
  15. package/lib/chunks/{index-qOC5xQyK.mjs → index-D2t64h6I.mjs} +2 -2
  16. package/lib/chunks/{index-qOC5xQyK.mjs.map → index-D2t64h6I.mjs.map} +1 -1
  17. package/lib/chunks/{index-BYdqrqnR.mjs → index-DAo4n3Mq.mjs} +2 -2
  18. package/lib/chunks/{index-BYdqrqnR.mjs.map → index-DAo4n3Mq.mjs.map} +1 -1
  19. package/lib/chunks/{index-DaFlk9dd.mjs → index-DCTwUpKS.mjs} +2 -2
  20. package/lib/chunks/{index-DaFlk9dd.mjs.map → index-DCTwUpKS.mjs.map} +1 -1
  21. package/lib/chunks/{index-BiyghBxu.mjs → index-DJZWizxK.mjs} +2 -2
  22. package/lib/chunks/{index-BiyghBxu.mjs.map → index-DJZWizxK.mjs.map} +1 -1
  23. package/lib/chunks/{index-DBEG73K1.mjs → index-DRCA7PhQ.mjs} +2 -2
  24. package/lib/chunks/{index-DBEG73K1.mjs.map → index-DRCA7PhQ.mjs.map} +1 -1
  25. package/lib/chunks/{index-rUfsiVR8.mjs → index-DdkkEzw3.mjs} +2 -2
  26. package/lib/chunks/{index-rUfsiVR8.mjs.map → index-DdkkEzw3.mjs.map} +1 -1
  27. package/lib/chunks/{index-BJ6vTNxc.mjs → index-DlptjfMf.mjs} +2 -2
  28. package/lib/chunks/{index-BJ6vTNxc.mjs.map → index-DlptjfMf.mjs.map} +1 -1
  29. package/lib/chunks/{index-C8CyS_sj.mjs → index-DrgP7cc7.mjs} +3 -3
  30. package/lib/chunks/{index-C8CyS_sj.mjs.map → index-DrgP7cc7.mjs.map} +1 -1
  31. package/lib/chunks/{index-_mP0FkqE.mjs → index-Dx8aLIDX.mjs} +2 -2
  32. package/lib/chunks/{index-_mP0FkqE.mjs.map → index-Dx8aLIDX.mjs.map} +1 -1
  33. package/lib/chunks/{index-BCuRRLYt.mjs → index-fhiaa9rv.mjs} +2 -2
  34. package/lib/chunks/{index-BCuRRLYt.mjs.map → index-fhiaa9rv.mjs.map} +1 -1
  35. package/lib/chunks/{index-C8OrFLd5.mjs → index-qEUWJYQ5.mjs} +2 -2
  36. package/lib/chunks/{index-C8OrFLd5.mjs.map → index-qEUWJYQ5.mjs.map} +1 -1
  37. package/lib/chunks/{index-B57rEPin.mjs → index-vaILKWGV.mjs} +3 -3
  38. package/lib/chunks/{index-B57rEPin.mjs.map → index-vaILKWGV.mjs.map} +1 -1
  39. package/lib/chunks/{useShikiHighlight-ClbUXJ2p.mjs → useShikiHighlight-Cq02e63J.mjs} +2 -2
  40. package/lib/chunks/{useShikiHighlight-ClbUXJ2p.mjs.map → useShikiHighlight-Cq02e63J.mjs.map} +1 -1
  41. package/lib/index.cjs +25 -25
  42. package/lib/index.cjs.map +1 -1
  43. package/lib/index.mjs +1 -1
  44. package/package.json +1 -1
  45. package/lib/chunks/index-CuAALtwC.mjs.map +0 -1
  46. package/lib/pdfjs/cmaps/78-EUC-H.bcmap +0 -0
  47. package/lib/pdfjs/cmaps/78-EUC-V.bcmap +0 -0
  48. package/lib/pdfjs/cmaps/78-H.bcmap +0 -0
  49. package/lib/pdfjs/cmaps/78-RKSJ-H.bcmap +0 -0
  50. package/lib/pdfjs/cmaps/78-RKSJ-V.bcmap +0 -0
  51. package/lib/pdfjs/cmaps/78-V.bcmap +0 -0
  52. package/lib/pdfjs/cmaps/78ms-RKSJ-H.bcmap +0 -0
  53. package/lib/pdfjs/cmaps/78ms-RKSJ-V.bcmap +0 -0
  54. package/lib/pdfjs/cmaps/83pv-RKSJ-H.bcmap +0 -0
  55. package/lib/pdfjs/cmaps/90ms-RKSJ-H.bcmap +0 -0
  56. package/lib/pdfjs/cmaps/90ms-RKSJ-V.bcmap +0 -0
  57. package/lib/pdfjs/cmaps/90msp-RKSJ-H.bcmap +0 -0
  58. package/lib/pdfjs/cmaps/90msp-RKSJ-V.bcmap +0 -0
  59. package/lib/pdfjs/cmaps/90pv-RKSJ-H.bcmap +0 -0
  60. package/lib/pdfjs/cmaps/90pv-RKSJ-V.bcmap +0 -0
  61. package/lib/pdfjs/cmaps/Add-H.bcmap +0 -0
  62. package/lib/pdfjs/cmaps/Add-RKSJ-H.bcmap +0 -0
  63. package/lib/pdfjs/cmaps/Add-RKSJ-V.bcmap +0 -0
  64. package/lib/pdfjs/cmaps/Add-V.bcmap +0 -0
  65. package/lib/pdfjs/cmaps/Adobe-CNS1-0.bcmap +0 -0
  66. package/lib/pdfjs/cmaps/Adobe-CNS1-1.bcmap +0 -0
  67. package/lib/pdfjs/cmaps/Adobe-CNS1-2.bcmap +0 -0
  68. package/lib/pdfjs/cmaps/Adobe-CNS1-3.bcmap +0 -0
  69. package/lib/pdfjs/cmaps/Adobe-CNS1-4.bcmap +0 -0
  70. package/lib/pdfjs/cmaps/Adobe-CNS1-5.bcmap +0 -0
  71. package/lib/pdfjs/cmaps/Adobe-CNS1-6.bcmap +0 -0
  72. package/lib/pdfjs/cmaps/Adobe-CNS1-UCS2.bcmap +0 -0
  73. package/lib/pdfjs/cmaps/Adobe-GB1-0.bcmap +0 -0
  74. package/lib/pdfjs/cmaps/Adobe-GB1-1.bcmap +0 -0
  75. package/lib/pdfjs/cmaps/Adobe-GB1-2.bcmap +0 -0
  76. package/lib/pdfjs/cmaps/Adobe-GB1-3.bcmap +0 -0
  77. package/lib/pdfjs/cmaps/Adobe-GB1-4.bcmap +0 -0
  78. package/lib/pdfjs/cmaps/Adobe-GB1-5.bcmap +0 -0
  79. package/lib/pdfjs/cmaps/Adobe-GB1-UCS2.bcmap +0 -0
  80. package/lib/pdfjs/cmaps/Adobe-Japan1-0.bcmap +0 -0
  81. package/lib/pdfjs/cmaps/Adobe-Japan1-1.bcmap +0 -0
  82. package/lib/pdfjs/cmaps/Adobe-Japan1-2.bcmap +0 -0
  83. package/lib/pdfjs/cmaps/Adobe-Japan1-3.bcmap +0 -0
  84. package/lib/pdfjs/cmaps/Adobe-Japan1-4.bcmap +0 -0
  85. package/lib/pdfjs/cmaps/Adobe-Japan1-5.bcmap +0 -0
  86. package/lib/pdfjs/cmaps/Adobe-Japan1-6.bcmap +0 -0
  87. package/lib/pdfjs/cmaps/Adobe-Japan1-UCS2.bcmap +0 -0
  88. package/lib/pdfjs/cmaps/Adobe-Korea1-0.bcmap +0 -0
  89. package/lib/pdfjs/cmaps/Adobe-Korea1-1.bcmap +0 -0
  90. package/lib/pdfjs/cmaps/Adobe-Korea1-2.bcmap +0 -0
  91. package/lib/pdfjs/cmaps/Adobe-Korea1-UCS2.bcmap +0 -0
  92. package/lib/pdfjs/cmaps/B5-H.bcmap +0 -0
  93. package/lib/pdfjs/cmaps/B5-V.bcmap +0 -0
  94. package/lib/pdfjs/cmaps/B5pc-H.bcmap +0 -0
  95. package/lib/pdfjs/cmaps/B5pc-V.bcmap +0 -0
  96. package/lib/pdfjs/cmaps/CNS-EUC-H.bcmap +0 -0
  97. package/lib/pdfjs/cmaps/CNS-EUC-V.bcmap +0 -0
  98. package/lib/pdfjs/cmaps/CNS1-H.bcmap +0 -0
  99. package/lib/pdfjs/cmaps/CNS1-V.bcmap +0 -0
  100. package/lib/pdfjs/cmaps/CNS2-H.bcmap +0 -0
  101. package/lib/pdfjs/cmaps/CNS2-V.bcmap +0 -3
  102. package/lib/pdfjs/cmaps/ETHK-B5-H.bcmap +0 -0
  103. package/lib/pdfjs/cmaps/ETHK-B5-V.bcmap +0 -0
  104. package/lib/pdfjs/cmaps/ETen-B5-H.bcmap +0 -0
  105. package/lib/pdfjs/cmaps/ETen-B5-V.bcmap +0 -0
  106. package/lib/pdfjs/cmaps/ETenms-B5-H.bcmap +0 -3
  107. package/lib/pdfjs/cmaps/ETenms-B5-V.bcmap +0 -0
  108. package/lib/pdfjs/cmaps/EUC-H.bcmap +0 -0
  109. package/lib/pdfjs/cmaps/EUC-V.bcmap +0 -0
  110. package/lib/pdfjs/cmaps/Ext-H.bcmap +0 -0
  111. package/lib/pdfjs/cmaps/Ext-RKSJ-H.bcmap +0 -0
  112. package/lib/pdfjs/cmaps/Ext-RKSJ-V.bcmap +0 -0
  113. package/lib/pdfjs/cmaps/Ext-V.bcmap +0 -0
  114. package/lib/pdfjs/cmaps/GB-EUC-H.bcmap +0 -0
  115. package/lib/pdfjs/cmaps/GB-EUC-V.bcmap +0 -0
  116. package/lib/pdfjs/cmaps/GB-H.bcmap +0 -4
  117. package/lib/pdfjs/cmaps/GB-V.bcmap +0 -0
  118. package/lib/pdfjs/cmaps/GBK-EUC-H.bcmap +0 -0
  119. package/lib/pdfjs/cmaps/GBK-EUC-V.bcmap +0 -0
  120. package/lib/pdfjs/cmaps/GBK2K-H.bcmap +0 -0
  121. package/lib/pdfjs/cmaps/GBK2K-V.bcmap +0 -0
  122. package/lib/pdfjs/cmaps/GBKp-EUC-H.bcmap +0 -0
  123. package/lib/pdfjs/cmaps/GBKp-EUC-V.bcmap +0 -0
  124. package/lib/pdfjs/cmaps/GBT-EUC-H.bcmap +0 -0
  125. package/lib/pdfjs/cmaps/GBT-EUC-V.bcmap +0 -0
  126. package/lib/pdfjs/cmaps/GBT-H.bcmap +0 -0
  127. package/lib/pdfjs/cmaps/GBT-V.bcmap +0 -0
  128. package/lib/pdfjs/cmaps/GBTpc-EUC-H.bcmap +0 -0
  129. package/lib/pdfjs/cmaps/GBTpc-EUC-V.bcmap +0 -0
  130. package/lib/pdfjs/cmaps/GBpc-EUC-H.bcmap +0 -0
  131. package/lib/pdfjs/cmaps/GBpc-EUC-V.bcmap +0 -0
  132. package/lib/pdfjs/cmaps/H.bcmap +0 -0
  133. package/lib/pdfjs/cmaps/HKdla-B5-H.bcmap +0 -0
  134. package/lib/pdfjs/cmaps/HKdla-B5-V.bcmap +0 -0
  135. package/lib/pdfjs/cmaps/HKdlb-B5-H.bcmap +0 -0
  136. package/lib/pdfjs/cmaps/HKdlb-B5-V.bcmap +0 -0
  137. package/lib/pdfjs/cmaps/HKgccs-B5-H.bcmap +0 -0
  138. package/lib/pdfjs/cmaps/HKgccs-B5-V.bcmap +0 -0
  139. package/lib/pdfjs/cmaps/HKm314-B5-H.bcmap +0 -0
  140. package/lib/pdfjs/cmaps/HKm314-B5-V.bcmap +0 -0
  141. package/lib/pdfjs/cmaps/HKm471-B5-H.bcmap +0 -0
  142. package/lib/pdfjs/cmaps/HKm471-B5-V.bcmap +0 -0
  143. package/lib/pdfjs/cmaps/HKscs-B5-H.bcmap +0 -0
  144. package/lib/pdfjs/cmaps/HKscs-B5-V.bcmap +0 -0
  145. package/lib/pdfjs/cmaps/Hankaku.bcmap +0 -0
  146. package/lib/pdfjs/cmaps/Hiragana.bcmap +0 -0
  147. package/lib/pdfjs/cmaps/KSC-EUC-H.bcmap +0 -0
  148. package/lib/pdfjs/cmaps/KSC-EUC-V.bcmap +0 -0
  149. package/lib/pdfjs/cmaps/KSC-H.bcmap +0 -0
  150. package/lib/pdfjs/cmaps/KSC-Johab-H.bcmap +0 -0
  151. package/lib/pdfjs/cmaps/KSC-Johab-V.bcmap +0 -0
  152. package/lib/pdfjs/cmaps/KSC-V.bcmap +0 -0
  153. package/lib/pdfjs/cmaps/KSCms-UHC-H.bcmap +0 -0
  154. package/lib/pdfjs/cmaps/KSCms-UHC-HW-H.bcmap +0 -0
  155. package/lib/pdfjs/cmaps/KSCms-UHC-HW-V.bcmap +0 -0
  156. package/lib/pdfjs/cmaps/KSCms-UHC-V.bcmap +0 -0
  157. package/lib/pdfjs/cmaps/KSCpc-EUC-H.bcmap +0 -0
  158. package/lib/pdfjs/cmaps/KSCpc-EUC-V.bcmap +0 -0
  159. package/lib/pdfjs/cmaps/Katakana.bcmap +0 -0
  160. package/lib/pdfjs/cmaps/LICENSE +0 -36
  161. package/lib/pdfjs/cmaps/NWP-H.bcmap +0 -0
  162. package/lib/pdfjs/cmaps/NWP-V.bcmap +0 -0
  163. package/lib/pdfjs/cmaps/RKSJ-H.bcmap +0 -0
  164. package/lib/pdfjs/cmaps/RKSJ-V.bcmap +0 -0
  165. package/lib/pdfjs/cmaps/Roman.bcmap +0 -0
  166. package/lib/pdfjs/cmaps/UniCNS-UCS2-H.bcmap +0 -0
  167. package/lib/pdfjs/cmaps/UniCNS-UCS2-V.bcmap +0 -0
  168. package/lib/pdfjs/cmaps/UniCNS-UTF16-H.bcmap +0 -0
  169. package/lib/pdfjs/cmaps/UniCNS-UTF16-V.bcmap +0 -0
  170. package/lib/pdfjs/cmaps/UniCNS-UTF32-H.bcmap +0 -0
  171. package/lib/pdfjs/cmaps/UniCNS-UTF32-V.bcmap +0 -0
  172. package/lib/pdfjs/cmaps/UniCNS-UTF8-H.bcmap +0 -0
  173. package/lib/pdfjs/cmaps/UniCNS-UTF8-V.bcmap +0 -0
  174. package/lib/pdfjs/cmaps/UniGB-UCS2-H.bcmap +0 -0
  175. package/lib/pdfjs/cmaps/UniGB-UCS2-V.bcmap +0 -0
  176. package/lib/pdfjs/cmaps/UniGB-UTF16-H.bcmap +0 -0
  177. package/lib/pdfjs/cmaps/UniGB-UTF16-V.bcmap +0 -0
  178. package/lib/pdfjs/cmaps/UniGB-UTF32-H.bcmap +0 -0
  179. package/lib/pdfjs/cmaps/UniGB-UTF32-V.bcmap +0 -0
  180. package/lib/pdfjs/cmaps/UniGB-UTF8-H.bcmap +0 -0
  181. package/lib/pdfjs/cmaps/UniGB-UTF8-V.bcmap +0 -0
  182. package/lib/pdfjs/cmaps/UniJIS-UCS2-H.bcmap +0 -0
  183. package/lib/pdfjs/cmaps/UniJIS-UCS2-HW-H.bcmap +0 -0
  184. package/lib/pdfjs/cmaps/UniJIS-UCS2-HW-V.bcmap +0 -0
  185. package/lib/pdfjs/cmaps/UniJIS-UCS2-V.bcmap +0 -0
  186. package/lib/pdfjs/cmaps/UniJIS-UTF16-H.bcmap +0 -0
  187. package/lib/pdfjs/cmaps/UniJIS-UTF16-V.bcmap +0 -0
  188. package/lib/pdfjs/cmaps/UniJIS-UTF32-H.bcmap +0 -0
  189. package/lib/pdfjs/cmaps/UniJIS-UTF32-V.bcmap +0 -0
  190. package/lib/pdfjs/cmaps/UniJIS-UTF8-H.bcmap +0 -0
  191. package/lib/pdfjs/cmaps/UniJIS-UTF8-V.bcmap +0 -0
  192. package/lib/pdfjs/cmaps/UniJIS2004-UTF16-H.bcmap +0 -0
  193. package/lib/pdfjs/cmaps/UniJIS2004-UTF16-V.bcmap +0 -0
  194. package/lib/pdfjs/cmaps/UniJIS2004-UTF32-H.bcmap +0 -0
  195. package/lib/pdfjs/cmaps/UniJIS2004-UTF32-V.bcmap +0 -0
  196. package/lib/pdfjs/cmaps/UniJIS2004-UTF8-H.bcmap +0 -0
  197. package/lib/pdfjs/cmaps/UniJIS2004-UTF8-V.bcmap +0 -0
  198. package/lib/pdfjs/cmaps/UniJISPro-UCS2-HW-V.bcmap +0 -0
  199. package/lib/pdfjs/cmaps/UniJISPro-UCS2-V.bcmap +0 -0
  200. package/lib/pdfjs/cmaps/UniJISPro-UTF8-V.bcmap +0 -0
  201. package/lib/pdfjs/cmaps/UniJISX0213-UTF32-H.bcmap +0 -0
  202. package/lib/pdfjs/cmaps/UniJISX0213-UTF32-V.bcmap +0 -0
  203. package/lib/pdfjs/cmaps/UniJISX02132004-UTF32-H.bcmap +0 -0
  204. package/lib/pdfjs/cmaps/UniJISX02132004-UTF32-V.bcmap +0 -0
  205. package/lib/pdfjs/cmaps/UniKS-UCS2-H.bcmap +0 -0
  206. package/lib/pdfjs/cmaps/UniKS-UCS2-V.bcmap +0 -0
  207. package/lib/pdfjs/cmaps/UniKS-UTF16-H.bcmap +0 -0
  208. package/lib/pdfjs/cmaps/UniKS-UTF16-V.bcmap +0 -0
  209. package/lib/pdfjs/cmaps/UniKS-UTF32-H.bcmap +0 -0
  210. package/lib/pdfjs/cmaps/UniKS-UTF32-V.bcmap +0 -0
  211. package/lib/pdfjs/cmaps/UniKS-UTF8-H.bcmap +0 -0
  212. package/lib/pdfjs/cmaps/UniKS-UTF8-V.bcmap +0 -0
  213. package/lib/pdfjs/cmaps/V.bcmap +0 -0
  214. package/lib/pdfjs/cmaps/WP-Symbol.bcmap +0 -0
  215. package/lib/pdfjs/pdf.worker.min.mjs +0 -21
@@ -1 +1 @@
1
- {"version":3,"file":"index-BYdqrqnR.mjs","sources":["../../src/renderers/Pdf/index.tsx"],"sourcesContent":["import { useState, useEffect, useRef, useCallback } from 'react';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { RendererError } from '../RendererError';\n// @ts-ignore - pdfjs-dist 类型路径\nimport * as pdfjsLib from 'pdfjs-dist/build/pdf.mjs';\n\ninterface PdfPageProxy {\n getViewport(opts: { scale: number }): { width: number; height: number };\n render(opts: { canvasContext: CanvasRenderingContext2D; viewport: { width: number; height: number } }): {\n promise: Promise<void>;\n cancel(): void;\n };\n}\n\ninterface PdfDocumentProxy {\n numPages: number;\n getPage(pageNumber: number): Promise<PdfPageProxy>;\n destroy(): void;\n}\n\ninterface PageState {\n element: HTMLDivElement;\n rendered: boolean;\n rendering: boolean;\n renderTask: { cancel(): void } | null;\n}\n\ninterface PdfRendererProps {\n url: string;\n zoom: number;\n currentPage: number;\n onPageChange: (page: number) => void;\n onTotalPagesChange: (total: number) => void;\n onPageWidthChange?: (width: number) => void;\n}\n\nexport const PdfRenderer: React.FC<PdfRendererProps> = ({\n url,\n zoom,\n currentPage,\n onPageChange,\n onTotalPagesChange,\n onPageWidthChange,\n}) => {\n const t = useTranslator();\n const [numPages, setNumPages] = useState<number>(0);\n const [error, setError] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState<boolean>(true);\n const containerRef = useRef<HTMLDivElement>(null);\n const pdfDocRef = useRef<PdfDocumentProxy | null>(null);\n const pageStatesRef = useRef<Map<number, PageState>>(new Map());\n const observerRef = useRef<IntersectionObserver | null>(null);\n\n // 渲染单个页面\n const renderPage = useCallback(async (pageNumber: number, scale: number) => {\n if (!pdfDocRef.current) return;\n const state = pageStatesRef.current.get(pageNumber);\n if (!state || state.rendering) return;\n\n state.rendering = true;\n\n try {\n const page = await pdfDocRef.current.getPage(pageNumber);\n const viewport = page.getViewport({ scale });\n\n const canvas = document.createElement('canvas');\n canvas.width = viewport.width;\n canvas.height = viewport.height;\n canvas.style.maxWidth = '100%';\n canvas.style.height = 'auto';\n canvas.style.borderRadius = '0';\n canvas.style.display = 'block';\n\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const renderTask = page.render({ canvasContext: ctx, viewport });\n state.renderTask = renderTask;\n await renderTask.promise;\n\n // 上报第一页原始宽度\n if (pageNumber === 1 && onPageWidthChange) {\n const baseViewport = page.getViewport({ scale: 1 });\n onPageWidthChange(baseViewport.width);\n }\n\n state.element.innerHTML = '';\n state.element.appendChild(canvas);\n\n // 页码标签\n const label = document.createElement('div');\n label.textContent = String(pageNumber);\n label.className = 'rfp-absolute rfp-top-2 rfp-right-2 rfp-bg-surface-nav-hover rfp-backdrop-blur-sm rfp-text-fg-primary rfp-text-xs rfp-px-3 rfp-py-1 rfp-rounded-full';\n state.element.appendChild(label);\n\n state.rendered = true;\n } catch (err: any) {\n if (err?.name !== 'RenderingCancelledException') {\n console.error(`渲染页面 ${pageNumber} 失败:`, err);\n }\n } finally {\n state.rendering = false;\n state.renderTask = null;\n }\n }, [onPageWidthChange]);\n\n // 清理页面 canvas\n const clearPageCanvas = useCallback((pageNumber: number) => {\n const state = pageStatesRef.current.get(pageNumber);\n if (!state) return;\n\n // 取消正在进行的渲染\n if (state.renderTask) {\n state.renderTask.cancel();\n state.renderTask = null;\n }\n\n // 清理 canvas\n const canvas = state.element.querySelector('canvas');\n if (canvas) {\n const ctx = canvas.getContext('2d');\n if (ctx) {\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n }\n canvas.remove();\n }\n\n state.element.innerHTML = '';\n state.rendered = false;\n state.rendering = false;\n }, []);\n\n // 初始化页面占位符\n const initPagePlaceholders = useCallback(() => {\n if (!pdfDocRef.current || !containerRef.current) return;\n\n const wrapper = containerRef.current.querySelector('.pdf-pages') as HTMLDivElement | null;\n if (!wrapper) return;\n\n wrapper.innerHTML = '';\n pageStatesRef.current.clear();\n\n for (let i = 1; i <= numPages; i++) {\n const pageDiv = document.createElement('div');\n pageDiv.className = 'rfp-relative rfp-flex rfp-justify-center rfp-min-h-[800px]';\n pageDiv.setAttribute('data-page-number', String(i));\n wrapper.appendChild(pageDiv);\n\n pageStatesRef.current.set(i, {\n element: pageDiv,\n rendered: false,\n rendering: false,\n renderTask: null,\n });\n\n // 观察页面元素\n if (observerRef.current) {\n observerRef.current.observe(pageDiv);\n }\n }\n }, [numPages]);\n\n // 加载 PDF 文档\n const loadPdf = useCallback(async () => {\n setError(null);\n setIsLoading(true);\n setNumPages(0);\n\n if (pdfDocRef.current) {\n try {\n pdfDocRef.current.destroy();\n } catch {\n // ignore\n }\n pdfDocRef.current = null;\n }\n\n try {\n const loadingTask = pdfjsLib.getDocument({ url });\n pdfDocRef.current = (await loadingTask.promise) as PdfDocumentProxy;\n const total = pdfDocRef.current.numPages;\n\n setNumPages(total);\n onTotalPagesChange(total);\n onPageChange(1);\n setIsLoading(false);\n } catch (err) {\n console.error('PDF 加载错误:', err);\n setError(t('pdf.load_failed'));\n setIsLoading(false);\n }\n }, [url, onTotalPagesChange, onPageChange, t]);\n\n // 滚动处理\n const handleScroll = useCallback(() => {\n if (!containerRef.current || pageStatesRef.current.size === 0) return;\n\n const container = containerRef.current;\n const scrollTop = container.scrollTop;\n const containerHeight = container.clientHeight;\n const scrollCenter = scrollTop + containerHeight / 2;\n\n let currentVisiblePage = 1;\n let minDistance = Infinity;\n\n pageStatesRef.current.forEach((state, pageNumber) => {\n const rect = state.element.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect();\n const pageCenter = rect.top - containerRect.top + rect.height / 2 + scrollTop;\n const distance = Math.abs(pageCenter - scrollCenter);\n\n if (distance < minDistance) {\n minDistance = distance;\n currentVisiblePage = pageNumber;\n }\n });\n\n if (currentVisiblePage !== currentPage) {\n onPageChange(currentVisiblePage);\n }\n }, [currentPage, onPageChange]);\n\n // 初始化 IntersectionObserver\n useEffect(() => {\n observerRef.current = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n const pageNumber = Number(entry.target.getAttribute('data-page-number'));\n if (!pageNumber) return;\n\n if (entry.isIntersecting) {\n // 页面进入视口,渲染\n renderPage(pageNumber, zoom);\n } else {\n // 页面离开视口,清理\n const state = pageStatesRef.current.get(pageNumber);\n if (state && state.rendered) {\n clearPageCanvas(pageNumber);\n }\n }\n });\n },\n {\n root: containerRef.current,\n rootMargin: '500px 0px',\n threshold: 0,\n }\n );\n\n return () => {\n if (observerRef.current) {\n observerRef.current.disconnect();\n observerRef.current = null;\n }\n };\n }, [zoom, renderPage, clearPageCanvas]);\n\n // 监听 URL 变化\n useEffect(() => {\n // 只有 URL 有效时才加载(避免空字符串或已 revoke 的 blob URL)\n if (url) {\n loadPdf();\n }\n }, [url, loadPdf]);\n\n // 监听 numPages 变化,初始化占位符\n useEffect(() => {\n if (numPages > 0) {\n // 等待 DOM 更新后初始化占位符\n setTimeout(() => {\n initPagePlaceholders();\n }, 0);\n }\n }, [numPages, initPagePlaceholders]);\n\n // 监听 zoom 变化(防抖)\n useEffect(() => {\n const timer = setTimeout(() => {\n // 清理所有已渲染页面\n pageStatesRef.current.forEach((state, pageNumber) => {\n if (state.rendered) {\n clearPageCanvas(pageNumber);\n }\n });\n\n // 触发重新渲染\n if (observerRef.current && containerRef.current) {\n pageStatesRef.current.forEach((state) => {\n observerRef.current?.unobserve(state.element);\n observerRef.current?.observe(state.element);\n });\n }\n }, 150);\n\n return () => clearTimeout(timer);\n }, [zoom, clearPageCanvas]);\n\n // 监听滚动事件\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n container.addEventListener('scroll', handleScroll);\n return () => container.removeEventListener('scroll', handleScroll);\n }, [handleScroll]);\n\n // 清理\n useEffect(() => {\n return () => {\n // 清理所有渲染任务\n pageStatesRef.current.forEach((state) => {\n if (state.renderTask) {\n state.renderTask.cancel();\n }\n });\n pageStatesRef.current.clear();\n\n if (pdfDocRef.current) {\n try {\n pdfDocRef.current.destroy();\n } catch {\n // ignore\n }\n pdfDocRef.current = null;\n }\n };\n }, []);\n\n return (\n <div\n ref={containerRef}\n className=\"rfp-flex rfp-flex-col rfp-items-center rfp-w-full rfp-h-full rfp-overflow-auto rfp-py-4 md:rfp-py-8 rfp-px-2 md:rfp-px-4\"\n >\n {error && (\n <RendererError message={error} />\n )}\n\n {!error && isLoading && (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-min-h-screen\">\n <div className=\"rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n )}\n\n {!error && !isLoading && (\n <div className=\"pdf-pages rfp-flex rfp-flex-col rfp-gap-4\" />\n )}\n\n {/* 底部页码指示器 */}\n {numPages > 0 && (\n <div className=\"rfp-sticky rfp-bottom-2 md:rfp-bottom-4 rfp-mt-4 md:rfp-mt-8 rfp-bg-surface-nav-hover rfp-backdrop-blur-xl rfp-text-fg-primary rfp-px-4 rfp-py-2 md:rfp-px-6 md:rfp-py-3 rfp-rounded-full rfp-text-xs md:rfp-text-sm rfp-font-medium rfp-shadow-2xl rfp-border rfp-border-line-weak\">\n 第 {currentPage} 页 / 共 {numPages} 页\n </div>\n )}\n </div>\n );\n};\n"],"names":["PdfRenderer","url","zoom","currentPage","onPageChange","onTotalPagesChange","onPageWidthChange","t","useTranslator","numPages","setNumPages","useState","error","setError","isLoading","setIsLoading","containerRef","useRef","pdfDocRef","pageStatesRef","observerRef","renderPage","useCallback","pageNumber","scale","state","page","viewport","canvas","ctx","renderTask","baseViewport","label","err","clearPageCanvas","initPagePlaceholders","wrapper","i","pageDiv","loadPdf","loadingTask","pdfjsLib","total","handleScroll","container","scrollTop","containerHeight","scrollCenter","currentVisiblePage","minDistance","rect","containerRect","pageCenter","distance","useEffect","entries","entry","timer","_a","_b","jsxs","jsx","RendererError"],"mappings":"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"}
1
+ {"version":3,"file":"index-DAo4n3Mq.mjs","sources":["../../src/renderers/Pdf/index.tsx"],"sourcesContent":["import { useState, useEffect, useRef, useCallback } from 'react';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { RendererError } from '../RendererError';\n// @ts-ignore - pdfjs-dist 类型路径\nimport * as pdfjsLib from 'pdfjs-dist/build/pdf.mjs';\n\ninterface PdfPageProxy {\n getViewport(opts: { scale: number }): { width: number; height: number };\n render(opts: { canvasContext: CanvasRenderingContext2D; viewport: { width: number; height: number } }): {\n promise: Promise<void>;\n cancel(): void;\n };\n}\n\ninterface PdfDocumentProxy {\n numPages: number;\n getPage(pageNumber: number): Promise<PdfPageProxy>;\n destroy(): void;\n}\n\ninterface PageState {\n element: HTMLDivElement;\n rendered: boolean;\n rendering: boolean;\n renderTask: { cancel(): void } | null;\n}\n\ninterface PdfRendererProps {\n url: string;\n zoom: number;\n currentPage: number;\n onPageChange: (page: number) => void;\n onTotalPagesChange: (total: number) => void;\n onPageWidthChange?: (width: number) => void;\n}\n\nexport const PdfRenderer: React.FC<PdfRendererProps> = ({\n url,\n zoom,\n currentPage,\n onPageChange,\n onTotalPagesChange,\n onPageWidthChange,\n}) => {\n const t = useTranslator();\n const [numPages, setNumPages] = useState<number>(0);\n const [error, setError] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState<boolean>(true);\n const containerRef = useRef<HTMLDivElement>(null);\n const pdfDocRef = useRef<PdfDocumentProxy | null>(null);\n const pageStatesRef = useRef<Map<number, PageState>>(new Map());\n const observerRef = useRef<IntersectionObserver | null>(null);\n\n // 渲染单个页面\n const renderPage = useCallback(async (pageNumber: number, scale: number) => {\n if (!pdfDocRef.current) return;\n const state = pageStatesRef.current.get(pageNumber);\n if (!state || state.rendering) return;\n\n state.rendering = true;\n\n try {\n const page = await pdfDocRef.current.getPage(pageNumber);\n const viewport = page.getViewport({ scale });\n\n const canvas = document.createElement('canvas');\n canvas.width = viewport.width;\n canvas.height = viewport.height;\n canvas.style.maxWidth = '100%';\n canvas.style.height = 'auto';\n canvas.style.borderRadius = '0';\n canvas.style.display = 'block';\n\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const renderTask = page.render({ canvasContext: ctx, viewport });\n state.renderTask = renderTask;\n await renderTask.promise;\n\n // 上报第一页原始宽度\n if (pageNumber === 1 && onPageWidthChange) {\n const baseViewport = page.getViewport({ scale: 1 });\n onPageWidthChange(baseViewport.width);\n }\n\n state.element.innerHTML = '';\n state.element.appendChild(canvas);\n\n // 页码标签\n const label = document.createElement('div');\n label.textContent = String(pageNumber);\n label.className = 'rfp-absolute rfp-top-2 rfp-right-2 rfp-bg-surface-nav-hover rfp-backdrop-blur-sm rfp-text-fg-primary rfp-text-xs rfp-px-3 rfp-py-1 rfp-rounded-full';\n state.element.appendChild(label);\n\n state.rendered = true;\n } catch (err: any) {\n if (err?.name !== 'RenderingCancelledException') {\n console.error(`渲染页面 ${pageNumber} 失败:`, err);\n }\n } finally {\n state.rendering = false;\n state.renderTask = null;\n }\n }, [onPageWidthChange]);\n\n // 清理页面 canvas\n const clearPageCanvas = useCallback((pageNumber: number) => {\n const state = pageStatesRef.current.get(pageNumber);\n if (!state) return;\n\n // 取消正在进行的渲染\n if (state.renderTask) {\n state.renderTask.cancel();\n state.renderTask = null;\n }\n\n // 清理 canvas\n const canvas = state.element.querySelector('canvas');\n if (canvas) {\n const ctx = canvas.getContext('2d');\n if (ctx) {\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n }\n canvas.remove();\n }\n\n state.element.innerHTML = '';\n state.rendered = false;\n state.rendering = false;\n }, []);\n\n // 初始化页面占位符\n const initPagePlaceholders = useCallback(() => {\n if (!pdfDocRef.current || !containerRef.current) return;\n\n const wrapper = containerRef.current.querySelector('.pdf-pages') as HTMLDivElement | null;\n if (!wrapper) return;\n\n wrapper.innerHTML = '';\n pageStatesRef.current.clear();\n\n for (let i = 1; i <= numPages; i++) {\n const pageDiv = document.createElement('div');\n pageDiv.className = 'rfp-relative rfp-flex rfp-justify-center rfp-min-h-[800px]';\n pageDiv.setAttribute('data-page-number', String(i));\n wrapper.appendChild(pageDiv);\n\n pageStatesRef.current.set(i, {\n element: pageDiv,\n rendered: false,\n rendering: false,\n renderTask: null,\n });\n\n // 观察页面元素\n if (observerRef.current) {\n observerRef.current.observe(pageDiv);\n }\n }\n }, [numPages]);\n\n // 加载 PDF 文档\n const loadPdf = useCallback(async () => {\n setError(null);\n setIsLoading(true);\n setNumPages(0);\n\n if (pdfDocRef.current) {\n try {\n pdfDocRef.current.destroy();\n } catch {\n // ignore\n }\n pdfDocRef.current = null;\n }\n\n try {\n const loadingTask = pdfjsLib.getDocument({ url });\n pdfDocRef.current = (await loadingTask.promise) as PdfDocumentProxy;\n const total = pdfDocRef.current.numPages;\n\n setNumPages(total);\n onTotalPagesChange(total);\n onPageChange(1);\n setIsLoading(false);\n } catch (err) {\n console.error('PDF 加载错误:', err);\n setError(t('pdf.load_failed'));\n setIsLoading(false);\n }\n }, [url, onTotalPagesChange, onPageChange, t]);\n\n // 滚动处理\n const handleScroll = useCallback(() => {\n if (!containerRef.current || pageStatesRef.current.size === 0) return;\n\n const container = containerRef.current;\n const scrollTop = container.scrollTop;\n const containerHeight = container.clientHeight;\n const scrollCenter = scrollTop + containerHeight / 2;\n\n let currentVisiblePage = 1;\n let minDistance = Infinity;\n\n pageStatesRef.current.forEach((state, pageNumber) => {\n const rect = state.element.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect();\n const pageCenter = rect.top - containerRect.top + rect.height / 2 + scrollTop;\n const distance = Math.abs(pageCenter - scrollCenter);\n\n if (distance < minDistance) {\n minDistance = distance;\n currentVisiblePage = pageNumber;\n }\n });\n\n if (currentVisiblePage !== currentPage) {\n onPageChange(currentVisiblePage);\n }\n }, [currentPage, onPageChange]);\n\n // 初始化 IntersectionObserver\n useEffect(() => {\n observerRef.current = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n const pageNumber = Number(entry.target.getAttribute('data-page-number'));\n if (!pageNumber) return;\n\n if (entry.isIntersecting) {\n // 页面进入视口,渲染\n renderPage(pageNumber, zoom);\n } else {\n // 页面离开视口,清理\n const state = pageStatesRef.current.get(pageNumber);\n if (state && state.rendered) {\n clearPageCanvas(pageNumber);\n }\n }\n });\n },\n {\n root: containerRef.current,\n rootMargin: '500px 0px',\n threshold: 0,\n }\n );\n\n return () => {\n if (observerRef.current) {\n observerRef.current.disconnect();\n observerRef.current = null;\n }\n };\n }, [zoom, renderPage, clearPageCanvas]);\n\n // 监听 URL 变化\n useEffect(() => {\n // 只有 URL 有效时才加载(避免空字符串或已 revoke 的 blob URL)\n if (url) {\n loadPdf();\n }\n }, [url, loadPdf]);\n\n // 监听 numPages 变化,初始化占位符\n useEffect(() => {\n if (numPages > 0) {\n // 等待 DOM 更新后初始化占位符\n setTimeout(() => {\n initPagePlaceholders();\n }, 0);\n }\n }, [numPages, initPagePlaceholders]);\n\n // 监听 zoom 变化(防抖)\n useEffect(() => {\n const timer = setTimeout(() => {\n // 清理所有已渲染页面\n pageStatesRef.current.forEach((state, pageNumber) => {\n if (state.rendered) {\n clearPageCanvas(pageNumber);\n }\n });\n\n // 触发重新渲染\n if (observerRef.current && containerRef.current) {\n pageStatesRef.current.forEach((state) => {\n observerRef.current?.unobserve(state.element);\n observerRef.current?.observe(state.element);\n });\n }\n }, 150);\n\n return () => clearTimeout(timer);\n }, [zoom, clearPageCanvas]);\n\n // 监听滚动事件\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n container.addEventListener('scroll', handleScroll);\n return () => container.removeEventListener('scroll', handleScroll);\n }, [handleScroll]);\n\n // 清理\n useEffect(() => {\n return () => {\n // 清理所有渲染任务\n pageStatesRef.current.forEach((state) => {\n if (state.renderTask) {\n state.renderTask.cancel();\n }\n });\n pageStatesRef.current.clear();\n\n if (pdfDocRef.current) {\n try {\n pdfDocRef.current.destroy();\n } catch {\n // ignore\n }\n pdfDocRef.current = null;\n }\n };\n }, []);\n\n return (\n <div\n ref={containerRef}\n className=\"rfp-flex rfp-flex-col rfp-items-center rfp-w-full rfp-h-full rfp-overflow-auto rfp-py-4 md:rfp-py-8 rfp-px-2 md:rfp-px-4\"\n >\n {error && (\n <RendererError message={error} />\n )}\n\n {!error && isLoading && (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-min-h-screen\">\n <div className=\"rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n )}\n\n {!error && !isLoading && (\n <div className=\"pdf-pages rfp-flex rfp-flex-col rfp-gap-4\" />\n )}\n\n {/* 底部页码指示器 */}\n {numPages > 0 && (\n <div className=\"rfp-sticky rfp-bottom-2 md:rfp-bottom-4 rfp-mt-4 md:rfp-mt-8 rfp-bg-surface-nav-hover rfp-backdrop-blur-xl rfp-text-fg-primary rfp-px-4 rfp-py-2 md:rfp-px-6 md:rfp-py-3 rfp-rounded-full rfp-text-xs md:rfp-text-sm rfp-font-medium rfp-shadow-2xl rfp-border rfp-border-line-weak\">\n 第 {currentPage} 页 / 共 {numPages} 页\n </div>\n )}\n </div>\n );\n};\n"],"names":["PdfRenderer","url","zoom","currentPage","onPageChange","onTotalPagesChange","onPageWidthChange","t","useTranslator","numPages","setNumPages","useState","error","setError","isLoading","setIsLoading","containerRef","useRef","pdfDocRef","pageStatesRef","observerRef","renderPage","useCallback","pageNumber","scale","state","page","viewport","canvas","ctx","renderTask","baseViewport","label","err","clearPageCanvas","initPagePlaceholders","wrapper","i","pageDiv","loadPdf","loadingTask","pdfjsLib","total","handleScroll","container","scrollTop","containerHeight","scrollCenter","currentVisiblePage","minDistance","rect","containerRect","pageCenter","distance","useEffect","entries","entry","timer","_a","_b","jsxs","jsx","RendererError"],"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-BCbSb9Ob.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-DCTwUpKS.mjs.map