@eternalheart/react-file-preview 1.5.0 → 1.5.1

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 (48) hide show
  1. package/lib/chunks/{index-FomaQSaL.mjs → index-BBYKNNLb.mjs} +2 -2
  2. package/lib/chunks/{index-FomaQSaL.mjs.map → index-BBYKNNLb.mjs.map} +1 -1
  3. package/lib/chunks/{index-Dc6q1OKl.mjs → index-BFh22D_W.mjs} +3 -3
  4. package/lib/chunks/{index-Dc6q1OKl.mjs.map → index-BFh22D_W.mjs.map} +1 -1
  5. package/lib/chunks/{index-_B5marES.mjs → index-BKXvtJh5.mjs} +2 -2
  6. package/lib/chunks/{index-_B5marES.mjs.map → index-BKXvtJh5.mjs.map} +1 -1
  7. package/lib/chunks/{index-CuWzRQZw.mjs → index-Bw3Fh4b5.mjs} +2 -2
  8. package/lib/chunks/{index-CuWzRQZw.mjs.map → index-Bw3Fh4b5.mjs.map} +1 -1
  9. package/lib/chunks/{index-D-Is8qvU.mjs → index-CEC_DHgr.mjs} +2 -2
  10. package/lib/chunks/{index-D-Is8qvU.mjs.map → index-CEC_DHgr.mjs.map} +1 -1
  11. package/lib/chunks/{index-CKdQL1Bk.mjs → index-COOUxB5e.mjs} +2 -2
  12. package/lib/chunks/{index-CKdQL1Bk.mjs.map → index-COOUxB5e.mjs.map} +1 -1
  13. package/lib/chunks/{index-Bdj8_B80.mjs → index-CU1Lc3lV.mjs} +3 -3
  14. package/lib/chunks/{index-Bdj8_B80.mjs.map → index-CU1Lc3lV.mjs.map} +1 -1
  15. package/lib/chunks/{index-Da3FN2-3.mjs → index-CgFv7B_G.mjs} +3 -3
  16. package/lib/chunks/{index-Da3FN2-3.mjs.map → index-CgFv7B_G.mjs.map} +1 -1
  17. package/lib/chunks/index-Cn4ZyhGM.mjs +587 -0
  18. package/lib/chunks/index-Cn4ZyhGM.mjs.map +1 -0
  19. package/lib/chunks/{index-OXjOFggq.mjs → index-DGNNEnWE.mjs} +2 -2
  20. package/lib/chunks/{index-OXjOFggq.mjs.map → index-DGNNEnWE.mjs.map} +1 -1
  21. package/lib/chunks/{index-CuTz7dbd.mjs → index-DLk08ylq.mjs} +2 -2
  22. package/lib/chunks/{index-CuTz7dbd.mjs.map → index-DLk08ylq.mjs.map} +1 -1
  23. package/lib/chunks/{index-WLepq2g2.mjs → index-DVtPyN-s.mjs} +3 -3
  24. package/lib/chunks/{index-WLepq2g2.mjs.map → index-DVtPyN-s.mjs.map} +1 -1
  25. package/lib/chunks/{index-Cz23v-TW.mjs → index-DreA69iU.mjs} +20 -20
  26. package/lib/chunks/{index-Cz23v-TW.mjs.map → index-DreA69iU.mjs.map} +1 -1
  27. package/lib/chunks/{index-CTghYlSh.mjs → index-Dta7iGov.mjs} +2 -2
  28. package/lib/chunks/{index-CTghYlSh.mjs.map → index-Dta7iGov.mjs.map} +1 -1
  29. package/lib/chunks/{index-CQYrhe7Z.mjs → index-fQGAUFAX.mjs} +2 -2
  30. package/lib/chunks/{index-CQYrhe7Z.mjs.map → index-fQGAUFAX.mjs.map} +1 -1
  31. package/lib/chunks/{index-DzCLf1Db.mjs → index-fSw6Hl5e.mjs} +2 -2
  32. package/lib/chunks/{index-DzCLf1Db.mjs.map → index-fSw6Hl5e.mjs.map} +1 -1
  33. package/lib/chunks/{index-2sX2d4iv.mjs → index-jvNrkVkp.mjs} +2 -2
  34. package/lib/chunks/{index-2sX2d4iv.mjs.map → index-jvNrkVkp.mjs.map} +1 -1
  35. package/lib/chunks/{index-CCcZzLUM.mjs → index-oVJyD-FV.mjs} +2 -2
  36. package/lib/chunks/{index-CCcZzLUM.mjs.map → index-oVJyD-FV.mjs.map} +1 -1
  37. package/lib/chunks/{index-CRZqNMQ7.mjs → index-vRLKumL8.mjs} +2 -2
  38. package/lib/chunks/{index-CRZqNMQ7.mjs.map → index-vRLKumL8.mjs.map} +1 -1
  39. package/lib/chunks/{useShikiHighlight-Bbs8Fbqs.mjs → useShikiHighlight-C6nJcETW.mjs} +2 -2
  40. package/lib/chunks/{useShikiHighlight-Bbs8Fbqs.mjs.map → useShikiHighlight-C6nJcETW.mjs.map} +1 -1
  41. package/lib/index.cjs +20 -20
  42. package/lib/index.cjs.map +1 -1
  43. package/lib/index.css +1 -1
  44. package/lib/index.mjs +1 -1
  45. package/lib/renderers/Audio/index.d.ts.map +1 -1
  46. package/package.json +1 -1
  47. package/lib/chunks/index-DoGKcq9y.mjs +0 -531
  48. package/lib/chunks/index-DoGKcq9y.mjs.map +0 -1
@@ -1,6 +1,6 @@
1
1
  import { jsx as o, jsxs as R } from "react/jsx-runtime";
2
2
  import { forwardRef as ce, useState as P, useRef as k, useCallback as l, useEffect as m, useImperativeHandle as ie } from "react";
3
- import { u as le } from "./index-Cz23v-TW.mjs";
3
+ import { u as le } from "./index-DreA69iU.mjs";
4
4
  import { R as fe } from "./RendererError-D5i8eSpN.mjs";
5
5
  import { Menu as ue, ChevronLeft as pe, ChevronRight as de, ZoomOut as me, ZoomIn as ge, RefreshCw as he, X as be } from "lucide-react";
6
6
  import * as ye from "pdfjs-dist/build/pdf.mjs";
@@ -310,4 +310,4 @@ const ke = ce(({
310
310
  export {
311
311
  ke as PdfRenderer
312
312
  };
313
- //# sourceMappingURL=index-CuTz7dbd.mjs.map
313
+ //# sourceMappingURL=index-DLk08ylq.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-CuTz7dbd.mjs","sources":["../../src/renderers/Pdf/index.tsx"],"sourcesContent":["import { useState, useEffect, useRef, useCallback, useImperativeHandle, forwardRef } from 'react';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { RendererError } from '../RendererError';\nimport { X, ZoomIn, ZoomOut, ChevronLeft, ChevronRight, Menu, RefreshCw } from 'lucide-react';\nimport type { RendererHandle } from '../base.types';\nimport type { ToolbarGroup } from '../toolbar.types';\n// @ts-ignore - pdfjs-dist 类型路径\nimport * as pdfjsLib from 'pdfjs-dist/build/pdf.mjs';\n\ninterface PdfOutlineItem {\n title: string;\n dest: any;\n items?: PdfOutlineItem[];\n}\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 getOutline(): Promise<PdfOutlineItem[] | null>;\n destroy(): void;\n}\n\ninterface PageState {\n element: HTMLDivElement;\n rendered: boolean;\n rendering: boolean;\n renderTask: { cancel(): void } | null;\n}\n\nexport interface PdfRendererHandle extends RendererHandle {\n // 可选的公开方法\n}\n\ninterface PdfRendererProps {\n url: string;\n}\n\nexport const PdfRenderer = forwardRef<PdfRendererHandle, PdfRendererProps>(({\n url,\n}, ref) => {\n const t = useTranslator();\n\n // 内部状态管理\n const [zoom, setZoom] = useState(1);\n const [currentPage, setCurrentPage] = useState(1);\n const [numPages, setNumPages] = useState<number>(0);\n const [showOutline, setShowOutline] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState<boolean>(true);\n const [outline, setOutline] = useState<PdfOutlineItem[]>([]);\n const [activeOutlineItem, setActiveOutlineItem] = useState<string | null>(null);\n const outlinePageMapRef = useRef<Map<string, number>>(new Map());\n const containerRef = useRef<HTMLDivElement>(null);\n const scrollContainerRef = 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 listenersRef = useRef<Set<() => void>>(new Set());\n const notifyToolbarChange = useCallback(() => {\n listenersRef.current.forEach(listener => listener());\n }, []);\n\n // 监听影响工具栏的状态变化\n useEffect(() => {\n notifyToolbarChange();\n }, [zoom, notifyToolbarChange]);\n\n useEffect(() => {\n notifyToolbarChange();\n }, [currentPage, notifyToolbarChange]);\n\n useEffect(() => {\n notifyToolbarChange();\n }, [numPages, notifyToolbarChange]);\n\n useEffect(() => {\n notifyToolbarChange();\n }, [outline.length, notifyToolbarChange]);\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 state.element.innerHTML = '';\n state.element.appendChild(canvas);\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 }, []);\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 // 构建大纲-页码映射\n const buildOutlinePageMap = async (items: PdfOutlineItem[], pdfDoc: PdfDocumentProxy, depth = 0) => {\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n const itemKey = `${item.title}-${i}-${depth}`;\n\n try {\n let pageNumber: number | null = null;\n const dest = item.dest;\n\n if (typeof dest === 'string') {\n const namedDest = await (pdfDoc as any).getDestination?.(dest);\n if (namedDest && namedDest[0] && typeof namedDest[0] === 'object') {\n pageNumber = await (pdfDoc as any).getPageIndex?.(namedDest[0]) + 1;\n }\n } else if (Array.isArray(dest) && dest[0] && typeof dest[0] === 'object') {\n pageNumber = await (pdfDoc as any).getPageIndex?.(dest[0]) + 1;\n }\n\n if (pageNumber !== null && pageNumber > 0) {\n outlinePageMapRef.current.set(itemKey, pageNumber);\n }\n\n if (item.items && item.items.length > 0) {\n await buildOutlinePageMap(item.items, pdfDoc, depth + 1);\n }\n } catch (err) {\n // 静默失败,某些大纲项可能无法映射到页码\n }\n }\n };\n\n // 根据当前页码更新激活的大纲项\n const updateActiveOutlineByPage = useCallback((page: number) => {\n let closestItem: string | null = null;\n let closestDistance = Infinity;\n\n outlinePageMapRef.current.forEach((itemPage, itemKey) => {\n if (itemPage <= page) {\n const distance = page - itemPage;\n if (distance < closestDistance) {\n closestDistance = distance;\n closestItem = itemKey;\n }\n }\n });\n\n if (closestItem !== activeOutlineItem) {\n setActiveOutlineItem(closestItem);\n }\n }, [activeOutlineItem]);\n\n // 监听页码变化,更新大纲高亮\n useEffect(() => {\n if (currentPage > 0 && outlinePageMapRef.current.size > 0) {\n updateActiveOutlineByPage(currentPage);\n }\n }, [currentPage, updateActiveOutlineByPage]);\n\n const initPagePlaceholders = useCallback(() => {\n if (!pdfDocRef.current || !scrollContainerRef.current) return;\n\n const wrapper = scrollContainerRef.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-pdf-page-placeholder rfp-relative rfp-flex rfp-justify-center';\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 setCurrentPage(1);\n\n // 提取大纲\n try {\n const outlineData = await pdfDocRef.current.getOutline();\n if (outlineData) {\n setOutline(outlineData);\n // 构建大纲-页码映射\n outlinePageMapRef.current.clear();\n await buildOutlinePageMap(outlineData, pdfDocRef.current);\n }\n } catch (err) {\n console.warn('PDF 大纲提取失败:', err);\n }\n\n setIsLoading(false);\n } catch (err) {\n console.error('PDF 加载错误:', err);\n setError(t('pdf.load_failed'));\n setIsLoading(false);\n }\n }, [url, t]);\n\n // 滚动处理\n const handleScroll = useCallback(() => {\n if (!scrollContainerRef.current || pageStatesRef.current.size === 0) return;\n\n const container = scrollContainerRef.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 setCurrentPage(currentVisiblePage);\n }\n }, [currentPage]);\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: scrollContainerRef.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 && scrollContainerRef.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 = scrollContainerRef.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 // 处理大纲点击跳转\n const handleOutlineClick = useCallback(async (dest: any, itemKey: string, onClose?: () => void) => {\n if (!pdfDocRef.current || !scrollContainerRef.current) return;\n\n try {\n let pageNumber: number;\n\n if (typeof dest === 'string') {\n // 命名目标\n const namedDest = await (pdfDocRef.current as any).getDestination(dest);\n if (namedDest && namedDest[0]) {\n const pageRef = namedDest[0];\n pageNumber = await (pdfDocRef.current as any).getPageIndex(pageRef) + 1;\n } else {\n return;\n }\n } else if (Array.isArray(dest) && dest[0]) {\n // 直接页面引用\n const pageRef = dest[0];\n pageNumber = await (pdfDocRef.current as any).getPageIndex(pageRef) + 1;\n } else {\n return;\n }\n\n // 设置激活项\n setActiveOutlineItem(itemKey);\n\n // 滚动到目标页面\n const pages = scrollContainerRef.current.querySelectorAll('[data-page-number]');\n const targetPage = pages[pageNumber - 1];\n if (targetPage) {\n targetPage.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n\n // 跳转后自动关闭侧边栏\n if (onClose) {\n setTimeout(() => onClose(), 300);\n }\n } catch (err) {\n console.error('大纲跳转失败:', err);\n }\n }, []);\n\n // 渲染大纲项\n const renderOutlineItems = (items: PdfOutlineItem[], depth = 0, onClose?: () => void): React.ReactNode => {\n return (\n <ul style={{ marginLeft: depth > 0 ? 16 : 0 }}>\n {items.map((item, i) => {\n const itemKey = `${item.title}-${i}-${depth}`;\n const isActive = activeOutlineItem === itemKey;\n return (\n <li key={itemKey}>\n <button\n onClick={() => handleOutlineClick(item.dest, itemKey, onClose)}\n className={`rfp-w-full rfp-text-left rfp-py-2 rfp-px-3 rfp-text-sm rfp-rounded rfp-transition-all rfp-truncate ${\n isActive\n ? 'rfp-bg-surface-2 rfp-text-fg-primary rfp-font-medium'\n : 'rfp-text-fg-secondary hover:rfp-text-fg-primary hover:rfp-bg-surface-2'\n }`}\n title={item.title}\n >\n {item.title}\n </button>\n {item.items && item.items.length > 0 && renderOutlineItems(item.items, depth + 1, onClose)}\n </li>\n );\n })}\n </ul>\n );\n };\n\n // 工具栏事件处理\n const handleZoomIn = useCallback(() => {\n setZoom(z => Math.min(z + 0.1, 3));\n }, []);\n\n const handleZoomOut = useCallback(() => {\n setZoom(z => Math.max(z - 0.1, 0.5));\n }, []);\n\n const handleReset = useCallback(() => {\n setZoom(1);\n }, []);\n\n const handlePrevPage = useCallback(() => {\n if (!scrollContainerRef.current) return;\n const container = scrollContainerRef.current;\n const pages = container.querySelectorAll('[data-page-number]');\n const targetPage = pages[Math.max(0, currentPage - 2)];\n if (targetPage) {\n targetPage.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n }, [currentPage]);\n\n const handleNextPage = useCallback(() => {\n if (!scrollContainerRef.current) return;\n const container = scrollContainerRef.current;\n const pages = container.querySelectorAll('[data-page-number]');\n const targetPage = pages[Math.min(pages.length - 1, currentPage)];\n if (targetPage) {\n targetPage.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n }, [currentPage, numPages]);\n\n const handleToggleOutline = useCallback(() => {\n setShowOutline(prev => !prev);\n }, []);\n\n // 工具栏配置\n const getToolbarGroups = useCallback((): ToolbarGroup[] => {\n const groups: ToolbarGroup[] = [];\n\n // 大纲按钮(如果有大纲)\n if (outline.length > 0) {\n groups.push({\n items: [\n { type: 'button', icon: <Menu className=\"rfp-w-4 rfp-h-4\" />, tooltip: t('toolbar.outline'), action: handleToggleOutline, active: showOutline },\n ],\n });\n }\n\n // 翻页\n groups.push({\n items: [\n { type: 'button', icon: <ChevronLeft className=\"rfp-w-4 rfp-h-4\" />, tooltip: t('toolbar.prev_page'), action: handlePrevPage, disabled: currentPage <= 1 },\n { type: 'text', content: `${currentPage} / ${numPages}`, minWidth: '4rem' },\n { type: 'button', icon: <ChevronRight className=\"rfp-w-4 rfp-h-4\" />, tooltip: t('toolbar.next_page'), action: handleNextPage, disabled: currentPage >= numPages },\n ],\n });\n\n // 缩放\n groups.push({\n items: [\n { type: 'button', icon: <ZoomOut className=\"rfp-w-4 rfp-h-4\" />, tooltip: t('toolbar.zoom_out'), action: handleZoomOut, disabled: zoom <= 0.5 },\n { type: 'text', content: `${Math.round(zoom * 100)}%`, minWidth: '3rem' },\n { type: 'button', icon: <ZoomIn className=\"rfp-w-4 rfp-h-4\" />, tooltip: t('toolbar.zoom_in'), action: handleZoomIn, disabled: zoom >= 3 },\n ],\n });\n\n // 重置\n groups.push({\n items: [\n { type: 'button', icon: <RefreshCw className=\"rfp-w-4 rfp-h-4\" />, tooltip: t('toolbar.reset'), action: handleReset },\n ],\n });\n\n return groups;\n }, [zoom, currentPage, numPages, showOutline, outline.length, t, handleZoomIn, handleZoomOut, handlePrevPage, handleNextPage, handleToggleOutline, handleReset]);\n\n // 暴露接口给父组件\n useImperativeHandle(ref, () => ({\n getToolbarGroups,\n onToolbarChange: (listener: () => void) => {\n listenersRef.current.add(listener);\n return () => listenersRef.current.delete(listener);\n },\n }), [getToolbarGroups]);\n\n return (\n <div ref={containerRef} className=\"rfp-relative rfp-w-full rfp-h-full\">\n {/* 大纲侧边栏 */}\n {outline.length > 0 && (\n <div\n className=\"rfp-absolute rfp-inset-0 rfp-z-20 rfp-flex rfp-transition-opacity rfp-duration-300\"\n style={{\n opacity: showOutline ? 1 : 0,\n pointerEvents: showOutline ? 'auto' : 'none',\n }}\n >\n <div\n className=\"rfp-w-72 rfp-max-w-[80%] rfp-h-full rfp-bg-surface-overlay rfp-backdrop-blur-xl rfp-border-r rfp-border-line-weak rfp-flex rfp-flex-col rfp-shadow-2xl rfp-transition-transform rfp-duration-300\"\n style={{ transform: showOutline ? 'translateX(0)' : 'translateX(-100%)' }}\n >\n <div className=\"rfp-flex rfp-items-center rfp-justify-between rfp-px-4 rfp-py-3 rfp-border-b rfp-border-line-weak rfp-flex-shrink-0\">\n <span className=\"rfp-text-fg-primary rfp-font-medium rfp-text-sm\">{t('toolbar.outline')}</span>\n <button\n onClick={() => setShowOutline(false)}\n className=\"rfp-text-fg-tertiary hover:rfp-text-fg-primary rfp-transition-colors\"\n >\n <X className=\"rfp-w-4 rfp-h-4\" />\n </button>\n </div>\n <div className=\"rfp-flex-1 rfp-overflow-y-auto rfp-py-4 rfp-px-1\">\n {renderOutlineItems(outline, 0, () => setShowOutline(false))}\n </div>\n </div>\n <div\n className=\"rfp-flex-1 rfp-transition-opacity rfp-duration-300\"\n style={{ background: showOutline ? 'rgba(0,0,0,0.3)' : 'transparent' }}\n onClick={() => setShowOutline(false)}\n />\n </div>\n )}\n\n <div\n ref={scrollContainerRef}\n className=\"rfp-pdf-container rfp-w-full rfp-h-full rfp-overflow-auto rfp-py-6 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 && (\n <div className=\"rfp-flex rfp-flex-col rfp-items-center\">\n <div className=\"pdf-pages rfp-flex rfp-flex-col rfp-gap-4\" />\n </div>\n )}\n </div>\n </div>\n );\n});\n"],"names":["PdfRenderer","forwardRef","url","ref","t","useTranslator","zoom","setZoom","useState","currentPage","setCurrentPage","numPages","setNumPages","showOutline","setShowOutline","error","setError","isLoading","setIsLoading","outline","setOutline","activeOutlineItem","setActiveOutlineItem","outlinePageMapRef","useRef","containerRef","scrollContainerRef","pdfDocRef","pageStatesRef","observerRef","listenersRef","notifyToolbarChange","useCallback","listener","useEffect","renderPage","pageNumber","scale","state","page","viewport","canvas","ctx","renderTask","err","clearPageCanvas","buildOutlinePageMap","items","pdfDoc","depth","i","item","itemKey","dest","namedDest","_a","_b","_c","updateActiveOutlineByPage","closestItem","closestDistance","itemPage","distance","initPagePlaceholders","wrapper","pageDiv","loadPdf","loadingTask","pdfjsLib","total","outlineData","handleScroll","container","scrollTop","containerHeight","scrollCenter","currentVisiblePage","minDistance","rect","containerRect","pageCenter","entries","entry","timer","handleOutlineClick","onClose","pageRef","targetPage","renderOutlineItems","jsx","handleZoomIn","z","handleZoomOut","handleReset","handlePrevPage","handleNextPage","pages","handleToggleOutline","prev","getToolbarGroups","groups","Menu","ChevronLeft","ChevronRight","ZoomOut","ZoomIn","RefreshCw","useImperativeHandle","jsxs","X","RendererError"],"mappings":"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"}
1
+ {"version":3,"file":"index-DLk08ylq.mjs","sources":["../../src/renderers/Pdf/index.tsx"],"sourcesContent":["import { useState, useEffect, useRef, useCallback, useImperativeHandle, forwardRef } from 'react';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { RendererError } from '../RendererError';\nimport { X, ZoomIn, ZoomOut, ChevronLeft, ChevronRight, Menu, RefreshCw } from 'lucide-react';\nimport type { RendererHandle } from '../base.types';\nimport type { ToolbarGroup } from '../toolbar.types';\n// @ts-ignore - pdfjs-dist 类型路径\nimport * as pdfjsLib from 'pdfjs-dist/build/pdf.mjs';\n\ninterface PdfOutlineItem {\n title: string;\n dest: any;\n items?: PdfOutlineItem[];\n}\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 getOutline(): Promise<PdfOutlineItem[] | null>;\n destroy(): void;\n}\n\ninterface PageState {\n element: HTMLDivElement;\n rendered: boolean;\n rendering: boolean;\n renderTask: { cancel(): void } | null;\n}\n\nexport interface PdfRendererHandle extends RendererHandle {\n // 可选的公开方法\n}\n\ninterface PdfRendererProps {\n url: string;\n}\n\nexport const PdfRenderer = forwardRef<PdfRendererHandle, PdfRendererProps>(({\n url,\n}, ref) => {\n const t = useTranslator();\n\n // 内部状态管理\n const [zoom, setZoom] = useState(1);\n const [currentPage, setCurrentPage] = useState(1);\n const [numPages, setNumPages] = useState<number>(0);\n const [showOutline, setShowOutline] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState<boolean>(true);\n const [outline, setOutline] = useState<PdfOutlineItem[]>([]);\n const [activeOutlineItem, setActiveOutlineItem] = useState<string | null>(null);\n const outlinePageMapRef = useRef<Map<string, number>>(new Map());\n const containerRef = useRef<HTMLDivElement>(null);\n const scrollContainerRef = 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 listenersRef = useRef<Set<() => void>>(new Set());\n const notifyToolbarChange = useCallback(() => {\n listenersRef.current.forEach(listener => listener());\n }, []);\n\n // 监听影响工具栏的状态变化\n useEffect(() => {\n notifyToolbarChange();\n }, [zoom, notifyToolbarChange]);\n\n useEffect(() => {\n notifyToolbarChange();\n }, [currentPage, notifyToolbarChange]);\n\n useEffect(() => {\n notifyToolbarChange();\n }, [numPages, notifyToolbarChange]);\n\n useEffect(() => {\n notifyToolbarChange();\n }, [outline.length, notifyToolbarChange]);\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 state.element.innerHTML = '';\n state.element.appendChild(canvas);\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 }, []);\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 // 构建大纲-页码映射\n const buildOutlinePageMap = async (items: PdfOutlineItem[], pdfDoc: PdfDocumentProxy, depth = 0) => {\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n const itemKey = `${item.title}-${i}-${depth}`;\n\n try {\n let pageNumber: number | null = null;\n const dest = item.dest;\n\n if (typeof dest === 'string') {\n const namedDest = await (pdfDoc as any).getDestination?.(dest);\n if (namedDest && namedDest[0] && typeof namedDest[0] === 'object') {\n pageNumber = await (pdfDoc as any).getPageIndex?.(namedDest[0]) + 1;\n }\n } else if (Array.isArray(dest) && dest[0] && typeof dest[0] === 'object') {\n pageNumber = await (pdfDoc as any).getPageIndex?.(dest[0]) + 1;\n }\n\n if (pageNumber !== null && pageNumber > 0) {\n outlinePageMapRef.current.set(itemKey, pageNumber);\n }\n\n if (item.items && item.items.length > 0) {\n await buildOutlinePageMap(item.items, pdfDoc, depth + 1);\n }\n } catch (err) {\n // 静默失败,某些大纲项可能无法映射到页码\n }\n }\n };\n\n // 根据当前页码更新激活的大纲项\n const updateActiveOutlineByPage = useCallback((page: number) => {\n let closestItem: string | null = null;\n let closestDistance = Infinity;\n\n outlinePageMapRef.current.forEach((itemPage, itemKey) => {\n if (itemPage <= page) {\n const distance = page - itemPage;\n if (distance < closestDistance) {\n closestDistance = distance;\n closestItem = itemKey;\n }\n }\n });\n\n if (closestItem !== activeOutlineItem) {\n setActiveOutlineItem(closestItem);\n }\n }, [activeOutlineItem]);\n\n // 监听页码变化,更新大纲高亮\n useEffect(() => {\n if (currentPage > 0 && outlinePageMapRef.current.size > 0) {\n updateActiveOutlineByPage(currentPage);\n }\n }, [currentPage, updateActiveOutlineByPage]);\n\n const initPagePlaceholders = useCallback(() => {\n if (!pdfDocRef.current || !scrollContainerRef.current) return;\n\n const wrapper = scrollContainerRef.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-pdf-page-placeholder rfp-relative rfp-flex rfp-justify-center';\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 setCurrentPage(1);\n\n // 提取大纲\n try {\n const outlineData = await pdfDocRef.current.getOutline();\n if (outlineData) {\n setOutline(outlineData);\n // 构建大纲-页码映射\n outlinePageMapRef.current.clear();\n await buildOutlinePageMap(outlineData, pdfDocRef.current);\n }\n } catch (err) {\n console.warn('PDF 大纲提取失败:', err);\n }\n\n setIsLoading(false);\n } catch (err) {\n console.error('PDF 加载错误:', err);\n setError(t('pdf.load_failed'));\n setIsLoading(false);\n }\n }, [url, t]);\n\n // 滚动处理\n const handleScroll = useCallback(() => {\n if (!scrollContainerRef.current || pageStatesRef.current.size === 0) return;\n\n const container = scrollContainerRef.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 setCurrentPage(currentVisiblePage);\n }\n }, [currentPage]);\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: scrollContainerRef.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 && scrollContainerRef.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 = scrollContainerRef.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 // 处理大纲点击跳转\n const handleOutlineClick = useCallback(async (dest: any, itemKey: string, onClose?: () => void) => {\n if (!pdfDocRef.current || !scrollContainerRef.current) return;\n\n try {\n let pageNumber: number;\n\n if (typeof dest === 'string') {\n // 命名目标\n const namedDest = await (pdfDocRef.current as any).getDestination(dest);\n if (namedDest && namedDest[0]) {\n const pageRef = namedDest[0];\n pageNumber = await (pdfDocRef.current as any).getPageIndex(pageRef) + 1;\n } else {\n return;\n }\n } else if (Array.isArray(dest) && dest[0]) {\n // 直接页面引用\n const pageRef = dest[0];\n pageNumber = await (pdfDocRef.current as any).getPageIndex(pageRef) + 1;\n } else {\n return;\n }\n\n // 设置激活项\n setActiveOutlineItem(itemKey);\n\n // 滚动到目标页面\n const pages = scrollContainerRef.current.querySelectorAll('[data-page-number]');\n const targetPage = pages[pageNumber - 1];\n if (targetPage) {\n targetPage.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n\n // 跳转后自动关闭侧边栏\n if (onClose) {\n setTimeout(() => onClose(), 300);\n }\n } catch (err) {\n console.error('大纲跳转失败:', err);\n }\n }, []);\n\n // 渲染大纲项\n const renderOutlineItems = (items: PdfOutlineItem[], depth = 0, onClose?: () => void): React.ReactNode => {\n return (\n <ul style={{ marginLeft: depth > 0 ? 16 : 0 }}>\n {items.map((item, i) => {\n const itemKey = `${item.title}-${i}-${depth}`;\n const isActive = activeOutlineItem === itemKey;\n return (\n <li key={itemKey}>\n <button\n onClick={() => handleOutlineClick(item.dest, itemKey, onClose)}\n className={`rfp-w-full rfp-text-left rfp-py-2 rfp-px-3 rfp-text-sm rfp-rounded rfp-transition-all rfp-truncate ${\n isActive\n ? 'rfp-bg-surface-2 rfp-text-fg-primary rfp-font-medium'\n : 'rfp-text-fg-secondary hover:rfp-text-fg-primary hover:rfp-bg-surface-2'\n }`}\n title={item.title}\n >\n {item.title}\n </button>\n {item.items && item.items.length > 0 && renderOutlineItems(item.items, depth + 1, onClose)}\n </li>\n );\n })}\n </ul>\n );\n };\n\n // 工具栏事件处理\n const handleZoomIn = useCallback(() => {\n setZoom(z => Math.min(z + 0.1, 3));\n }, []);\n\n const handleZoomOut = useCallback(() => {\n setZoom(z => Math.max(z - 0.1, 0.5));\n }, []);\n\n const handleReset = useCallback(() => {\n setZoom(1);\n }, []);\n\n const handlePrevPage = useCallback(() => {\n if (!scrollContainerRef.current) return;\n const container = scrollContainerRef.current;\n const pages = container.querySelectorAll('[data-page-number]');\n const targetPage = pages[Math.max(0, currentPage - 2)];\n if (targetPage) {\n targetPage.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n }, [currentPage]);\n\n const handleNextPage = useCallback(() => {\n if (!scrollContainerRef.current) return;\n const container = scrollContainerRef.current;\n const pages = container.querySelectorAll('[data-page-number]');\n const targetPage = pages[Math.min(pages.length - 1, currentPage)];\n if (targetPage) {\n targetPage.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n }, [currentPage, numPages]);\n\n const handleToggleOutline = useCallback(() => {\n setShowOutline(prev => !prev);\n }, []);\n\n // 工具栏配置\n const getToolbarGroups = useCallback((): ToolbarGroup[] => {\n const groups: ToolbarGroup[] = [];\n\n // 大纲按钮(如果有大纲)\n if (outline.length > 0) {\n groups.push({\n items: [\n { type: 'button', icon: <Menu className=\"rfp-w-4 rfp-h-4\" />, tooltip: t('toolbar.outline'), action: handleToggleOutline, active: showOutline },\n ],\n });\n }\n\n // 翻页\n groups.push({\n items: [\n { type: 'button', icon: <ChevronLeft className=\"rfp-w-4 rfp-h-4\" />, tooltip: t('toolbar.prev_page'), action: handlePrevPage, disabled: currentPage <= 1 },\n { type: 'text', content: `${currentPage} / ${numPages}`, minWidth: '4rem' },\n { type: 'button', icon: <ChevronRight className=\"rfp-w-4 rfp-h-4\" />, tooltip: t('toolbar.next_page'), action: handleNextPage, disabled: currentPage >= numPages },\n ],\n });\n\n // 缩放\n groups.push({\n items: [\n { type: 'button', icon: <ZoomOut className=\"rfp-w-4 rfp-h-4\" />, tooltip: t('toolbar.zoom_out'), action: handleZoomOut, disabled: zoom <= 0.5 },\n { type: 'text', content: `${Math.round(zoom * 100)}%`, minWidth: '3rem' },\n { type: 'button', icon: <ZoomIn className=\"rfp-w-4 rfp-h-4\" />, tooltip: t('toolbar.zoom_in'), action: handleZoomIn, disabled: zoom >= 3 },\n ],\n });\n\n // 重置\n groups.push({\n items: [\n { type: 'button', icon: <RefreshCw className=\"rfp-w-4 rfp-h-4\" />, tooltip: t('toolbar.reset'), action: handleReset },\n ],\n });\n\n return groups;\n }, [zoom, currentPage, numPages, showOutline, outline.length, t, handleZoomIn, handleZoomOut, handlePrevPage, handleNextPage, handleToggleOutline, handleReset]);\n\n // 暴露接口给父组件\n useImperativeHandle(ref, () => ({\n getToolbarGroups,\n onToolbarChange: (listener: () => void) => {\n listenersRef.current.add(listener);\n return () => listenersRef.current.delete(listener);\n },\n }), [getToolbarGroups]);\n\n return (\n <div ref={containerRef} className=\"rfp-relative rfp-w-full rfp-h-full\">\n {/* 大纲侧边栏 */}\n {outline.length > 0 && (\n <div\n className=\"rfp-absolute rfp-inset-0 rfp-z-20 rfp-flex rfp-transition-opacity rfp-duration-300\"\n style={{\n opacity: showOutline ? 1 : 0,\n pointerEvents: showOutline ? 'auto' : 'none',\n }}\n >\n <div\n className=\"rfp-w-72 rfp-max-w-[80%] rfp-h-full rfp-bg-surface-overlay rfp-backdrop-blur-xl rfp-border-r rfp-border-line-weak rfp-flex rfp-flex-col rfp-shadow-2xl rfp-transition-transform rfp-duration-300\"\n style={{ transform: showOutline ? 'translateX(0)' : 'translateX(-100%)' }}\n >\n <div className=\"rfp-flex rfp-items-center rfp-justify-between rfp-px-4 rfp-py-3 rfp-border-b rfp-border-line-weak rfp-flex-shrink-0\">\n <span className=\"rfp-text-fg-primary rfp-font-medium rfp-text-sm\">{t('toolbar.outline')}</span>\n <button\n onClick={() => setShowOutline(false)}\n className=\"rfp-text-fg-tertiary hover:rfp-text-fg-primary rfp-transition-colors\"\n >\n <X className=\"rfp-w-4 rfp-h-4\" />\n </button>\n </div>\n <div className=\"rfp-flex-1 rfp-overflow-y-auto rfp-py-4 rfp-px-1\">\n {renderOutlineItems(outline, 0, () => setShowOutline(false))}\n </div>\n </div>\n <div\n className=\"rfp-flex-1 rfp-transition-opacity rfp-duration-300\"\n style={{ background: showOutline ? 'rgba(0,0,0,0.3)' : 'transparent' }}\n onClick={() => setShowOutline(false)}\n />\n </div>\n )}\n\n <div\n ref={scrollContainerRef}\n className=\"rfp-pdf-container rfp-w-full rfp-h-full rfp-overflow-auto rfp-py-6 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 && (\n <div className=\"rfp-flex rfp-flex-col rfp-items-center\">\n <div className=\"pdf-pages rfp-flex rfp-flex-col rfp-gap-4\" />\n </div>\n )}\n </div>\n </div>\n );\n});\n"],"names":["PdfRenderer","forwardRef","url","ref","t","useTranslator","zoom","setZoom","useState","currentPage","setCurrentPage","numPages","setNumPages","showOutline","setShowOutline","error","setError","isLoading","setIsLoading","outline","setOutline","activeOutlineItem","setActiveOutlineItem","outlinePageMapRef","useRef","containerRef","scrollContainerRef","pdfDocRef","pageStatesRef","observerRef","listenersRef","notifyToolbarChange","useCallback","listener","useEffect","renderPage","pageNumber","scale","state","page","viewport","canvas","ctx","renderTask","err","clearPageCanvas","buildOutlinePageMap","items","pdfDoc","depth","i","item","itemKey","dest","namedDest","_a","_b","_c","updateActiveOutlineByPage","closestItem","closestDistance","itemPage","distance","initPagePlaceholders","wrapper","pageDiv","loadPdf","loadingTask","pdfjsLib","total","outlineData","handleScroll","container","scrollTop","containerHeight","scrollCenter","currentVisiblePage","minDistance","rect","containerRect","pageCenter","entries","entry","timer","handleOutlineClick","onClose","pageRef","targetPage","renderOutlineItems","jsx","handleZoomIn","z","handleZoomOut","handleReset","handlePrevPage","handleNextPage","pages","handleToggleOutline","prev","getToolbarGroups","groups","Menu","ChevronLeft","ChevronRight","ZoomOut","ZoomIn","RefreshCw","useImperativeHandle","jsxs","X","RendererError"],"mappings":"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"}
@@ -6,8 +6,8 @@ import F from "remark-math";
6
6
  import G from "rehype-katex";
7
7
  import P from "rehype-raw";
8
8
  import { Code as V, Eye as K, Check as S, Copy as z } from "lucide-react";
9
- import { u as g, a as O, z as $ } from "./index-Cz23v-TW.mjs";
10
- import { u as R } from "./useShikiHighlight-Bbs8Fbqs.mjs";
9
+ import { u as g, a as O, z as $ } from "./index-DreA69iU.mjs";
10
+ import { u as R } from "./useShikiHighlight-C6nJcETW.mjs";
11
11
  import { R as D } from "./RendererError-D5i8eSpN.mjs";
12
12
  const T = (o) => {
13
13
  const [p, t] = i(!1), a = c(async () => {
@@ -197,4 +197,4 @@ const T = (o) => {
197
197
  export {
198
198
  sr as MarkdownRenderer
199
199
  };
200
- //# sourceMappingURL=index-WLepq2g2.mjs.map
200
+ //# sourceMappingURL=index-DVtPyN-s.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-WLepq2g2.mjs","sources":["../../src/renderers/Markdown/index.tsx"],"sourcesContent":["import { useState, useEffect, useCallback, forwardRef, useImperativeHandle, useRef } 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, Eye, Code } 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 type { RendererHandle } from '../base.types';\nimport type { ToolbarGroup } from '../toolbar.types';\nimport 'katex/dist/katex.min.css';\n\ninterface MarkdownRendererProps {\n url: string;\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 = forwardRef<RendererHandle, MarkdownRendererProps>(({ url }, ref) => {\n const t = useTranslator();\n const fetcher = useFetcher();\n\n // 内部状态管理\n const [content, setContent] = useState<string>('');\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [viewMode, setViewMode] = useState<'preview' | 'source'>('preview');\n\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 // 事件发射器:用于通知主组件工具栏状态变化\n const listenersRef = useRef<Set<() => void>>(new Set());\n const notifyToolbarChange = useCallback(() => {\n listenersRef.current.forEach(listener => listener());\n }, []);\n\n // 监听影响工具栏的状态变化\n useEffect(() => {\n notifyToolbarChange();\n }, [viewMode, notifyToolbarChange]);\n\n // 切换视图模式\n const toggleViewMode = useCallback(() => {\n setViewMode(prev => prev === 'preview' ? 'source' : 'preview');\n }, []);\n\n // 工具栏配置\n const getToolbarGroups = useCallback((): ToolbarGroup[] => [\n {\n items: [\n {\n type: 'button',\n icon: viewMode === 'preview' ? <Code className=\"rfp-w-4 rfp-h-4\" /> : <Eye className=\"rfp-w-4 rfp-h-4\" />,\n tooltip: viewMode === 'preview' ? t('toolbar.source') : t('toolbar.preview'),\n action: toggleViewMode,\n active: viewMode === 'source',\n },\n ],\n },\n ], [viewMode, t, toggleViewMode]);\n\n // 暴露接口给父组件\n useImperativeHandle(ref, () => ({\n getToolbarGroups,\n onToolbarChange: (listener: () => void) => {\n listenersRef.current.add(listener);\n return () => listenersRef.current.delete(listener);\n },\n }), [getToolbarGroups]);\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-py-6 rfp-px-4\">\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 );\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","forwardRef","url","ref","fetcher","useFetcher","content","setContent","loading","setLoading","error","setError","viewMode","setViewMode","sourceHtml","useEffect","controller","fetchTextUtf8","err","listenersRef","useRef","notifyToolbarChange","listener","toggleViewMode","prev","getToolbarGroups","Code","Eye","useImperativeHandle","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-DVtPyN-s.mjs","sources":["../../src/renderers/Markdown/index.tsx"],"sourcesContent":["import { useState, useEffect, useCallback, forwardRef, useImperativeHandle, useRef } 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, Eye, Code } 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 type { RendererHandle } from '../base.types';\nimport type { ToolbarGroup } from '../toolbar.types';\nimport 'katex/dist/katex.min.css';\n\ninterface MarkdownRendererProps {\n url: string;\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 = forwardRef<RendererHandle, MarkdownRendererProps>(({ url }, ref) => {\n const t = useTranslator();\n const fetcher = useFetcher();\n\n // 内部状态管理\n const [content, setContent] = useState<string>('');\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [viewMode, setViewMode] = useState<'preview' | 'source'>('preview');\n\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 // 事件发射器:用于通知主组件工具栏状态变化\n const listenersRef = useRef<Set<() => void>>(new Set());\n const notifyToolbarChange = useCallback(() => {\n listenersRef.current.forEach(listener => listener());\n }, []);\n\n // 监听影响工具栏的状态变化\n useEffect(() => {\n notifyToolbarChange();\n }, [viewMode, notifyToolbarChange]);\n\n // 切换视图模式\n const toggleViewMode = useCallback(() => {\n setViewMode(prev => prev === 'preview' ? 'source' : 'preview');\n }, []);\n\n // 工具栏配置\n const getToolbarGroups = useCallback((): ToolbarGroup[] => [\n {\n items: [\n {\n type: 'button',\n icon: viewMode === 'preview' ? <Code className=\"rfp-w-4 rfp-h-4\" /> : <Eye className=\"rfp-w-4 rfp-h-4\" />,\n tooltip: viewMode === 'preview' ? t('toolbar.source') : t('toolbar.preview'),\n action: toggleViewMode,\n active: viewMode === 'source',\n },\n ],\n },\n ], [viewMode, t, toggleViewMode]);\n\n // 暴露接口给父组件\n useImperativeHandle(ref, () => ({\n getToolbarGroups,\n onToolbarChange: (listener: () => void) => {\n listenersRef.current.add(listener);\n return () => listenersRef.current.delete(listener);\n },\n }), [getToolbarGroups]);\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-py-6 rfp-px-4\">\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 );\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","forwardRef","url","ref","fetcher","useFetcher","content","setContent","loading","setLoading","error","setError","viewMode","setViewMode","sourceHtml","useEffect","controller","fetchTextUtf8","err","listenersRef","useRef","notifyToolbarChange","listener","toggleViewMode","prev","getToolbarGroups","Code","Eye","useImperativeHandle","RendererError","ReactMarkdown","remarkGfm","remarkMath","rehypeRaw","rehypeKatex","node","inline","className","children","props","match","codeString","href","src","alt","type","checked"],"mappings":"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"}
@@ -8,7 +8,7 @@ import { motion as V, AnimatePresence as Ee } from "framer-motion";
8
8
  import Me from "jszip";
9
9
  import { FileQuestion as ze, Download as J, X as Le, AlertCircle as Se, RotateCw as De, ChevronLeft as Ue, ChevronRight as $e } from "lucide-react";
10
10
  import * as Ae from "pdfjs-dist/build/pdf.mjs";
11
- const We = "1.5.0", Be = {
11
+ const We = "1.5.1", Be = {
12
12
  version: We
13
13
  }, hr = [
14
14
  "image",
@@ -1888,41 +1888,41 @@ const Ut = () => {
1888
1888
  )
1889
1889
  ] });
1890
1890
  }, Bt = F(
1891
- () => import("./index-FomaQSaL.mjs").then((e) => ({ default: e.ImageRenderer }))
1891
+ () => import("./index-BBYKNNLb.mjs").then((e) => ({ default: e.ImageRenderer }))
1892
1892
  ), It = F(
1893
- () => import("./index-CuTz7dbd.mjs").then((e) => ({ default: e.PdfRenderer }))
1893
+ () => import("./index-DLk08ylq.mjs").then((e) => ({ default: e.PdfRenderer }))
1894
1894
  ), Vt = F(
1895
- () => import("./index-CCcZzLUM.mjs").then((e) => ({ default: e.DocxRenderer }))
1895
+ () => import("./index-oVJyD-FV.mjs").then((e) => ({ default: e.DocxRenderer }))
1896
1896
  ), Ot = F(
1897
- () => import("./index-CRZqNMQ7.mjs").then((e) => ({ default: e.XlsxRenderer }))
1897
+ () => import("./index-vRLKumL8.mjs").then((e) => ({ default: e.XlsxRenderer }))
1898
1898
  ), qt = F(
1899
- () => import("./index-_B5marES.mjs").then((e) => ({ default: e.PptxRenderer }))
1899
+ () => import("./index-BKXvtJh5.mjs").then((e) => ({ default: e.PptxRenderer }))
1900
1900
  ), Gt = F(
1901
- () => import("./index-OXjOFggq.mjs").then((e) => ({ default: e.MsgRenderer }))
1901
+ () => import("./index-DGNNEnWE.mjs").then((e) => ({ default: e.MsgRenderer }))
1902
1902
  ), Ht = F(
1903
- () => import("./index-2sX2d4iv.mjs").then((e) => ({ default: e.EpubRenderer }))
1903
+ () => import("./index-jvNrkVkp.mjs").then((e) => ({ default: e.EpubRenderer }))
1904
1904
  ), Zt = F(
1905
- () => import("./index-CQYrhe7Z.mjs").then((e) => ({ default: e.MobiRenderer }))
1905
+ () => import("./index-fQGAUFAX.mjs").then((e) => ({ default: e.MobiRenderer }))
1906
1906
  ), Kt = F(
1907
- () => import("./index-CuWzRQZw.mjs").then((e) => ({ default: e.VideoRenderer }))
1907
+ () => import("./index-Bw3Fh4b5.mjs").then((e) => ({ default: e.VideoRenderer }))
1908
1908
  ), Xt = F(
1909
- () => import("./index-DoGKcq9y.mjs").then((e) => ({ default: e.AudioRenderer }))
1909
+ () => import("./index-Cn4ZyhGM.mjs").then((e) => ({ default: e.AudioRenderer }))
1910
1910
  ), Jt = F(
1911
- () => import("./index-WLepq2g2.mjs").then((e) => ({ default: e.MarkdownRenderer }))
1911
+ () => import("./index-DVtPyN-s.mjs").then((e) => ({ default: e.MarkdownRenderer }))
1912
1912
  ), Qt = F(
1913
- () => import("./index-CKdQL1Bk.mjs").then((e) => ({ default: e.JsonRenderer }))
1913
+ () => import("./index-COOUxB5e.mjs").then((e) => ({ default: e.JsonRenderer }))
1914
1914
  ), Yt = F(
1915
- () => import("./index-D-Is8qvU.mjs").then((e) => ({ default: e.CsvRenderer }))
1915
+ () => import("./index-CEC_DHgr.mjs").then((e) => ({ default: e.CsvRenderer }))
1916
1916
  ), er = F(
1917
- () => import("./index-Dc6q1OKl.mjs").then((e) => ({ default: e.XmlRenderer }))
1917
+ () => import("./index-BFh22D_W.mjs").then((e) => ({ default: e.XmlRenderer }))
1918
1918
  ), tr = F(
1919
- () => import("./index-DzCLf1Db.mjs").then((e) => ({ default: e.SubtitleRenderer }))
1919
+ () => import("./index-fSw6Hl5e.mjs").then((e) => ({ default: e.SubtitleRenderer }))
1920
1920
  ), rr = F(
1921
- () => import("./index-Da3FN2-3.mjs").then((e) => ({ default: e.ZipRenderer }))
1921
+ () => import("./index-CgFv7B_G.mjs").then((e) => ({ default: e.ZipRenderer }))
1922
1922
  ), or = F(
1923
- () => import("./index-Bdj8_B80.mjs").then((e) => ({ default: e.TextRenderer }))
1923
+ () => import("./index-CU1Lc3lV.mjs").then((e) => ({ default: e.TextRenderer }))
1924
1924
  ), nr = F(
1925
- () => import("./index-CTghYlSh.mjs").then((e) => ({ default: e.FontRenderer }))
1925
+ () => import("./index-Dta7iGov.mjs").then((e) => ({ default: e.FontRenderer }))
1926
1926
  ), ar = [
1927
1927
  {
1928
1928
  fileType: "image",
@@ -2406,4 +2406,4 @@ export {
2406
2406
  gr as y,
2407
2407
  wr as z
2408
2408
  };
2409
- //# sourceMappingURL=index-Cz23v-TW.mjs.map
2409
+ //# sourceMappingURL=index-DreA69iU.mjs.map