@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
@@ -1 +1 @@
1
- {"version":3,"file":"index-C8CyS_sj.mjs","sources":["../../src/renderers/Markdown/index.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport remarkMath from 'remark-math';\nimport rehypeKatex from 'rehype-katex';\nimport rehypeRaw from 'rehype-raw';\nimport { Copy, Check } from 'lucide-react';\nimport { fetchTextUtf8 } from '@eternalheart/file-preview-core';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { useFetcher } from '../../RequestContext';\nimport { useShikiHighlight } from '../../hooks/useShikiHighlight';\nimport { RendererError } from '../RendererError';\nimport 'katex/dist/katex.min.css';\n\ninterface MarkdownRendererProps {\n url: string;\n viewMode?: 'preview' | 'source';\n}\n\nconst useCopy = (text: string) => {\n const [copied, setCopied] = useState(false);\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(text);\n } catch {\n const textarea = document.createElement('textarea');\n textarea.value = text;\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand('copy');\n document.body.removeChild(textarea);\n }\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }, [text]);\n return { copied, handleCopy };\n};\n\n/** 内联版复制按钮:放在代码块 header 行内,始终可见 */\nconst InlineCopyButton = ({ text }: { text: string }) => {\n const t = useTranslator();\n const { copied, handleCopy } = useCopy(text);\n return (\n <button\n onClick={handleCopy}\n className=\"rfp-p-1 rfp-rounded rfp-text-fg-muted hover:rfp-text-fg-secondary rfp-transition-colors rfp-flex rfp-items-center rfp-gap-1\"\n title={copied ? t('markdown.copied') : t('markdown.copy_code')}\n >\n {copied ? <Check size={13} /> : <Copy size={13} />}\n </button>\n );\n};\n\n/** 浮动版复制按钮:无 header 时绝对定位于代码块右上角(hover 显示) */\nconst FloatingCopyButton = ({ text }: { text: string }) => {\n const t = useTranslator();\n const { copied, handleCopy } = useCopy(text);\n return (\n <button\n onClick={handleCopy}\n className=\"rfp-absolute rfp-top-2 rfp-right-2 rfp-p-1.5 rfp-rounded-md rfp-bg-surface-2 hover:rfp-bg-surface-3 rfp-text-fg-tertiary hover:rfp-text-fg-secondary rfp-transition-colors rfp-opacity-0 group-hover:rfp-opacity-100 rfp-border rfp-border-line\"\n title={copied ? t('markdown.copied') : t('markdown.copy_code')}\n >\n {copied ? <Check size={14} /> : <Copy size={14} />}\n </button>\n );\n};\n\n/** 带语言标注的代码块:shiki 高亮 + header + 复制按钮 */\nconst ShikiCodeBlock = ({ code, lang }: { code: string; lang: string }) => {\n const { html } = useShikiHighlight(code, lang);\n return (\n <div className=\"rfp-relative rfp-group rfp-my-4\">\n <div className=\"rfp-flex rfp-items-center rfp-justify-between rfp-px-4 rfp-py-1.5 rfp-bg-surface-1 rfp-border rfp-border-line-weak rfp-rounded-t-md rfp-border-b-0\">\n <span className=\"rfp-text-xs rfp-text-fg-secondary rfp-font-mono rfp-select-none\">{lang}</span>\n <InlineCopyButton text={code} />\n </div>\n {html ? (\n <div\n className=\"rfp-shiki-wrapper rfp-rounded-b-md rfp-border rfp-border-line-weak rfp-border-t-0 rfp-overflow-x-auto\"\n dangerouslySetInnerHTML={{ __html: html }}\n />\n ) : (\n <pre\n className=\"rfp-m-0 rfp-rounded-b-md rfp-border rfp-border-line-weak rfp-border-t-0 rfp-overflow-x-auto rfp-p-4 rfp-bg-code-bg\"\n style={{ fontSize: '13px', lineHeight: '1.5' }}\n >\n <code className=\"rfp-font-mono rfp-text-code-fg rfp-text-sm\">{code}</code>\n </pre>\n )}\n </div>\n );\n};\n\nexport const MarkdownRenderer: React.FC<MarkdownRendererProps> = ({ url, viewMode = 'preview' }) => {\n const t = useTranslator();\n const fetcher = useFetcher();\n const [content, setContent] = useState<string>('');\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const { html: sourceHtml } = useShikiHighlight(\n viewMode === 'source' ? content : '',\n 'markdown',\n );\n\n useEffect(() => {\n const controller = new AbortController();\n const loadMarkdown = async () => {\n try {\n setLoading(true);\n setError(null);\n const text = await fetchTextUtf8(url, { fetcher, signal: controller.signal });\n setContent(text);\n } catch (err: any) {\n if (err.name === 'AbortError') return;\n setError(t('markdown.load_failed'));\n console.error(err);\n } finally {\n setLoading(false);\n }\n };\n\n loadMarkdown();\n return () => controller.abort();\n }, [url, fetcher, t]);\n\n if (loading) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n );\n }\n\n if (error) {\n return <RendererError message={error} />;\n }\n\n // 源码视图\n if (viewMode === 'source') {\n return (\n <div className=\"rfp-w-full rfp-h-full rfp-overflow-auto rfp-bg-code-bg\">\n {sourceHtml ? (\n <div\n className=\"rfp-shiki-wrapper with-line-numbers\"\n dangerouslySetInnerHTML={{ __html: sourceHtml }}\n />\n ) : (\n <pre className=\"rfp-p-6 rfp-text-fg-primary rfp-font-mono rfp-text-sm rfp-whitespace-pre-wrap rfp-break-words\">\n {content}\n </pre>\n )}\n </div>\n );\n }\n\n // 预览视图\n return (\n <div className=\"rfp-w-full rfp-h-full rfp-overflow-auto rfp-p-6 md:rfp-p-10\">\n <div className=\"rfp-max-w-full md:rfp-max-w-4xl rfp-mx-auto\">\n <ReactMarkdown\n remarkPlugins={[remarkGfm, remarkMath]}\n rehypePlugins={[rehypeRaw, rehypeKatex]}\n components={{\n code({ node, inline, className, children, ...props }: any) {\n const match = /language-(\\w+)/.exec(className || '');\n const codeString = String(children).replace(/\\n$/, '');\n // react-markdown v9 不再传 inline,需要兜底判断:\n // 无语言 className 且不含换行视为内联代码\n const isInline = inline ?? (!match && !codeString.includes('\\n'));\n\n // 行内代码 - 返回纯 <code>\n if (isInline) {\n return (\n <code\n className=\"rfp-bg-surface-2 rfp-px-1.5 rfp-py-0.5 rfp-rounded rfp-text-sm rfp-font-mono rfp-text-fg-primary rfp-border rfp-border-line-weak\"\n {...props}\n >\n {children}\n </code>\n );\n }\n\n // 代码块 - 有语言标注\n if (match) {\n return <ShikiCodeBlock code={codeString} lang={match[1]} />;\n }\n\n // 代码块 - 无语言标注\n return (\n <div className=\"rfp-relative rfp-group rfp-my-4\">\n <FloatingCopyButton text={codeString} />\n <pre\n className=\"rfp-m-0 rfp-rounded-md rfp-border rfp-border-line-weak rfp-overflow-x-auto rfp-p-4 rfp-bg-code-bg\"\n style={{ fontSize: '13px', lineHeight: '1.5' }}\n >\n <code className=\"rfp-font-mono rfp-text-code-fg rfp-text-sm\">{children}</code>\n </pre>\n </div>\n );\n },\n h1: ({ children }) => (\n <h1 className=\"rfp-text-3xl rfp-font-semibold rfp-mb-4 rfp-mt-6 rfp-text-fg-primary first:rfp-mt-0\">\n {children}\n </h1>\n ),\n h2: ({ children }) => (\n <h2 className=\"rfp-text-2xl rfp-font-semibold rfp-mb-3 rfp-mt-8 rfp-text-fg-primary\">\n {children}\n </h2>\n ),\n h3: ({ children }) => (\n <h3 className=\"rfp-text-xl rfp-font-semibold rfp-mb-2 rfp-mt-6 rfp-text-fg-primary\">{children}</h3>\n ),\n h4: ({ children }) => (\n <h4 className=\"rfp-text-lg rfp-font-semibold rfp-mb-2 rfp-mt-4 rfp-text-fg-primary\">{children}</h4>\n ),\n p: ({ children }) => (\n <p className=\"rfp-text-fg-secondary rfp-mb-4 rfp-leading-7 rfp-text-base\">{children}</p>\n ),\n a: ({ href, children }) => (\n <a\n href={href}\n className=\"rfp-text-indigo-400 hover:rfp-text-indigo-300 rfp-underline rfp-decoration-indigo-600 hover:rfp-decoration-indigo-400\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {children}\n </a>\n ),\n ul: ({ children }) => (\n <ul className=\"rfp-list-disc rfp-pl-6 rfp-mb-4 rfp-text-fg-secondary rfp-space-y-1\">{children}</ul>\n ),\n ol: ({ children }) => (\n <ol className=\"rfp-list-decimal rfp-pl-6 rfp-mb-4 rfp-text-fg-secondary rfp-space-y-1\">{children}</ol>\n ),\n li: ({ children }) => <li className=\"rfp-leading-7\">{children}</li>,\n blockquote: ({ children }) => (\n <blockquote className=\"rfp-border-l-4 rfp-border-line-strong rfp-pl-4 rfp-text-fg-tertiary rfp-my-4 rfp-italic\">\n {children}\n </blockquote>\n ),\n table: ({ children }) => (\n <div className=\"rfp-overflow-x-auto rfp-my-4 rfp-rounded-md rfp-border rfp-border-line\">\n <table className=\"rfp-min-w-full rfp-divide-y rfp-divide-divide\">{children}</table>\n </div>\n ),\n thead: ({ children }) => <thead className=\"rfp-bg-surface-1\">{children}</thead>,\n tbody: ({ children }) => (\n <tbody className=\"rfp-divide-y rfp-divide-divide rfp-bg-transparent\">{children}</tbody>\n ),\n tr: ({ children }) => (\n <tr className=\"hover:rfp-bg-surface-1 rfp-transition-colors\">{children}</tr>\n ),\n th: ({ children }) => (\n <th className=\"rfp-px-4 rfp-py-3 rfp-text-left rfp-text-xs rfp-font-semibold rfp-text-fg-tertiary rfp-uppercase rfp-tracking-wider\">\n {children}\n </th>\n ),\n td: ({ children }) => (\n <td className=\"rfp-px-4 rfp-py-3 rfp-text-sm rfp-text-fg-secondary\">{children}</td>\n ),\n hr: () => <hr className=\"rfp-border-line rfp-my-6\" />,\n img: ({ src, alt }) => (\n <img\n src={src}\n alt={alt}\n className=\"rfp-rounded-md rfp-max-w-full rfp-h-auto rfp-my-4 rfp-mx-auto rfp-block rfp-shadow-sm\"\n />\n ),\n input: ({ type, checked, ...props }) => {\n if (type === 'checkbox') {\n return (\n <input\n type=\"checkbox\"\n checked={checked}\n readOnly\n className=\"rfp-mr-2 rfp-rounded rfp-border-line\"\n {...props}\n />\n );\n }\n return <input type={type} {...props} />;\n },\n strong: ({ children }) => (\n <strong className=\"rfp-font-semibold rfp-text-fg-primary\">{children}</strong>\n ),\n em: ({ children }) => <em className=\"rfp-italic\">{children}</em>,\n del: ({ children }) => (\n <del className=\"rfp-text-fg-muted rfp-line-through\">{children}</del>\n ),\n }}\n >\n {content}\n </ReactMarkdown>\n </div>\n </div>\n );\n};\n"],"names":["useCopy","text","copied","setCopied","useState","handleCopy","useCallback","textarea","InlineCopyButton","t","useTranslator","jsx","Check","Copy","FloatingCopyButton","ShikiCodeBlock","code","lang","html","useShikiHighlight","jsxs","MarkdownRenderer","url","viewMode","fetcher","useFetcher","content","setContent","loading","setLoading","error","setError","sourceHtml","useEffect","controller","fetchTextUtf8","err","RendererError","ReactMarkdown","remarkGfm","remarkMath","rehypeRaw","rehypeKatex","node","inline","className","children","props","match","codeString","href","src","alt","type","checked"],"mappings":"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"}
1
+ {"version":3,"file":"index-CRn7LdHD.mjs","sources":["../../src/renderers/Markdown/index.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport remarkMath from 'remark-math';\nimport rehypeKatex from 'rehype-katex';\nimport rehypeRaw from 'rehype-raw';\nimport { Copy, Check } from 'lucide-react';\nimport { fetchTextUtf8 } from '@eternalheart/file-preview-core';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { useFetcher } from '../../RequestContext';\nimport { useShikiHighlight } from '../../hooks/useShikiHighlight';\nimport { RendererError } from '../RendererError';\nimport 'katex/dist/katex.min.css';\n\ninterface MarkdownRendererProps {\n url: string;\n viewMode?: 'preview' | 'source';\n}\n\nconst useCopy = (text: string) => {\n const [copied, setCopied] = useState(false);\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(text);\n } catch {\n const textarea = document.createElement('textarea');\n textarea.value = text;\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand('copy');\n document.body.removeChild(textarea);\n }\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }, [text]);\n return { copied, handleCopy };\n};\n\n/** 内联版复制按钮:放在代码块 header 行内,始终可见 */\nconst InlineCopyButton = ({ text }: { text: string }) => {\n const t = useTranslator();\n const { copied, handleCopy } = useCopy(text);\n return (\n <button\n onClick={handleCopy}\n className=\"rfp-p-1 rfp-rounded rfp-text-fg-muted hover:rfp-text-fg-secondary rfp-transition-colors rfp-flex rfp-items-center rfp-gap-1\"\n title={copied ? t('markdown.copied') : t('markdown.copy_code')}\n >\n {copied ? <Check size={13} /> : <Copy size={13} />}\n </button>\n );\n};\n\n/** 浮动版复制按钮:无 header 时绝对定位于代码块右上角(hover 显示) */\nconst FloatingCopyButton = ({ text }: { text: string }) => {\n const t = useTranslator();\n const { copied, handleCopy } = useCopy(text);\n return (\n <button\n onClick={handleCopy}\n className=\"rfp-absolute rfp-top-2 rfp-right-2 rfp-p-1.5 rfp-rounded-md rfp-bg-surface-2 hover:rfp-bg-surface-3 rfp-text-fg-tertiary hover:rfp-text-fg-secondary rfp-transition-colors rfp-opacity-0 group-hover:rfp-opacity-100 rfp-border rfp-border-line\"\n title={copied ? t('markdown.copied') : t('markdown.copy_code')}\n >\n {copied ? <Check size={14} /> : <Copy size={14} />}\n </button>\n );\n};\n\n/** 带语言标注的代码块:shiki 高亮 + header + 复制按钮 */\nconst ShikiCodeBlock = ({ code, lang }: { code: string; lang: string }) => {\n const { html } = useShikiHighlight(code, lang);\n return (\n <div className=\"rfp-relative rfp-group rfp-my-4\">\n <div className=\"rfp-flex rfp-items-center rfp-justify-between rfp-px-4 rfp-py-1.5 rfp-bg-surface-1 rfp-border rfp-border-line-weak rfp-rounded-t-md rfp-border-b-0\">\n <span className=\"rfp-text-xs rfp-text-fg-secondary rfp-font-mono rfp-select-none\">{lang}</span>\n <InlineCopyButton text={code} />\n </div>\n {html ? (\n <div\n className=\"rfp-shiki-wrapper rfp-rounded-b-md rfp-border rfp-border-line-weak rfp-border-t-0 rfp-overflow-x-auto\"\n dangerouslySetInnerHTML={{ __html: html }}\n />\n ) : (\n <pre\n className=\"rfp-m-0 rfp-rounded-b-md rfp-border rfp-border-line-weak rfp-border-t-0 rfp-overflow-x-auto rfp-p-4 rfp-bg-code-bg\"\n style={{ fontSize: '13px', lineHeight: '1.5' }}\n >\n <code className=\"rfp-font-mono rfp-text-code-fg rfp-text-sm\">{code}</code>\n </pre>\n )}\n </div>\n );\n};\n\nexport const MarkdownRenderer: React.FC<MarkdownRendererProps> = ({ url, viewMode = 'preview' }) => {\n const t = useTranslator();\n const fetcher = useFetcher();\n const [content, setContent] = useState<string>('');\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const { html: sourceHtml } = useShikiHighlight(\n viewMode === 'source' ? content : '',\n 'markdown',\n );\n\n useEffect(() => {\n const controller = new AbortController();\n const loadMarkdown = async () => {\n try {\n setLoading(true);\n setError(null);\n const text = await fetchTextUtf8(url, { fetcher, signal: controller.signal });\n setContent(text);\n } catch (err: any) {\n if (err.name === 'AbortError') return;\n setError(t('markdown.load_failed'));\n console.error(err);\n } finally {\n setLoading(false);\n }\n };\n\n loadMarkdown();\n return () => controller.abort();\n }, [url, fetcher, t]);\n\n if (loading) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n );\n }\n\n if (error) {\n return <RendererError message={error} />;\n }\n\n // 源码视图\n if (viewMode === 'source') {\n return (\n <div className=\"rfp-w-full rfp-h-full rfp-overflow-auto rfp-bg-code-bg\">\n {sourceHtml ? (\n <div\n className=\"rfp-shiki-wrapper with-line-numbers\"\n dangerouslySetInnerHTML={{ __html: sourceHtml }}\n />\n ) : (\n <pre className=\"rfp-p-6 rfp-text-fg-primary rfp-font-mono rfp-text-sm rfp-whitespace-pre-wrap rfp-break-words\">\n {content}\n </pre>\n )}\n </div>\n );\n }\n\n // 预览视图\n return (\n <div className=\"rfp-w-full rfp-h-full rfp-overflow-auto rfp-p-6 md:rfp-p-10\">\n <div className=\"rfp-max-w-full md:rfp-max-w-4xl rfp-mx-auto\">\n <ReactMarkdown\n remarkPlugins={[remarkGfm, remarkMath]}\n rehypePlugins={[rehypeRaw, rehypeKatex]}\n components={{\n code({ node, inline, className, children, ...props }: any) {\n const match = /language-(\\w+)/.exec(className || '');\n const codeString = String(children).replace(/\\n$/, '');\n // react-markdown v9 不再传 inline,需要兜底判断:\n // 无语言 className 且不含换行视为内联代码\n const isInline = inline ?? (!match && !codeString.includes('\\n'));\n\n // 行内代码 - 返回纯 <code>\n if (isInline) {\n return (\n <code\n className=\"rfp-bg-surface-2 rfp-px-1.5 rfp-py-0.5 rfp-rounded rfp-text-sm rfp-font-mono rfp-text-fg-primary rfp-border rfp-border-line-weak\"\n {...props}\n >\n {children}\n </code>\n );\n }\n\n // 代码块 - 有语言标注\n if (match) {\n return <ShikiCodeBlock code={codeString} lang={match[1]} />;\n }\n\n // 代码块 - 无语言标注\n return (\n <div className=\"rfp-relative rfp-group rfp-my-4\">\n <FloatingCopyButton text={codeString} />\n <pre\n className=\"rfp-m-0 rfp-rounded-md rfp-border rfp-border-line-weak rfp-overflow-x-auto rfp-p-4 rfp-bg-code-bg\"\n style={{ fontSize: '13px', lineHeight: '1.5' }}\n >\n <code className=\"rfp-font-mono rfp-text-code-fg rfp-text-sm\">{children}</code>\n </pre>\n </div>\n );\n },\n h1: ({ children }) => (\n <h1 className=\"rfp-text-3xl rfp-font-semibold rfp-mb-4 rfp-mt-6 rfp-text-fg-primary first:rfp-mt-0\">\n {children}\n </h1>\n ),\n h2: ({ children }) => (\n <h2 className=\"rfp-text-2xl rfp-font-semibold rfp-mb-3 rfp-mt-8 rfp-text-fg-primary\">\n {children}\n </h2>\n ),\n h3: ({ children }) => (\n <h3 className=\"rfp-text-xl rfp-font-semibold rfp-mb-2 rfp-mt-6 rfp-text-fg-primary\">{children}</h3>\n ),\n h4: ({ children }) => (\n <h4 className=\"rfp-text-lg rfp-font-semibold rfp-mb-2 rfp-mt-4 rfp-text-fg-primary\">{children}</h4>\n ),\n p: ({ children }) => (\n <p className=\"rfp-text-fg-secondary rfp-mb-4 rfp-leading-7 rfp-text-base\">{children}</p>\n ),\n a: ({ href, children }) => (\n <a\n href={href}\n className=\"rfp-text-indigo-400 hover:rfp-text-indigo-300 rfp-underline rfp-decoration-indigo-600 hover:rfp-decoration-indigo-400\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {children}\n </a>\n ),\n ul: ({ children }) => (\n <ul className=\"rfp-list-disc rfp-pl-6 rfp-mb-4 rfp-text-fg-secondary rfp-space-y-1\">{children}</ul>\n ),\n ol: ({ children }) => (\n <ol className=\"rfp-list-decimal rfp-pl-6 rfp-mb-4 rfp-text-fg-secondary rfp-space-y-1\">{children}</ol>\n ),\n li: ({ children }) => <li className=\"rfp-leading-7\">{children}</li>,\n blockquote: ({ children }) => (\n <blockquote className=\"rfp-border-l-4 rfp-border-line-strong rfp-pl-4 rfp-text-fg-tertiary rfp-my-4 rfp-italic\">\n {children}\n </blockquote>\n ),\n table: ({ children }) => (\n <div className=\"rfp-overflow-x-auto rfp-my-4 rfp-rounded-md rfp-border rfp-border-line\">\n <table className=\"rfp-min-w-full rfp-divide-y rfp-divide-divide\">{children}</table>\n </div>\n ),\n thead: ({ children }) => <thead className=\"rfp-bg-surface-1\">{children}</thead>,\n tbody: ({ children }) => (\n <tbody className=\"rfp-divide-y rfp-divide-divide rfp-bg-transparent\">{children}</tbody>\n ),\n tr: ({ children }) => (\n <tr className=\"hover:rfp-bg-surface-1 rfp-transition-colors\">{children}</tr>\n ),\n th: ({ children }) => (\n <th className=\"rfp-px-4 rfp-py-3 rfp-text-left rfp-text-xs rfp-font-semibold rfp-text-fg-tertiary rfp-uppercase rfp-tracking-wider\">\n {children}\n </th>\n ),\n td: ({ children }) => (\n <td className=\"rfp-px-4 rfp-py-3 rfp-text-sm rfp-text-fg-secondary\">{children}</td>\n ),\n hr: () => <hr className=\"rfp-border-line rfp-my-6\" />,\n img: ({ src, alt }) => (\n <img\n src={src}\n alt={alt}\n className=\"rfp-rounded-md rfp-max-w-full rfp-h-auto rfp-my-4 rfp-mx-auto rfp-block rfp-shadow-sm\"\n />\n ),\n input: ({ type, checked, ...props }) => {\n if (type === 'checkbox') {\n return (\n <input\n type=\"checkbox\"\n checked={checked}\n readOnly\n className=\"rfp-mr-2 rfp-rounded rfp-border-line\"\n {...props}\n />\n );\n }\n return <input type={type} {...props} />;\n },\n strong: ({ children }) => (\n <strong className=\"rfp-font-semibold rfp-text-fg-primary\">{children}</strong>\n ),\n em: ({ children }) => <em className=\"rfp-italic\">{children}</em>,\n del: ({ children }) => (\n <del className=\"rfp-text-fg-muted rfp-line-through\">{children}</del>\n ),\n }}\n >\n {content}\n </ReactMarkdown>\n </div>\n </div>\n );\n};\n"],"names":["useCopy","text","copied","setCopied","useState","handleCopy","useCallback","textarea","InlineCopyButton","t","useTranslator","jsx","Check","Copy","FloatingCopyButton","ShikiCodeBlock","code","lang","html","useShikiHighlight","jsxs","MarkdownRenderer","url","viewMode","fetcher","useFetcher","content","setContent","loading","setLoading","error","setError","sourceHtml","useEffect","controller","fetchTextUtf8","err","RendererError","ReactMarkdown","remarkGfm","remarkMath","rehypeRaw","rehypeKatex","node","inline","className","children","props","match","codeString","href","src","alt","type","checked"],"mappings":"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"}