@somecat/epub-reader 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/reader.ts","../src/core/icons.ts","../src/react/components/SvgIcon.tsx","../src/react/components/DesktopToolbar.tsx","../src/react/components/DesktopBottomBar.tsx","../src/react/components/TocTree.tsx","../src/react/components/TocDrawer.tsx","../src/react/components/SearchResultList.tsx","../src/react/components/SearchDrawer.tsx","../src/react/components/MobileUI.tsx","../src/react/EBookReader.tsx"],"names":["jsx","jsxs","EBookReader","useRef","useState","useMemo","Fragment"],"mappings":"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","file":"react.js","sourcesContent":["import 'foliate-js/view.js'\r\nimport type { EBookReaderHandle, EBookReaderOptions, ProgressInfo, SearchOptions, SearchResult, TocItem } from './types.js'\r\n\r\ntype FoliateViewElement = HTMLElement & {\r\n book?: { toc?: TocItem[] }\r\n renderer?: {\r\n prevSection?: () => void\r\n nextSection?: () => void\r\n setStyles?: (css: string) => void\r\n render?: () => void\r\n expand?: () => void\r\n }\r\n open?: (file: File) => Promise<void>\r\n init?: (options?: unknown) => Promise<void>\r\n goLeft?: () => void\r\n goRight?: () => void\r\n goTo?: (target: string) => Promise<void> | void\r\n goToFraction?: (fraction: number) => Promise<void> | void\r\n search?: (options: unknown) => AsyncIterable<unknown>\r\n clearSearch?: () => void\r\n}\r\n\r\nconst getContentCSS = (fontSize: number, isDark: boolean, extraCSS?: string) => `\r\n@namespace epub \"http://www.idpf.org/2007/ops\";\r\nhtml {\r\n color-scheme: ${isDark ? 'dark' : 'light'} !important;\r\n}\r\nbody {\r\n background-color: transparent !important;\r\n color: ${isDark ? '#e0e0e0' : 'black'} !important;\r\n font-size: ${fontSize}% !important;\r\n}\r\np {\r\n line-height: 1.6;\r\n margin-bottom: 1em;\r\n}\r\na {\r\n color: ${isDark ? '#64b5f6' : '#2563eb'} !important;\r\n}\r\nimg {\r\n max-width: 100%;\r\n height: auto;\r\n object-fit: contain;\r\n ${isDark ? 'filter: brightness(0.8) contrast(1.2);' : ''}\r\n}\r\n${extraCSS ?? ''}\r\n`\r\n\r\nexport function createEBookReader(container: HTMLElement, options: EBookReaderOptions = {}): EBookReaderHandle {\r\n if (!container) throw new Error('container is required')\r\n if (!customElements.get('foliate-view')) throw new Error('foliate-view is not defined')\r\n\r\n const {\r\n darkMode: initialDarkMode = false,\r\n fontSize: initialFontSize = 100,\r\n extraContentCSS,\r\n onReady,\r\n onError,\r\n onProgress,\r\n onToc,\r\n onSearchProgress,\r\n onContentLoad,\r\n } = options\r\n\r\n let destroyed = false\r\n let toc: TocItem[] = []\r\n let fontSize = initialFontSize\r\n let darkMode = initialDarkMode\r\n let searchToken = 0\r\n\r\n container.innerHTML = ''\r\n\r\n const viewer = document.createElement('foliate-view') as FoliateViewElement\r\n viewer.style.display = 'block'\r\n viewer.style.width = '100%'\r\n viewer.style.height = '100%'\r\n viewer.setAttribute('margin', '48')\r\n viewer.setAttribute('gap', '0.07')\r\n\r\n const applyStyles = () => {\r\n if (destroyed) return\r\n if (!viewer.renderer?.setStyles) return\r\n viewer.renderer.setStyles(getContentCSS(fontSize, darkMode, extraContentCSS))\r\n requestAnimationFrame(() => {\r\n setTimeout(() => {\r\n if (destroyed) return\r\n viewer.renderer?.render?.()\r\n viewer.renderer?.expand?.()\r\n }, 50)\r\n })\r\n }\r\n\r\n const handleLoad = (e: Event) => {\r\n applyStyles()\r\n const detail = (e as CustomEvent).detail as { doc?: Document } | undefined\r\n if (detail?.doc) onContentLoad?.(detail.doc)\r\n }\r\n\r\n const handleRelocate = (e: Event) => {\r\n const detail = (e as CustomEvent).detail as ProgressInfo\r\n onProgress?.(detail)\r\n }\r\n\r\n viewer.addEventListener('load', handleLoad as EventListener)\r\n viewer.addEventListener('relocate', handleRelocate as EventListener)\r\n\r\n container.appendChild(viewer)\r\n\r\n const handle: EBookReaderHandle = {\r\n async open(file) {\r\n if (destroyed) return\r\n if (!file) return\r\n\r\n try {\r\n viewer.clearSearch?.()\r\n searchToken++\r\n\r\n await viewer.open?.(file)\r\n\r\n const nextToc = viewer.book?.toc ?? []\r\n toc = nextToc\r\n onToc?.(toc)\r\n\r\n await viewer.init?.({ showTextStart: true })\r\n applyStyles()\r\n } catch (error) {\r\n onError?.(error)\r\n throw error\r\n }\r\n },\r\n destroy() {\r\n if (destroyed) return\r\n destroyed = true\r\n searchToken++\r\n viewer.removeEventListener('load', handleLoad)\r\n viewer.removeEventListener('relocate', handleRelocate as EventListener)\r\n container.innerHTML = ''\r\n },\r\n prevPage() {\r\n viewer.goLeft?.()\r\n },\r\n nextPage() {\r\n viewer.goRight?.()\r\n },\r\n prevSection() {\r\n viewer.renderer?.prevSection?.()\r\n },\r\n nextSection() {\r\n viewer.renderer?.nextSection?.()\r\n },\r\n goTo(target) {\r\n if (!target) return\r\n viewer.goTo?.(target)\r\n },\r\n goToFraction(fraction) {\r\n const safe = Math.min(1, Math.max(0, fraction))\r\n viewer.goToFraction?.(safe)\r\n },\r\n setDarkMode(nextDarkMode) {\r\n darkMode = nextDarkMode\r\n applyStyles()\r\n },\r\n setFontSize(nextFontSize) {\r\n const safe = Math.min(300, Math.max(50, nextFontSize))\r\n fontSize = safe\r\n applyStyles()\r\n },\r\n async search(query, opts: SearchOptions = {}) {\r\n const normalized = query.trim()\r\n if (!normalized) {\r\n viewer.clearSearch?.()\r\n return []\r\n }\r\n\r\n const token = ++searchToken\r\n const results: SearchResult[] = []\r\n\r\n try {\r\n for await (const item of viewer.search?.({\r\n query: normalized,\r\n matchCase: Boolean(opts.matchCase),\r\n matchWholeWords: Boolean(opts.wholeWords),\r\n matchDiacritics: Boolean(opts.matchDiacritics),\r\n }) ?? []) {\r\n if (destroyed || token !== searchToken) return results\r\n\r\n if (item === 'done') {\r\n onSearchProgress?.({ done: true, progress: 1 })\r\n break\r\n }\r\n\r\n if (typeof item === 'object' && item && 'progress' in (item as any)) {\r\n const progress = (item as any).progress\r\n if (typeof progress === 'number') onSearchProgress?.({ progress })\r\n continue\r\n }\r\n\r\n const anyItem = item as any\r\n if (anyItem?.subitems?.length) {\r\n for (const sub of anyItem.subitems) {\r\n results.push({\r\n label: anyItem.label,\r\n cfi: sub?.cfi,\r\n excerpt: sub?.excerpt,\r\n title: sub?.title,\r\n })\r\n }\r\n } else if (anyItem?.cfi) {\r\n results.push({\r\n cfi: anyItem.cfi,\r\n excerpt: anyItem.excerpt,\r\n title: anyItem.title,\r\n })\r\n }\r\n }\r\n } catch (error) {\r\n onError?.(error)\r\n throw error\r\n }\r\n\r\n return results\r\n },\r\n cancelSearch() {\r\n searchToken++\r\n },\r\n clearSearch() {\r\n viewer.clearSearch?.()\r\n },\r\n getToc() {\r\n return toc\r\n },\r\n }\r\n\r\n onReady?.(handle)\r\n return handle\r\n}\r\n","export const icons: Record<string, string> = {\n list: '<path d=\"M3 12h18M3 6h18M3 18h18\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n search: '<path d=\"M11 19a8 8 0 1 0 0-16 8 8 0 0 0 0 16zM21 21l-4.35-4.35\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n 'chevron-left': '<path d=\"M15 18l-6-6 6-6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n 'chevron-right': '<path d=\"M9 18l6-6-6-6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n 'chevrons-left': '<path d=\"M11 17l-5-5 5-5M18 17l-5-5 5-5\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n 'chevrons-right': '<path d=\"M13 17l5-5-5-5M6 17l5-5-5-5\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n sun: '<circle cx=\"12\" cy=\"12\" r=\"5\" stroke=\"currentColor\" stroke-width=\"2\"/><path d=\"M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/>',\n moon: '<path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n plus: '<path d=\"M12 5v14M5 12h14\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n minus: '<path d=\"M5 12h14\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n x: '<path d=\"M18 6L6 18M6 6l12 12\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n type: '<path d=\"M4 7V4h16v3M9 20h6M12 4v16\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n sliders: '<path d=\"M4 21v-7M4 10V3M12 21v-9M12 8V3M20 21v-5M20 12V3M1 14h6M9 8h6M17 16h6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>'\n}\n","import { useMemo } from 'react'\nimport { icons } from '../../core/icons'\n\nexport type SvgIconProps = {\n name: string\n size?: number | string\n color?: string\n className?: string\n}\n\nexport const SvgIcon = ({ name, size = 24, color = 'currentColor', className }: SvgIconProps) => {\n const iconPath = icons[name] || ''\n\n const style = useMemo(() => {\n const sizeVal = typeof size === 'number' ? `${size}px` : size\n return {\n width: sizeVal,\n height: sizeVal,\n color: color,\n minWidth: sizeVal,\n display: 'inline-block',\n verticalAlign: 'middle',\n }\n }, [size, color])\n\n if (!iconPath) return null\n\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n style={style}\n className={className}\n dangerouslySetInnerHTML={{ __html: iconPath }}\n />\n )\n}\n","import { SvgIcon } from './SvgIcon'\r\n\r\ntype DesktopToolbarProps = {\r\n onToggleToc: () => void\r\n onToggleSearch: () => void\r\n onPrevSection: () => void\r\n onPrevPage: () => void\r\n onNextPage: () => void\r\n onNextSection: () => void\r\n darkMode: boolean\r\n onToggleDarkMode: () => void\r\n fontSize: number\r\n onFontSizeChange: (size: number) => void\r\n}\r\n\r\n/**\r\n * 桌面端工具栏组件\r\n */\r\nexport const DesktopToolbar = ({\r\n onToggleToc,\r\n onToggleSearch,\r\n onPrevSection,\r\n onPrevPage,\r\n onNextPage,\r\n onNextSection,\r\n darkMode,\r\n onToggleDarkMode,\r\n fontSize,\r\n onFontSizeChange,\r\n}: DesktopToolbarProps) => {\r\n return (\r\n <div className=\"ebook-reader__toolbar\">\r\n <div className=\"ebook-reader__panel\">\r\n <button type=\"button\" className=\"ebook-reader__btn\" onClick={onToggleToc} title=\"目录\">\r\n <SvgIcon name=\"list\" />\r\n </button>\r\n <button type=\"button\" className=\"ebook-reader__btn\" onClick={onToggleSearch} title=\"搜索\">\r\n <SvgIcon name=\"search\" />\r\n </button>\r\n <div className=\"ebook-reader__divider\" />\r\n <button type=\"button\" className=\"ebook-reader__btn\" onClick={onPrevSection} title=\"上一章\">\r\n <SvgIcon name=\"chevrons-left\" />\r\n </button>\r\n <button type=\"button\" className=\"ebook-reader__btn\" onClick={onPrevPage} title=\"上一页\">\r\n <SvgIcon name=\"chevron-left\" />\r\n </button>\r\n <button type=\"button\" className=\"ebook-reader__btn\" onClick={onNextPage} title=\"下一页\">\r\n <SvgIcon name=\"chevron-right\" />\r\n </button>\r\n <button type=\"button\" className=\"ebook-reader__btn\" onClick={onNextSection} title=\"下一章\">\r\n <SvgIcon name=\"chevrons-right\" />\r\n </button>\r\n </div>\r\n\r\n <div className=\"ebook-reader__panel\">\r\n <button type=\"button\" className=\"ebook-reader__btn\" onClick={onToggleDarkMode} title=\"主题\">\r\n <SvgIcon name={darkMode ? 'sun' : 'moon'} />\r\n </button>\r\n <div className=\"ebook-reader__divider\" />\r\n <button type=\"button\" className=\"ebook-reader__btn\" onClick={() => onFontSizeChange(fontSize + 10)} title=\"增大字号\">\r\n <SvgIcon name=\"plus\" />\r\n </button>\r\n <div className=\"ebook-reader__font\">{fontSize}%</div>\r\n <button type=\"button\" className=\"ebook-reader__btn\" onClick={() => onFontSizeChange(fontSize - 10)} title=\"减小字号\">\r\n <SvgIcon name=\"minus\" />\r\n </button>\r\n </div>\r\n </div>\r\n )\r\n}\r\n","type DesktopBottomBarProps = {\n status: 'idle' | 'ready' | 'opening' | 'error'\n errorText: string\n sectionLabel: string\n displayedPercent: number\n onSeekStart: () => void\n onSeekChange: (val: number) => void\n onSeekEnd: (val: number) => void\n onSeekCommit: (val: number) => void\n}\n\n/**\n * 桌面端底部栏组件 (进度条)\n */\nexport const DesktopBottomBar = ({\n status,\n errorText,\n sectionLabel,\n displayedPercent,\n onSeekStart,\n onSeekChange,\n onSeekEnd,\n onSeekCommit,\n}: DesktopBottomBarProps) => {\n return (\n <div className=\"ebook-reader__bottom\">\n <div className=\"ebook-reader__bottom-left\">\n <span className=\"ebook-reader__status\">\n {status === 'error' ? errorText || '错误' : status === 'opening' ? '正在打开…' : '就绪'}\n </span>\n {sectionLabel ? <span className=\"ebook-reader__section\">{sectionLabel}</span> : null}\n </div>\n <div className=\"ebook-reader__bottom-right\">\n <input\n className=\"ebook-reader__range\"\n type=\"range\"\n min={0}\n max={100}\n step={1}\n value={displayedPercent}\n onChange={(e) => {\n onSeekStart()\n onSeekChange(Number(e.target.value))\n }}\n onPointerUp={(e) => {\n const v = Number((e.target as HTMLInputElement).value)\n onSeekEnd(v)\n }}\n onKeyUp={(e) => {\n if (e.key !== 'Enter') return\n const v = Number((e.target as HTMLInputElement).value)\n onSeekCommit(v)\n }}\n />\n <span className=\"ebook-reader__percent\">{displayedPercent}%</span>\n </div>\n </div>\n )\n}\n","import type { TocItem } from '../../core/types.js'\r\n\r\ntype TocTreeProps = {\r\n items: TocItem[]\r\n onSelect: (href?: string) => void\r\n}\r\n\r\n/**\r\n * 目录树组件\r\n * 递归渲染目录项\r\n */\r\nexport const TocTree = ({ items, onSelect }: TocTreeProps) => {\r\n return (\r\n <ul className=\"ebook-reader__toc-list\">\r\n {items.map((item, idx) => {\r\n const key = item.href || `${item.label ?? 'item'}-${idx}`\r\n const hasChildren = Boolean(item.subitems?.length)\r\n const label = item.label || item.href || '未命名'\r\n\r\n if (!hasChildren) {\r\n return (\r\n <li key={key} className=\"ebook-reader__toc-item\">\r\n <button type=\"button\" className=\"ebook-reader__toc-btn\" onClick={() => onSelect(item.href)}>\r\n {label}\r\n </button>\r\n </li>\r\n )\r\n }\r\n\r\n return (\r\n <li key={key} className=\"ebook-reader__toc-item\">\r\n <details className=\"ebook-reader__toc-details\">\r\n <summary className=\"ebook-reader__toc-summary\">{label}</summary>\r\n <TocTree items={item.subitems ?? []} onSelect={onSelect} />\r\n </details>\r\n </li>\r\n )\r\n })}\r\n </ul>\r\n )\r\n}\r\n","import type { TocItem } from '../../core/types.js'\nimport { TocTree } from './TocTree'\nimport { SvgIcon } from './SvgIcon'\n\ntype TocDrawerProps = {\n isOpen: boolean\n onClose: () => void\n toc: TocItem[]\n onSelect: (href?: string) => void\n}\n\n/**\n * 目录侧边栏组件\n */\nexport const TocDrawer = ({ isOpen, onClose, toc, onSelect }: TocDrawerProps) => {\n return (\n <aside className={`ebook-reader__drawer ${isOpen ? 'is-open' : ''}`} aria-hidden={!isOpen}>\n <div className=\"ebook-reader__drawer-header\">\n <div className=\"ebook-reader__drawer-title\">目录</div>\n <button type=\"button\" className=\"ebook-reader__btn\" onClick={onClose}>\n <SvgIcon name=\"x\" />\n </button>\n </div>\n <div className=\"ebook-reader__drawer-body\">\n {toc.length ? (\n <TocTree\n items={toc}\n onSelect={(href) => {\n onSelect(href)\n onClose()\n }}\n />\n ) : (\n <div className=\"ebook-reader__empty\">未找到目录</div>\n )}\n </div>\n </aside>\n )\n}\n","import type { SearchResult } from '../../core/types.js'\n\ntype SearchResultListProps = {\n results: SearchResult[]\n onSelect: (cfi: string) => void\n}\n\n/**\n * 搜索结果列表组件\n */\nexport const SearchResultList = ({ results, onSelect }: SearchResultListProps) => {\n return (\n <ul className=\"ebook-reader__search-list\">\n {results.map((r, idx) => (\n <li key={`${r.cfi ?? 'no-cfi'}-${idx}`} className=\"ebook-reader__search-item\">\n <button\n type=\"button\"\n className=\"ebook-reader__search-btn\"\n onClick={() => {\n if (r.cfi) onSelect(r.cfi)\n }}\n >\n {r.label ? <div className=\"ebook-reader__search-label\">{r.label}</div> : null}\n <div className=\"ebook-reader__search-excerpt\">\n {typeof r.excerpt === 'string'\n ? r.excerpt\n : `${r.excerpt?.pre ?? ''}${r.excerpt?.match ?? ''}${r.excerpt?.post ?? ''}`}\n </div>\n </button>\n </li>\n ))}\n </ul>\n )\n}\n","import type { SearchState } from '../types.js'\nimport { SearchResultList } from './SearchResultList'\nimport { SvgIcon } from './SvgIcon'\n\ntype SearchDrawerProps = {\n isOpen: boolean\n onClose: () => void\n status: 'idle' | 'ready' | 'opening' | 'error'\n search: SearchState\n onSearch: (query: string) => void\n onQueryChange: (query: string) => void\n onOptionChange: (opt: Partial<SearchState['options']>) => void\n onCancelSearch: () => void\n onResultSelect: (cfi: string) => void\n}\n\n/**\n * 搜索侧边栏组件\n */\nexport const SearchDrawer = ({\n isOpen,\n onClose,\n status,\n search,\n onSearch,\n onQueryChange,\n onOptionChange,\n onCancelSearch,\n onResultSelect,\n}: SearchDrawerProps) => {\n return (\n <aside className={`ebook-reader__drawer right ${isOpen ? 'is-open' : ''}`} aria-hidden={!isOpen}>\n <div className=\"ebook-reader__drawer-header\">\n <div className=\"ebook-reader__drawer-title\">搜索</div>\n <button type=\"button\" className=\"ebook-reader__btn\" onClick={onClose}>\n <SvgIcon name=\"x\" />\n </button>\n </div>\n <div className=\"ebook-reader__drawer-body\">\n <div className=\"ebook-reader__field\">\n <input\n className=\"ebook-reader__input\"\n placeholder=\"输入关键词\"\n value={search.query}\n onChange={(e) => {\n const v = e.target.value\n onQueryChange(v)\n if (!v.trim()) onSearch('')\n }}\n disabled={status !== 'ready'}\n onKeyDown={(e) => {\n if (e.key === 'Enter') onSearch(search.query)\n }}\n />\n <button type=\"button\" className=\"ebook-reader__btn\" onClick={() => onSearch(search.query)} disabled={status !== 'ready'}>\n <SvgIcon name=\"search\" />\n </button>\n </div>\n\n <div className=\"ebook-reader__checks\">\n <label className=\"ebook-reader__check\">\n <input\n type=\"checkbox\"\n checked={Boolean(search.options.matchCase)}\n onChange={(e) => onOptionChange({ matchCase: e.target.checked })}\n />\n 区分大小写\n </label>\n <label className=\"ebook-reader__check\">\n <input\n type=\"checkbox\"\n checked={Boolean(search.options.wholeWords)}\n onChange={(e) => onOptionChange({ wholeWords: e.target.checked })}\n />\n 全词匹配\n </label>\n <label className=\"ebook-reader__check\">\n <input\n type=\"checkbox\"\n checked={Boolean(search.options.matchDiacritics)}\n onChange={(e) => onOptionChange({ matchDiacritics: e.target.checked })}\n />\n 区分变音\n </label>\n </div>\n\n <div className=\"ebook-reader__meta\">\n <span>进度 {search.progressPercent}%</span>\n {search.searching ? <span>搜索中…</span> : null}\n {search.searching ? (\n <button type=\"button\" className=\"ebook-reader__link\" onClick={onCancelSearch}>\n 取消\n </button>\n ) : null}\n </div>\n\n {search.results.length ? (\n <SearchResultList results={search.results} onSelect={onResultSelect} />\n ) : (\n <div className=\"ebook-reader__empty\">{search.query.trim() ? '无匹配结果' : '请输入关键词'}</div>\n )}\n </div>\n </aside>\n )\n}\n","import { useState, useRef } from 'react'\r\nimport type { TocItem } from '../../core/types.js'\r\nimport type { MobilePanel, SearchState } from '../types.js'\r\nimport { TocTree } from './TocTree'\r\nimport { SearchResultList } from './SearchResultList'\r\nimport { SvgIcon } from './SvgIcon'\r\n\r\ntype MobileUIProps = {\r\n barVisible: boolean\r\n activePanel: MobilePanel | null\r\n onTogglePanel: (panel: MobilePanel) => void\r\n onClosePanel: () => void\r\n \r\n // Data props\r\n toc: TocItem[]\r\n search: SearchState\r\n status: 'idle' | 'ready' | 'opening' | 'error'\r\n errorText: string\r\n sectionLabel: string\r\n displayedPercent: number\r\n darkMode: boolean\r\n fontSize: number\r\n \r\n // Actions\r\n onTocSelect: (href?: string) => void\r\n \r\n onSearch: (query: string) => void\r\n onSearchQueryChange: (query: string) => void\r\n onSearchOptionChange: (opt: Partial<SearchState['options']>) => void\r\n onCancelSearch: () => void\r\n onSearchResultSelect: (cfi: string) => void\r\n \r\n onSeekStart: () => void\r\n onSeekChange: (val: number) => void\r\n onSeekEnd: (val: number) => void\r\n onSeekCommit: (val: number) => void\r\n \r\n onToggleDarkMode: (val: boolean) => void\r\n onFontSizeChange: (val: number) => void\r\n}\r\n\r\n/**\r\n * 移动端 UI 组件\r\n * 包含底部导航栏和弹出面板\r\n */\r\nexport const MobileUI = ({\r\n barVisible,\r\n activePanel,\r\n onTogglePanel,\r\n onClosePanel,\r\n toc,\r\n search,\r\n status,\r\n errorText,\r\n sectionLabel,\r\n displayedPercent,\r\n darkMode,\r\n fontSize,\r\n onTocSelect,\r\n onSearch,\r\n onSearchQueryChange,\r\n onSearchOptionChange,\r\n onCancelSearch,\r\n onSearchResultSelect,\r\n onSeekStart,\r\n onSeekChange,\r\n onSeekEnd,\r\n onSeekCommit,\r\n onToggleDarkMode,\r\n onFontSizeChange,\r\n}: MobileUIProps) => {\r\n const mobileTitle = activePanel === 'menu' ? '目录' : activePanel === 'search' ? '搜索' : activePanel === 'progress' ? '进度' : activePanel === 'theme' ? '明暗' : activePanel === 'font' ? '字号' : ''\r\n\r\n const [tooltip, setTooltip] = useState<{ text: string, left: number } | null>(null)\r\n const timerRef = useRef<number | null>(null)\r\n\r\n const handleTouchStart = (e: React.TouchEvent, text: string) => {\r\n const rect = e.currentTarget.getBoundingClientRect()\r\n // 长按 500ms 后显示提示\r\n timerRef.current = window.setTimeout(() => {\r\n setTooltip({\r\n text,\r\n left: rect.left + rect.width / 2\r\n })\r\n }, 500)\r\n }\r\n\r\n const handleTouchEnd = () => {\r\n if (timerRef.current) {\r\n clearTimeout(timerRef.current)\r\n timerRef.current = null\r\n }\r\n setTooltip(null)\r\n }\r\n\r\n return (\r\n <>\r\n <div className={`ebook-reader__mbar ${barVisible ? 'is-visible' : ''}`}>\r\n {tooltip && (\r\n <div \r\n className=\"ebook-reader__tooltip\" \r\n style={{ \r\n position: 'fixed', \r\n bottom: '60px', // 位于工具栏上方\r\n left: tooltip.left,\r\n transform: 'translateX(-50%)',\r\n background: 'rgba(0,0,0,0.8)',\r\n color: '#fff',\r\n padding: '4px 8px',\r\n borderRadius: '4px',\r\n fontSize: '12px',\r\n pointerEvents: 'none',\r\n zIndex: 1000,\r\n whiteSpace: 'nowrap'\r\n }}\r\n >\r\n {tooltip.text}\r\n </div>\r\n )}\r\n <button \r\n type=\"button\" \r\n className=\"ebook-reader__btn\" \r\n onClick={() => onTogglePanel('menu')} \r\n aria-pressed={activePanel === 'menu'}\r\n onTouchStart={(e) => handleTouchStart(e, '目录')}\r\n onTouchEnd={handleTouchEnd}\r\n onTouchCancel={handleTouchEnd}\r\n title=\"目录\"\r\n >\r\n <SvgIcon name=\"list\" />\r\n </button>\r\n <button \r\n type=\"button\" \r\n className=\"ebook-reader__btn\" \r\n onClick={() => onTogglePanel('search')} \r\n aria-pressed={activePanel === 'search'}\r\n onTouchStart={(e) => handleTouchStart(e, '搜索')}\r\n onTouchEnd={handleTouchEnd}\r\n onTouchCancel={handleTouchEnd}\r\n title=\"搜索\"\r\n >\r\n <SvgIcon name=\"search\" />\r\n </button>\r\n <button \r\n type=\"button\" \r\n className=\"ebook-reader__btn\" \r\n onClick={() => onTogglePanel('progress')} \r\n aria-pressed={activePanel === 'progress'}\r\n onTouchStart={(e) => handleTouchStart(e, '进度')}\r\n onTouchEnd={handleTouchEnd}\r\n onTouchCancel={handleTouchEnd}\r\n title=\"进度\"\r\n >\r\n <SvgIcon name=\"sliders\" />\r\n </button>\r\n <button \r\n type=\"button\" \r\n className=\"ebook-reader__btn\" \r\n onClick={() => onTogglePanel('theme')} \r\n aria-pressed={activePanel === 'theme'}\r\n onTouchStart={(e) => handleTouchStart(e, '明暗')}\r\n onTouchEnd={handleTouchEnd}\r\n onTouchCancel={handleTouchEnd}\r\n title=\"明暗\"\r\n >\r\n <SvgIcon name=\"sun\" />\r\n </button>\r\n <button \r\n type=\"button\" \r\n className=\"ebook-reader__btn\" \r\n onClick={() => onTogglePanel('font')} \r\n aria-pressed={activePanel === 'font'}\r\n onTouchStart={(e) => handleTouchStart(e, '字号')}\r\n onTouchEnd={handleTouchEnd}\r\n onTouchCancel={handleTouchEnd}\r\n title=\"字号\"\r\n >\r\n <SvgIcon name=\"type\" />\r\n </button>\r\n </div>\r\n\r\n {activePanel ? <div className=\"ebook-reader__moverlay\" onClick={onClosePanel} /> : null}\r\n\r\n <div className={`ebook-reader__msheet ${activePanel ? 'is-open' : ''}`} aria-hidden={!activePanel}>\r\n <div className=\"ebook-reader__msheet-header\">\r\n <div className=\"ebook-reader__msheet-title\">{mobileTitle}</div>\r\n <button type=\"button\" className=\"ebook-reader__btn\" onClick={onClosePanel}>\r\n <SvgIcon name=\"x\" />\r\n </button>\r\n </div>\r\n <div className=\"ebook-reader__msheet-body\">\r\n {activePanel === 'menu' ? (\r\n toc.length ? (\r\n <TocTree\r\n items={toc}\r\n onSelect={(href) => {\r\n onTocSelect(href)\r\n onClosePanel()\r\n }}\r\n />\r\n ) : (\r\n <div className=\"ebook-reader__empty\">未找到目录</div>\r\n )\r\n ) : null}\r\n\r\n {activePanel === 'search' ? (\r\n <>\r\n <div className=\"ebook-reader__field\">\r\n <input\r\n className=\"ebook-reader__input\"\r\n placeholder=\"输入关键词\"\r\n value={search.query}\r\n onChange={(e) => {\r\n const v = e.target.value\r\n onSearchQueryChange(v)\r\n if (!v.trim()) onSearch('')\r\n }}\r\n disabled={status !== 'ready'}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter') onSearch(search.query)\r\n }}\r\n />\r\n <button type=\"button\" className=\"ebook-reader__btn\" onClick={() => onSearch(search.query)} disabled={status !== 'ready'}>\r\n 搜索\r\n </button>\r\n </div>\r\n\r\n <div className=\"ebook-reader__checks\">\r\n <label className=\"ebook-reader__check\">\r\n <input\r\n type=\"checkbox\"\r\n checked={Boolean(search.options.matchCase)}\r\n onChange={(e) => onSearchOptionChange({ matchCase: e.target.checked })}\r\n />\r\n 区分大小写\r\n </label>\r\n <label className=\"ebook-reader__check\">\r\n <input\r\n type=\"checkbox\"\r\n checked={Boolean(search.options.wholeWords)}\r\n onChange={(e) => onSearchOptionChange({ wholeWords: e.target.checked })}\r\n />\r\n 全词匹配\r\n </label>\r\n <label className=\"ebook-reader__check\">\r\n <input\r\n type=\"checkbox\"\r\n checked={Boolean(search.options.matchDiacritics)}\r\n onChange={(e) => onSearchOptionChange({ matchDiacritics: e.target.checked })}\r\n />\r\n 区分变音\r\n </label>\r\n </div>\r\n\r\n <div className=\"ebook-reader__meta\">\r\n <span>进度 {search.progressPercent}%</span>\r\n {search.searching ? <span>搜索中…</span> : null}\r\n {search.searching ? (\r\n <button type=\"button\" className=\"ebook-reader__link\" onClick={onCancelSearch}>\r\n 取消\r\n </button>\r\n ) : null}\r\n </div>\r\n\r\n {search.results.length ? (\r\n <SearchResultList results={search.results} onSelect={onSearchResultSelect} />\r\n ) : (\r\n <div className=\"ebook-reader__empty\">{search.query.trim() ? '无匹配结果' : '请输入关键词'}</div>\r\n )}\r\n </>\r\n ) : null}\r\n\r\n {activePanel === 'progress' ? (\r\n <>\r\n <div className=\"ebook-reader__meta\">\r\n <span className=\"ebook-reader__status\">\r\n {status === 'error' ? errorText || '错误' : status === 'opening' ? '正在打开…' : '就绪'}\r\n </span>\r\n {sectionLabel ? <span>{sectionLabel}</span> : null}\r\n </div>\r\n <div className=\"ebook-reader__mprogress\">\r\n <input\r\n className=\"ebook-reader__range\"\r\n type=\"range\"\r\n min={0}\r\n max={100}\r\n step={1}\r\n value={displayedPercent}\r\n onChange={(e) => {\r\n onSeekStart()\r\n onSeekChange(Number(e.target.value))\r\n }}\r\n onPointerUp={(e) => {\r\n const v = Number((e.target as HTMLInputElement).value)\r\n onSeekEnd(v)\r\n }}\r\n onKeyUp={(e) => {\r\n if (e.key !== 'Enter') return\r\n const v = Number((e.target as HTMLInputElement).value)\r\n onSeekCommit(v)\r\n }}\r\n />\r\n <div className=\"ebook-reader__mprogress-percent\">{displayedPercent}%</div>\r\n </div>\r\n </>\r\n ) : null}\r\n\r\n {activePanel === 'theme' ? (\r\n <button type=\"button\" className=\"ebook-reader__btn\" onClick={() => onToggleDarkMode(!darkMode)}>\r\n {darkMode ? '切换到亮色' : '切换到暗黑'}\r\n </button>\r\n ) : null}\r\n\r\n {activePanel === 'font' ? (\r\n <div className=\"ebook-reader__mfont\">\r\n <button type=\"button\" className=\"ebook-reader__btn\" onClick={() => onFontSizeChange(fontSize - 10)}>\r\n A-\r\n </button>\r\n <div className=\"ebook-reader__font\">{fontSize}%</div>\r\n <button type=\"button\" className=\"ebook-reader__btn\" onClick={() => onFontSizeChange(fontSize + 10)}>\r\n A+\r\n </button>\r\n </div>\r\n ) : null}\r\n </div>\r\n </div>\r\n </>\r\n )\r\n}\r\n","import { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react'\r\nimport { createEBookReader } from '../core/reader.js'\r\nimport type { ProgressInfo, TocItem } from '../core/types.js'\r\nimport type { EBookReaderReactHandle, EBookReaderReactProps, SearchState, MobilePanel } from './types.js'\r\nimport { DesktopToolbar } from './components/DesktopToolbar'\r\nimport { DesktopBottomBar } from './components/DesktopBottomBar'\r\nimport { TocDrawer } from './components/TocDrawer'\r\nimport { SearchDrawer } from './components/SearchDrawer'\r\nimport { MobileUI } from './components/MobileUI'\r\n\r\nconst MOBILE_MAX_WIDTH = 768\r\nconst WIDE_MIN_WIDTH = 1024\r\n\r\nconst clamp = (n: number, min: number, max: number) => Math.min(max, Math.max(min, n))\r\n\r\nconst mergeClassName = (...parts: Array<string | undefined>) => parts.filter(Boolean).join(' ')\r\n\r\n/**\r\n * EBookReader 组件\r\n *\r\n * 核心阅读器组件,负责:\r\n * 1. 管理核心 Reader 实例 (createEBookReader)\r\n * 2. 管理 UI 状态 (布局、弹窗、搜索状态等)\r\n * 3. 分发事件和数据给子组件 (Desktop/Mobile)\r\n */\r\nexport const EBookReader = forwardRef<EBookReaderReactHandle, EBookReaderReactProps>(function EBookReader(\r\n {\r\n file,\r\n className,\r\n style,\r\n defaultFontSize = 100,\r\n fontSize: controlledFontSize,\r\n onFontSizeChange,\r\n defaultDarkMode = false,\r\n darkMode: controlledDarkMode,\r\n onDarkModeChange,\r\n enableKeyboardNav = true,\r\n defaultSearchOptions = { matchCase: false, wholeWords: false, matchDiacritics: false },\r\n onReady,\r\n onError,\r\n onProgress,\r\n },\r\n ref,\r\n) {\r\n const rootRef = useRef<HTMLDivElement | null>(null)\r\n const viewerHostRef = useRef<HTMLDivElement | null>(null)\r\n const readerRef = useRef<ReturnType<typeof createEBookReader> | null>(null)\r\n\r\n const [status, setStatus] = useState<'idle' | 'ready' | 'opening' | 'error'>('idle')\r\n const [errorText, setErrorText] = useState<string>('')\r\n const [toc, setToc] = useState<TocItem[]>([])\r\n const [tocOpen, setTocOpen] = useState(false)\r\n const [searchOpen, setSearchOpen] = useState(false)\r\n const [progressInfo, setProgressInfo] = useState<ProgressInfo | null>(null)\r\n const [isSeeking, setIsSeeking] = useState(false)\r\n const [seekPercent, setSeekPercent] = useState(0)\r\n\r\n const [uncontrolledFontSize, setUncontrolledFontSize] = useState(defaultFontSize)\r\n const [uncontrolledDarkMode, setUncontrolledDarkMode] = useState(defaultDarkMode)\r\n\r\n const fontSize = controlledFontSize ?? uncontrolledFontSize\r\n const darkMode = controlledDarkMode ?? uncontrolledDarkMode\r\n\r\n const [search, setSearch] = useState<SearchState>({\r\n query: '',\r\n options: defaultSearchOptions,\r\n progressPercent: 0,\r\n searching: false,\r\n results: [],\r\n })\r\n\r\n const [layout, setLayout] = useState<'mobile' | 'default' | 'wide'>('default')\r\n const [mobileBarVisible, setMobileBarVisible] = useState(false)\r\n const [mobilePanel, setMobilePanel] = useState<MobilePanel | null>(null)\r\n const layoutRef = useRef(layout)\r\n const boundDocsRef = useRef(new WeakSet<Document>())\r\n const gestureRef = useRef({ startX: 0, startY: 0, startAt: 0, tracking: false, moved: false, actionTaken: false })\r\n\r\n const percentage = useMemo(() => Math.round((progressInfo?.fraction ?? 0) * 100), [progressInfo])\r\n const displayedPercent = isSeeking ? seekPercent : percentage\r\n const sectionLabel = progressInfo?.tocItem?.label ?? ''\r\n\r\n // 监听容器大小变化,切换布局模式\r\n useEffect(() => {\r\n const el = rootRef.current\r\n if (!el) return\r\n const ro = new ResizeObserver((entries) => {\r\n const w = entries[0]?.contentRect?.width ?? el.getBoundingClientRect().width\r\n const next = w <= MOBILE_MAX_WIDTH ? 'mobile' : w >= WIDE_MIN_WIDTH ? 'wide' : 'default'\r\n setLayout((prev) => (prev === next ? prev : next))\r\n })\r\n ro.observe(el)\r\n return () => ro.disconnect()\r\n }, [])\r\n\r\n // 布局切换时重置移动端面板状态\r\n useEffect(() => {\r\n if (layout === 'mobile') return\r\n setMobilePanel(null)\r\n setMobileBarVisible(false)\r\n }, [layout])\r\n\r\n useEffect(() => {\r\n layoutRef.current = layout\r\n }, [layout])\r\n\r\n const closeMobileSheet = useCallback(() => setMobilePanel(null), [])\r\n\r\n const toggleMobilePanel = useCallback((panel: MobilePanel) => {\r\n setMobileBarVisible(true)\r\n setMobilePanel((prev) => (prev === panel ? null : panel))\r\n }, [])\r\n\r\n const onPointerDown = useCallback((e: PointerEvent) => {\r\n if (layoutRef.current !== 'mobile') return\r\n const t = e.target as HTMLElement | null\r\n if (!t) return\r\n if (t.closest('.ebook-reader__mbar') || t.closest('.ebook-reader__msheet')) return\r\n if (t.closest('a,button,input,textarea,select,label,[role=\"button\"],[contenteditable=\"true\"]')) return\r\n gestureRef.current.tracking = true\r\n gestureRef.current.moved = false\r\n gestureRef.current.actionTaken = false\r\n gestureRef.current.startAt = e.timeStamp\r\n gestureRef.current.startX = e.screenX\r\n gestureRef.current.startY = e.screenY\r\n }, [])\r\n\r\n const onPointerMove = useCallback((e: PointerEvent) => {\r\n if (!gestureRef.current.tracking) return\r\n const dx = e.screenX - gestureRef.current.startX\r\n const dy = e.screenY - gestureRef.current.startY\r\n\r\n if (Math.abs(dx) > 8 || Math.abs(dy) > 8) gestureRef.current.moved = true\r\n if (Math.abs(dy) < 8) return\r\n\r\n if (Math.abs(dy) < Math.abs(dx)) {\r\n if (Math.abs(dx) >= 8) gestureRef.current.tracking = false\r\n return\r\n }\r\n\r\n if (dy <= -24) {\r\n gestureRef.current.actionTaken = true\r\n gestureRef.current.tracking = false\r\n setMobileBarVisible(true)\r\n return\r\n }\r\n if (dy >= 24) {\r\n gestureRef.current.actionTaken = true\r\n gestureRef.current.tracking = false\r\n setMobileBarVisible(false)\r\n setMobilePanel(null)\r\n }\r\n }, [])\r\n\r\n const onPointerEnd = useCallback((e: PointerEvent) => {\r\n if (layoutRef.current !== 'mobile') {\r\n gestureRef.current.tracking = false\r\n return\r\n }\r\n\r\n if (gestureRef.current.actionTaken) {\r\n gestureRef.current.tracking = false\r\n gestureRef.current.moved = false\r\n gestureRef.current.actionTaken = false\r\n return\r\n }\r\n\r\n if (!gestureRef.current.tracking) {\r\n gestureRef.current.moved = false\r\n return\r\n }\r\n\r\n const dx = e.screenX - gestureRef.current.startX\r\n const dy = e.screenY - gestureRef.current.startY\r\n const dt = e.timeStamp - gestureRef.current.startAt\r\n const isTap = !gestureRef.current.moved && Math.hypot(dx, dy) <= 10 && dt <= 300\r\n\r\n if (isTap) {\r\n setMobileBarVisible((prev) => {\r\n const next = !prev\r\n if (!next) setMobilePanel(null)\r\n return next\r\n })\r\n }\r\n\r\n gestureRef.current.tracking = false\r\n gestureRef.current.moved = false\r\n }, [])\r\n\r\n useEffect(() => {\r\n const root = rootRef.current\r\n if (!root) return\r\n root.addEventListener('pointerdown', onPointerDown)\r\n root.addEventListener('pointermove', onPointerMove)\r\n root.addEventListener('pointerup', onPointerEnd)\r\n root.addEventListener('pointercancel', onPointerEnd)\r\n\r\n return () => {\r\n root.removeEventListener('pointerdown', onPointerDown)\r\n root.removeEventListener('pointermove', onPointerMove)\r\n root.removeEventListener('pointerup', onPointerEnd)\r\n root.removeEventListener('pointercancel', onPointerEnd)\r\n }\r\n }, [onPointerDown, onPointerMove, onPointerEnd])\r\n\r\n const setDarkModeInternal = useCallback(\r\n (next: boolean) => {\r\n if (controlledDarkMode == null) setUncontrolledDarkMode(next)\r\n onDarkModeChange?.(next)\r\n readerRef.current?.setDarkMode(next)\r\n },\r\n [controlledDarkMode, onDarkModeChange],\r\n )\r\n\r\n const setFontSizeInternal = useCallback(\r\n (next: number) => {\r\n const safe = clamp(next, 50, 300)\r\n if (controlledFontSize == null) setUncontrolledFontSize(safe)\r\n onFontSizeChange?.(safe)\r\n readerRef.current?.setFontSize(safe)\r\n },\r\n [controlledFontSize, onFontSizeChange],\r\n )\r\n\r\n const closeDrawers = useCallback(() => {\r\n setTocOpen(false)\r\n setSearchOpen(false)\r\n }, [])\r\n\r\n const handleOpenFile = useCallback(\r\n async (nextFile: File) => {\r\n const reader = readerRef.current\r\n if (!reader) return\r\n\r\n setStatus('opening')\r\n setErrorText('')\r\n setToc([])\r\n setProgressInfo(null)\r\n setIsSeeking(false)\r\n setSeekPercent(0)\r\n setSearch((prev) => ({ ...prev, results: [], progressPercent: 0, searching: false }))\r\n\r\n try {\r\n await reader.open(nextFile)\r\n setStatus('ready')\r\n } catch (e: any) {\r\n setStatus('error')\r\n setErrorText(e?.message ? String(e.message) : '打开失败')\r\n onError?.(e)\r\n }\r\n },\r\n [onError],\r\n )\r\n\r\n const runSearch = useCallback(\r\n async (query: string) => {\r\n const reader = readerRef.current\r\n const normalized = query.trim()\r\n\r\n setSearch((prev) => ({\r\n ...prev,\r\n query,\r\n results: normalized ? prev.results : [],\r\n progressPercent: 0,\r\n searching: Boolean(normalized),\r\n }))\r\n\r\n if (!reader || !normalized) {\r\n reader?.clearSearch()\r\n return\r\n }\r\n\r\n reader.cancelSearch()\r\n try {\r\n const results = await reader.search(normalized, search.options)\r\n setSearch((prev) => ({ ...prev, results, searching: false, progressPercent: 100 }))\r\n } catch (e) {\r\n setSearch((prev) => ({ ...prev, searching: false }))\r\n onError?.(e)\r\n }\r\n },\r\n [onError, search.options],\r\n )\r\n\r\n // 初始化阅读器 Core\r\n useEffect(() => {\r\n const host = viewerHostRef.current\r\n if (!host) return\r\n\r\n try {\r\n const reader = createEBookReader(host, {\r\n darkMode,\r\n fontSize,\r\n onReady: (h) => onReady?.(h),\r\n onError: (e) => onError?.(e),\r\n onProgress: (info) => {\r\n setProgressInfo(info)\r\n onProgress?.(info)\r\n },\r\n onToc: (items) => setToc(items),\r\n onSearchProgress: (info) => {\r\n const p = info.progress\r\n if (typeof p === 'number') setSearch((prev) => ({ ...prev, progressPercent: Math.round(p * 100) }))\r\n },\r\n onContentLoad: (doc) => {\r\n if (boundDocsRef.current.has(doc)) return\r\n boundDocsRef.current.add(doc)\r\n doc.addEventListener('pointerdown', onPointerDown)\r\n doc.addEventListener('pointermove', onPointerMove)\r\n doc.addEventListener('pointerup', onPointerEnd)\r\n doc.addEventListener('pointercancel', onPointerEnd)\r\n },\r\n })\r\n readerRef.current = reader\r\n setStatus('ready')\r\n } catch (e: any) {\r\n setStatus('error')\r\n setErrorText(e?.message ? String(e.message) : '初始化失败')\r\n onError?.(e)\r\n return\r\n }\r\n\r\n return () => {\r\n readerRef.current?.destroy()\r\n readerRef.current = null\r\n }\r\n }, [onError, onProgress, onReady])\r\n\r\n useEffect(() => {\r\n if (!file) return\r\n void handleOpenFile(file)\r\n }, [file, handleOpenFile])\r\n\r\n useEffect(() => {\r\n readerRef.current?.setDarkMode(darkMode)\r\n }, [darkMode])\r\n\r\n useEffect(() => {\r\n readerRef.current?.setFontSize(fontSize)\r\n }, [fontSize])\r\n\r\n // 键盘导航\r\n useEffect(() => {\r\n if (!enableKeyboardNav) return\r\n const root = rootRef.current\r\n if (!root) return\r\n\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n if (e.key === 'ArrowLeft') readerRef.current?.prevPage()\r\n if (e.key === 'ArrowRight') readerRef.current?.nextPage()\r\n if (e.key === 'Escape') closeDrawers()\r\n }\r\n\r\n root.addEventListener('keydown', handleKeyDown)\r\n return () => {\r\n root.removeEventListener('keydown', handleKeyDown)\r\n }\r\n }, [closeDrawers, enableKeyboardNav])\r\n\r\n useImperativeHandle(\r\n ref,\r\n () => ({\r\n prevPage: () => readerRef.current?.prevPage(),\r\n nextPage: () => readerRef.current?.nextPage(),\r\n prevSection: () => readerRef.current?.prevSection(),\r\n nextSection: () => readerRef.current?.nextSection(),\r\n goTo: (target) => readerRef.current?.goTo(target),\r\n goToFraction: (frac) => readerRef.current?.goToFraction(frac),\r\n search: (q, o) => (readerRef.current ? readerRef.current.search(q, o) : Promise.resolve([])),\r\n cancelSearch: () => readerRef.current?.cancelSearch(),\r\n clearSearch: () => readerRef.current?.clearSearch(),\r\n }),\r\n [],\r\n )\r\n\r\n // 子组件回调 Helpers\r\n const handleSeekStart = useCallback(() => setIsSeeking(true), [])\r\n const handleSeekChange = useCallback((v: number) => setSeekPercent(v), [])\r\n const handleSeekEnd = useCallback((v: number) => {\r\n setIsSeeking(false)\r\n readerRef.current?.goToFraction(v / 100)\r\n }, [])\r\n\r\n const handleTocSelect = useCallback((href?: string) => {\r\n if (href) readerRef.current?.goTo(href)\r\n }, [])\r\n\r\n const handleSearchResultSelect = useCallback((cfi: string) => {\r\n if (cfi) readerRef.current?.goTo(cfi)\r\n }, [])\r\n\r\n return (\r\n <div\r\n ref={rootRef}\r\n className={mergeClassName('ebook-reader', className)}\r\n style={style}\r\n data-theme={darkMode ? 'dark' : 'light'}\r\n data-layout={layout}\r\n tabIndex={0}\r\n >\r\n <div className=\"ebook-reader__viewer\" ref={viewerHostRef} />\r\n\r\n {layout === 'mobile' ? (\r\n <MobileUI\r\n barVisible={mobileBarVisible}\r\n activePanel={mobilePanel}\r\n onTogglePanel={toggleMobilePanel}\r\n onClosePanel={closeMobileSheet}\r\n toc={toc}\r\n search={search}\r\n status={status}\r\n errorText={errorText}\r\n sectionLabel={sectionLabel}\r\n displayedPercent={displayedPercent}\r\n darkMode={darkMode}\r\n fontSize={fontSize}\r\n onTocSelect={handleTocSelect}\r\n onSearch={(q) => void runSearch(q)}\r\n onSearchQueryChange={(v) => setSearch((prev) => ({ ...prev, query: v }))}\r\n onSearchOptionChange={(opt) => setSearch((prev) => ({ ...prev, options: { ...prev.options, ...opt } }))}\r\n onCancelSearch={() => readerRef.current?.cancelSearch()}\r\n onSearchResultSelect={handleSearchResultSelect}\r\n onSeekStart={handleSeekStart}\r\n onSeekChange={handleSeekChange}\r\n onSeekEnd={handleSeekEnd}\r\n onSeekCommit={handleSeekEnd}\r\n onToggleDarkMode={setDarkModeInternal}\r\n onFontSizeChange={setFontSizeInternal}\r\n />\r\n ) : (\r\n <>\r\n <DesktopToolbar\r\n onToggleToc={() => setTocOpen(true)}\r\n onToggleSearch={() => setSearchOpen(true)}\r\n onPrevSection={() => readerRef.current?.prevSection()}\r\n onPrevPage={() => readerRef.current?.prevPage()}\r\n onNextPage={() => readerRef.current?.nextPage()}\r\n onNextSection={() => readerRef.current?.nextSection()}\r\n darkMode={darkMode}\r\n onToggleDarkMode={() => setDarkModeInternal(!darkMode)}\r\n fontSize={fontSize}\r\n onFontSizeChange={setFontSizeInternal}\r\n />\r\n\r\n {(tocOpen || searchOpen) && <div className=\"ebook-reader__overlay\" onClick={closeDrawers} />}\r\n\r\n <TocDrawer\r\n isOpen={tocOpen}\r\n onClose={() => setTocOpen(false)}\r\n toc={toc}\r\n onSelect={handleTocSelect}\r\n />\r\n\r\n <SearchDrawer\r\n isOpen={searchOpen}\r\n onClose={() => setSearchOpen(false)}\r\n status={status}\r\n search={search}\r\n onSearch={(q) => void runSearch(q)}\r\n onQueryChange={(v) => setSearch((prev) => ({ ...prev, query: v }))}\r\n onOptionChange={(opt) => setSearch((prev) => ({ ...prev, options: { ...prev.options, ...opt } }))}\r\n onCancelSearch={() => readerRef.current?.cancelSearch()}\r\n onResultSelect={handleSearchResultSelect}\r\n />\r\n\r\n <DesktopBottomBar\r\n status={status}\r\n errorText={errorText}\r\n sectionLabel={sectionLabel}\r\n displayedPercent={displayedPercent}\r\n onSeekStart={handleSeekStart}\r\n onSeekChange={handleSeekChange}\r\n onSeekEnd={handleSeekEnd}\r\n onSeekCommit={handleSeekEnd}\r\n />\r\n </>\r\n )}\r\n </div>\r\n )\r\n})\r\n"]}
@@ -0,0 +1,58 @@
1
+ type TocItem = {
2
+ id?: string;
3
+ href?: string;
4
+ label?: string;
5
+ subitems?: TocItem[];
6
+ };
7
+ type ProgressInfo = {
8
+ fraction?: number;
9
+ location?: unknown;
10
+ tocItem?: TocItem | null;
11
+ };
12
+ type SearchResult = {
13
+ cfi?: string;
14
+ label?: string;
15
+ excerpt?: string | {
16
+ pre?: string;
17
+ match?: string;
18
+ post?: string;
19
+ };
20
+ title?: string;
21
+ };
22
+ type SearchOptions = {
23
+ matchCase?: boolean;
24
+ matchDiacritics?: boolean;
25
+ wholeWords?: boolean;
26
+ };
27
+ type EBookReaderOptions = {
28
+ darkMode?: boolean;
29
+ fontSize?: number;
30
+ extraContentCSS?: string;
31
+ onReady?: (handle: EBookReaderHandle) => void;
32
+ onError?: (error: unknown) => void;
33
+ onProgress?: (info: ProgressInfo) => void;
34
+ onToc?: (toc: TocItem[]) => void;
35
+ onSearchProgress?: (info: {
36
+ progress?: number;
37
+ done?: boolean;
38
+ }) => void;
39
+ onContentLoad?: (doc: Document) => void;
40
+ };
41
+ type EBookReaderHandle = {
42
+ open: (file: File) => Promise<void>;
43
+ destroy: () => void;
44
+ prevPage: () => void;
45
+ nextPage: () => void;
46
+ prevSection: () => void;
47
+ nextSection: () => void;
48
+ goTo: (target: string) => void;
49
+ goToFraction: (fraction: number) => void;
50
+ setDarkMode: (darkMode: boolean) => void;
51
+ setFontSize: (fontSize: number) => void;
52
+ search: (query: string, options?: SearchOptions) => Promise<SearchResult[]>;
53
+ cancelSearch: () => void;
54
+ clearSearch: () => void;
55
+ getToc: () => TocItem[];
56
+ };
57
+
58
+ export type { EBookReaderHandle as E, ProgressInfo as P, SearchOptions as S, TocItem as T, EBookReaderOptions as a, SearchResult as b };
@@ -0,0 +1,58 @@
1
+ type TocItem = {
2
+ id?: string;
3
+ href?: string;
4
+ label?: string;
5
+ subitems?: TocItem[];
6
+ };
7
+ type ProgressInfo = {
8
+ fraction?: number;
9
+ location?: unknown;
10
+ tocItem?: TocItem | null;
11
+ };
12
+ type SearchResult = {
13
+ cfi?: string;
14
+ label?: string;
15
+ excerpt?: string | {
16
+ pre?: string;
17
+ match?: string;
18
+ post?: string;
19
+ };
20
+ title?: string;
21
+ };
22
+ type SearchOptions = {
23
+ matchCase?: boolean;
24
+ matchDiacritics?: boolean;
25
+ wholeWords?: boolean;
26
+ };
27
+ type EBookReaderOptions = {
28
+ darkMode?: boolean;
29
+ fontSize?: number;
30
+ extraContentCSS?: string;
31
+ onReady?: (handle: EBookReaderHandle) => void;
32
+ onError?: (error: unknown) => void;
33
+ onProgress?: (info: ProgressInfo) => void;
34
+ onToc?: (toc: TocItem[]) => void;
35
+ onSearchProgress?: (info: {
36
+ progress?: number;
37
+ done?: boolean;
38
+ }) => void;
39
+ onContentLoad?: (doc: Document) => void;
40
+ };
41
+ type EBookReaderHandle = {
42
+ open: (file: File) => Promise<void>;
43
+ destroy: () => void;
44
+ prevPage: () => void;
45
+ nextPage: () => void;
46
+ prevSection: () => void;
47
+ nextSection: () => void;
48
+ goTo: (target: string) => void;
49
+ goToFraction: (fraction: number) => void;
50
+ setDarkMode: (darkMode: boolean) => void;
51
+ setFontSize: (fontSize: number) => void;
52
+ search: (query: string, options?: SearchOptions) => Promise<SearchResult[]>;
53
+ cancelSearch: () => void;
54
+ clearSearch: () => void;
55
+ getToc: () => TocItem[];
56
+ };
57
+
58
+ export type { EBookReaderHandle as E, ProgressInfo as P, SearchOptions as S, TocItem as T, EBookReaderOptions as a, SearchResult as b };
package/dist/vue.cjs ADDED
Binary file
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/reader.ts","../src/vue/types.ts","../src/core/icons.ts","unplugin-vue:%00/plugin-vue/export-helper","../src/vue/components/SvgIcon.vue","../src/vue/components/DesktopToolbar.vue","../src/vue/components/DesktopBottomBar.vue","../src/vue/components/TocTree.vue","../src/vue/components/TocDrawer.vue","../src/vue/components/SearchResultList.vue","../src/vue/components/SearchDrawer.vue","../src/vue/components/MobileUI.vue","../src/vue/EBookReaderVue.ts"],"names":["computed","_openBlock","_createElementBlock","_normalizeStyle","_hoisted_1","_createElementVNode","_createVNode","_toDisplayString","_hoisted_2","_hoisted_3","_hoisted_4","_createCommentVNode","_withKeys","_Fragment","_renderList","_toDisplayString3","_normalizeClass","_createBlock","_hoisted_6","_hoisted_7","_hoisted_12","_hoisted_14","_hoisted_15","_hoisted_16","ref","_toDisplayString6","_hoisted_5","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_13","_hoisted_17","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","defineComponent","getCurrentInstance","onMounted","nextTick","h","onBeforeUnmount","watch"],"mappings":"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","file":"vue.cjs","sourcesContent":["import 'foliate-js/view.js'\r\nimport type { EBookReaderHandle, EBookReaderOptions, ProgressInfo, SearchOptions, SearchResult, TocItem } from './types.js'\r\n\r\ntype FoliateViewElement = HTMLElement & {\r\n book?: { toc?: TocItem[] }\r\n renderer?: {\r\n prevSection?: () => void\r\n nextSection?: () => void\r\n setStyles?: (css: string) => void\r\n render?: () => void\r\n expand?: () => void\r\n }\r\n open?: (file: File) => Promise<void>\r\n init?: (options?: unknown) => Promise<void>\r\n goLeft?: () => void\r\n goRight?: () => void\r\n goTo?: (target: string) => Promise<void> | void\r\n goToFraction?: (fraction: number) => Promise<void> | void\r\n search?: (options: unknown) => AsyncIterable<unknown>\r\n clearSearch?: () => void\r\n}\r\n\r\nconst getContentCSS = (fontSize: number, isDark: boolean, extraCSS?: string) => `\r\n@namespace epub \"http://www.idpf.org/2007/ops\";\r\nhtml {\r\n color-scheme: ${isDark ? 'dark' : 'light'} !important;\r\n}\r\nbody {\r\n background-color: transparent !important;\r\n color: ${isDark ? '#e0e0e0' : 'black'} !important;\r\n font-size: ${fontSize}% !important;\r\n}\r\np {\r\n line-height: 1.6;\r\n margin-bottom: 1em;\r\n}\r\na {\r\n color: ${isDark ? '#64b5f6' : '#2563eb'} !important;\r\n}\r\nimg {\r\n max-width: 100%;\r\n height: auto;\r\n object-fit: contain;\r\n ${isDark ? 'filter: brightness(0.8) contrast(1.2);' : ''}\r\n}\r\n${extraCSS ?? ''}\r\n`\r\n\r\nexport function createEBookReader(container: HTMLElement, options: EBookReaderOptions = {}): EBookReaderHandle {\r\n if (!container) throw new Error('container is required')\r\n if (!customElements.get('foliate-view')) throw new Error('foliate-view is not defined')\r\n\r\n const {\r\n darkMode: initialDarkMode = false,\r\n fontSize: initialFontSize = 100,\r\n extraContentCSS,\r\n onReady,\r\n onError,\r\n onProgress,\r\n onToc,\r\n onSearchProgress,\r\n onContentLoad,\r\n } = options\r\n\r\n let destroyed = false\r\n let toc: TocItem[] = []\r\n let fontSize = initialFontSize\r\n let darkMode = initialDarkMode\r\n let searchToken = 0\r\n\r\n container.innerHTML = ''\r\n\r\n const viewer = document.createElement('foliate-view') as FoliateViewElement\r\n viewer.style.display = 'block'\r\n viewer.style.width = '100%'\r\n viewer.style.height = '100%'\r\n viewer.setAttribute('margin', '48')\r\n viewer.setAttribute('gap', '0.07')\r\n\r\n const applyStyles = () => {\r\n if (destroyed) return\r\n if (!viewer.renderer?.setStyles) return\r\n viewer.renderer.setStyles(getContentCSS(fontSize, darkMode, extraContentCSS))\r\n requestAnimationFrame(() => {\r\n setTimeout(() => {\r\n if (destroyed) return\r\n viewer.renderer?.render?.()\r\n viewer.renderer?.expand?.()\r\n }, 50)\r\n })\r\n }\r\n\r\n const handleLoad = (e: Event) => {\r\n applyStyles()\r\n const detail = (e as CustomEvent).detail as { doc?: Document } | undefined\r\n if (detail?.doc) onContentLoad?.(detail.doc)\r\n }\r\n\r\n const handleRelocate = (e: Event) => {\r\n const detail = (e as CustomEvent).detail as ProgressInfo\r\n onProgress?.(detail)\r\n }\r\n\r\n viewer.addEventListener('load', handleLoad as EventListener)\r\n viewer.addEventListener('relocate', handleRelocate as EventListener)\r\n\r\n container.appendChild(viewer)\r\n\r\n const handle: EBookReaderHandle = {\r\n async open(file) {\r\n if (destroyed) return\r\n if (!file) return\r\n\r\n try {\r\n viewer.clearSearch?.()\r\n searchToken++\r\n\r\n await viewer.open?.(file)\r\n\r\n const nextToc = viewer.book?.toc ?? []\r\n toc = nextToc\r\n onToc?.(toc)\r\n\r\n await viewer.init?.({ showTextStart: true })\r\n applyStyles()\r\n } catch (error) {\r\n onError?.(error)\r\n throw error\r\n }\r\n },\r\n destroy() {\r\n if (destroyed) return\r\n destroyed = true\r\n searchToken++\r\n viewer.removeEventListener('load', handleLoad)\r\n viewer.removeEventListener('relocate', handleRelocate as EventListener)\r\n container.innerHTML = ''\r\n },\r\n prevPage() {\r\n viewer.goLeft?.()\r\n },\r\n nextPage() {\r\n viewer.goRight?.()\r\n },\r\n prevSection() {\r\n viewer.renderer?.prevSection?.()\r\n },\r\n nextSection() {\r\n viewer.renderer?.nextSection?.()\r\n },\r\n goTo(target) {\r\n if (!target) return\r\n viewer.goTo?.(target)\r\n },\r\n goToFraction(fraction) {\r\n const safe = Math.min(1, Math.max(0, fraction))\r\n viewer.goToFraction?.(safe)\r\n },\r\n setDarkMode(nextDarkMode) {\r\n darkMode = nextDarkMode\r\n applyStyles()\r\n },\r\n setFontSize(nextFontSize) {\r\n const safe = Math.min(300, Math.max(50, nextFontSize))\r\n fontSize = safe\r\n applyStyles()\r\n },\r\n async search(query, opts: SearchOptions = {}) {\r\n const normalized = query.trim()\r\n if (!normalized) {\r\n viewer.clearSearch?.()\r\n return []\r\n }\r\n\r\n const token = ++searchToken\r\n const results: SearchResult[] = []\r\n\r\n try {\r\n for await (const item of viewer.search?.({\r\n query: normalized,\r\n matchCase: Boolean(opts.matchCase),\r\n matchWholeWords: Boolean(opts.wholeWords),\r\n matchDiacritics: Boolean(opts.matchDiacritics),\r\n }) ?? []) {\r\n if (destroyed || token !== searchToken) return results\r\n\r\n if (item === 'done') {\r\n onSearchProgress?.({ done: true, progress: 1 })\r\n break\r\n }\r\n\r\n if (typeof item === 'object' && item && 'progress' in (item as any)) {\r\n const progress = (item as any).progress\r\n if (typeof progress === 'number') onSearchProgress?.({ progress })\r\n continue\r\n }\r\n\r\n const anyItem = item as any\r\n if (anyItem?.subitems?.length) {\r\n for (const sub of anyItem.subitems) {\r\n results.push({\r\n label: anyItem.label,\r\n cfi: sub?.cfi,\r\n excerpt: sub?.excerpt,\r\n title: sub?.title,\r\n })\r\n }\r\n } else if (anyItem?.cfi) {\r\n results.push({\r\n cfi: anyItem.cfi,\r\n excerpt: anyItem.excerpt,\r\n title: anyItem.title,\r\n })\r\n }\r\n }\r\n } catch (error) {\r\n onError?.(error)\r\n throw error\r\n }\r\n\r\n return results\r\n },\r\n cancelSearch() {\r\n searchToken++\r\n },\r\n clearSearch() {\r\n viewer.clearSearch?.()\r\n },\r\n getToc() {\r\n return toc\r\n },\r\n }\r\n\r\n onReady?.(handle)\r\n return handle\r\n}\r\n","import type { PropType } from 'vue'\nimport type { EBookReaderHandle, ProgressInfo, SearchOptions } from '../core/types.js'\n\nexport type MobilePanel = 'menu' | 'search' | 'progress' | 'theme' | 'font'\n\nexport type EBookReaderVueExposed = Pick<\n EBookReaderHandle,\n 'prevPage' | 'nextPage' | 'prevSection' | 'nextSection' | 'goTo' | 'goToFraction' | 'search' | 'cancelSearch' | 'clearSearch'\n>\n\nexport type EBookReaderVueProps = {\n file?: File | null\n defaultFontSize?: number\n fontSize?: number\n defaultDarkMode?: boolean\n darkMode?: boolean\n enableKeyboardNav?: boolean\n defaultSearchOptions?: SearchOptions\n}\n\nexport const EBookReaderVuePropsDef = {\n file: { type: Object as PropType<File | null>, required: false },\n defaultFontSize: { type: Number, required: false, default: 100 },\n fontSize: { type: Number, required: false },\n defaultDarkMode: { type: Boolean, required: false, default: false },\n darkMode: { type: Boolean, required: false },\n enableKeyboardNav: { type: Boolean, required: false, default: true },\n defaultSearchOptions: {\n type: Object as PropType<SearchOptions>,\n required: false,\n default: () => ({ matchCase: false, wholeWords: false, matchDiacritics: false }),\n },\n} as const\n\nexport type EBookReaderVueEmits = {\n (e: 'ready', handle: EBookReaderHandle): void\n (e: 'error', error: unknown): void\n (e: 'progress', info: ProgressInfo): void\n (e: 'fontSizeChange', fontSize: number): void\n (e: 'darkModeChange', darkMode: boolean): void\n (e: 'update:fontSize', fontSize: number): void\n (e: 'update:darkMode', darkMode: boolean): void\n}\n","export const icons: Record<string, string> = {\n list: '<path d=\"M3 12h18M3 6h18M3 18h18\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n search: '<path d=\"M11 19a8 8 0 1 0 0-16 8 8 0 0 0 0 16zM21 21l-4.35-4.35\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n 'chevron-left': '<path d=\"M15 18l-6-6 6-6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n 'chevron-right': '<path d=\"M9 18l6-6-6-6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n 'chevrons-left': '<path d=\"M11 17l-5-5 5-5M18 17l-5-5 5-5\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n 'chevrons-right': '<path d=\"M13 17l5-5-5-5M6 17l5-5-5-5\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n sun: '<circle cx=\"12\" cy=\"12\" r=\"5\" stroke=\"currentColor\" stroke-width=\"2\"/><path d=\"M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/>',\n moon: '<path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n plus: '<path d=\"M12 5v14M5 12h14\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n minus: '<path d=\"M5 12h14\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n x: '<path d=\"M18 6L6 18M6 6l12 12\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n type: '<path d=\"M4 7V4h16v3M9 20h6M12 4v16\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n sliders: '<path d=\"M4 21v-7M4 10V3M12 21v-9M12 8V3M20 21v-5M20 12V3M1 14h6M9 8h6M17 16h6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>'\n}\n","\nexport default (sfc, props) => {\n const target = sfc.__vccOpts || sfc;\n for (const [key, val] of props) {\n target[key] = val;\n }\n return target;\n}\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { icons } from '../../core/icons'\n\nconst props = withDefaults(defineProps<{\n name: string\n size?: number | string\n color?: string\n}>(), {\n size: 24,\n color: 'currentColor'\n})\n\nconst iconPath = computed(() => icons[props.name] || '')\n\nconst iconStyle = computed(() => {\n const sizeVal = typeof props.size === 'number' ? `${props.size}px` : props.size\n return {\n width: sizeVal,\n height: sizeVal,\n color: props.color,\n minWidth: sizeVal // 防止在 flex 布局中被压缩\n }\n})\n</script>\n\n<template>\n <svg\n v-if=\"iconPath\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n :style=\"iconStyle\"\n class=\"ebook-reader-icon\"\n v-html=\"iconPath\"\n >\n </svg>\n</template>\n","<script setup lang=\"ts\">\r\nimport SvgIcon from './SvgIcon.vue'\r\n\r\ndefineProps<{\r\n darkMode: boolean\r\n fontSize: number\r\n}>()\r\n\r\nconst emit = defineEmits<{\r\n (e: 'toggleToc'): void\r\n (e: 'toggleSearch'): void\r\n (e: 'prevSection'): void\r\n (e: 'prevPage'): void\r\n (e: 'nextPage'): void\r\n (e: 'nextSection'): void\r\n (e: 'toggleDarkMode'): void\r\n (e: 'changeFontSize', val: number): void\r\n}>()\r\n</script>\r\n\r\n<template>\r\n <div class=\"ebook-reader__toolbar\">\r\n <div class=\"ebook-reader__panel\">\r\n <button type=\"button\" class=\"ebook-reader__btn\" title=\"目录\" @click=\"emit('toggleToc')\">\r\n <SvgIcon name=\"list\" />\r\n </button>\r\n <button type=\"button\" class=\"ebook-reader__btn\" title=\"搜索\" @click=\"emit('toggleSearch')\">\r\n <SvgIcon name=\"search\" />\r\n </button>\r\n <div class=\"ebook-reader__divider\" />\r\n <button type=\"button\" class=\"ebook-reader__btn\" title=\"上一章\" @click=\"emit('prevSection')\">\r\n <SvgIcon name=\"chevrons-left\" />\r\n </button>\r\n <button type=\"button\" class=\"ebook-reader__btn\" title=\"上一页\" @click=\"emit('prevPage')\">\r\n <SvgIcon name=\"chevron-left\" />\r\n </button>\r\n <button type=\"button\" class=\"ebook-reader__btn\" title=\"下一页\" @click=\"emit('nextPage')\">\r\n <SvgIcon name=\"chevron-right\" />\r\n </button>\r\n <button type=\"button\" class=\"ebook-reader__btn\" title=\"下一章\" @click=\"emit('nextSection')\">\r\n <SvgIcon name=\"chevrons-right\" />\r\n </button>\r\n </div>\r\n\r\n <div class=\"ebook-reader__panel\">\r\n <button type=\"button\" class=\"ebook-reader__btn\" title=\"主题\" @click=\"emit('toggleDarkMode')\">\r\n <SvgIcon :name=\"darkMode ? 'sun' : 'moon'\" />\r\n </button>\r\n <div class=\"ebook-reader__divider\" />\r\n <button type=\"button\" class=\"ebook-reader__btn\" title=\"增大字号\" @click=\"emit('changeFontSize', fontSize + 10)\">\r\n <SvgIcon name=\"plus\" />\r\n </button>\r\n <div class=\"ebook-reader__font\">{{ fontSize }}%</div>\r\n <button type=\"button\" class=\"ebook-reader__btn\" title=\"减小字号\" @click=\"emit('changeFontSize', fontSize - 10)\">\r\n <SvgIcon name=\"minus\" />\r\n </button>\r\n </div>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\ndefineProps<{\n status: 'idle' | 'ready' | 'opening' | 'error'\n errorText: string\n sectionLabel: string\n displayedPercent: number\n}>()\n\nconst emit = defineEmits<{\n (e: 'seekStart'): void\n (e: 'seekChange', val: number): void\n (e: 'seekEnd', val: number): void\n (e: 'seekCommit', val: number): void\n}>()\n</script>\n\n<template>\n <div class=\"ebook-reader__bottom\">\n <div class=\"ebook-reader__bottom-left\">\n <span class=\"ebook-reader__status\">\n {{ status === 'error' ? errorText || '错误' : status === 'opening' ? '正在打开…' : '就绪' }}\n </span>\n <span v-if=\"sectionLabel\" class=\"ebook-reader__section\">{{ sectionLabel }}</span>\n </div>\n <div class=\"ebook-reader__bottom-right\">\n <input\n class=\"ebook-reader__range\"\n type=\"range\"\n :min=\"0\"\n :max=\"100\"\n :step=\"1\"\n :value=\"displayedPercent\"\n @input=\"(e: any) => {\n emit('seekStart')\n emit('seekChange', Number(e.target.value))\n }\"\n @pointerup=\"(e: any) => emit('seekEnd', Number(e.target.value))\"\n @keyup.enter=\"(e: any) => emit('seekCommit', Number(e.target.value))\"\n />\n <span class=\"ebook-reader__percent\">{{ displayedPercent }}%</span>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\r\nimport type { TocItem } from '../../core/types'\r\n\r\ndefineProps<{\r\n items: TocItem[]\r\n}>()\r\n\r\nconst emit = defineEmits<{\r\n (e: 'select', href?: string): void\r\n}>()\r\n</script>\r\n\r\n<template>\r\n <ul class=\"ebook-reader__toc-list\">\r\n <li v-for=\"(item, idx) in items\" :key=\"item.href || `${item.label ?? 'item'}-${idx}`\" class=\"ebook-reader__toc-item\">\r\n <template v-if=\"!item.subitems?.length\">\r\n <button type=\"button\" class=\"ebook-reader__toc-btn\" @click=\"emit('select', item.href)\">\r\n {{ item.label || item.href || '未命名' }}\r\n </button>\r\n </template>\r\n <template v-else>\r\n <details class=\"ebook-reader__toc-details\">\r\n <summary class=\"ebook-reader__toc-summary\">{{ item.label || item.href || '未命名' }}</summary>\r\n <TocTree :items=\"item.subitems\" @select=\"emit('select', $event)\" />\r\n </details>\r\n </template>\r\n </li>\r\n </ul>\r\n</template>\r\n","<script setup lang=\"ts\">\nimport type { TocItem } from '../../core/types'\nimport TocTree from './TocTree.vue'\nimport SvgIcon from './SvgIcon.vue'\n\ndefineProps<{\n isOpen: boolean\n toc: TocItem[]\n}>()\n\nconst emit = defineEmits<{\n (e: 'close'): void\n (e: 'select', href?: string): void\n}>()\n</script>\n\n<template>\n <aside :class=\"['ebook-reader__drawer', { 'is-open': isOpen }]\" :aria-hidden=\"!isOpen\">\n <div class=\"ebook-reader__drawer-header\">\n <div class=\"ebook-reader__drawer-title\">目录</div>\n <button type=\"button\" class=\"ebook-reader__btn\" @click=\"emit('close')\">\n <SvgIcon name=\"x\" />\n </button>\n </div>\n <div class=\"ebook-reader__drawer-body\">\n <TocTree\n v-if=\"toc.length\"\n :items=\"toc\"\n @select=\"(href) => {\n emit('select', href)\n emit('close')\n }\"\n />\n <div v-else class=\"ebook-reader__empty\">未找到目录</div>\n </div>\n </aside>\n</template>\n","<script setup lang=\"ts\">\nimport type { SearchResult } from '../../core/types'\n\ndefineProps<{\n results: SearchResult[]\n}>()\n\nconst emit = defineEmits<{\n (e: 'select', cfi: string): void\n}>()\n</script>\n\n<template>\n <ul class=\"ebook-reader__search-list\">\n <li v-for=\"(r, idx) in results\" :key=\"`${r.cfi ?? 'no-cfi'}-${idx}`\" class=\"ebook-reader__search-item\">\n <button\n type=\"button\"\n class=\"ebook-reader__search-btn\"\n @click=\"r.cfi && emit('select', r.cfi)\"\n >\n <div v-if=\"r.label\" class=\"ebook-reader__search-label\">{{ r.label }}</div>\n <div class=\"ebook-reader__search-excerpt\">\n {{ typeof r.excerpt === 'string' ? r.excerpt : `${r.excerpt?.pre ?? ''}${r.excerpt?.match ?? ''}${r.excerpt?.post ?? ''}` }}\n </div>\n </button>\n </li>\n </ul>\n</template>\n","<script setup lang=\"ts\">\nimport type { SearchOptions, SearchResult } from '../../core/types'\nimport SearchResultList from './SearchResultList.vue'\nimport SvgIcon from './SvgIcon.vue'\n\ndefineProps<{\n isOpen: boolean\n status: 'idle' | 'ready' | 'opening' | 'error'\n query: string\n options: SearchOptions\n progressPercent: number\n searching: boolean\n results: SearchResult[]\n}>()\n\nconst emit = defineEmits<{\n (e: 'close'): void\n (e: 'search', query: string): void\n (e: 'update:query', val: string): void\n (e: 'update:options', val: Partial<SearchOptions>): void\n (e: 'cancelSearch'): void\n (e: 'selectResult', cfi: string): void\n}>()\n\nconst updateOption = (key: keyof SearchOptions, value: boolean) => {\n emit('update:options', { [key]: value })\n}\n</script>\n\n<template>\n <aside :class=\"['ebook-reader__drawer', 'right', { 'is-open': isOpen }]\" :aria-hidden=\"!isOpen\">\n <div class=\"ebook-reader__drawer-header\">\n <div class=\"ebook-reader__drawer-title\">搜索</div>\n <button type=\"button\" class=\"ebook-reader__btn\" @click=\"emit('close')\">\n <SvgIcon name=\"x\" />\n </button>\n </div>\n <div class=\"ebook-reader__drawer-body\">\n <div class=\"ebook-reader__field\">\n <input\n class=\"ebook-reader__input\"\n placeholder=\"输入关键词\"\n :value=\"query\"\n :disabled=\"status !== 'ready'\"\n @input=\"(e: any) => {\n const v = e.target.value\n emit('update:query', v)\n if (!v.trim()) emit('search', '')\n }\"\n @keydown.enter=\"emit('search', query)\"\n />\n <button type=\"button\" class=\"ebook-reader__btn\" :disabled=\"status !== 'ready'\" @click=\"emit('search', query)\">\n <SvgIcon name=\"search\" />\n </button>\n </div>\n\n <div class=\"ebook-reader__checks\">\n <label class=\"ebook-reader__check\">\n <input\n type=\"checkbox\"\n :checked=\"Boolean(options.matchCase)\"\n @change=\"(e: any) => updateOption('matchCase', e.target.checked)\"\n />\n 区分大小写\n </label>\n <label class=\"ebook-reader__check\">\n <input\n type=\"checkbox\"\n :checked=\"Boolean(options.wholeWords)\"\n @change=\"(e: any) => updateOption('wholeWords', e.target.checked)\"\n />\n 全词匹配\n </label>\n <label class=\"ebook-reader__check\">\n <input\n type=\"checkbox\"\n :checked=\"Boolean(options.matchDiacritics)\"\n @change=\"(e: any) => updateOption('matchDiacritics', e.target.checked)\"\n />\n 区分变音\n </label>\n </div>\n\n <div class=\"ebook-reader__meta\">\n <span>进度 {{ progressPercent }}%</span>\n <span v-if=\"searching\">搜索中…</span>\n <button v-if=\"searching\" type=\"button\" class=\"ebook-reader__link\" @click=\"emit('cancelSearch')\">\n 取消\n </button>\n </div>\n\n <SearchResultList v-if=\"results.length\" :results=\"results\" @select=\"(cfi) => emit('selectResult', cfi)\" />\n <div v-else class=\"ebook-reader__empty\">{{ query.trim() ? '无匹配结果' : '请输入关键词' }}</div>\n </div>\n </aside>\n</template>\n","<script setup lang=\"ts\">\r\nimport { computed, ref } from 'vue'\r\nimport type { TocItem, SearchOptions, SearchResult } from '../../core/types'\r\nimport TocTree from './TocTree.vue'\r\nimport SearchResultList from './SearchResultList.vue'\r\nimport SvgIcon from './SvgIcon.vue'\r\nimport type { MobilePanel } from '../types'\r\n\r\nconst props = defineProps<{\r\n barVisible: boolean\r\n activePanel: MobilePanel | null\r\n \r\n // Data\r\n toc: TocItem[]\r\n status: 'idle' | 'ready' | 'opening' | 'error'\r\n errorText: string\r\n sectionLabel: string\r\n displayedPercent: number\r\n darkMode: boolean\r\n fontSize: number\r\n \r\n // Search Data\r\n searchQuery: string\r\n searchOptions: SearchOptions\r\n searchProgressPercent: number\r\n searching: boolean\r\n searchResults: SearchResult[]\r\n}>()\r\n\r\nconst emit = defineEmits<{\r\n (e: 'togglePanel', panel: MobilePanel): void\r\n (e: 'closePanel'): void\r\n \r\n (e: 'tocSelect', href?: string): void\r\n \r\n (e: 'search', query: string): void\r\n (e: 'update:searchQuery', val: string): void\r\n (e: 'update:searchOptions', val: Partial<SearchOptions>): void\r\n (e: 'cancelSearch'): void\r\n (e: 'searchResultSelect', cfi: string): void\r\n \r\n (e: 'seekStart'): void\r\n (e: 'seekChange', val: number): void\r\n (e: 'seekEnd', val: number): void\r\n (e: 'seekCommit', val: number): void\r\n \r\n (e: 'toggleDarkMode', val: boolean): void\r\n (e: 'changeFontSize', val: number): void\r\n}>()\r\n\r\nconst mobileTitle = computed(() => {\r\n switch (props.activePanel) {\r\n case 'menu': return '目录'\r\n case 'search': return '搜索'\r\n case 'progress': return '进度'\r\n case 'theme': return '明暗'\r\n case 'font': return '字号'\r\n default: return ''\r\n }\r\n})\r\n\r\nconst updateSearchOption = (key: keyof SearchOptions, value: boolean) => {\r\n emit('update:searchOptions', { [key]: value })\r\n}\r\n\r\nconst tooltip = ref<{ text: string, left: number } | null>(null)\r\nlet timer: number | null = null\r\n\r\nconst handleTouchStart = (e: TouchEvent, text: string) => {\r\n const target = e.currentTarget as HTMLElement\r\n const rect = target.getBoundingClientRect()\r\n timer = window.setTimeout(() => {\r\n tooltip.value = {\r\n text,\r\n left: rect.left + rect.width / 2\r\n }\r\n }, 500)\r\n}\r\n\r\nconst handleTouchEnd = () => {\r\n if (timer) {\r\n clearTimeout(timer)\r\n timer = null\r\n }\r\n tooltip.value = null\r\n}\r\n</script>\r\n\r\n<template>\r\n <div>\r\n <div :class=\"['ebook-reader__mbar', { 'is-visible': barVisible }]\">\r\n <div \r\n v-if=\"tooltip\"\r\n class=\"ebook-reader__tooltip\"\r\n :style=\"{\r\n position: 'fixed',\r\n bottom: '60px',\r\n left: `${tooltip.left}px`,\r\n transform: 'translateX(-50%)',\r\n background: 'rgba(0,0,0,0.8)',\r\n color: '#fff',\r\n padding: '4px 8px',\r\n borderRadius: '4px',\r\n fontSize: '12px',\r\n pointerEvents: 'none',\r\n zIndex: 1000,\r\n whiteSpace: 'nowrap'\r\n }\"\r\n >\r\n {{ tooltip.text }}\r\n </div>\r\n <button \r\n type=\"button\" \r\n class=\"ebook-reader__btn\" \r\n :aria-pressed=\"activePanel === 'menu'\" \r\n @click=\"emit('togglePanel', 'menu')\"\r\n @touchstart=\"(e) => handleTouchStart(e, '目录')\"\r\n @touchend=\"handleTouchEnd\"\r\n @touchcancel=\"handleTouchEnd\"\r\n title=\"目录\"\r\n >\r\n <SvgIcon name=\"list\" />\r\n </button>\r\n <button \r\n type=\"button\" \r\n class=\"ebook-reader__btn\" \r\n :aria-pressed=\"activePanel === 'search'\" \r\n @click=\"emit('togglePanel', 'search')\"\r\n @touchstart=\"(e) => handleTouchStart(e, '搜索')\"\r\n @touchend=\"handleTouchEnd\"\r\n @touchcancel=\"handleTouchEnd\"\r\n title=\"搜索\"\r\n >\r\n <SvgIcon name=\"search\" />\r\n </button>\r\n <button \r\n type=\"button\" \r\n class=\"ebook-reader__btn\" \r\n :aria-pressed=\"activePanel === 'progress'\" \r\n @click=\"emit('togglePanel', 'progress')\"\r\n @touchstart=\"(e) => handleTouchStart(e, '进度')\"\r\n @touchend=\"handleTouchEnd\"\r\n @touchcancel=\"handleTouchEnd\"\r\n title=\"进度\"\r\n >\r\n <SvgIcon name=\"sliders\" />\r\n </button>\r\n <button \r\n type=\"button\" \r\n class=\"ebook-reader__btn\" \r\n :aria-pressed=\"activePanel === 'theme'\" \r\n @click=\"emit('togglePanel', 'theme')\"\r\n @touchstart=\"(e) => handleTouchStart(e, '明暗')\"\r\n @touchend=\"handleTouchEnd\"\r\n @touchcancel=\"handleTouchEnd\"\r\n title=\"明暗\"\r\n >\r\n <SvgIcon name=\"sun\" />\r\n </button>\r\n <button \r\n type=\"button\" \r\n class=\"ebook-reader__btn\" \r\n :aria-pressed=\"activePanel === 'font'\" \r\n @click=\"emit('togglePanel', 'font')\"\r\n @touchstart=\"(e) => handleTouchStart(e, '字号')\"\r\n @touchend=\"handleTouchEnd\"\r\n @touchcancel=\"handleTouchEnd\"\r\n title=\"字号\"\r\n >\r\n <SvgIcon name=\"type\" />\r\n </button>\r\n </div>\r\n\r\n <div v-if=\"activePanel\" class=\"ebook-reader__moverlay\" @click=\"emit('closePanel')\" />\r\n\r\n <div :class=\"['ebook-reader__msheet', { 'is-open': activePanel }]\" :aria-hidden=\"!activePanel\">\r\n <div class=\"ebook-reader__msheet-header\">\r\n <div class=\"ebook-reader__msheet-title\">{{ mobileTitle }}</div>\r\n <button type=\"button\" class=\"ebook-reader__btn\" @click=\"emit('closePanel')\">\r\n <SvgIcon name=\"x\" />\r\n </button>\r\n </div>\r\n <div class=\"ebook-reader__msheet-body\">\r\n <template v-if=\"activePanel === 'menu'\">\r\n <TocTree\r\n v-if=\"toc.length\"\r\n :items=\"toc\"\r\n @select=\"(href) => {\r\n emit('tocSelect', href)\r\n emit('closePanel')\r\n }\"\r\n />\r\n <div v-else class=\"ebook-reader__empty\">未找到目录</div>\r\n </template>\r\n\r\n <template v-if=\"activePanel === 'search'\">\r\n <div class=\"ebook-reader__field\">\r\n <input\r\n class=\"ebook-reader__input\"\r\n placeholder=\"输入关键词\"\r\n :value=\"searchQuery\"\r\n :disabled=\"status !== 'ready'\"\r\n @input=\"(e: any) => {\r\n const v = e.target.value\r\n emit('update:searchQuery', v)\r\n if (!v.trim()) emit('search', '')\r\n }\"\r\n @keydown.enter=\"emit('search', searchQuery)\"\r\n />\r\n <button type=\"button\" class=\"ebook-reader__btn\" :disabled=\"status !== 'ready'\" @click=\"emit('search', searchQuery)\">\r\n 搜索\r\n </button>\r\n </div>\r\n\r\n <div class=\"ebook-reader__checks\">\r\n <label class=\"ebook-reader__check\">\r\n <input\r\n type=\"checkbox\"\r\n :checked=\"Boolean(searchOptions.matchCase)\"\r\n @change=\"(e: any) => updateSearchOption('matchCase', e.target.checked)\"\r\n />\r\n 区分大小写\r\n </label>\r\n <label class=\"ebook-reader__check\">\r\n <input\r\n type=\"checkbox\"\r\n :checked=\"Boolean(searchOptions.wholeWords)\"\r\n @change=\"(e: any) => updateSearchOption('wholeWords', e.target.checked)\"\r\n />\r\n 全词匹配\r\n </label>\r\n <label class=\"ebook-reader__check\">\r\n <input\r\n type=\"checkbox\"\r\n :checked=\"Boolean(searchOptions.matchDiacritics)\"\r\n @change=\"(e: any) => updateSearchOption('matchDiacritics', e.target.checked)\"\r\n />\r\n 区分变音\r\n </label>\r\n </div>\r\n\r\n <div class=\"ebook-reader__meta\">\r\n <span>进度 {{ searchProgressPercent }}%</span>\r\n <span v-if=\"searching\">搜索中…</span>\r\n <button v-if=\"searching\" type=\"button\" class=\"ebook-reader__link\" @click=\"emit('cancelSearch')\">\r\n 取消\r\n </button>\r\n </div>\r\n\r\n <SearchResultList v-if=\"searchResults.length\" :results=\"searchResults\" @select=\"(cfi) => emit('searchResultSelect', cfi)\" />\r\n <div v-else class=\"ebook-reader__empty\">{{ searchQuery.trim() ? '无匹配结果' : '请输入关键词' }}</div>\r\n </template>\r\n\r\n <template v-if=\"activePanel === 'progress'\">\r\n <div class=\"ebook-reader__meta\">\r\n <span class=\"ebook-reader__status\">\r\n {{ status === 'error' ? errorText || '错误' : status === 'opening' ? '正在打开…' : '就绪' }}\r\n </span>\r\n <span v-if=\"sectionLabel\">{{ sectionLabel }}</span>\r\n </div>\r\n <div class=\"ebook-reader__mprogress\">\r\n <input\r\n class=\"ebook-reader__range\"\r\n type=\"range\"\r\n :min=\"0\"\r\n :max=\"100\"\r\n :step=\"1\"\r\n :value=\"displayedPercent\"\r\n @input=\"(e: any) => {\r\n emit('seekStart')\r\n emit('seekChange', Number(e.target.value))\r\n }\"\r\n @pointerup=\"(e: any) => emit('seekEnd', Number(e.target.value))\"\r\n @keyup.enter=\"(e: any) => emit('seekCommit', Number(e.target.value))\"\r\n />\r\n <div class=\"ebook-reader__mprogress-percent\">{{ displayedPercent }}%</div>\r\n </div>\r\n </template>\r\n\r\n <template v-if=\"activePanel === 'theme'\">\r\n <button type=\"button\" class=\"ebook-reader__btn\" @click=\"emit('toggleDarkMode', !darkMode)\">\r\n {{ darkMode ? '切换到亮色' : '切换到暗黑' }}\r\n </button>\r\n </template>\r\n\r\n <template v-if=\"activePanel === 'font'\">\r\n <div class=\"ebook-reader__mfont\">\r\n <button type=\"button\" class=\"ebook-reader__btn\" @click=\"emit('changeFontSize', fontSize - 10)\">\r\n A-\r\n </button>\r\n <div class=\"ebook-reader__font\">{{ fontSize }}%</div>\r\n <button type=\"button\" class=\"ebook-reader__btn\" @click=\"emit('changeFontSize', fontSize + 10)\">\r\n A+\r\n </button>\r\n </div>\r\n </template>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n","import { defineComponent, getCurrentInstance, h, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'\r\nimport { createEBookReader } from '../core/reader.js'\r\nimport type { ProgressInfo, SearchOptions, SearchResult, TocItem } from '../core/types.js'\r\nimport { EBookReaderVuePropsDef } from './types.js'\r\nimport type { EBookReaderVueEmits, EBookReaderVueExposed, MobilePanel } from './types.js'\r\nimport DesktopToolbar from './components/DesktopToolbar.vue'\r\nimport DesktopBottomBar from './components/DesktopBottomBar.vue'\r\nimport TocDrawer from './components/TocDrawer.vue'\r\nimport SearchDrawer from './components/SearchDrawer.vue'\r\nimport MobileUI from './components/MobileUI.vue'\r\n\r\nconst MOBILE_MAX_WIDTH = 768\r\nconst WIDE_MIN_WIDTH = 1024\r\n\r\nconst clamp = (n: number, min: number, max: number) => Math.min(max, Math.max(min, n))\r\n\r\nconst mergeClassName = (...parts: Array<string | undefined>) => parts.filter(Boolean).join(' ')\r\n\r\nexport const EBookReaderVue = defineComponent({\r\n name: 'EBookReaderVue',\r\n props: EBookReaderVuePropsDef,\r\n emits: ['ready', 'error', 'progress', 'fontSizeChange', 'darkModeChange', 'update:fontSize', 'update:darkMode'],\r\n setup(props, { emit, expose }) {\r\n const instance = getCurrentInstance()\r\n const isPropProvided = (key: string) => {\r\n const vnodeProps = instance?.vnode.props\r\n if (!vnodeProps) return false\r\n return Object.prototype.hasOwnProperty.call(vnodeProps, key)\r\n }\r\n\r\n const rootEl = ref<HTMLElement | null>(null)\r\n const viewerHost = ref<HTMLElement | null>(null)\r\n const reader = ref<ReturnType<typeof createEBookReader> | null>(null)\r\n\r\n const status = ref<'idle' | 'ready' | 'opening' | 'error'>('idle')\r\n const errorText = ref('')\r\n const toc = ref<TocItem[]>([])\r\n const tocOpen = ref(false)\r\n const searchOpen = ref(false)\r\n\r\n const progressInfo = ref<ProgressInfo | null>(null)\r\n const isSeeking = ref(false)\r\n const seekPercent = ref(0)\r\n\r\n const layout = ref<'mobile' | 'default' | 'wide'>('default')\r\n const mobileBarVisible = ref(false)\r\n const mobilePanel = ref<MobilePanel | null>(null)\r\n\r\n const uncontrolledFontSize = ref(props.defaultFontSize ?? 100)\r\n const uncontrolledDarkMode = ref(Boolean(props.defaultDarkMode))\r\n\r\n const fontSize = () => (props.fontSize ?? uncontrolledFontSize.value)\r\n const darkMode = () => (isPropProvided('darkMode') ? Boolean(props.darkMode) : uncontrolledDarkMode.value)\r\n\r\n const searchQuery = ref('')\r\n const searchOptions = ref<SearchOptions>(props.defaultSearchOptions ?? { matchCase: false, wholeWords: false, matchDiacritics: false })\r\n const searchProgressPercent = ref(0)\r\n const searching = ref(false)\r\n const searchResults = ref<SearchResult[]>([])\r\n\r\n const closeDrawers = () => {\r\n tocOpen.value = false\r\n searchOpen.value = false\r\n }\r\n\r\n const closeMobileSheet = () => {\r\n mobilePanel.value = null\r\n }\r\n\r\n const toggleMobilePanel = (panel: MobilePanel) => {\r\n mobileBarVisible.value = true\r\n mobilePanel.value = mobilePanel.value === panel ? null : panel\r\n }\r\n\r\n const setDarkModeInternal = (next: boolean) => {\r\n if (!isPropProvided('darkMode')) uncontrolledDarkMode.value = next\r\n emit('update:darkMode', next)\r\n emit('darkModeChange', next)\r\n reader.value?.setDarkMode(next)\r\n }\r\n\r\n const setFontSizeInternal = (next: number) => {\r\n const safe = clamp(next, 50, 300)\r\n if (props.fontSize == null) uncontrolledFontSize.value = safe\r\n emit('update:fontSize', safe)\r\n emit('fontSizeChange', safe)\r\n reader.value?.setFontSize(safe)\r\n }\r\n\r\n const openFile = async (nextFile: File) => {\r\n if (!reader.value) return\r\n status.value = 'opening'\r\n errorText.value = ''\r\n toc.value = []\r\n progressInfo.value = null\r\n isSeeking.value = false\r\n seekPercent.value = 0\r\n searchResults.value = []\r\n searchProgressPercent.value = 0\r\n searching.value = false\r\n\r\n try {\r\n await reader.value.open(nextFile)\r\n status.value = 'ready'\r\n } catch (e: any) {\r\n status.value = 'error'\r\n errorText.value = e?.message ? String(e.message) : '打开失败'\r\n emit('error', e)\r\n }\r\n }\r\n\r\n const runSearch = async (query: string) => {\r\n const r = reader.value\r\n const normalized = query.trim()\r\n searchQuery.value = query\r\n searchProgressPercent.value = 0\r\n searching.value = Boolean(normalized)\r\n\r\n if (!r || !normalized) {\r\n r?.clearSearch()\r\n searchResults.value = []\r\n searching.value = false\r\n return\r\n }\r\n\r\n r.cancelSearch()\r\n try {\r\n const results = await r.search(normalized, searchOptions.value)\r\n searchResults.value = results\r\n searchProgressPercent.value = 100\r\n } catch (e) {\r\n emit('error', e)\r\n } finally {\r\n searching.value = false\r\n }\r\n }\r\n\r\n const keydownHandler = (e: KeyboardEvent) => {\r\n if (!props.enableKeyboardNav) return\r\n if (e.key === 'ArrowLeft') reader.value?.prevPage()\r\n if (e.key === 'ArrowRight') reader.value?.nextPage()\r\n if (e.key === 'Escape') closeDrawers()\r\n }\r\n\r\n let gestureStartX = 0\r\n let gestureStartY = 0\r\n let gestureTracking = false\r\n let gestureMoved = false\r\n let gestureActionTaken = false\r\n let gestureStartAt = 0\r\n const boundDocs = new WeakSet<Document>()\r\n\r\n const pointerDownHandler = (e: PointerEvent) => {\r\n if (layout.value !== 'mobile') return\r\n const t = e.target as HTMLElement | null\r\n if (!t) return\r\n if (t.closest('.ebook-reader__mbar') || t.closest('.ebook-reader__msheet')) return\r\n if (t.closest('a,button,input,textarea,select,label,[role=\"button\"],[contenteditable=\"true\"]')) return\r\n gestureTracking = true\r\n gestureMoved = false\r\n gestureActionTaken = false\r\n gestureStartAt = e.timeStamp\r\n gestureStartX = e.screenX\r\n gestureStartY = e.screenY\r\n }\r\n\r\n const pointerMoveHandler = (e: PointerEvent) => {\r\n if (!gestureTracking) return\r\n const dx = e.screenX - gestureStartX\r\n const dy = e.screenY - gestureStartY\r\n\r\n if (Math.abs(dx) > 8 || Math.abs(dy) > 8) gestureMoved = true\r\n if (Math.abs(dy) < 8) return\r\n\r\n if (Math.abs(dy) < Math.abs(dx)) {\r\n if (Math.abs(dx) >= 8) gestureTracking = false\r\n return\r\n }\r\n\r\n if (dy <= -24) {\r\n gestureActionTaken = true\r\n gestureTracking = false\r\n mobileBarVisible.value = true\r\n return\r\n }\r\n if (dy >= 24) {\r\n gestureActionTaken = true\r\n gestureTracking = false\r\n mobileBarVisible.value = false\r\n mobilePanel.value = null\r\n }\r\n }\r\n\r\n const pointerEndHandler = (e: PointerEvent) => {\r\n if (layout.value !== 'mobile') {\r\n gestureTracking = false\r\n return\r\n }\r\n\r\n if (gestureActionTaken) {\r\n gestureTracking = false\r\n gestureMoved = false\r\n gestureActionTaken = false\r\n return\r\n }\r\n\r\n if (!gestureTracking) {\r\n gestureMoved = false\r\n return\r\n }\r\n\r\n const dx = e.screenX - gestureStartX\r\n const dy = e.screenY - gestureStartY\r\n const dt = e.timeStamp - gestureStartAt\r\n const isTap = !gestureMoved && Math.hypot(dx, dy) <= 10 && dt <= 300\r\n\r\n if (isTap) {\r\n const next = !mobileBarVisible.value\r\n mobileBarVisible.value = next\r\n if (!next) mobilePanel.value = null\r\n }\r\n\r\n gestureTracking = false\r\n gestureMoved = false\r\n }\r\n\r\n const bindContentPointerListeners = (doc: Document) => {\r\n if (boundDocs.has(doc)) return\r\n boundDocs.add(doc)\r\n doc.addEventListener('pointerdown', pointerDownHandler)\r\n doc.addEventListener('pointermove', pointerMoveHandler)\r\n doc.addEventListener('pointerup', pointerEndHandler)\r\n doc.addEventListener('pointercancel', pointerEndHandler)\r\n }\r\n\r\n let ro: ResizeObserver | null = null\r\n\r\n onMounted(async () => {\r\n await nextTick()\r\n const host = viewerHost.value\r\n if (!host) return\r\n\r\n try {\r\n reader.value = createEBookReader(host, {\r\n darkMode: darkMode(),\r\n fontSize: fontSize(),\r\n onReady: (h) => emit('ready', h),\r\n onError: (e) => emit('error', e),\r\n onProgress: (info) => {\r\n progressInfo.value = info\r\n emit('progress', info)\r\n },\r\n onToc: (items) => (toc.value = items),\r\n onSearchProgress: (info) => {\r\n if (typeof info.progress === 'number') searchProgressPercent.value = Math.round(info.progress * 100)\r\n },\r\n onContentLoad: (doc) => bindContentPointerListeners(doc),\r\n })\r\n status.value = 'ready'\r\n } catch (e: any) {\r\n status.value = 'error'\r\n errorText.value = e?.message ? String(e.message) : '初始化失败'\r\n emit('error', e)\r\n return\r\n }\r\n\r\n const root = rootEl.value\r\n if (root) {\r\n root.addEventListener('keydown', keydownHandler)\r\n root.addEventListener('pointerdown', pointerDownHandler)\r\n root.addEventListener('pointermove', pointerMoveHandler)\r\n root.addEventListener('pointerup', pointerEndHandler)\r\n root.addEventListener('pointercancel', pointerEndHandler)\r\n }\r\n\r\n if (root) {\r\n ro = new ResizeObserver((entries) => {\r\n const w = entries[0]?.contentRect?.width ?? root.getBoundingClientRect().width\r\n layout.value = w <= MOBILE_MAX_WIDTH ? 'mobile' : w >= WIDE_MIN_WIDTH ? 'wide' : 'default'\r\n })\r\n ro.observe(root)\r\n }\r\n })\r\n\r\n onBeforeUnmount(() => {\r\n const root = rootEl.value\r\n if (root) {\r\n root.removeEventListener('keydown', keydownHandler)\r\n root.removeEventListener('pointerdown', pointerDownHandler)\r\n root.removeEventListener('pointermove', pointerMoveHandler)\r\n root.removeEventListener('pointerup', pointerEndHandler)\r\n root.removeEventListener('pointercancel', pointerEndHandler)\r\n }\r\n ro?.disconnect()\r\n reader.value?.destroy()\r\n reader.value = null\r\n })\r\n\r\n watch(\r\n () => props.file,\r\n (next) => {\r\n if (next) void openFile(next)\r\n },\r\n )\r\n\r\n watch(\r\n () => darkMode(),\r\n (v) => reader.value?.setDarkMode(Boolean(v)),\r\n )\r\n\r\n watch(\r\n () => fontSize(),\r\n (v) => reader.value?.setFontSize(Number(v)),\r\n )\r\n\r\n watch(\r\n () => layout.value,\r\n (v) => {\r\n closeDrawers()\r\n if (v !== 'mobile') {\r\n mobilePanel.value = null\r\n mobileBarVisible.value = false\r\n }\r\n },\r\n )\r\n\r\n expose<EBookReaderVueExposed>({\r\n prevPage: () => reader.value?.prevPage(),\r\n nextPage: () => reader.value?.nextPage(),\r\n prevSection: () => reader.value?.prevSection(),\r\n nextSection: () => reader.value?.nextSection(),\r\n goTo: (t) => reader.value?.goTo(t),\r\n goToFraction: (f) => reader.value?.goToFraction(f),\r\n search: (q, o) => (reader.value ? reader.value.search(q, o) : Promise.resolve([])),\r\n cancelSearch: () => reader.value?.cancelSearch(),\r\n clearSearch: () => reader.value?.clearSearch(),\r\n })\r\n\r\n return () => {\r\n const pct = Math.round((progressInfo.value?.fraction ?? 0) * 100)\r\n const displayed = isSeeking.value ? seekPercent.value : pct\r\n const sectionLabel = progressInfo.value?.tocItem?.label ?? ''\r\n const isMobile = layout.value === 'mobile'\r\n\r\n const viewer = h('div', { class: 'ebook-reader__viewer', ref: viewerHost })\r\n\r\n const children = isMobile\r\n ? [\r\n viewer,\r\n h(MobileUI, {\r\n barVisible: mobileBarVisible.value,\r\n activePanel: mobilePanel.value,\r\n toc: toc.value,\r\n status: status.value,\r\n errorText: errorText.value,\r\n sectionLabel: sectionLabel,\r\n displayedPercent: displayed,\r\n darkMode: darkMode(),\r\n fontSize: fontSize(),\r\n searchQuery: searchQuery.value,\r\n searchOptions: searchOptions.value,\r\n searchProgressPercent: searchProgressPercent.value,\r\n searching: searching.value,\r\n searchResults: searchResults.value,\r\n \r\n onTogglePanel: toggleMobilePanel,\r\n onClosePanel: closeMobileSheet,\r\n onTocSelect: (href: string | undefined) => {\r\n if (href) reader.value?.goTo(href)\r\n },\r\n onSearch: (q: string) => void runSearch(q),\r\n 'onUpdate:searchQuery': (v: string) => (searchQuery.value = v),\r\n 'onUpdate:searchOptions': (v: Partial<SearchOptions>) => (searchOptions.value = { ...searchOptions.value, ...v }),\r\n onCancelSearch: () => reader.value?.cancelSearch(),\r\n onSearchResultSelect: (cfi: string) => {\r\n if (cfi) reader.value?.goTo(cfi)\r\n },\r\n onSeekStart: () => (isSeeking.value = true),\r\n onSeekChange: (v: number) => (seekPercent.value = v),\r\n onSeekEnd: (v: number) => {\r\n isSeeking.value = false\r\n reader.value?.goToFraction(v / 100)\r\n },\r\n onSeekCommit: (v: number) => {\r\n isSeeking.value = false\r\n reader.value?.goToFraction(v / 100)\r\n },\r\n onToggleDarkMode: setDarkModeInternal,\r\n onChangeFontSize: setFontSizeInternal,\r\n }),\r\n ]\r\n : [\r\n viewer,\r\n h(DesktopToolbar, {\r\n darkMode: darkMode(),\r\n fontSize: fontSize(),\r\n onToggleToc: () => (tocOpen.value = true),\r\n onToggleSearch: () => (searchOpen.value = true),\r\n onPrevSection: () => reader.value?.prevSection(),\r\n onPrevPage: () => reader.value?.prevPage(),\r\n onNextPage: () => reader.value?.nextPage(),\r\n onNextSection: () => reader.value?.nextSection(),\r\n onToggleDarkMode: () => setDarkModeInternal(!darkMode()),\r\n onChangeFontSize: setFontSizeInternal,\r\n }),\r\n tocOpen.value || searchOpen.value ? h('div', { class: 'ebook-reader__overlay', onClick: closeDrawers }) : null,\r\n h(TocDrawer, {\r\n isOpen: tocOpen.value,\r\n toc: toc.value,\r\n onClose: () => (tocOpen.value = false),\r\n onSelect: (href: string | undefined) => {\r\n if (href) reader.value?.goTo(href)\r\n },\r\n }),\r\n h(SearchDrawer, {\r\n isOpen: searchOpen.value,\r\n status: status.value,\r\n query: searchQuery.value,\r\n options: searchOptions.value,\r\n progressPercent: searchProgressPercent.value,\r\n searching: searching.value,\r\n results: searchResults.value,\r\n onClose: () => (searchOpen.value = false),\r\n onSearch: (q: string) => void runSearch(q),\r\n 'onUpdate:query': (v: string) => (searchQuery.value = v),\r\n 'onUpdate:options': (v: Partial<SearchOptions>) => (searchOptions.value = { ...searchOptions.value, ...v }),\r\n onCancelSearch: () => reader.value?.cancelSearch(),\r\n onSelectResult: (cfi: string) => {\r\n if (cfi) reader.value?.goTo(cfi)\r\n },\r\n }),\r\n h(DesktopBottomBar, {\r\n status: status.value,\r\n errorText: errorText.value,\r\n sectionLabel: sectionLabel,\r\n displayedPercent: displayed,\r\n onSeekStart: () => (isSeeking.value = true),\r\n onSeekChange: (v: number) => (seekPercent.value = v),\r\n onSeekEnd: (v: number) => {\r\n isSeeking.value = false\r\n reader.value?.goToFraction(v / 100)\r\n },\r\n onSeekCommit: (v: number) => {\r\n isSeeking.value = false\r\n reader.value?.goToFraction(v / 100)\r\n },\r\n }),\r\n ]\r\n\r\n return h(\r\n 'div',\r\n {\r\n ref: rootEl,\r\n class: 'ebook-reader',\r\n 'data-theme': darkMode() ? 'dark' : 'light',\r\n 'data-layout': layout.value,\r\n tabindex: 0,\r\n },\r\n children,\r\n )\r\n }\r\n },\r\n})\r\n"]}