@somecat/epub-reader 0.1.0 → 0.1.3

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.
package/README.md CHANGED
@@ -1,28 +1,29 @@
1
- # @somecat/ebook-reader
1
+ # @somecat/epub-reader
2
2
 
3
3
  轻量 EBookReader:基于 `foliate-js` 的 `foliate-view`,提供 React 18+ / Vue 3 组件(不依赖 Ant Design / UnoCSS),并内置基础 UI(目录、搜索、翻页、字号、明暗主题、阅读进度)。
4
4
 
5
5
  ## 安装
6
6
 
7
7
  ```bash
8
- pnpm add @somecat/ebook-reader
8
+ pnpm add @somecat/epub-reader
9
9
  ```
10
10
 
11
11
  同时在你的应用入口引入样式:
12
12
 
13
13
  ```ts
14
- import '@somecat/ebook-reader/style.css'
14
+ import '@somecat/epub-reader/style.css'
15
15
  ```
16
16
 
17
17
  ## React 18+
18
18
 
19
19
  ```tsx
20
- import { useMemo, useState } from 'react'
21
- import { EBookReader } from '@somecat/ebook-reader/react'
22
- import '@somecat/ebook-reader/style.css'
20
+ import { useMemo, useRef, useState } from 'react'
21
+ import { EBookReader } from '@somecat/epub-reader/react'
22
+ import '@somecat/epub-reader/style.css'
23
23
 
24
24
  export default function Demo() {
25
25
  const [file, setFile] = useState<File | null>(null)
26
+ const ref = useRef(null)
26
27
 
27
28
  return (
28
29
  <div style={{ height: '100vh' }}>
@@ -32,22 +33,55 @@ export default function Demo() {
32
33
  onChange={(e) => setFile(e.target.files?.[0] ?? null)}
33
34
  />
34
35
  <div style={{ height: 'calc(100vh - 40px)' }}>
35
- <EBookReader file={file} />
36
+ <EBookReader ref={ref} file={file} />
36
37
  </div>
37
38
  </div>
38
39
  )
39
40
  }
40
41
  ```
41
42
 
43
+ ### Props
44
+
45
+ > `file` 与 `fileUrl` 同时传入时,优先使用 `file`。
46
+
47
+ | 参数 | 类型 | 默认值 | 说明 |
48
+ | --- | --- | --- | --- |
49
+ | file | `File \| null` | - | 直接传入本地文件(`.epub`) |
50
+ | fileUrl | `string \| null` | - | 传入 URL,组件内部下载并打开(需服务端允许跨域) |
51
+ | className | `string` | - | 根容器额外类名 |
52
+ | style | `React.CSSProperties` | - | 根容器行内样式 |
53
+ | defaultFontSize | `number` | `100` | 非受控字号初始值(百分比) |
54
+ | fontSize | `number` | - | 受控字号(百分比) |
55
+ | onFontSizeChange | `(fontSize: number) => void` | - | 字号变化回调(受控/非受控都会触发) |
56
+ | defaultDarkMode | `boolean` | `false` | 非受控暗黑模式初始值 |
57
+ | darkMode | `boolean` | - | 受控暗黑模式 |
58
+ | onDarkModeChange | `(darkMode: boolean) => void` | - | 明暗变化回调(受控/非受控都会触发) |
59
+ | enableKeyboardNav | `boolean` | `true` | 是否启用键盘左右键翻页、ESC 关闭抽屉 |
60
+ | defaultSearchOptions | `SearchOptions` | `{ matchCase:false, wholeWords:false, matchDiacritics:false }` | 搜索默认选项 |
61
+ | onReady | `(handle: EBookReaderHandle) => void` | - | Core 就绪回调(可拿到完整 handle) |
62
+ | onError | `(error: unknown) => void` | - | 错误回调(初始化/打开/搜索等) |
63
+ | onProgress | `(info: ProgressInfo) => void` | - | 阅读进度回调 |
64
+
65
+ ### Ref(命令式 API)
66
+
67
+ `ref` 暴露的方法:
68
+
69
+ - `prevPage()` / `nextPage()`
70
+ - `prevSection()` / `nextSection()`
71
+ - `goTo(target: string)`
72
+ - `goToFraction(fraction: number)`(`0 ~ 1`)
73
+ - `search(query: string, options?: SearchOptions): Promise<SearchResult[]>`
74
+ - `cancelSearch()` / `clearSearch()`
75
+
42
76
  ## Vue 3
43
77
 
44
78
  ```ts
45
- import '@somecat/ebook-reader/style.css'
79
+ import '@somecat/epub-reader/style.css'
46
80
  ```
47
81
 
48
82
  ```ts
49
83
  import { defineComponent, ref } from 'vue'
50
- import { EBookReaderVue } from '@somecat/ebook-reader/vue'
84
+ import { EBookReaderVue } from '@somecat/epub-reader/vue'
51
85
 
52
86
  export default defineComponent({
53
87
  setup() {
@@ -68,7 +102,58 @@ export default defineComponent({
68
102
  })
69
103
  ```
70
104
 
105
+ ### Props
106
+
107
+ > `file` 与 `fileUrl` 同时传入时,优先使用 `file`。
108
+
109
+ | 参数 | 类型 | 默认值 | 说明 |
110
+ | --- | --- | --- | --- |
111
+ | file | `File \| null` | - | 直接传入本地文件(`.epub`) |
112
+ | fileUrl | `string \| null` | - | 传入 URL,组件内部下载并打开(需服务端允许跨域) |
113
+ | defaultFontSize | `number` | `100` | 非受控字号初始值(百分比) |
114
+ | fontSize | `number` | - | 受控字号(百分比) |
115
+ | defaultDarkMode | `boolean` | `false` | 非受控暗黑模式初始值 |
116
+ | darkMode | `boolean` | - | 受控暗黑模式 |
117
+ | enableKeyboardNav | `boolean` | `true` | 是否启用键盘左右键翻页、ESC 关闭抽屉 |
118
+ | defaultSearchOptions | `SearchOptions` | `{ matchCase:false, wholeWords:false, matchDiacritics:false }` | 搜索默认选项 |
119
+
120
+ ### Emits / v-model
121
+
122
+ - `ready(handle)` / `error(error)` / `progress(info)`
123
+ - `fontSizeChange(fontSize)` / `darkModeChange(darkMode)`
124
+ - `update:fontSize(fontSize)` / `update:darkMode(darkMode)`(用于 `v-model:fontSize`、`v-model:darkMode`)
125
+
126
+ ### Expose(命令式 API)
127
+
128
+ 组件实例暴露的方法同 React ref:
129
+
130
+ - `prevPage()` / `nextPage()`
131
+ - `prevSection()` / `nextSection()`
132
+ - `goTo(target: string)`
133
+ - `goToFraction(fraction: number)`(`0 ~ 1`)
134
+ - `search(query: string, options?: SearchOptions): Promise<SearchResult[]>`
135
+ - `cancelSearch()` / `clearSearch()`
136
+
137
+ ## 类型说明
138
+
139
+ ### SearchOptions
140
+
141
+ | 字段 | 类型 | 默认值 | 说明 |
142
+ | --- | --- | --- | --- |
143
+ | matchCase | `boolean` | `false` | 匹配大小写 |
144
+ | wholeWords | `boolean` | `false` | 全词匹配 |
145
+ | matchDiacritics | `boolean` | `false` | 匹配变音符号 |
146
+
147
+ ### ProgressInfo
148
+
149
+ | 字段 | 类型 | 说明 |
150
+ | --- | --- | --- |
151
+ | fraction | `number \| undefined` | 进度(`0 ~ 1`) |
152
+ | tocItem | `TocItem \| null \| undefined` | 当前章节信息 |
153
+ | location | `unknown` | 底层定位信息(透传) |
154
+
71
155
  ## 注意事项
72
156
 
73
157
  - 外层容器必须有明确高度(组件内部会使用 `height: calc(100% - 40px)` 给阅读区留出底部进度条)。
74
158
  - 键盘左右方向键翻页:需要组件获得焦点(点击组件区域或 Tab 聚焦)。
159
+ - 使用 `fileUrl` 时,资源需要允许浏览器跨域访问(CORS),否则下载会失败。