@eternalheart/react-file-preview 1.5.1 → 1.5.2

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 (53) hide show
  1. package/lib/chunks/{index-Dta7iGov.mjs → index-37FMdXja.mjs} +2 -2
  2. package/lib/chunks/{index-Dta7iGov.mjs.map → index-37FMdXja.mjs.map} +1 -1
  3. package/lib/chunks/{index-BFh22D_W.mjs → index-7aRho9r4.mjs} +3 -3
  4. package/lib/chunks/{index-BFh22D_W.mjs.map → index-7aRho9r4.mjs.map} +1 -1
  5. package/lib/chunks/{index-CgFv7B_G.mjs → index-BXa7r4uK.mjs} +3 -3
  6. package/lib/chunks/{index-CgFv7B_G.mjs.map → index-BXa7r4uK.mjs.map} +1 -1
  7. package/lib/chunks/{index-COOUxB5e.mjs → index-BaSsmMZP.mjs} +2 -2
  8. package/lib/chunks/{index-COOUxB5e.mjs.map → index-BaSsmMZP.mjs.map} +1 -1
  9. package/lib/chunks/{index-fSw6Hl5e.mjs → index-Bn0NJNzq.mjs} +2 -2
  10. package/lib/chunks/{index-fSw6Hl5e.mjs.map → index-Bn0NJNzq.mjs.map} +1 -1
  11. package/lib/chunks/{index-fQGAUFAX.mjs → index-Btsr3v83.mjs} +2 -2
  12. package/lib/chunks/{index-fQGAUFAX.mjs.map → index-Btsr3v83.mjs.map} +1 -1
  13. package/lib/chunks/{index-Bw3Fh4b5.mjs → index-C2uu09Eb.mjs} +2 -2
  14. package/lib/chunks/{index-Bw3Fh4b5.mjs.map → index-C2uu09Eb.mjs.map} +1 -1
  15. package/lib/chunks/{index-vRLKumL8.mjs → index-C5o_T3Es.mjs} +18 -19
  16. package/lib/chunks/index-C5o_T3Es.mjs.map +1 -0
  17. package/lib/chunks/{index-Cn4ZyhGM.mjs → index-CMehLA91.mjs} +2 -2
  18. package/lib/chunks/{index-Cn4ZyhGM.mjs.map → index-CMehLA91.mjs.map} +1 -1
  19. package/lib/chunks/{index-jvNrkVkp.mjs → index-CTEgp9x8.mjs} +2 -2
  20. package/lib/chunks/{index-jvNrkVkp.mjs.map → index-CTEgp9x8.mjs.map} +1 -1
  21. package/lib/chunks/{index-DreA69iU.mjs → index-Cbp94jbP.mjs} +20 -20
  22. package/lib/chunks/{index-DreA69iU.mjs.map → index-Cbp94jbP.mjs.map} +1 -1
  23. package/lib/chunks/{index-CU1Lc3lV.mjs → index-CmK5E5Oa.mjs} +3 -3
  24. package/lib/chunks/{index-CU1Lc3lV.mjs.map → index-CmK5E5Oa.mjs.map} +1 -1
  25. package/lib/chunks/index-CyBXARuf.mjs +5215 -0
  26. package/lib/chunks/index-CyBXARuf.mjs.map +1 -0
  27. package/lib/chunks/{index-DVtPyN-s.mjs → index-DTNdG1bB.mjs} +3 -3
  28. package/lib/chunks/{index-DVtPyN-s.mjs.map → index-DTNdG1bB.mjs.map} +1 -1
  29. package/lib/chunks/{index-oVJyD-FV.mjs → index-DfzgQFfx.mjs} +2 -2
  30. package/lib/chunks/{index-oVJyD-FV.mjs.map → index-DfzgQFfx.mjs.map} +1 -1
  31. package/lib/chunks/{index-CEC_DHgr.mjs → index-DsIUJXpz.mjs} +8 -9
  32. package/lib/chunks/index-DsIUJXpz.mjs.map +1 -0
  33. package/lib/chunks/{index-DGNNEnWE.mjs → index-DxUP4apX.mjs} +2 -2
  34. package/lib/chunks/{index-DGNNEnWE.mjs.map → index-DxUP4apX.mjs.map} +1 -1
  35. package/lib/chunks/{index-BBYKNNLb.mjs → index-HRUhzosx.mjs} +2 -2
  36. package/lib/chunks/{index-BBYKNNLb.mjs.map → index-HRUhzosx.mjs.map} +1 -1
  37. package/lib/chunks/{index-BKXvtJh5.mjs → index-VnjkEX5p.mjs} +2 -2
  38. package/lib/chunks/{index-BKXvtJh5.mjs.map → index-VnjkEX5p.mjs.map} +1 -1
  39. package/lib/chunks/{index-DLk08ylq.mjs → index-qWLZuYn6.mjs} +2 -2
  40. package/lib/chunks/{index-DLk08ylq.mjs.map → index-qWLZuYn6.mjs.map} +1 -1
  41. package/lib/chunks/{useShikiHighlight-C6nJcETW.mjs → useShikiHighlight-BG7pCfB5.mjs} +2 -2
  42. package/lib/chunks/{useShikiHighlight-C6nJcETW.mjs.map → useShikiHighlight-BG7pCfB5.mjs.map} +1 -1
  43. package/lib/index.cjs +1 -1
  44. package/lib/index.cjs.map +1 -1
  45. package/lib/index.css +1 -1
  46. package/lib/index.mjs +1 -1
  47. package/lib/renderers/Csv/index.d.ts +0 -1
  48. package/lib/renderers/Csv/index.d.ts.map +1 -1
  49. package/lib/renderers/Xlsx/index.d.ts +0 -1
  50. package/lib/renderers/Xlsx/index.d.ts.map +1 -1
  51. package/package.json +1 -1
  52. package/lib/chunks/index-CEC_DHgr.mjs.map +0 -1
  53. package/lib/chunks/index-vRLKumL8.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index-Cn4ZyhGM.mjs","sources":["../../src/hooks/useAudioPlayer.ts","../../src/renderers/Audio/index.tsx"],"sourcesContent":["import { useState, useRef, useEffect, useCallback } from 'react';\n\ninterface UseAudioPlayerOptions {\n url: string;\n skipSeconds?: number;\n}\n\ninterface UseAudioPlayerReturn {\n audioRef: React.RefObject<HTMLAudioElement>;\n isPlaying: boolean;\n isLoading: boolean;\n isLoop: boolean;\n currentTime: number;\n duration: number;\n volume: number;\n isMuted: boolean;\n error: string | null;\n togglePlay: () => void;\n seek: (time: number) => void;\n skip: (seconds: number) => void;\n setVolume: (vol: number) => void;\n toggleMute: () => void;\n toggleLoop: () => void;\n formatTime: (time: number) => string;\n}\n\nexport function useAudioPlayer({\n url,\n}: UseAudioPlayerOptions): UseAudioPlayerReturn {\n const audioRef = useRef<HTMLAudioElement>(null);\n const [isPlaying, setIsPlaying] = useState(false);\n const [isLoading, setIsLoading] = useState(true);\n const [currentTime, setCurrentTime] = useState(0);\n const [duration, setDuration] = useState(0);\n const [volume, setVolumeState] = useState(1);\n const [isMuted, setIsMuted] = useState(false);\n const [isLoop, setIsLoop] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const audio = audioRef.current;\n if (!audio) return;\n\n // 重置加载状态\n setIsLoading(true);\n setError(null);\n\n const onTimeUpdate = () => {\n if (!isNaN(audio.currentTime)) {\n setCurrentTime(audio.currentTime);\n }\n };\n\n const onDurationChange = () => {\n if (!isNaN(audio.duration) && isFinite(audio.duration)) {\n setDuration(audio.duration);\n }\n };\n\n const onCanPlay = () => {\n setIsLoading(false);\n onDurationChange();\n };\n\n const onWaiting = () => setIsLoading(true);\n const onPlaying = () => {\n setIsLoading(false);\n setIsPlaying(true);\n };\n\n // 由 audio 事件驱动播放状态,而非手动设置\n const onPlay = () => setIsPlaying(true);\n const onPause = () => setIsPlaying(false);\n const onEnded = () => setIsPlaying(false);\n\n const onError = () => {\n setError('音频加载失败');\n setIsLoading(false);\n };\n\n audio.addEventListener('timeupdate', onTimeUpdate);\n audio.addEventListener('loadedmetadata', onDurationChange);\n audio.addEventListener('durationchange', onDurationChange);\n audio.addEventListener('canplay', onCanPlay);\n audio.addEventListener('waiting', onWaiting);\n audio.addEventListener('playing', onPlaying);\n audio.addEventListener('play', onPlay);\n audio.addEventListener('pause', onPause);\n audio.addEventListener('ended', onEnded);\n audio.addEventListener('error', onError);\n\n // 如果 audio 已经就绪\n if (audio.readyState >= 3) {\n setIsLoading(false);\n onDurationChange();\n } else if (audio.readyState >= 1) {\n onDurationChange();\n }\n\n return () => {\n audio.removeEventListener('timeupdate', onTimeUpdate);\n audio.removeEventListener('loadedmetadata', onDurationChange);\n audio.removeEventListener('durationchange', onDurationChange);\n audio.removeEventListener('canplay', onCanPlay);\n audio.removeEventListener('waiting', onWaiting);\n audio.removeEventListener('playing', onPlaying);\n audio.removeEventListener('play', onPlay);\n audio.removeEventListener('pause', onPause);\n audio.removeEventListener('ended', onEnded);\n audio.removeEventListener('error', onError);\n };\n }, [url]);\n\n const togglePlay = useCallback(() => {\n const audio = audioRef.current;\n if (!audio) return;\n\n if (audio.paused) {\n audio.play().catch(() => {\n // 浏览器自动播放策略拒绝\n });\n } else {\n audio.pause();\n }\n }, []);\n\n const seek = useCallback((time: number) => {\n const audio = audioRef.current;\n if (!audio) return;\n audio.currentTime = time;\n setCurrentTime(time);\n }, []);\n\n const skip = useCallback(\n (seconds: number) => {\n const audio = audioRef.current;\n if (!audio) return;\n audio.currentTime = Math.max(\n 0,\n Math.min(audio.currentTime + seconds, audio.duration || Infinity)\n );\n },\n []\n );\n\n const setVolume = useCallback((vol: number) => {\n const audio = audioRef.current;\n if (!audio) return;\n const clamped = Math.max(0, Math.min(1, vol));\n audio.volume = clamped;\n setVolumeState(clamped);\n if (clamped > 0) {\n audio.muted = false;\n setIsMuted(false);\n }\n }, []);\n\n const toggleMute = useCallback(() => {\n const audio = audioRef.current;\n if (!audio) return;\n audio.muted = !audio.muted;\n setIsMuted(audio.muted);\n }, []);\n\n const toggleLoop = useCallback(() => {\n const audio = audioRef.current;\n if (!audio) return;\n const next = !audio.loop;\n audio.loop = next;\n setIsLoop(next);\n }, []);\n\n const formatTime = useCallback((time: number) => {\n if (!isFinite(time) || isNaN(time) || time < 0) return '0:00';\n const minutes = Math.floor(time / 60);\n const seconds = Math.floor(time % 60);\n return `${minutes}:${seconds.toString().padStart(2, '0')}`;\n }, []);\n\n return {\n audioRef,\n isPlaying,\n isLoading,\n isLoop,\n currentTime,\n duration,\n volume,\n isMuted,\n error,\n togglePlay,\n seek,\n skip,\n setVolume,\n toggleMute,\n toggleLoop,\n formatTime,\n };\n}\n","import { useState, useRef, useEffect, forwardRef, useImperativeHandle } from 'react';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport { Play, Pause, Volume2, VolumeX, Volume1, SkipBack, SkipForward, Repeat } from 'lucide-react';\nimport { useAudioPlayer } from '../../hooks/useAudioPlayer';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { RendererError } from '../RendererError';\nimport type { RendererHandle } from '../base.types';\n\n/** 文本溢出时自动横向滚动 */\nconst MarqueeText: React.FC<{\n text: string;\n className?: string;\n style?: React.CSSProperties;\n}> = ({ text, className = '', style }) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const innerRef = useRef<HTMLDivElement>(null);\n const [overflow, setOverflow] = useState(false);\n const [scrollDist, setScrollDist] = useState(0);\n\n useEffect(() => {\n const check = () => {\n const container = containerRef.current;\n const inner = innerRef.current;\n if (!container || !inner) return;\n const cw = container.clientWidth;\n const tw = inner.scrollWidth;\n setOverflow(tw > cw);\n setScrollDist(tw);\n };\n check();\n const observer = new ResizeObserver(check);\n if (containerRef.current) observer.observe(containerRef.current);\n return () => observer.disconnect();\n }, [text]);\n\n const gap = 60;\n const totalScroll = scrollDist + gap;\n const dur = totalScroll / 40;\n\n return (\n <div\n ref={containerRef}\n className={`rfp-overflow-hidden rfp-whitespace-nowrap ${className}`}\n style={style}\n >\n {overflow ? (\n <motion.div\n className=\"rfp-inline-flex rfp-whitespace-nowrap\"\n animate={{ x: [0, -totalScroll] }}\n transition={{ duration: dur, repeat: Infinity, ease: 'linear', repeatDelay: 1.5 }}\n >\n <span>{text}</span>\n <span style={{ width: gap }} className=\"rfp-inline-block\" />\n <span>{text}</span>\n </motion.div>\n ) : null}\n {/* 始终渲染用于测量的隐藏层 */}\n <div\n ref={innerRef}\n className=\"rfp-whitespace-nowrap\"\n style={overflow ? { position: 'absolute', visibility: 'hidden', pointerEvents: 'none' } : undefined}\n >\n {text}\n </div>\n </div>\n );\n};\n\n/** SVG 唱臂组件 */\nconst Tonearm: React.FC<{ isPlaying: boolean }> = ({ isPlaying }) => (\n <motion.div\n className=\"rfp-absolute\"\n style={{\n top: '-6px',\n right: '2px',\n width: '100px',\n height: '120px',\n transformOrigin: '76px 16px',\n zIndex: 5,\n }}\n animate={{ rotate: isPlaying ? 16 : 0 }}\n transition={{ duration: 0.8, ease: [0.4, 0, 0.2, 1] }}\n >\n <svg\n width=\"100\"\n height=\"120\"\n viewBox=\"0 0 100 120\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n {/* 底座阴影 */}\n <circle cx=\"76\" cy=\"16\" r=\"13\" fill=\"rgba(0,0,0,0.3)\" />\n {/* 底座外圈 */}\n <circle cx=\"76\" cy=\"16\" r=\"11\" fill=\"url(#baseGrad)\" />\n {/* 底座内圈 */}\n <circle cx=\"76\" cy=\"16\" r=\"6\" fill=\"url(#baseInnerGrad)\" />\n {/* 底座中心轴 */}\n <circle cx=\"76\" cy=\"16\" r=\"2.5\" fill=\"#222\" stroke=\"#555\" strokeWidth=\"0.5\" />\n\n {/* 臂杆 */}\n <path\n d=\"M74 22 L56 88\"\n stroke=\"url(#armGrad)\"\n strokeWidth=\"3.5\"\n strokeLinecap=\"round\"\n />\n {/* 臂杆高光 */}\n <path\n d=\"M74.8 22 L56.8 88\"\n stroke=\"rgba(255,255,255,0.06)\"\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n />\n\n {/* 唱头座 (Headshell) */}\n <rect x=\"50\" y=\"86\" width=\"12\" height=\"7\" rx=\"1.5\" fill=\"url(#headGrad)\" />\n {/* 唱头 (Cartridge) */}\n <rect x=\"52.5\" y=\"92\" width=\"7\" height=\"9\" rx=\"1\" fill=\"url(#cartridgeGrad)\" />\n {/* 唱针 (Stylus) */}\n <line x1=\"56\" y1=\"101\" x2=\"56\" y2=\"105\" stroke=\"#bbb\" strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n <circle cx=\"56\" cy=\"105.5\" r=\"0.8\" fill=\"#ddd\" />\n\n {/* 渐变定义 */}\n <defs>\n <radialGradient id=\"baseGrad\" cx=\"40%\" cy=\"35%\">\n <stop offset=\"0%\" stopColor=\"#555\" />\n <stop offset=\"100%\" stopColor=\"#1a1a1a\" />\n </radialGradient>\n <radialGradient id=\"baseInnerGrad\" cx=\"40%\" cy=\"35%\">\n <stop offset=\"0%\" stopColor=\"#666\" />\n <stop offset=\"100%\" stopColor=\"#333\" />\n </radialGradient>\n <linearGradient id=\"armGrad\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"#555\" />\n <stop offset=\"50%\" stopColor=\"#444\" />\n <stop offset=\"100%\" stopColor=\"#333\" />\n </linearGradient>\n <linearGradient id=\"headGrad\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"#555\" />\n <stop offset=\"100%\" stopColor=\"#333\" />\n </linearGradient>\n <linearGradient id=\"cartridgeGrad\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"#444\" />\n <stop offset=\"100%\" stopColor=\"#222\" />\n </linearGradient>\n </defs>\n </svg>\n </motion.div>\n);\n\ninterface AudioRendererProps {\n url: string;\n fileName: string;\n}\n\nexport const AudioRenderer = forwardRef<RendererHandle, AudioRendererProps>(({ url, fileName }, ref) => {\n const t = useTranslator();\n const {\n audioRef,\n isPlaying,\n isLoading,\n isLoop,\n currentTime,\n duration,\n volume,\n isMuted,\n error,\n togglePlay,\n seek,\n skip,\n setVolume,\n toggleMute,\n toggleLoop,\n formatTime,\n } = useAudioPlayer({ url });\n\n const [showVolume, setShowVolume] = useState(false);\n const [isCompact, setIsCompact] = useState(false);\n const [controlScale, setControlScale] = useState(1);\n const [isDragging, setIsDragging] = useState(false);\n const [dragTime, setDragTime] = useState(0);\n const containerRef = useRef<HTMLDivElement>(null);\n const volumeRef = useRef<HTMLDivElement>(null);\n const volumeTimerRef = useRef<ReturnType<typeof setTimeout>>();\n\n const displayTime = isDragging ? dragTime : currentTime;\n const progress = duration > 0 ? displayTime / duration : 0;\n\n // 监听容器尺寸,自适应调整布局\n useEffect(() => {\n const checkSize = () => {\n if (containerRef.current) {\n const height = containerRef.current.clientHeight;\n const width = containerRef.current.clientWidth;\n // 高度小于 580px 时启用紧凑模式\n setIsCompact(height < 580);\n // 控制面板宽度自适应缩放\n // 基础宽度 448px (max-w-md),最小视觉宽度 320px,即最小 scale ≈ 0.714\n const baseWidth = 464; // 448 + 左右各 8px 呼吸空间\n const minVisualWidth = 320;\n const minScale = minVisualWidth / baseWidth;\n const scale = width >= baseWidth\n ? 1\n : Math.max(minScale, width / baseWidth);\n setControlScale(scale);\n }\n };\n checkSize();\n const observer = new ResizeObserver(checkSize);\n if (containerRef.current) {\n observer.observe(containerRef.current);\n }\n return () => observer.disconnect();\n }, []);\n\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (volumeRef.current && !volumeRef.current.contains(e.target as Node)) {\n setShowVolume(false);\n }\n };\n if (showVolume) {\n document.addEventListener('mousedown', handleClickOutside);\n }\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [showVolume]);\n\n const handleVolumeEnter = () => {\n clearTimeout(volumeTimerRef.current);\n setShowVolume(true);\n };\n\n const handleVolumeLeave = () => {\n volumeTimerRef.current = setTimeout(() => setShowVolume(false), 300);\n };\n\n const VolumeIcon = isMuted || volume === 0 ? VolumeX : volume < 0.5 ? Volume1 : Volume2;\n\n // 暴露接口给父组件\n useImperativeHandle(ref, () => ({\n getToolbarGroups: () => [],\n }), []);\n\n if (error) {\n return <RendererError message={error} />;\n }\n\n // 根据紧凑模式动态计算尺寸\n const vinylScale = isCompact ? 0.72 : 1;\n const vinylBase = 260;\n const vinylHeightBase = 240;\n\n // 唱片跟随控制面板同步缩放,避免头重脚轻\n const finalVinylScale = vinylScale * controlScale;\n\n return (\n <div\n ref={containerRef}\n className={`rfp-flex rfp-flex-col rfp-items-center rfp-justify-center rfp-w-full rfp-h-full rfp-select-none rfp-overflow-auto ${\n isCompact ? 'rfp-p-3 rfp-gap-3' : 'rfp-p-6 rfp-gap-6'\n }`}\n >\n {/* 唱片机整体 */}\n <div\n className=\"rfp-relative rfp-flex-shrink-0\"\n style={{\n width: `${vinylBase}px`,\n height: `${vinylHeightBase}px`,\n transform: `scale(${finalVinylScale})`,\n transformOrigin: 'center center',\n marginTop: isCompact ? `${-(vinylHeightBase * (1 - finalVinylScale)) / 2}px` : 0,\n marginBottom: isCompact ? `${-(vinylHeightBase * (1 - finalVinylScale)) / 2}px` : 0,\n }}\n >\n {/* 外圈光晕 */}\n <motion.div\n className=\"rfp-absolute rfp-rounded-full\"\n style={{\n width: '220px',\n height: '220px',\n top: '18px',\n left: '8px',\n background: 'radial-gradient(circle, rgba(129,140,248,0.12) 0%, transparent 70%)',\n }}\n animate={isPlaying ? { scale: [1, 1.08, 1], opacity: [0.5, 1, 0.5] } : { scale: 1, opacity: 0.2 }}\n transition={isPlaying ? { duration: 3, repeat: Infinity, ease: 'easeInOut' } : { duration: 0.5 }}\n />\n\n {/* 唱片主体 */}\n <div\n className=\"rfp-absolute rfp-rounded-full rfp-overflow-hidden\"\n style={{\n width: '200px',\n height: '200px',\n top: '28px',\n left: '18px',\n background: `\n radial-gradient(circle at center, transparent 95%, rgba(30,30,30,0.8) 95.5%, #111 97%),\n radial-gradient(circle at center, transparent 38%, rgba(50,50,50,0.5) 38.15%, transparent 38.4%),\n radial-gradient(circle at center, transparent 45%, rgba(50,50,50,0.3) 45.15%, transparent 45.4%),\n radial-gradient(circle at center, transparent 52%, rgba(50,50,50,0.5) 52.15%, transparent 52.4%),\n radial-gradient(circle at center, transparent 59%, rgba(50,50,50,0.3) 59.15%, transparent 59.4%),\n radial-gradient(circle at center, transparent 66%, rgba(50,50,50,0.5) 66.15%, transparent 66.4%),\n radial-gradient(circle at center, transparent 73%, rgba(50,50,50,0.3) 73.15%, transparent 73.4%),\n radial-gradient(circle at center, transparent 80%, rgba(50,50,50,0.4) 80.15%, transparent 80.4%),\n radial-gradient(circle at center, transparent 87%, rgba(50,50,50,0.3) 87.15%, transparent 87.4%),\n conic-gradient(from 0deg, #1c1c1c, #232323, #1a1a1a, #262626, #1c1c1c, #212121, #1a1a1a, #252525, #1c1c1c, #232323, #1a1a1a, #262626, #1c1c1c)\n `,\n boxShadow: isPlaying\n ? '0 0 36px rgba(129,140,248,0.1), 0 8px 32px rgba(0,0,0,0.4), inset 0 0 20px rgba(0,0,0,0.4)'\n : '0 8px 32px rgba(0,0,0,0.4), inset 0 0 20px rgba(0,0,0,0.4)',\n animation: 'rfp-vinyl-spin 8s linear infinite',\n animationPlayState: isPlaying ? 'running' : 'paused',\n }}\n >\n {/* 中心标签 */}\n <div\n className=\"rfp-absolute rfp-rounded-full\"\n style={{\n width: '34%',\n height: '34%',\n top: '33%',\n left: '33%',\n background: 'radial-gradient(circle at 40% 38%, #818cf8, #6366f1, #4f46e5, #4338ca)',\n boxShadow: 'inset 0 1px 3px rgba(255,255,255,0.25), inset 0 -1px 3px rgba(0,0,0,0.3), 0 0 8px rgba(0,0,0,0.3)',\n }}\n >\n <div\n className=\"rfp-absolute rfp-inset-0 rfp-rounded-full rfp-opacity-20\"\n style={{\n background: `\n radial-gradient(circle at center, transparent 30%, rgba(0,0,0,0.3) 31%, transparent 32%),\n radial-gradient(circle at center, transparent 50%, rgba(0,0,0,0.2) 51%, transparent 52%),\n radial-gradient(circle at center, transparent 70%, rgba(0,0,0,0.3) 71%, transparent 72%),\n radial-gradient(circle at center, transparent 88%, rgba(0,0,0,0.2) 89%, transparent 90%)\n `,\n }}\n />\n <div\n className=\"rfp-absolute rfp-rounded-full\"\n style={{\n width: '14%',\n height: '14%',\n top: '43%',\n left: '43%',\n background: 'radial-gradient(circle at 40% 40%, #333, #0d0d0d)',\n boxShadow: 'inset 0 1px 3px rgba(0,0,0,0.9), 0 0 2px rgba(0,0,0,0.5)',\n }}\n />\n </div>\n\n {isLoading && (\n <motion.div\n className=\"rfp-absolute rfp-inset-0 rfp-rounded-full\"\n style={{ border: '2px solid rgba(129,140,248,0.3)' }}\n animate={{ scale: [1, 1.02, 1], opacity: [0.3, 0.6, 0.3] }}\n transition={{ duration: 1.5, repeat: Infinity }}\n />\n )}\n </div>\n\n {/* 唱臂 */}\n <Tonearm isPlaying={isPlaying} />\n </div>\n\n {/* 文件名 */}\n <div className={`rfp-text-center rfp-max-w-md rfp-flex-shrink-0 ${isCompact ? 'rfp-px-2' : 'rfp-px-4'}`}>\n <MarqueeText\n text={fileName}\n className={`rfp-font-medium rfp-text-fg-primary ${isCompact ? 'rfp-text-sm' : 'rfp-text-lg'}`}\n />\n </div>\n\n {/* 控制面板 wrapper:按容器宽度整体缩放,保底视觉宽度 320px */}\n <div\n className=\"rfp-w-full rfp-flex rfp-justify-center rfp-flex-shrink-0\"\n >\n <div\n className={`rfp-rounded-2xl rfp-border rfp-bg-surface-1 rfp-border-line-weak ${\n isCompact ? 'rfp-p-3' : 'rfp-p-5'\n }`}\n style={{\n width: '448px',\n backdropFilter: 'blur(16px)',\n transform: controlScale < 1 ? `scale(${controlScale})` : undefined,\n transformOrigin: 'top center',\n marginBottom: controlScale < 1 ? `${-(1 - controlScale) * 100}px` : undefined,\n }}\n >\n {/* 进度条 */}\n <div className={isCompact ? 'rfp-mb-3' : 'rfp-mb-5'}>\n <div className=\"rfp-relative rfp-h-4 rfp-flex rfp-items-center\">\n <div className=\"rfp-absolute rfp-w-full rfp-h-[5px] rfp-rounded-full rfp-bg-surface-2\" />\n <div\n className=\"rfp-absolute rfp-h-[5px] rfp-rounded-full rfp-pointer-events-none\"\n style={{\n width: `${progress * 100}%`,\n background: 'linear-gradient(90deg, var(--fp-accent), var(--fp-accent-hover))',\n boxShadow: isPlaying ? '0 0 8px rgba(129,140,248,0.4)' : 'none',\n transition: isDragging ? 'none' : 'width 0.1s linear',\n }}\n />\n <input\n type=\"range\"\n min=\"0\"\n max={duration > 0 ? duration : currentTime || 100}\n step=\"any\"\n value={displayTime}\n onPointerDown={() => {\n setDragTime(currentTime);\n setIsDragging(true);\n }}\n onChange={(e) => {\n const value = parseFloat(e.target.value);\n if (isDragging) {\n setDragTime(value);\n } else {\n seek(value);\n }\n }}\n onPointerUp={(e) => {\n const value = parseFloat((e.target as HTMLInputElement).value);\n seek(value);\n setIsDragging(false);\n }}\n onPointerCancel={() => setIsDragging(false)}\n disabled={duration <= 0}\n aria-label={t('audio.aria.progress')}\n className=\"audio-slider rfp-absolute rfp-w-full\"\n />\n </div>\n <div className={`rfp-flex rfp-justify-between rfp-text-fg-tertiary ${isCompact ? 'rfp-text-[10px] rfp-mt-1.5' : 'rfp-text-xs rfp-mt-2.5'}`}>\n <span style={{ fontVariantNumeric: 'tabular-nums' }}>{formatTime(displayTime)}</span>\n <span style={{ fontVariantNumeric: 'tabular-nums' }}>{duration > 0 ? formatTime(duration) : '--:--'}</span>\n </div>\n </div>\n\n {/* 控制按钮 */}\n <div className={`rfp-flex rfp-items-center rfp-justify-center ${isCompact ? 'rfp-gap-2' : 'rfp-gap-3'}`}>\n {/* 循环 */}\n <motion.button\n onClick={toggleLoop}\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.92 }}\n aria-label={isLoop ? t('audio.aria.loop_off') : t('audio.aria.loop_on')}\n className={`rfp-rounded-full rfp-flex rfp-items-center rfp-justify-center rfp-transition-colors rfp-flex-shrink-0 ${\n isCompact ? 'rfp-w-8 rfp-h-8' : 'rfp-w-9 rfp-h-9'\n } ${\n isLoop\n ? 'rfp-bg-accent-soft rfp-text-accent'\n : 'rfp-bg-surface-2 rfp-text-fg-tertiary'\n }`}\n >\n <Repeat className={isCompact ? 'rfp-w-3.5 rfp-h-3.5' : 'rfp-w-4 rfp-h-4'} />\n </motion.button>\n\n {/* 后退 */}\n <motion.button\n onClick={() => skip(-10)}\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.92 }}\n aria-label={t('audio.aria.backward_10')}\n className={`rfp-rounded-full rfp-flex rfp-items-center rfp-justify-center rfp-transition-colors rfp-bg-surface-2 rfp-text-fg-secondary rfp-flex-shrink-0 ${\n isCompact ? 'rfp-w-9 rfp-h-9' : 'rfp-w-10 rfp-h-10'\n }`}\n >\n <SkipBack className={isCompact ? 'rfp-w-4 rfp-h-4' : 'rfp-w-[18px] rfp-h-[18px]'} />\n </motion.button>\n\n {/* 播放/暂停 */}\n <motion.button\n onClick={togglePlay}\n whileHover={{ scale: 1.06 }}\n whileTap={{ scale: 0.94 }}\n aria-label={isPlaying ? t('audio.aria.pause') : t('audio.aria.play')}\n className={`rfp-rounded-full rfp-flex rfp-items-center rfp-justify-center rfp-flex-shrink-0 ${\n isCompact ? 'rfp-w-12 rfp-h-12' : 'rfp-w-14 rfp-h-14'\n }`}\n style={{\n background: 'linear-gradient(135deg, var(--fp-accent-hover), var(--fp-accent))',\n color: '#fff',\n boxShadow: '0 4px 20px rgba(99,102,241,0.35)',\n }}\n >\n {isPlaying ? (\n <Pause className={isCompact ? 'rfp-w-5 rfp-h-5' : 'rfp-w-6 rfp-h-6'} />\n ) : (\n <Play className={isCompact ? 'rfp-w-5 rfp-h-5 rfp-ml-0.5' : 'rfp-w-6 rfp-h-6 rfp-ml-0.5'} />\n )}\n </motion.button>\n\n {/* 前进 */}\n <motion.button\n onClick={() => skip(10)}\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.92 }}\n aria-label={t('audio.aria.forward_10')}\n className={`rfp-rounded-full rfp-flex rfp-items-center rfp-justify-center rfp-transition-colors rfp-bg-surface-2 rfp-text-fg-secondary rfp-flex-shrink-0 ${\n isCompact ? 'rfp-w-9 rfp-h-9' : 'rfp-w-10 rfp-h-10'\n }`}\n >\n <SkipForward className={isCompact ? 'rfp-w-4 rfp-h-4' : 'rfp-w-[18px] rfp-h-[18px]'} />\n </motion.button>\n\n {/* 音量 */}\n <div\n ref={volumeRef}\n className=\"rfp-relative\"\n onMouseEnter={handleVolumeEnter}\n onMouseLeave={handleVolumeLeave}\n >\n <motion.button\n onClick={toggleMute}\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.92 }}\n aria-label={isMuted ? t('audio.aria.unmute') : t('audio.aria.mute')}\n className={`rfp-rounded-full rfp-flex rfp-items-center rfp-justify-center rfp-transition-colors rfp-flex-shrink-0 ${\n isCompact ? 'rfp-w-8 rfp-h-8' : 'rfp-w-9 rfp-h-9'\n } ${\n showVolume\n ? 'rfp-bg-accent-soft rfp-text-accent'\n : 'rfp-bg-surface-2 rfp-text-fg-secondary'\n }`}\n >\n <VolumeIcon className={isCompact ? 'rfp-w-3.5 rfp-h-3.5' : 'rfp-w-4 rfp-h-4'} />\n </motion.button>\n\n <AnimatePresence>\n {showVolume && (\n <motion.div\n initial={{ opacity: 0, scale: 0.95 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.95 }}\n transition={{ duration: 0.12 }}\n className=\"rfp-absolute rfp-bottom-full rfp-mb-2 rfp-rounded-xl rfp-p-3 rfp-border rfp-bg-surface-3 rfp-border-line\"\n style={{\n left: '50%',\n marginLeft: '-27px',\n backdropFilter: 'blur(16px)',\n }}\n onMouseEnter={handleVolumeEnter}\n onMouseLeave={handleVolumeLeave}\n >\n <div className=\"rfp-flex rfp-flex-col rfp-items-center rfp-gap-2\" style={{ height: '100px' }}>\n <div className=\"rfp-relative rfp-flex rfp-items-center rfp-justify-center\" style={{ width: '24px', height: '80px' }}>\n <div\n className=\"rfp-absolute rfp-rounded-full rfp-bg-surface-2\"\n style={{ width: '3px', height: '100%' }}\n />\n <div\n className=\"rfp-absolute rfp-bottom-0 rfp-rounded-full rfp-pointer-events-none\"\n style={{\n width: '3px',\n height: `${(isMuted ? 0 : volume) * 100}%`,\n background: 'var(--fp-accent-hover)',\n transition: 'height 0.1s linear',\n }}\n />\n <input\n type=\"range\"\n min=\"0\"\n max=\"1\"\n step=\"0.01\"\n value={isMuted ? 0 : volume}\n onChange={(e) => setVolume(parseFloat(e.target.value))}\n aria-label={t('audio.aria.volume')}\n className=\"volume-slider-vertical rfp-absolute\"\n style={{\n width: '80px',\n height: '24px',\n transform: 'rotate(-90deg)',\n transformOrigin: 'center center',\n }}\n />\n </div>\n <span className=\"rfp-text-[10px] rfp-tabular-nums rfp-text-fg-tertiary\">\n {Math.round((isMuted ? 0 : volume) * 100)}\n </span>\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n </div>\n </div>\n {/* wrapper 闭合 */}\n </div>\n\n <audio ref={audioRef} src={url} className=\"rfp-hidden\" />\n </div>\n );\n});\n"],"names":["useAudioPlayer","url","audioRef","useRef","isPlaying","setIsPlaying","useState","isLoading","setIsLoading","currentTime","setCurrentTime","duration","setDuration","volume","setVolumeState","isMuted","setIsMuted","isLoop","setIsLoop","error","setError","useEffect","audio","onTimeUpdate","onDurationChange","onCanPlay","onWaiting","onPlaying","onPlay","onPause","onEnded","onError","togglePlay","useCallback","seek","time","skip","seconds","setVolume","vol","clamped","toggleMute","toggleLoop","next","formatTime","minutes","MarqueeText","text","className","style","containerRef","innerRef","overflow","setOverflow","scrollDist","setScrollDist","check","container","inner","cw","tw","observer","gap","totalScroll","dur","jsxs","motion","jsx","Tonearm","AudioRenderer","forwardRef","fileName","ref","t","useTranslator","showVolume","setShowVolume","isCompact","setIsCompact","controlScale","setControlScale","isDragging","setIsDragging","dragTime","setDragTime","volumeRef","volumeTimerRef","displayTime","progress","checkSize","height","width","baseWidth","minScale","scale","handleClickOutside","e","handleVolumeEnter","handleVolumeLeave","VolumeIcon","VolumeX","Volume1","Volume2","useImperativeHandle","RendererError","vinylScale","vinylBase","vinylHeightBase","finalVinylScale","value","Repeat","SkipBack","Pause","Play","SkipForward","AnimatePresence"],"mappings":"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"}
1
+ {"version":3,"file":"index-CMehLA91.mjs","sources":["../../src/hooks/useAudioPlayer.ts","../../src/renderers/Audio/index.tsx"],"sourcesContent":["import { useState, useRef, useEffect, useCallback } from 'react';\n\ninterface UseAudioPlayerOptions {\n url: string;\n skipSeconds?: number;\n}\n\ninterface UseAudioPlayerReturn {\n audioRef: React.RefObject<HTMLAudioElement>;\n isPlaying: boolean;\n isLoading: boolean;\n isLoop: boolean;\n currentTime: number;\n duration: number;\n volume: number;\n isMuted: boolean;\n error: string | null;\n togglePlay: () => void;\n seek: (time: number) => void;\n skip: (seconds: number) => void;\n setVolume: (vol: number) => void;\n toggleMute: () => void;\n toggleLoop: () => void;\n formatTime: (time: number) => string;\n}\n\nexport function useAudioPlayer({\n url,\n}: UseAudioPlayerOptions): UseAudioPlayerReturn {\n const audioRef = useRef<HTMLAudioElement>(null);\n const [isPlaying, setIsPlaying] = useState(false);\n const [isLoading, setIsLoading] = useState(true);\n const [currentTime, setCurrentTime] = useState(0);\n const [duration, setDuration] = useState(0);\n const [volume, setVolumeState] = useState(1);\n const [isMuted, setIsMuted] = useState(false);\n const [isLoop, setIsLoop] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const audio = audioRef.current;\n if (!audio) return;\n\n // 重置加载状态\n setIsLoading(true);\n setError(null);\n\n const onTimeUpdate = () => {\n if (!isNaN(audio.currentTime)) {\n setCurrentTime(audio.currentTime);\n }\n };\n\n const onDurationChange = () => {\n if (!isNaN(audio.duration) && isFinite(audio.duration)) {\n setDuration(audio.duration);\n }\n };\n\n const onCanPlay = () => {\n setIsLoading(false);\n onDurationChange();\n };\n\n const onWaiting = () => setIsLoading(true);\n const onPlaying = () => {\n setIsLoading(false);\n setIsPlaying(true);\n };\n\n // 由 audio 事件驱动播放状态,而非手动设置\n const onPlay = () => setIsPlaying(true);\n const onPause = () => setIsPlaying(false);\n const onEnded = () => setIsPlaying(false);\n\n const onError = () => {\n setError('音频加载失败');\n setIsLoading(false);\n };\n\n audio.addEventListener('timeupdate', onTimeUpdate);\n audio.addEventListener('loadedmetadata', onDurationChange);\n audio.addEventListener('durationchange', onDurationChange);\n audio.addEventListener('canplay', onCanPlay);\n audio.addEventListener('waiting', onWaiting);\n audio.addEventListener('playing', onPlaying);\n audio.addEventListener('play', onPlay);\n audio.addEventListener('pause', onPause);\n audio.addEventListener('ended', onEnded);\n audio.addEventListener('error', onError);\n\n // 如果 audio 已经就绪\n if (audio.readyState >= 3) {\n setIsLoading(false);\n onDurationChange();\n } else if (audio.readyState >= 1) {\n onDurationChange();\n }\n\n return () => {\n audio.removeEventListener('timeupdate', onTimeUpdate);\n audio.removeEventListener('loadedmetadata', onDurationChange);\n audio.removeEventListener('durationchange', onDurationChange);\n audio.removeEventListener('canplay', onCanPlay);\n audio.removeEventListener('waiting', onWaiting);\n audio.removeEventListener('playing', onPlaying);\n audio.removeEventListener('play', onPlay);\n audio.removeEventListener('pause', onPause);\n audio.removeEventListener('ended', onEnded);\n audio.removeEventListener('error', onError);\n };\n }, [url]);\n\n const togglePlay = useCallback(() => {\n const audio = audioRef.current;\n if (!audio) return;\n\n if (audio.paused) {\n audio.play().catch(() => {\n // 浏览器自动播放策略拒绝\n });\n } else {\n audio.pause();\n }\n }, []);\n\n const seek = useCallback((time: number) => {\n const audio = audioRef.current;\n if (!audio) return;\n audio.currentTime = time;\n setCurrentTime(time);\n }, []);\n\n const skip = useCallback(\n (seconds: number) => {\n const audio = audioRef.current;\n if (!audio) return;\n audio.currentTime = Math.max(\n 0,\n Math.min(audio.currentTime + seconds, audio.duration || Infinity)\n );\n },\n []\n );\n\n const setVolume = useCallback((vol: number) => {\n const audio = audioRef.current;\n if (!audio) return;\n const clamped = Math.max(0, Math.min(1, vol));\n audio.volume = clamped;\n setVolumeState(clamped);\n if (clamped > 0) {\n audio.muted = false;\n setIsMuted(false);\n }\n }, []);\n\n const toggleMute = useCallback(() => {\n const audio = audioRef.current;\n if (!audio) return;\n audio.muted = !audio.muted;\n setIsMuted(audio.muted);\n }, []);\n\n const toggleLoop = useCallback(() => {\n const audio = audioRef.current;\n if (!audio) return;\n const next = !audio.loop;\n audio.loop = next;\n setIsLoop(next);\n }, []);\n\n const formatTime = useCallback((time: number) => {\n if (!isFinite(time) || isNaN(time) || time < 0) return '0:00';\n const minutes = Math.floor(time / 60);\n const seconds = Math.floor(time % 60);\n return `${minutes}:${seconds.toString().padStart(2, '0')}`;\n }, []);\n\n return {\n audioRef,\n isPlaying,\n isLoading,\n isLoop,\n currentTime,\n duration,\n volume,\n isMuted,\n error,\n togglePlay,\n seek,\n skip,\n setVolume,\n toggleMute,\n toggleLoop,\n formatTime,\n };\n}\n","import { useState, useRef, useEffect, forwardRef, useImperativeHandle } from 'react';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport { Play, Pause, Volume2, VolumeX, Volume1, SkipBack, SkipForward, Repeat } from 'lucide-react';\nimport { useAudioPlayer } from '../../hooks/useAudioPlayer';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { RendererError } from '../RendererError';\nimport type { RendererHandle } from '../base.types';\n\n/** 文本溢出时自动横向滚动 */\nconst MarqueeText: React.FC<{\n text: string;\n className?: string;\n style?: React.CSSProperties;\n}> = ({ text, className = '', style }) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const innerRef = useRef<HTMLDivElement>(null);\n const [overflow, setOverflow] = useState(false);\n const [scrollDist, setScrollDist] = useState(0);\n\n useEffect(() => {\n const check = () => {\n const container = containerRef.current;\n const inner = innerRef.current;\n if (!container || !inner) return;\n const cw = container.clientWidth;\n const tw = inner.scrollWidth;\n setOverflow(tw > cw);\n setScrollDist(tw);\n };\n check();\n const observer = new ResizeObserver(check);\n if (containerRef.current) observer.observe(containerRef.current);\n return () => observer.disconnect();\n }, [text]);\n\n const gap = 60;\n const totalScroll = scrollDist + gap;\n const dur = totalScroll / 40;\n\n return (\n <div\n ref={containerRef}\n className={`rfp-overflow-hidden rfp-whitespace-nowrap ${className}`}\n style={style}\n >\n {overflow ? (\n <motion.div\n className=\"rfp-inline-flex rfp-whitespace-nowrap\"\n animate={{ x: [0, -totalScroll] }}\n transition={{ duration: dur, repeat: Infinity, ease: 'linear', repeatDelay: 1.5 }}\n >\n <span>{text}</span>\n <span style={{ width: gap }} className=\"rfp-inline-block\" />\n <span>{text}</span>\n </motion.div>\n ) : null}\n {/* 始终渲染用于测量的隐藏层 */}\n <div\n ref={innerRef}\n className=\"rfp-whitespace-nowrap\"\n style={overflow ? { position: 'absolute', visibility: 'hidden', pointerEvents: 'none' } : undefined}\n >\n {text}\n </div>\n </div>\n );\n};\n\n/** SVG 唱臂组件 */\nconst Tonearm: React.FC<{ isPlaying: boolean }> = ({ isPlaying }) => (\n <motion.div\n className=\"rfp-absolute\"\n style={{\n top: '-6px',\n right: '2px',\n width: '100px',\n height: '120px',\n transformOrigin: '76px 16px',\n zIndex: 5,\n }}\n animate={{ rotate: isPlaying ? 16 : 0 }}\n transition={{ duration: 0.8, ease: [0.4, 0, 0.2, 1] }}\n >\n <svg\n width=\"100\"\n height=\"120\"\n viewBox=\"0 0 100 120\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n {/* 底座阴影 */}\n <circle cx=\"76\" cy=\"16\" r=\"13\" fill=\"rgba(0,0,0,0.3)\" />\n {/* 底座外圈 */}\n <circle cx=\"76\" cy=\"16\" r=\"11\" fill=\"url(#baseGrad)\" />\n {/* 底座内圈 */}\n <circle cx=\"76\" cy=\"16\" r=\"6\" fill=\"url(#baseInnerGrad)\" />\n {/* 底座中心轴 */}\n <circle cx=\"76\" cy=\"16\" r=\"2.5\" fill=\"#222\" stroke=\"#555\" strokeWidth=\"0.5\" />\n\n {/* 臂杆 */}\n <path\n d=\"M74 22 L56 88\"\n stroke=\"url(#armGrad)\"\n strokeWidth=\"3.5\"\n strokeLinecap=\"round\"\n />\n {/* 臂杆高光 */}\n <path\n d=\"M74.8 22 L56.8 88\"\n stroke=\"rgba(255,255,255,0.06)\"\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n />\n\n {/* 唱头座 (Headshell) */}\n <rect x=\"50\" y=\"86\" width=\"12\" height=\"7\" rx=\"1.5\" fill=\"url(#headGrad)\" />\n {/* 唱头 (Cartridge) */}\n <rect x=\"52.5\" y=\"92\" width=\"7\" height=\"9\" rx=\"1\" fill=\"url(#cartridgeGrad)\" />\n {/* 唱针 (Stylus) */}\n <line x1=\"56\" y1=\"101\" x2=\"56\" y2=\"105\" stroke=\"#bbb\" strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n <circle cx=\"56\" cy=\"105.5\" r=\"0.8\" fill=\"#ddd\" />\n\n {/* 渐变定义 */}\n <defs>\n <radialGradient id=\"baseGrad\" cx=\"40%\" cy=\"35%\">\n <stop offset=\"0%\" stopColor=\"#555\" />\n <stop offset=\"100%\" stopColor=\"#1a1a1a\" />\n </radialGradient>\n <radialGradient id=\"baseInnerGrad\" cx=\"40%\" cy=\"35%\">\n <stop offset=\"0%\" stopColor=\"#666\" />\n <stop offset=\"100%\" stopColor=\"#333\" />\n </radialGradient>\n <linearGradient id=\"armGrad\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"#555\" />\n <stop offset=\"50%\" stopColor=\"#444\" />\n <stop offset=\"100%\" stopColor=\"#333\" />\n </linearGradient>\n <linearGradient id=\"headGrad\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"#555\" />\n <stop offset=\"100%\" stopColor=\"#333\" />\n </linearGradient>\n <linearGradient id=\"cartridgeGrad\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"#444\" />\n <stop offset=\"100%\" stopColor=\"#222\" />\n </linearGradient>\n </defs>\n </svg>\n </motion.div>\n);\n\ninterface AudioRendererProps {\n url: string;\n fileName: string;\n}\n\nexport const AudioRenderer = forwardRef<RendererHandle, AudioRendererProps>(({ url, fileName }, ref) => {\n const t = useTranslator();\n const {\n audioRef,\n isPlaying,\n isLoading,\n isLoop,\n currentTime,\n duration,\n volume,\n isMuted,\n error,\n togglePlay,\n seek,\n skip,\n setVolume,\n toggleMute,\n toggleLoop,\n formatTime,\n } = useAudioPlayer({ url });\n\n const [showVolume, setShowVolume] = useState(false);\n const [isCompact, setIsCompact] = useState(false);\n const [controlScale, setControlScale] = useState(1);\n const [isDragging, setIsDragging] = useState(false);\n const [dragTime, setDragTime] = useState(0);\n const containerRef = useRef<HTMLDivElement>(null);\n const volumeRef = useRef<HTMLDivElement>(null);\n const volumeTimerRef = useRef<ReturnType<typeof setTimeout>>();\n\n const displayTime = isDragging ? dragTime : currentTime;\n const progress = duration > 0 ? displayTime / duration : 0;\n\n // 监听容器尺寸,自适应调整布局\n useEffect(() => {\n const checkSize = () => {\n if (containerRef.current) {\n const height = containerRef.current.clientHeight;\n const width = containerRef.current.clientWidth;\n // 高度小于 580px 时启用紧凑模式\n setIsCompact(height < 580);\n // 控制面板宽度自适应缩放\n // 基础宽度 448px (max-w-md),最小视觉宽度 320px,即最小 scale ≈ 0.714\n const baseWidth = 464; // 448 + 左右各 8px 呼吸空间\n const minVisualWidth = 320;\n const minScale = minVisualWidth / baseWidth;\n const scale = width >= baseWidth\n ? 1\n : Math.max(minScale, width / baseWidth);\n setControlScale(scale);\n }\n };\n checkSize();\n const observer = new ResizeObserver(checkSize);\n if (containerRef.current) {\n observer.observe(containerRef.current);\n }\n return () => observer.disconnect();\n }, []);\n\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (volumeRef.current && !volumeRef.current.contains(e.target as Node)) {\n setShowVolume(false);\n }\n };\n if (showVolume) {\n document.addEventListener('mousedown', handleClickOutside);\n }\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [showVolume]);\n\n const handleVolumeEnter = () => {\n clearTimeout(volumeTimerRef.current);\n setShowVolume(true);\n };\n\n const handleVolumeLeave = () => {\n volumeTimerRef.current = setTimeout(() => setShowVolume(false), 300);\n };\n\n const VolumeIcon = isMuted || volume === 0 ? VolumeX : volume < 0.5 ? Volume1 : Volume2;\n\n // 暴露接口给父组件\n useImperativeHandle(ref, () => ({\n getToolbarGroups: () => [],\n }), []);\n\n if (error) {\n return <RendererError message={error} />;\n }\n\n // 根据紧凑模式动态计算尺寸\n const vinylScale = isCompact ? 0.72 : 1;\n const vinylBase = 260;\n const vinylHeightBase = 240;\n\n // 唱片跟随控制面板同步缩放,避免头重脚轻\n const finalVinylScale = vinylScale * controlScale;\n\n return (\n <div\n ref={containerRef}\n className={`rfp-flex rfp-flex-col rfp-items-center rfp-justify-center rfp-w-full rfp-h-full rfp-select-none rfp-overflow-auto ${\n isCompact ? 'rfp-p-3 rfp-gap-3' : 'rfp-p-6 rfp-gap-6'\n }`}\n >\n {/* 唱片机整体 */}\n <div\n className=\"rfp-relative rfp-flex-shrink-0\"\n style={{\n width: `${vinylBase}px`,\n height: `${vinylHeightBase}px`,\n transform: `scale(${finalVinylScale})`,\n transformOrigin: 'center center',\n marginTop: isCompact ? `${-(vinylHeightBase * (1 - finalVinylScale)) / 2}px` : 0,\n marginBottom: isCompact ? `${-(vinylHeightBase * (1 - finalVinylScale)) / 2}px` : 0,\n }}\n >\n {/* 外圈光晕 */}\n <motion.div\n className=\"rfp-absolute rfp-rounded-full\"\n style={{\n width: '220px',\n height: '220px',\n top: '18px',\n left: '8px',\n background: 'radial-gradient(circle, rgba(129,140,248,0.12) 0%, transparent 70%)',\n }}\n animate={isPlaying ? { scale: [1, 1.08, 1], opacity: [0.5, 1, 0.5] } : { scale: 1, opacity: 0.2 }}\n transition={isPlaying ? { duration: 3, repeat: Infinity, ease: 'easeInOut' } : { duration: 0.5 }}\n />\n\n {/* 唱片主体 */}\n <div\n className=\"rfp-absolute rfp-rounded-full rfp-overflow-hidden\"\n style={{\n width: '200px',\n height: '200px',\n top: '28px',\n left: '18px',\n background: `\n radial-gradient(circle at center, transparent 95%, rgba(30,30,30,0.8) 95.5%, #111 97%),\n radial-gradient(circle at center, transparent 38%, rgba(50,50,50,0.5) 38.15%, transparent 38.4%),\n radial-gradient(circle at center, transparent 45%, rgba(50,50,50,0.3) 45.15%, transparent 45.4%),\n radial-gradient(circle at center, transparent 52%, rgba(50,50,50,0.5) 52.15%, transparent 52.4%),\n radial-gradient(circle at center, transparent 59%, rgba(50,50,50,0.3) 59.15%, transparent 59.4%),\n radial-gradient(circle at center, transparent 66%, rgba(50,50,50,0.5) 66.15%, transparent 66.4%),\n radial-gradient(circle at center, transparent 73%, rgba(50,50,50,0.3) 73.15%, transparent 73.4%),\n radial-gradient(circle at center, transparent 80%, rgba(50,50,50,0.4) 80.15%, transparent 80.4%),\n radial-gradient(circle at center, transparent 87%, rgba(50,50,50,0.3) 87.15%, transparent 87.4%),\n conic-gradient(from 0deg, #1c1c1c, #232323, #1a1a1a, #262626, #1c1c1c, #212121, #1a1a1a, #252525, #1c1c1c, #232323, #1a1a1a, #262626, #1c1c1c)\n `,\n boxShadow: isPlaying\n ? '0 0 36px rgba(129,140,248,0.1), 0 8px 32px rgba(0,0,0,0.4), inset 0 0 20px rgba(0,0,0,0.4)'\n : '0 8px 32px rgba(0,0,0,0.4), inset 0 0 20px rgba(0,0,0,0.4)',\n animation: 'rfp-vinyl-spin 8s linear infinite',\n animationPlayState: isPlaying ? 'running' : 'paused',\n }}\n >\n {/* 中心标签 */}\n <div\n className=\"rfp-absolute rfp-rounded-full\"\n style={{\n width: '34%',\n height: '34%',\n top: '33%',\n left: '33%',\n background: 'radial-gradient(circle at 40% 38%, #818cf8, #6366f1, #4f46e5, #4338ca)',\n boxShadow: 'inset 0 1px 3px rgba(255,255,255,0.25), inset 0 -1px 3px rgba(0,0,0,0.3), 0 0 8px rgba(0,0,0,0.3)',\n }}\n >\n <div\n className=\"rfp-absolute rfp-inset-0 rfp-rounded-full rfp-opacity-20\"\n style={{\n background: `\n radial-gradient(circle at center, transparent 30%, rgba(0,0,0,0.3) 31%, transparent 32%),\n radial-gradient(circle at center, transparent 50%, rgba(0,0,0,0.2) 51%, transparent 52%),\n radial-gradient(circle at center, transparent 70%, rgba(0,0,0,0.3) 71%, transparent 72%),\n radial-gradient(circle at center, transparent 88%, rgba(0,0,0,0.2) 89%, transparent 90%)\n `,\n }}\n />\n <div\n className=\"rfp-absolute rfp-rounded-full\"\n style={{\n width: '14%',\n height: '14%',\n top: '43%',\n left: '43%',\n background: 'radial-gradient(circle at 40% 40%, #333, #0d0d0d)',\n boxShadow: 'inset 0 1px 3px rgba(0,0,0,0.9), 0 0 2px rgba(0,0,0,0.5)',\n }}\n />\n </div>\n\n {isLoading && (\n <motion.div\n className=\"rfp-absolute rfp-inset-0 rfp-rounded-full\"\n style={{ border: '2px solid rgba(129,140,248,0.3)' }}\n animate={{ scale: [1, 1.02, 1], opacity: [0.3, 0.6, 0.3] }}\n transition={{ duration: 1.5, repeat: Infinity }}\n />\n )}\n </div>\n\n {/* 唱臂 */}\n <Tonearm isPlaying={isPlaying} />\n </div>\n\n {/* 文件名 */}\n <div className={`rfp-text-center rfp-max-w-md rfp-flex-shrink-0 ${isCompact ? 'rfp-px-2' : 'rfp-px-4'}`}>\n <MarqueeText\n text={fileName}\n className={`rfp-font-medium rfp-text-fg-primary ${isCompact ? 'rfp-text-sm' : 'rfp-text-lg'}`}\n />\n </div>\n\n {/* 控制面板 wrapper:按容器宽度整体缩放,保底视觉宽度 320px */}\n <div\n className=\"rfp-w-full rfp-flex rfp-justify-center rfp-flex-shrink-0\"\n >\n <div\n className={`rfp-rounded-2xl rfp-border rfp-bg-surface-1 rfp-border-line-weak ${\n isCompact ? 'rfp-p-3' : 'rfp-p-5'\n }`}\n style={{\n width: '448px',\n backdropFilter: 'blur(16px)',\n transform: controlScale < 1 ? `scale(${controlScale})` : undefined,\n transformOrigin: 'top center',\n marginBottom: controlScale < 1 ? `${-(1 - controlScale) * 100}px` : undefined,\n }}\n >\n {/* 进度条 */}\n <div className={isCompact ? 'rfp-mb-3' : 'rfp-mb-5'}>\n <div className=\"rfp-relative rfp-h-4 rfp-flex rfp-items-center\">\n <div className=\"rfp-absolute rfp-w-full rfp-h-[5px] rfp-rounded-full rfp-bg-surface-2\" />\n <div\n className=\"rfp-absolute rfp-h-[5px] rfp-rounded-full rfp-pointer-events-none\"\n style={{\n width: `${progress * 100}%`,\n background: 'linear-gradient(90deg, var(--fp-accent), var(--fp-accent-hover))',\n boxShadow: isPlaying ? '0 0 8px rgba(129,140,248,0.4)' : 'none',\n transition: isDragging ? 'none' : 'width 0.1s linear',\n }}\n />\n <input\n type=\"range\"\n min=\"0\"\n max={duration > 0 ? duration : currentTime || 100}\n step=\"any\"\n value={displayTime}\n onPointerDown={() => {\n setDragTime(currentTime);\n setIsDragging(true);\n }}\n onChange={(e) => {\n const value = parseFloat(e.target.value);\n if (isDragging) {\n setDragTime(value);\n } else {\n seek(value);\n }\n }}\n onPointerUp={(e) => {\n const value = parseFloat((e.target as HTMLInputElement).value);\n seek(value);\n setIsDragging(false);\n }}\n onPointerCancel={() => setIsDragging(false)}\n disabled={duration <= 0}\n aria-label={t('audio.aria.progress')}\n className=\"audio-slider rfp-absolute rfp-w-full\"\n />\n </div>\n <div className={`rfp-flex rfp-justify-between rfp-text-fg-tertiary ${isCompact ? 'rfp-text-[10px] rfp-mt-1.5' : 'rfp-text-xs rfp-mt-2.5'}`}>\n <span style={{ fontVariantNumeric: 'tabular-nums' }}>{formatTime(displayTime)}</span>\n <span style={{ fontVariantNumeric: 'tabular-nums' }}>{duration > 0 ? formatTime(duration) : '--:--'}</span>\n </div>\n </div>\n\n {/* 控制按钮 */}\n <div className={`rfp-flex rfp-items-center rfp-justify-center ${isCompact ? 'rfp-gap-2' : 'rfp-gap-3'}`}>\n {/* 循环 */}\n <motion.button\n onClick={toggleLoop}\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.92 }}\n aria-label={isLoop ? t('audio.aria.loop_off') : t('audio.aria.loop_on')}\n className={`rfp-rounded-full rfp-flex rfp-items-center rfp-justify-center rfp-transition-colors rfp-flex-shrink-0 ${\n isCompact ? 'rfp-w-8 rfp-h-8' : 'rfp-w-9 rfp-h-9'\n } ${\n isLoop\n ? 'rfp-bg-accent-soft rfp-text-accent'\n : 'rfp-bg-surface-2 rfp-text-fg-tertiary'\n }`}\n >\n <Repeat className={isCompact ? 'rfp-w-3.5 rfp-h-3.5' : 'rfp-w-4 rfp-h-4'} />\n </motion.button>\n\n {/* 后退 */}\n <motion.button\n onClick={() => skip(-10)}\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.92 }}\n aria-label={t('audio.aria.backward_10')}\n className={`rfp-rounded-full rfp-flex rfp-items-center rfp-justify-center rfp-transition-colors rfp-bg-surface-2 rfp-text-fg-secondary rfp-flex-shrink-0 ${\n isCompact ? 'rfp-w-9 rfp-h-9' : 'rfp-w-10 rfp-h-10'\n }`}\n >\n <SkipBack className={isCompact ? 'rfp-w-4 rfp-h-4' : 'rfp-w-[18px] rfp-h-[18px]'} />\n </motion.button>\n\n {/* 播放/暂停 */}\n <motion.button\n onClick={togglePlay}\n whileHover={{ scale: 1.06 }}\n whileTap={{ scale: 0.94 }}\n aria-label={isPlaying ? t('audio.aria.pause') : t('audio.aria.play')}\n className={`rfp-rounded-full rfp-flex rfp-items-center rfp-justify-center rfp-flex-shrink-0 ${\n isCompact ? 'rfp-w-12 rfp-h-12' : 'rfp-w-14 rfp-h-14'\n }`}\n style={{\n background: 'linear-gradient(135deg, var(--fp-accent-hover), var(--fp-accent))',\n color: '#fff',\n boxShadow: '0 4px 20px rgba(99,102,241,0.35)',\n }}\n >\n {isPlaying ? (\n <Pause className={isCompact ? 'rfp-w-5 rfp-h-5' : 'rfp-w-6 rfp-h-6'} />\n ) : (\n <Play className={isCompact ? 'rfp-w-5 rfp-h-5 rfp-ml-0.5' : 'rfp-w-6 rfp-h-6 rfp-ml-0.5'} />\n )}\n </motion.button>\n\n {/* 前进 */}\n <motion.button\n onClick={() => skip(10)}\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.92 }}\n aria-label={t('audio.aria.forward_10')}\n className={`rfp-rounded-full rfp-flex rfp-items-center rfp-justify-center rfp-transition-colors rfp-bg-surface-2 rfp-text-fg-secondary rfp-flex-shrink-0 ${\n isCompact ? 'rfp-w-9 rfp-h-9' : 'rfp-w-10 rfp-h-10'\n }`}\n >\n <SkipForward className={isCompact ? 'rfp-w-4 rfp-h-4' : 'rfp-w-[18px] rfp-h-[18px]'} />\n </motion.button>\n\n {/* 音量 */}\n <div\n ref={volumeRef}\n className=\"rfp-relative\"\n onMouseEnter={handleVolumeEnter}\n onMouseLeave={handleVolumeLeave}\n >\n <motion.button\n onClick={toggleMute}\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.92 }}\n aria-label={isMuted ? t('audio.aria.unmute') : t('audio.aria.mute')}\n className={`rfp-rounded-full rfp-flex rfp-items-center rfp-justify-center rfp-transition-colors rfp-flex-shrink-0 ${\n isCompact ? 'rfp-w-8 rfp-h-8' : 'rfp-w-9 rfp-h-9'\n } ${\n showVolume\n ? 'rfp-bg-accent-soft rfp-text-accent'\n : 'rfp-bg-surface-2 rfp-text-fg-secondary'\n }`}\n >\n <VolumeIcon className={isCompact ? 'rfp-w-3.5 rfp-h-3.5' : 'rfp-w-4 rfp-h-4'} />\n </motion.button>\n\n <AnimatePresence>\n {showVolume && (\n <motion.div\n initial={{ opacity: 0, scale: 0.95 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.95 }}\n transition={{ duration: 0.12 }}\n className=\"rfp-absolute rfp-bottom-full rfp-mb-2 rfp-rounded-xl rfp-p-3 rfp-border rfp-bg-surface-3 rfp-border-line\"\n style={{\n left: '50%',\n marginLeft: '-27px',\n backdropFilter: 'blur(16px)',\n }}\n onMouseEnter={handleVolumeEnter}\n onMouseLeave={handleVolumeLeave}\n >\n <div className=\"rfp-flex rfp-flex-col rfp-items-center rfp-gap-2\" style={{ height: '100px' }}>\n <div className=\"rfp-relative rfp-flex rfp-items-center rfp-justify-center\" style={{ width: '24px', height: '80px' }}>\n <div\n className=\"rfp-absolute rfp-rounded-full rfp-bg-surface-2\"\n style={{ width: '3px', height: '100%' }}\n />\n <div\n className=\"rfp-absolute rfp-bottom-0 rfp-rounded-full rfp-pointer-events-none\"\n style={{\n width: '3px',\n height: `${(isMuted ? 0 : volume) * 100}%`,\n background: 'var(--fp-accent-hover)',\n transition: 'height 0.1s linear',\n }}\n />\n <input\n type=\"range\"\n min=\"0\"\n max=\"1\"\n step=\"0.01\"\n value={isMuted ? 0 : volume}\n onChange={(e) => setVolume(parseFloat(e.target.value))}\n aria-label={t('audio.aria.volume')}\n className=\"volume-slider-vertical rfp-absolute\"\n style={{\n width: '80px',\n height: '24px',\n transform: 'rotate(-90deg)',\n transformOrigin: 'center center',\n }}\n />\n </div>\n <span className=\"rfp-text-[10px] rfp-tabular-nums rfp-text-fg-tertiary\">\n {Math.round((isMuted ? 0 : volume) * 100)}\n </span>\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n </div>\n </div>\n {/* wrapper 闭合 */}\n </div>\n\n <audio ref={audioRef} src={url} className=\"rfp-hidden\" />\n </div>\n );\n});\n"],"names":["useAudioPlayer","url","audioRef","useRef","isPlaying","setIsPlaying","useState","isLoading","setIsLoading","currentTime","setCurrentTime","duration","setDuration","volume","setVolumeState","isMuted","setIsMuted","isLoop","setIsLoop","error","setError","useEffect","audio","onTimeUpdate","onDurationChange","onCanPlay","onWaiting","onPlaying","onPlay","onPause","onEnded","onError","togglePlay","useCallback","seek","time","skip","seconds","setVolume","vol","clamped","toggleMute","toggleLoop","next","formatTime","minutes","MarqueeText","text","className","style","containerRef","innerRef","overflow","setOverflow","scrollDist","setScrollDist","check","container","inner","cw","tw","observer","gap","totalScroll","dur","jsxs","motion","jsx","Tonearm","AudioRenderer","forwardRef","fileName","ref","t","useTranslator","showVolume","setShowVolume","isCompact","setIsCompact","controlScale","setControlScale","isDragging","setIsDragging","dragTime","setDragTime","volumeRef","volumeTimerRef","displayTime","progress","checkSize","height","width","baseWidth","minScale","scale","handleClickOutside","e","handleVolumeEnter","handleVolumeLeave","VolumeIcon","VolumeX","Volume1","Volume2","useImperativeHandle","RendererError","vinylScale","vinylBase","vinylHeightBase","finalVinylScale","value","Repeat","SkipBack","Pause","Play","SkipForward","AnimatePresence"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { jsx as i, jsxs as L } from "react/jsx-runtime";
2
2
  import { forwardRef as ht, useRef as f, useState as g, useCallback as d, useEffect as v, useImperativeHandle as mt } from "react";
3
3
  import bt from "@likecoin/epub-ts";
4
4
  import { List as gt, ChevronLeft as wt, ChevronRight as yt, Minimize2 as vt, Maximize2 as xt, X as kt } from "lucide-react";
5
- import { u as Tt, a as Rt } from "./index-DreA69iU.mjs";
5
+ import { u as Tt, a as Rt } from "./index-Cbp94jbP.mjs";
6
6
  import { R as Nt } from "./RendererError-D5i8eSpN.mjs";
7
7
  if (typeof document < "u" && !document.getElementById("rfp-epub-styles")) {
8
8
  const l = document.createElement("style");
@@ -288,4 +288,4 @@ const Ct = 794, At = ht(
288
288
  export {
289
289
  At as EpubRenderer
290
290
  };
291
- //# sourceMappingURL=index-jvNrkVkp.mjs.map
291
+ //# sourceMappingURL=index-CTEgp9x8.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-jvNrkVkp.mjs","sources":["../../src/renderers/Epub/index.tsx"],"sourcesContent":["import { useEffect, useRef, useState, useCallback, useImperativeHandle, forwardRef } from 'react';\nimport ePub from '@likecoin/epub-ts';\nimport { X, ChevronLeft, ChevronRight, Maximize2, Minimize2, List } from 'lucide-react';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { useFetcher } from '../../RequestContext';\nimport { RendererError } from '../RendererError';\nimport type { RendererHandle } from '../base.types';\nimport type { ToolbarGroup } from '../toolbar.types';\n\n// 全局注入 epubjs 容器样式(只注入一次)\nif (typeof document !== 'undefined' && !document.getElementById('rfp-epub-styles')) {\n const styleEl = document.createElement('style');\n styleEl.id = 'rfp-epub-styles';\n styleEl.textContent = `\n .epub-container { overflow-y: auto !important; scrollbar-width: thin; }\n .epub-container::-webkit-scrollbar { width: 8px; }\n .epub-container::-webkit-scrollbar-track { background: transparent; }\n .epub-container::-webkit-scrollbar-thumb { background: rgba(0,0,0,0.15); border-radius: 4px; }\n .epub-container::-webkit-scrollbar-thumb:hover { background: rgba(0,0,0,0.3); }\n .epub-view > iframe { background: white; }\n `;\n document.head.appendChild(styleEl);\n}\n\nexport interface TocItem {\n label: string;\n href: string;\n subitems?: TocItem[];\n}\n\nexport interface EpubRendererHandle extends RendererHandle {\n prevPage: () => void;\n nextPage: () => void;\n toggleFullWidth: () => void;\n toggleToc: () => void;\n}\n\ninterface EpubRendererProps {\n url: string;\n}\n\ninterface RenditionLike {\n display: (target?: string) => Promise<unknown>;\n next: () => Promise<unknown>;\n prev: () => Promise<unknown>;\n on: (event: string, cb: (...args: unknown[]) => void) => void;\n resize: (width: number, height: number) => void;\n currentLocation: () => unknown;\n destroy?: () => void;\n themes: {\n register: (name: string, styles: Record<string, unknown>) => void;\n select: (name: string) => void;\n };\n}\n\ninterface BookLike {\n ready: Promise<unknown>;\n loaded: { navigation: Promise<unknown> };\n locations: {\n generate: (chars: number) => Promise<string[]>;\n length: () => number;\n locationFromCfi: (cfi: string) => number;\n };\n renderTo: (el: HTMLElement, opts: Record<string, unknown>) => RenditionLike;\n destroy: () => void;\n}\n\nconst A4_WIDTH = 794;\n\nexport const EpubRenderer = forwardRef<EpubRendererHandle, EpubRendererProps>(\n ({ url }, ref) => {\n const t = useTranslator();\n const fetcher = useFetcher();\n const viewerRef = useRef<HTMLDivElement>(null);\n const bookRef = useRef<BookLike | null>(null);\n const renditionRef = useRef<RenditionLike | null>(null);\n\n const totalLocationsRef = useRef(0);\n const lastCfiRef = useRef<string | null>(null);\n const isFullWidthRef = useRef(false);\n\n // 内部状态管理\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [isFullWidth, setIsFullWidth] = useState(false);\n const [toc, setToc] = useState<TocItem[]>([]);\n const [showToc, setShowToc] = useState(false);\n const [activeTocHref, setActiveTocHref] = useState<string>('');\n const [currentChapter, setCurrentChapter] = useState(0);\n const [totalChapters, setTotalChapters] = useState(0);\n const tocRef = useRef<TocItem[]>([]);\n tocRef.current = toc;\n\n isFullWidthRef.current = isFullWidth;\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 }, [currentChapter, notifyToolbarChange]);\n\n useEffect(() => {\n notifyToolbarChange();\n }, [totalChapters, notifyToolbarChange]);\n\n useEffect(() => {\n notifyToolbarChange();\n }, [isFullWidth, notifyToolbarChange]);\n\n useEffect(() => {\n notifyToolbarChange();\n }, [toc.length, notifyToolbarChange]);\n\n const handlePrev = useCallback(() => {\n renditionRef.current?.prev();\n }, []);\n\n const handleNext = useCallback(() => {\n renditionRef.current?.next();\n }, []);\n\n // 滚动监听:接近底部时强制触发 check 加载后续 section\n const scrollContainerRef = useRef<Element | null>(null);\n const scrollRafRef = useRef(0);\n\n const onScrollRef = useRef((_e?: Event) => {\n const container = scrollContainerRef.current;\n if (!container) return;\n const el = container as HTMLElement;\n const nearBottom = el.scrollTop + el.clientHeight >= el.scrollHeight - 200;\n if (nearBottom) {\n try {\n const mgr = (renditionRef.current as unknown as { manager?: { check?: (t?: number, e?: number) => Promise<unknown> } })?.manager;\n mgr?.check?.(500, 500);\n } catch { /* ignore */ }\n }\n });\n\n const reattachScrollListener = useCallback(() => {\n // 清理旧监听\n if (scrollContainerRef.current) {\n scrollContainerRef.current.removeEventListener('scroll', onScrollRef.current);\n scrollContainerRef.current = null;\n }\n cancelAnimationFrame(scrollRafRef.current);\n\n const tryAttach = () => {\n const container = viewerRef.current?.querySelector('.epub-container') ?? null;\n if (!container) {\n scrollRafRef.current = requestAnimationFrame(tryAttach);\n return;\n }\n scrollContainerRef.current = container;\n container.addEventListener('scroll', onScrollRef.current, { passive: true });\n };\n scrollRafRef.current = requestAnimationFrame(tryAttach);\n }, []);\n\n const toggleFullWidth = useCallback(() => {\n const newVal = !isFullWidthRef.current;\n setIsFullWidth(newVal);\n // 等 CSS transition 完成后再 resize 并恢复位置\n setTimeout(() => {\n const viewer = viewerRef.current;\n const rendition = renditionRef.current;\n if (!viewer || !rendition) return;\n rendition.resize(viewer.offsetWidth, viewer.offsetHeight);\n // 重排后恢复阅读位置\n if (lastCfiRef.current) {\n rendition.display(lastCfiRef.current);\n }\n // resize/display 可能重建 .epub-container,需要重新绑定滚动监听\n reattachScrollListener();\n }, 350);\n }, [reattachScrollListener]);\n\n const toggleToc = useCallback(() => {\n setShowToc(prev => !prev);\n }, []);\n\n const handleTocClick = useCallback((href: string) => {\n setActiveTocHref(href);\n renditionRef.current?.display(href);\n setShowToc(false);\n }, []);\n\n // 工具栏配置\n const getToolbarGroups = useCallback((): ToolbarGroup[] => [\n {\n items: [\n { type: 'button', icon: <List className=\"rfp-w-4 rfp-h-4\" />, tooltip: t('toolbar.toc'), action: toggleToc, disabled: toc.length === 0, active: showToc },\n ],\n },\n {\n items: [\n { type: 'button', icon: <ChevronLeft className=\"rfp-w-4 rfp-h-4\" />, tooltip: t('toolbar.prev_page'), action: handlePrev, disabled: currentChapter <= 1 },\n { type: 'text', content: `${currentChapter} / ${totalChapters}`, minWidth: '4rem' },\n { type: 'button', icon: <ChevronRight className=\"rfp-w-4 rfp-h-4\" />, tooltip: t('toolbar.next_page'), action: handleNext, disabled: currentChapter >= totalChapters },\n ],\n },\n {\n items: [\n { type: 'button', icon: isFullWidth ? <Minimize2 className=\"rfp-w-4 rfp-h-4\" /> : <Maximize2 className=\"rfp-w-4 rfp-h-4\" />, tooltip: isFullWidth ? t('toolbar.normal_width') : t('toolbar.full_width'), action: toggleFullWidth, active: isFullWidth },\n ],\n },\n ], [currentChapter, totalChapters, isFullWidth, showToc, toc.length, t, handlePrev, handleNext, toggleToc, toggleFullWidth]);\n\n useImperativeHandle(ref, () => ({\n getToolbarGroups,\n onToolbarChange: (listener: () => void) => {\n listenersRef.current.add(listener);\n return () => listenersRef.current.delete(listener);\n },\n prevPage: handlePrev,\n nextPage: handleNext,\n toggleFullWidth,\n toggleToc,\n }), [getToolbarGroups, handlePrev, handleNext, toggleFullWidth, toggleToc]);\n\n useEffect(() => {\n const viewer = viewerRef.current;\n // 只有 URL 有效时才加载(避免空字符串或已 revoke 的 blob URL)\n if (!viewer || !url) return;\n\n setLoading(true);\n setError(null);\n setToc([]);\n setShowToc(false);\n viewer.innerHTML = '';\n lastCfiRef.current = null;\n totalLocationsRef.current = 0;\n\n let cancelled = false;\n // StrictMode 下 effect 会立即 mount→unmount→mount\n // 用 microtask 延迟初始化,让第一次的 cleanup 先执行,避免 epubjs 内部状态被污染\n const loadTimer = window.setTimeout(() => {\n if (cancelled) return;\n load();\n }, 0);\n\n const load = async () => {\n try {\n let bookInput: string | ArrayBuffer = url;\n if (url.startsWith('blob:')) {\n const resp = await fetcher(url);\n bookInput = await resp.arrayBuffer();\n }\n\n const book = ePub(bookInput) as unknown as BookLike;\n bookRef.current = book;\n\n const rendition = book.renderTo(viewer, {\n manager: 'continuous',\n flow: 'scrolled',\n width: '100%',\n height: '100%',\n });\n renditionRef.current = rendition;\n\n rendition.themes.register('default', {\n body: {\n background: '#ffffff !important',\n color: '#1a1a1a !important',\n 'font-family': '\"Noto Serif SC\", \"Source Han Serif SC\", Georgia, \"Times New Roman\", serif !important',\n 'font-size': '16px !important',\n 'line-height': '2 !important',\n padding: '40px 60px !important',\n 'max-width': '100% !important',\n 'box-sizing': 'border-box !important',\n 'word-break': 'break-word !important',\n 'overflow-wrap': 'break-word !important',\n },\n p: { 'text-indent': '2em !important', margin: '0.8em 0 !important' },\n h1: { 'text-align': 'center !important', margin: '1.5em 0 1em !important' },\n h2: { margin: '1.2em 0 0.8em !important' },\n h3: { margin: '1em 0 0.6em !important' },\n img: { 'max-width': '100% !important', height: 'auto !important' },\n a: { color: '#2563eb !important', 'text-decoration': 'none !important' },\n });\n rendition.themes.select('default');\n\n await book.ready;\n\n // 异步生成 locations 索引(用于实时页数)\n book.locations.generate(1024).then(() => {\n if (cancelled) return;\n totalLocationsRef.current = book.locations.length();\n // 更新内部状态\n const loc = renditionRef.current?.currentLocation() as { start?: { location?: number; cfi?: string } } | undefined;\n const cur = loc?.start?.location ?? 0;\n setCurrentChapter(cur + 1);\n setTotalChapters(totalLocationsRef.current);\n }).catch(() => { /* ignore */ });\n\n // 获取目录\n const nav = await book.loaded.navigation as { toc?: TocItem[] };\n if (!cancelled && Array.isArray(nav?.toc)) {\n setToc(nav.toc);\n }\n\n await rendition.display();\n\n if (cancelled) return;\n setCurrentChapter(1);\n setTotalChapters(totalLocationsRef.current || 1);\n\n setLoading(false);\n\n rendition.on('relocated', (location: unknown) => {\n const loc = location as { start?: { cfi?: string; location?: number; href?: string } };\n if (loc?.start?.cfi) {\n lastCfiRef.current = loc.start.cfi;\n }\n if (loc?.start?.href) {\n // 根据 spine href 查找匹配的 TOC 项\n const spineHref = loc.start.href;\n const matches: string[] = [];\n const collect = (items: TocItem[]) => {\n for (const item of items) {\n const base = item.href.split('#')[0];\n if (base && (spineHref === base || spineHref.endsWith('/' + base) || spineHref.endsWith(base))) {\n matches.push(item.href);\n }\n if (item.subitems) collect(item.subitems);\n }\n };\n collect(tocRef.current);\n if (matches.length === 1) {\n // 唯一匹配,直接设置\n setActiveTocHref(matches[0]);\n }\n // 多个匹配(同一文件不同 anchor)时保持当前选中(由点击设置)\n }\n const cur = loc?.start?.location;\n const total = totalLocationsRef.current;\n if (typeof cur === 'number' && total > 0) {\n setCurrentChapter(cur + 1);\n setTotalChapters(total);\n }\n });\n\n } catch (err) {\n console.error('EPUB 加载错误:', err);\n if (!cancelled) {\n setError(t('epub.load_failed'));\n setLoading(false);\n }\n }\n };\n\n return () => {\n cancelled = true;\n window.clearTimeout(loadTimer);\n try { renditionRef.current?.destroy?.(); } catch { /* ignore */ }\n try { bookRef.current?.destroy(); } catch { /* ignore */ }\n renditionRef.current = null;\n bookRef.current = null;\n };\n }, [url]);\n\n // 监听容器尺寸变化:等待 transition 完成后才 resize,避免 transition 期间频繁触发导致频闪\n useEffect(() => {\n const viewer = viewerRef.current;\n if (!viewer) return;\n\n let isInitialRender = true;\n let lastDimensions = { width: 0, height: 0 };\n let resizeTimeout: number | null = null;\n\n const doResize = () => {\n const v = viewerRef.current;\n const rendition = renditionRef.current;\n if (!v || !rendition) return;\n rendition.resize(v.offsetWidth, v.offsetHeight);\n // resize 后恢复阅读位置\n if (lastCfiRef.current) {\n try { rendition.display(lastCfiRef.current); } catch { /* ignore */ }\n }\n // resize/display 可能重建 .epub-container,需要重新绑定滚动监听\n reattachScrollListener();\n };\n\n const observer = new ResizeObserver(() => {\n const v = viewerRef.current;\n if (!v) return;\n\n if (isInitialRender) {\n isInitialRender = false;\n lastDimensions = { width: v.offsetWidth, height: v.offsetHeight };\n return;\n }\n\n const newDimensions = { width: v.offsetWidth, height: v.offsetHeight };\n const widthDiff = Math.abs(lastDimensions.width - newDimensions.width);\n const heightDiff = Math.abs(lastDimensions.height - newDimensions.height);\n\n // 微小变化不触发,避免抖动\n if (widthDiff < 10 && heightDiff < 10) return;\n\n lastDimensions = newDimensions;\n\n // 防抖:等待 transition 完成(350ms)后才重新渲染\n if (resizeTimeout !== null) clearTimeout(resizeTimeout);\n resizeTimeout = window.setTimeout(() => {\n doResize();\n }, 350);\n });\n\n observer.observe(viewer);\n\n return () => {\n observer.disconnect();\n if (resizeTimeout !== null) clearTimeout(resizeTimeout);\n };\n }, [reattachScrollListener]);\n\n useEffect(() => {\n reattachScrollListener();\n return () => {\n cancelAnimationFrame(scrollRafRef.current);\n scrollContainerRef.current?.removeEventListener('scroll', onScrollRef.current);\n };\n }, [url, reattachScrollListener]);\n\n const isActive = useCallback((href: string) => {\n return href === activeTocHref;\n }, [activeTocHref]);\n\n const renderTocItems = (items: TocItem[], depth = 0) => (\n <ul style={{ marginLeft: depth > 0 ? 16 : 0 }}>\n {items.map((item, i) => {\n const active = isActive(item.href);\n return (\n <li key={`${item.href}-${i}`}>\n <button\n onClick={() => handleTocClick(item.href)}\n className={`rfp-w-full rfp-text-left rfp-py-2 rfp-px-3 rfp-text-sm rfp-rounded rfp-transition-all rfp-truncate ${active\n ? 'rfp-text-fg-primary rfp-bg-surface-3 rfp-font-medium'\n : 'rfp-text-fg-secondary hover:rfp-text-fg-primary hover:rfp-bg-surface-2'\n }`}\n title={item.label}\n >\n {item.label.trim()}\n </button>\n {item.subitems && item.subitems.length > 0 && renderTocItems(item.subitems, depth + 1)}\n </li>\n );\n })}\n </ul>\n );\n\n return (\n <div className=\"rfp-relative rfp-w-full rfp-h-full rfp-flex rfp-justify-center rfp-bg-surface-1 rfp-overflow-hidden\">\n {error && <RendererError message={error} />}\n\n {loading && !error && (\n <div className=\"rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-z-10\">\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 {toc.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: showToc ? 1 : 0,\n pointerEvents: showToc ? '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: showToc ? '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.toc')}</span>\n <button\n onClick={() => setShowToc(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 {renderTocItems(toc)}\n </div>\n </div>\n <div\n className=\"rfp-flex-1 rfp-transition-opacity rfp-duration-300\"\n style={{ background: showToc ? 'rgba(0,0,0,0.3)' : 'transparent' }}\n onClick={() => setShowToc(false)}\n />\n </div>\n )}\n\n {!error && (\n <div\n ref={viewerRef}\n className=\"rfp-h-full rfp-bg-surface-toolbar rfp-shadow-lg\"\n style={{\n width: isFullWidth ? '100%' : `${A4_WIDTH}px`,\n maxWidth: '100%',\n transition: 'width 0.3s ease',\n overflow: 'hidden',\n }}\n />\n )}\n </div>\n );\n }\n);\n"],"names":["styleEl","A4_WIDTH","EpubRenderer","forwardRef","url","ref","t","useTranslator","fetcher","useFetcher","viewerRef","useRef","bookRef","renditionRef","totalLocationsRef","lastCfiRef","isFullWidthRef","loading","setLoading","useState","error","setError","isFullWidth","setIsFullWidth","toc","setToc","showToc","setShowToc","activeTocHref","setActiveTocHref","currentChapter","setCurrentChapter","totalChapters","setTotalChapters","tocRef","listenersRef","notifyToolbarChange","useCallback","listener","useEffect","handlePrev","_a","handleNext","scrollContainerRef","scrollRafRef","onScrollRef","_e","container","el","mgr","_b","reattachScrollListener","tryAttach","toggleFullWidth","newVal","viewer","rendition","toggleToc","prev","handleTocClick","href","getToolbarGroups","List","jsx","ChevronLeft","ChevronRight","Minimize2","Maximize2","useImperativeHandle","cancelled","loadTimer","load","bookInput","book","ePub","loc","cur","nav","location","spineHref","matches","collect","items","item","base","_c","total","err","isInitialRender","lastDimensions","resizeTimeout","doResize","v","observer","newDimensions","widthDiff","heightDiff","isActive","renderTocItems","depth","i","active","jsxs","RendererError","X"],"mappings":"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"}
1
+ {"version":3,"file":"index-CTEgp9x8.mjs","sources":["../../src/renderers/Epub/index.tsx"],"sourcesContent":["import { useEffect, useRef, useState, useCallback, useImperativeHandle, forwardRef } from 'react';\nimport ePub from '@likecoin/epub-ts';\nimport { X, ChevronLeft, ChevronRight, Maximize2, Minimize2, List } from 'lucide-react';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { useFetcher } from '../../RequestContext';\nimport { RendererError } from '../RendererError';\nimport type { RendererHandle } from '../base.types';\nimport type { ToolbarGroup } from '../toolbar.types';\n\n// 全局注入 epubjs 容器样式(只注入一次)\nif (typeof document !== 'undefined' && !document.getElementById('rfp-epub-styles')) {\n const styleEl = document.createElement('style');\n styleEl.id = 'rfp-epub-styles';\n styleEl.textContent = `\n .epub-container { overflow-y: auto !important; scrollbar-width: thin; }\n .epub-container::-webkit-scrollbar { width: 8px; }\n .epub-container::-webkit-scrollbar-track { background: transparent; }\n .epub-container::-webkit-scrollbar-thumb { background: rgba(0,0,0,0.15); border-radius: 4px; }\n .epub-container::-webkit-scrollbar-thumb:hover { background: rgba(0,0,0,0.3); }\n .epub-view > iframe { background: white; }\n `;\n document.head.appendChild(styleEl);\n}\n\nexport interface TocItem {\n label: string;\n href: string;\n subitems?: TocItem[];\n}\n\nexport interface EpubRendererHandle extends RendererHandle {\n prevPage: () => void;\n nextPage: () => void;\n toggleFullWidth: () => void;\n toggleToc: () => void;\n}\n\ninterface EpubRendererProps {\n url: string;\n}\n\ninterface RenditionLike {\n display: (target?: string) => Promise<unknown>;\n next: () => Promise<unknown>;\n prev: () => Promise<unknown>;\n on: (event: string, cb: (...args: unknown[]) => void) => void;\n resize: (width: number, height: number) => void;\n currentLocation: () => unknown;\n destroy?: () => void;\n themes: {\n register: (name: string, styles: Record<string, unknown>) => void;\n select: (name: string) => void;\n };\n}\n\ninterface BookLike {\n ready: Promise<unknown>;\n loaded: { navigation: Promise<unknown> };\n locations: {\n generate: (chars: number) => Promise<string[]>;\n length: () => number;\n locationFromCfi: (cfi: string) => number;\n };\n renderTo: (el: HTMLElement, opts: Record<string, unknown>) => RenditionLike;\n destroy: () => void;\n}\n\nconst A4_WIDTH = 794;\n\nexport const EpubRenderer = forwardRef<EpubRendererHandle, EpubRendererProps>(\n ({ url }, ref) => {\n const t = useTranslator();\n const fetcher = useFetcher();\n const viewerRef = useRef<HTMLDivElement>(null);\n const bookRef = useRef<BookLike | null>(null);\n const renditionRef = useRef<RenditionLike | null>(null);\n\n const totalLocationsRef = useRef(0);\n const lastCfiRef = useRef<string | null>(null);\n const isFullWidthRef = useRef(false);\n\n // 内部状态管理\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [isFullWidth, setIsFullWidth] = useState(false);\n const [toc, setToc] = useState<TocItem[]>([]);\n const [showToc, setShowToc] = useState(false);\n const [activeTocHref, setActiveTocHref] = useState<string>('');\n const [currentChapter, setCurrentChapter] = useState(0);\n const [totalChapters, setTotalChapters] = useState(0);\n const tocRef = useRef<TocItem[]>([]);\n tocRef.current = toc;\n\n isFullWidthRef.current = isFullWidth;\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 }, [currentChapter, notifyToolbarChange]);\n\n useEffect(() => {\n notifyToolbarChange();\n }, [totalChapters, notifyToolbarChange]);\n\n useEffect(() => {\n notifyToolbarChange();\n }, [isFullWidth, notifyToolbarChange]);\n\n useEffect(() => {\n notifyToolbarChange();\n }, [toc.length, notifyToolbarChange]);\n\n const handlePrev = useCallback(() => {\n renditionRef.current?.prev();\n }, []);\n\n const handleNext = useCallback(() => {\n renditionRef.current?.next();\n }, []);\n\n // 滚动监听:接近底部时强制触发 check 加载后续 section\n const scrollContainerRef = useRef<Element | null>(null);\n const scrollRafRef = useRef(0);\n\n const onScrollRef = useRef((_e?: Event) => {\n const container = scrollContainerRef.current;\n if (!container) return;\n const el = container as HTMLElement;\n const nearBottom = el.scrollTop + el.clientHeight >= el.scrollHeight - 200;\n if (nearBottom) {\n try {\n const mgr = (renditionRef.current as unknown as { manager?: { check?: (t?: number, e?: number) => Promise<unknown> } })?.manager;\n mgr?.check?.(500, 500);\n } catch { /* ignore */ }\n }\n });\n\n const reattachScrollListener = useCallback(() => {\n // 清理旧监听\n if (scrollContainerRef.current) {\n scrollContainerRef.current.removeEventListener('scroll', onScrollRef.current);\n scrollContainerRef.current = null;\n }\n cancelAnimationFrame(scrollRafRef.current);\n\n const tryAttach = () => {\n const container = viewerRef.current?.querySelector('.epub-container') ?? null;\n if (!container) {\n scrollRafRef.current = requestAnimationFrame(tryAttach);\n return;\n }\n scrollContainerRef.current = container;\n container.addEventListener('scroll', onScrollRef.current, { passive: true });\n };\n scrollRafRef.current = requestAnimationFrame(tryAttach);\n }, []);\n\n const toggleFullWidth = useCallback(() => {\n const newVal = !isFullWidthRef.current;\n setIsFullWidth(newVal);\n // 等 CSS transition 完成后再 resize 并恢复位置\n setTimeout(() => {\n const viewer = viewerRef.current;\n const rendition = renditionRef.current;\n if (!viewer || !rendition) return;\n rendition.resize(viewer.offsetWidth, viewer.offsetHeight);\n // 重排后恢复阅读位置\n if (lastCfiRef.current) {\n rendition.display(lastCfiRef.current);\n }\n // resize/display 可能重建 .epub-container,需要重新绑定滚动监听\n reattachScrollListener();\n }, 350);\n }, [reattachScrollListener]);\n\n const toggleToc = useCallback(() => {\n setShowToc(prev => !prev);\n }, []);\n\n const handleTocClick = useCallback((href: string) => {\n setActiveTocHref(href);\n renditionRef.current?.display(href);\n setShowToc(false);\n }, []);\n\n // 工具栏配置\n const getToolbarGroups = useCallback((): ToolbarGroup[] => [\n {\n items: [\n { type: 'button', icon: <List className=\"rfp-w-4 rfp-h-4\" />, tooltip: t('toolbar.toc'), action: toggleToc, disabled: toc.length === 0, active: showToc },\n ],\n },\n {\n items: [\n { type: 'button', icon: <ChevronLeft className=\"rfp-w-4 rfp-h-4\" />, tooltip: t('toolbar.prev_page'), action: handlePrev, disabled: currentChapter <= 1 },\n { type: 'text', content: `${currentChapter} / ${totalChapters}`, minWidth: '4rem' },\n { type: 'button', icon: <ChevronRight className=\"rfp-w-4 rfp-h-4\" />, tooltip: t('toolbar.next_page'), action: handleNext, disabled: currentChapter >= totalChapters },\n ],\n },\n {\n items: [\n { type: 'button', icon: isFullWidth ? <Minimize2 className=\"rfp-w-4 rfp-h-4\" /> : <Maximize2 className=\"rfp-w-4 rfp-h-4\" />, tooltip: isFullWidth ? t('toolbar.normal_width') : t('toolbar.full_width'), action: toggleFullWidth, active: isFullWidth },\n ],\n },\n ], [currentChapter, totalChapters, isFullWidth, showToc, toc.length, t, handlePrev, handleNext, toggleToc, toggleFullWidth]);\n\n useImperativeHandle(ref, () => ({\n getToolbarGroups,\n onToolbarChange: (listener: () => void) => {\n listenersRef.current.add(listener);\n return () => listenersRef.current.delete(listener);\n },\n prevPage: handlePrev,\n nextPage: handleNext,\n toggleFullWidth,\n toggleToc,\n }), [getToolbarGroups, handlePrev, handleNext, toggleFullWidth, toggleToc]);\n\n useEffect(() => {\n const viewer = viewerRef.current;\n // 只有 URL 有效时才加载(避免空字符串或已 revoke 的 blob URL)\n if (!viewer || !url) return;\n\n setLoading(true);\n setError(null);\n setToc([]);\n setShowToc(false);\n viewer.innerHTML = '';\n lastCfiRef.current = null;\n totalLocationsRef.current = 0;\n\n let cancelled = false;\n // StrictMode 下 effect 会立即 mount→unmount→mount\n // 用 microtask 延迟初始化,让第一次的 cleanup 先执行,避免 epubjs 内部状态被污染\n const loadTimer = window.setTimeout(() => {\n if (cancelled) return;\n load();\n }, 0);\n\n const load = async () => {\n try {\n let bookInput: string | ArrayBuffer = url;\n if (url.startsWith('blob:')) {\n const resp = await fetcher(url);\n bookInput = await resp.arrayBuffer();\n }\n\n const book = ePub(bookInput) as unknown as BookLike;\n bookRef.current = book;\n\n const rendition = book.renderTo(viewer, {\n manager: 'continuous',\n flow: 'scrolled',\n width: '100%',\n height: '100%',\n });\n renditionRef.current = rendition;\n\n rendition.themes.register('default', {\n body: {\n background: '#ffffff !important',\n color: '#1a1a1a !important',\n 'font-family': '\"Noto Serif SC\", \"Source Han Serif SC\", Georgia, \"Times New Roman\", serif !important',\n 'font-size': '16px !important',\n 'line-height': '2 !important',\n padding: '40px 60px !important',\n 'max-width': '100% !important',\n 'box-sizing': 'border-box !important',\n 'word-break': 'break-word !important',\n 'overflow-wrap': 'break-word !important',\n },\n p: { 'text-indent': '2em !important', margin: '0.8em 0 !important' },\n h1: { 'text-align': 'center !important', margin: '1.5em 0 1em !important' },\n h2: { margin: '1.2em 0 0.8em !important' },\n h3: { margin: '1em 0 0.6em !important' },\n img: { 'max-width': '100% !important', height: 'auto !important' },\n a: { color: '#2563eb !important', 'text-decoration': 'none !important' },\n });\n rendition.themes.select('default');\n\n await book.ready;\n\n // 异步生成 locations 索引(用于实时页数)\n book.locations.generate(1024).then(() => {\n if (cancelled) return;\n totalLocationsRef.current = book.locations.length();\n // 更新内部状态\n const loc = renditionRef.current?.currentLocation() as { start?: { location?: number; cfi?: string } } | undefined;\n const cur = loc?.start?.location ?? 0;\n setCurrentChapter(cur + 1);\n setTotalChapters(totalLocationsRef.current);\n }).catch(() => { /* ignore */ });\n\n // 获取目录\n const nav = await book.loaded.navigation as { toc?: TocItem[] };\n if (!cancelled && Array.isArray(nav?.toc)) {\n setToc(nav.toc);\n }\n\n await rendition.display();\n\n if (cancelled) return;\n setCurrentChapter(1);\n setTotalChapters(totalLocationsRef.current || 1);\n\n setLoading(false);\n\n rendition.on('relocated', (location: unknown) => {\n const loc = location as { start?: { cfi?: string; location?: number; href?: string } };\n if (loc?.start?.cfi) {\n lastCfiRef.current = loc.start.cfi;\n }\n if (loc?.start?.href) {\n // 根据 spine href 查找匹配的 TOC 项\n const spineHref = loc.start.href;\n const matches: string[] = [];\n const collect = (items: TocItem[]) => {\n for (const item of items) {\n const base = item.href.split('#')[0];\n if (base && (spineHref === base || spineHref.endsWith('/' + base) || spineHref.endsWith(base))) {\n matches.push(item.href);\n }\n if (item.subitems) collect(item.subitems);\n }\n };\n collect(tocRef.current);\n if (matches.length === 1) {\n // 唯一匹配,直接设置\n setActiveTocHref(matches[0]);\n }\n // 多个匹配(同一文件不同 anchor)时保持当前选中(由点击设置)\n }\n const cur = loc?.start?.location;\n const total = totalLocationsRef.current;\n if (typeof cur === 'number' && total > 0) {\n setCurrentChapter(cur + 1);\n setTotalChapters(total);\n }\n });\n\n } catch (err) {\n console.error('EPUB 加载错误:', err);\n if (!cancelled) {\n setError(t('epub.load_failed'));\n setLoading(false);\n }\n }\n };\n\n return () => {\n cancelled = true;\n window.clearTimeout(loadTimer);\n try { renditionRef.current?.destroy?.(); } catch { /* ignore */ }\n try { bookRef.current?.destroy(); } catch { /* ignore */ }\n renditionRef.current = null;\n bookRef.current = null;\n };\n }, [url]);\n\n // 监听容器尺寸变化:等待 transition 完成后才 resize,避免 transition 期间频繁触发导致频闪\n useEffect(() => {\n const viewer = viewerRef.current;\n if (!viewer) return;\n\n let isInitialRender = true;\n let lastDimensions = { width: 0, height: 0 };\n let resizeTimeout: number | null = null;\n\n const doResize = () => {\n const v = viewerRef.current;\n const rendition = renditionRef.current;\n if (!v || !rendition) return;\n rendition.resize(v.offsetWidth, v.offsetHeight);\n // resize 后恢复阅读位置\n if (lastCfiRef.current) {\n try { rendition.display(lastCfiRef.current); } catch { /* ignore */ }\n }\n // resize/display 可能重建 .epub-container,需要重新绑定滚动监听\n reattachScrollListener();\n };\n\n const observer = new ResizeObserver(() => {\n const v = viewerRef.current;\n if (!v) return;\n\n if (isInitialRender) {\n isInitialRender = false;\n lastDimensions = { width: v.offsetWidth, height: v.offsetHeight };\n return;\n }\n\n const newDimensions = { width: v.offsetWidth, height: v.offsetHeight };\n const widthDiff = Math.abs(lastDimensions.width - newDimensions.width);\n const heightDiff = Math.abs(lastDimensions.height - newDimensions.height);\n\n // 微小变化不触发,避免抖动\n if (widthDiff < 10 && heightDiff < 10) return;\n\n lastDimensions = newDimensions;\n\n // 防抖:等待 transition 完成(350ms)后才重新渲染\n if (resizeTimeout !== null) clearTimeout(resizeTimeout);\n resizeTimeout = window.setTimeout(() => {\n doResize();\n }, 350);\n });\n\n observer.observe(viewer);\n\n return () => {\n observer.disconnect();\n if (resizeTimeout !== null) clearTimeout(resizeTimeout);\n };\n }, [reattachScrollListener]);\n\n useEffect(() => {\n reattachScrollListener();\n return () => {\n cancelAnimationFrame(scrollRafRef.current);\n scrollContainerRef.current?.removeEventListener('scroll', onScrollRef.current);\n };\n }, [url, reattachScrollListener]);\n\n const isActive = useCallback((href: string) => {\n return href === activeTocHref;\n }, [activeTocHref]);\n\n const renderTocItems = (items: TocItem[], depth = 0) => (\n <ul style={{ marginLeft: depth > 0 ? 16 : 0 }}>\n {items.map((item, i) => {\n const active = isActive(item.href);\n return (\n <li key={`${item.href}-${i}`}>\n <button\n onClick={() => handleTocClick(item.href)}\n className={`rfp-w-full rfp-text-left rfp-py-2 rfp-px-3 rfp-text-sm rfp-rounded rfp-transition-all rfp-truncate ${active\n ? 'rfp-text-fg-primary rfp-bg-surface-3 rfp-font-medium'\n : 'rfp-text-fg-secondary hover:rfp-text-fg-primary hover:rfp-bg-surface-2'\n }`}\n title={item.label}\n >\n {item.label.trim()}\n </button>\n {item.subitems && item.subitems.length > 0 && renderTocItems(item.subitems, depth + 1)}\n </li>\n );\n })}\n </ul>\n );\n\n return (\n <div className=\"rfp-relative rfp-w-full rfp-h-full rfp-flex rfp-justify-center rfp-bg-surface-1 rfp-overflow-hidden\">\n {error && <RendererError message={error} />}\n\n {loading && !error && (\n <div className=\"rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-z-10\">\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 {toc.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: showToc ? 1 : 0,\n pointerEvents: showToc ? '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: showToc ? '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.toc')}</span>\n <button\n onClick={() => setShowToc(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 {renderTocItems(toc)}\n </div>\n </div>\n <div\n className=\"rfp-flex-1 rfp-transition-opacity rfp-duration-300\"\n style={{ background: showToc ? 'rgba(0,0,0,0.3)' : 'transparent' }}\n onClick={() => setShowToc(false)}\n />\n </div>\n )}\n\n {!error && (\n <div\n ref={viewerRef}\n className=\"rfp-h-full rfp-bg-surface-toolbar rfp-shadow-lg\"\n style={{\n width: isFullWidth ? '100%' : `${A4_WIDTH}px`,\n maxWidth: '100%',\n transition: 'width 0.3s ease',\n overflow: 'hidden',\n }}\n />\n )}\n </div>\n );\n }\n);\n"],"names":["styleEl","A4_WIDTH","EpubRenderer","forwardRef","url","ref","t","useTranslator","fetcher","useFetcher","viewerRef","useRef","bookRef","renditionRef","totalLocationsRef","lastCfiRef","isFullWidthRef","loading","setLoading","useState","error","setError","isFullWidth","setIsFullWidth","toc","setToc","showToc","setShowToc","activeTocHref","setActiveTocHref","currentChapter","setCurrentChapter","totalChapters","setTotalChapters","tocRef","listenersRef","notifyToolbarChange","useCallback","listener","useEffect","handlePrev","_a","handleNext","scrollContainerRef","scrollRafRef","onScrollRef","_e","container","el","mgr","_b","reattachScrollListener","tryAttach","toggleFullWidth","newVal","viewer","rendition","toggleToc","prev","handleTocClick","href","getToolbarGroups","List","jsx","ChevronLeft","ChevronRight","Minimize2","Maximize2","useImperativeHandle","cancelled","loadTimer","load","bookInput","book","ePub","loc","cur","nav","location","spineHref","matches","collect","items","item","base","_c","total","err","isInitialRender","lastDimensions","resizeTimeout","doResize","v","observer","newDimensions","widthDiff","heightDiff","isActive","renderTocItems","depth","i","active","jsxs","RendererError","X"],"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.1", Be = {
11
+ const We = "1.5.2", 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-BBYKNNLb.mjs").then((e) => ({ default: e.ImageRenderer }))
1891
+ () => import("./index-HRUhzosx.mjs").then((e) => ({ default: e.ImageRenderer }))
1892
1892
  ), It = F(
1893
- () => import("./index-DLk08ylq.mjs").then((e) => ({ default: e.PdfRenderer }))
1893
+ () => import("./index-qWLZuYn6.mjs").then((e) => ({ default: e.PdfRenderer }))
1894
1894
  ), Vt = F(
1895
- () => import("./index-oVJyD-FV.mjs").then((e) => ({ default: e.DocxRenderer }))
1895
+ () => import("./index-DfzgQFfx.mjs").then((e) => ({ default: e.DocxRenderer }))
1896
1896
  ), Ot = F(
1897
- () => import("./index-vRLKumL8.mjs").then((e) => ({ default: e.XlsxRenderer }))
1897
+ () => import("./index-C5o_T3Es.mjs").then((e) => ({ default: e.XlsxRenderer }))
1898
1898
  ), qt = F(
1899
- () => import("./index-BKXvtJh5.mjs").then((e) => ({ default: e.PptxRenderer }))
1899
+ () => import("./index-VnjkEX5p.mjs").then((e) => ({ default: e.PptxRenderer }))
1900
1900
  ), Gt = F(
1901
- () => import("./index-DGNNEnWE.mjs").then((e) => ({ default: e.MsgRenderer }))
1901
+ () => import("./index-DxUP4apX.mjs").then((e) => ({ default: e.MsgRenderer }))
1902
1902
  ), Ht = F(
1903
- () => import("./index-jvNrkVkp.mjs").then((e) => ({ default: e.EpubRenderer }))
1903
+ () => import("./index-CTEgp9x8.mjs").then((e) => ({ default: e.EpubRenderer }))
1904
1904
  ), Zt = F(
1905
- () => import("./index-fQGAUFAX.mjs").then((e) => ({ default: e.MobiRenderer }))
1905
+ () => import("./index-Btsr3v83.mjs").then((e) => ({ default: e.MobiRenderer }))
1906
1906
  ), Kt = F(
1907
- () => import("./index-Bw3Fh4b5.mjs").then((e) => ({ default: e.VideoRenderer }))
1907
+ () => import("./index-C2uu09Eb.mjs").then((e) => ({ default: e.VideoRenderer }))
1908
1908
  ), Xt = F(
1909
- () => import("./index-Cn4ZyhGM.mjs").then((e) => ({ default: e.AudioRenderer }))
1909
+ () => import("./index-CMehLA91.mjs").then((e) => ({ default: e.AudioRenderer }))
1910
1910
  ), Jt = F(
1911
- () => import("./index-DVtPyN-s.mjs").then((e) => ({ default: e.MarkdownRenderer }))
1911
+ () => import("./index-DTNdG1bB.mjs").then((e) => ({ default: e.MarkdownRenderer }))
1912
1912
  ), Qt = F(
1913
- () => import("./index-COOUxB5e.mjs").then((e) => ({ default: e.JsonRenderer }))
1913
+ () => import("./index-BaSsmMZP.mjs").then((e) => ({ default: e.JsonRenderer }))
1914
1914
  ), Yt = F(
1915
- () => import("./index-CEC_DHgr.mjs").then((e) => ({ default: e.CsvRenderer }))
1915
+ () => import("./index-DsIUJXpz.mjs").then((e) => ({ default: e.CsvRenderer }))
1916
1916
  ), er = F(
1917
- () => import("./index-BFh22D_W.mjs").then((e) => ({ default: e.XmlRenderer }))
1917
+ () => import("./index-7aRho9r4.mjs").then((e) => ({ default: e.XmlRenderer }))
1918
1918
  ), tr = F(
1919
- () => import("./index-fSw6Hl5e.mjs").then((e) => ({ default: e.SubtitleRenderer }))
1919
+ () => import("./index-Bn0NJNzq.mjs").then((e) => ({ default: e.SubtitleRenderer }))
1920
1920
  ), rr = F(
1921
- () => import("./index-CgFv7B_G.mjs").then((e) => ({ default: e.ZipRenderer }))
1921
+ () => import("./index-BXa7r4uK.mjs").then((e) => ({ default: e.ZipRenderer }))
1922
1922
  ), or = F(
1923
- () => import("./index-CU1Lc3lV.mjs").then((e) => ({ default: e.TextRenderer }))
1923
+ () => import("./index-CmK5E5Oa.mjs").then((e) => ({ default: e.TextRenderer }))
1924
1924
  ), nr = F(
1925
- () => import("./index-Dta7iGov.mjs").then((e) => ({ default: e.FontRenderer }))
1925
+ () => import("./index-37FMdXja.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-DreA69iU.mjs.map
2409
+ //# sourceMappingURL=index-Cbp94jbP.mjs.map