@embedpdf-editor/vue3-chapter-viewer 0.3.2 → 0.3.4

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
@@ -104,18 +104,28 @@ const options: ChapterViewerOptions = {
104
104
  </style>
105
105
  ```
106
106
 
107
- ## `ChapterViewerOptions`
108
-
109
- `options` 是三端渲染器的统一配置入口。
107
+ ## 配置总览
110
108
 
111
- | 字段 | 说明 |
109
+ | 层级 | 说明 |
112
110
  | --- | --- |
113
- | `manifest` | 章节清单,描述每章 PDF 和全局页码关系 |
114
- | `notes` | 附注加载、创建、更新、删除回调 |
115
- | `bookmarks` | 段落书签加载、持久化、删除确认回调 |
116
- | `chapterPdfLoader` | 可选:全局 PDF 预处理/拉取(见下文) |
117
- | `overlapStrategy` | 可选:同一全局页多章节重叠时,用先/后出现的章节 PDF 渲染 |
118
- | `features` | 可选:功能开关与样式配置,省略时使用默认能力 |
111
+ | `ChapterViewerOptions` | `ChapterPdfViewer` `options`:**manifest**、**notes**、**bookmarks**、**features** |
112
+ | `ChapterViewerConfig` | `options.features`:划线样式、图标、缩放、选区工具栏 |
113
+ | `ChapterPdfViewer` props | `class-name`、`build-selection-menu`、`@extra-selection-action` |
114
+
115
+ 省略 `features` 时默认全部开启。字段说明与 [React README](../react-chapter-viewer/README.md) 一致,下文为 Vue 3 用法示例。
116
+
117
+ ---
118
+
119
+ ## `ChapterViewerOptions`
120
+
121
+ | 字段 | 必填 | 说明 |
122
+ | --- | --- | --- |
123
+ | `manifest` | 是 | `ChapterManifest` |
124
+ | `notes` | 是 | `NoteCallbacks`(须 `onCreateNote` 或 `onRequestCreateNote`) |
125
+ | `bookmarks` | 是 | `ParagraphBookmarkCallbacks`(删除须 `onRequestRemove` 返回 `true`) |
126
+ | `chapterPdfLoader` | 否 | 全局 `IChapterPdfLoader` |
127
+ | `overlapStrategy` | 否 | 默认 `{ kind: 'first-wins' }` |
128
+ | `features` | 否 | 见 [`features` 配置](#features-配置) |
119
129
 
120
130
  ### Manifest
121
131
 
@@ -136,6 +146,20 @@ type ChapterManifest = {
136
146
 
137
147
  `globalPageRange` 和 `localPageRange` 都是闭区间,且页数必须一致。`chapterId` 同时作为内部 `documentId`,需要在整本书内唯一。
138
148
 
149
+ | 字段 | 说明 |
150
+ | --- | --- |
151
+ | `chapterId` / `title` | 唯一 ID 与标题 |
152
+ | `globalPageRange` / `localPageRange` | 全局与 PDF 内闭区间,页数须一致 |
153
+ | `source` | `url` \| `buffer` \| `load()`,见下文 |
154
+ | `encrypted` | 可选标记;密码流见 [加密 PDF](#加密-pdf-与-passwordprovider) |
155
+ | `ownedGlobalPages` | `overlapStrategy: explicit` 时使用 |
156
+
157
+ ### `notes` / `bookmarks` 回调
158
+
159
+ **`NoteCallbacks`:** `loadNotes`、`onCreateNote` \| `onRequestCreateNote`(二选一)、`onRequestEditNote`、`onUpdateNote`、`onDeleteNote`。
160
+
161
+ **`ParagraphBookmarkCallbacks`:** `load`、`persist`、`onRequestRemove`(返回 `true` 才删除)、`onRemoveSuccess`。
162
+
139
163
  ### 嵌套目录树与重叠页
140
164
 
141
165
  侧栏目录支持**任意层级**(`ChapterTreePanel` + `ChapterTreeNode.children`)。引擎滚动用的 `manifest.chapters` 是**扁平列表**:父节点页范围可包含子节点,相邻/重叠全局页由 **owner 策略** 决定只渲染一个章节的 PDF,避免同页画两遍。
@@ -227,6 +251,49 @@ const options: ChapterViewerOptions = {
227
251
  };
228
252
  ```
229
253
 
254
+ ### 加密 PDF 与 `passwordProvider`
255
+
256
+ ```ts
257
+ import { CallbackPasswordProvider } from '@embedpdf-editor/vue3-chapter-viewer';
258
+
259
+ // 在 createPdfChapterEditor / 自定义 bundle 中传入
260
+ const passwordProvider = new CallbackPasswordProvider(async (chapter, attempt) =>
261
+ askPassword(chapter.chapterId, attempt),
262
+ );
263
+ ```
264
+
265
+ ---
266
+
267
+ ## `features` 配置
268
+
269
+ `ChapterViewerConfig`:每项可 `true` | `false` | 对象。
270
+
271
+ | 模块 | 主要字段 |
272
+ | --- | --- |
273
+ | `markup` | `enabled`、`styles`(`color`/`thickness`/`offsetY`/`opacity`)、`annotationMenu`(`enabled`、`renderMenu`) |
274
+ | `bookmarks` | `enabled`、`marker`(`renderIcon`、`iconSize`)、`hover`(`renderAddIcon`、`iconSize`) |
275
+ | `notes` | `enabled`、`marker`(`renderIcon`、`renderMenuActions`、`iconSize`、`highlightColor`) |
276
+ | `zoom` | `enabled`(默认 true)、`min` 0.5、`max` 3、`initial` 1、`pageWidth` |
277
+ | `selectionToolbar` | `enabled`、`hiddenBuiltinActions`、`extraActions` |
278
+
279
+ 默认划线 `offsetY`:`squiggly` 为 **4**。内置工具条按钮:`highlight` | `underline` | `squiggly` | `strikeout` | `note`。
280
+
281
+ ---
282
+
283
+ ## `ChapterPdfViewer` 组件
284
+
285
+ | Prop / 事件 | 说明 |
286
+ | --- | --- |
287
+ | `engine` / `options` | 必填引擎与配置 |
288
+ | `class-name` / `viewport-class-name` | 布局 |
289
+ | `build-selection-menu` | 包装划词菜单 |
290
+ | `@extra-selection-action` | 扩展工具条 |
291
+ | `#default` 子节点 | 视口内插槽 |
292
+
293
+ `PdfChapterViewport`:`annotation-selection-menu`(宿主优先于默认划线删除)、`features` 等。
294
+
295
+ ---
296
+
230
297
  ## Worker 与 WASM
231
298
 
232
299
  `usePdfiumEngine()` 默认使用 `@embedpdf/engines` 内置的 PDFium CDN wasm 地址,并默认启用 worker:
@@ -243,6 +310,83 @@ usePdfiumEngine({ wasmUrl: '/assets/pdfium.wasm', worker: true });
243
310
 
244
311
  使用 `worker: true` 时,部署环境需要允许 worker 加载 wasm。若只在 worker 模式失败,可先用 `worker: false` 定位资源或响应头问题。
245
312
 
313
+ ## `features` 配置示例
314
+
315
+ 完整字段表见 [React README 的 `features` 配置](../react-chapter-viewer/README.md#features-配置)。
316
+
317
+ ### 划线颜色、粗细与位置
318
+
319
+ ```ts
320
+ features: {
321
+ markup: {
322
+ styles: {
323
+ highlight: { color: '#fef08a', opacity: 0.45 },
324
+ underline: { color: '#dc2626', thickness: 1.5, offsetY: 2.5 },
325
+ squiggly: { color: '#dc2626', thickness: 1.5, offsetY: 4 },
326
+ strikeout: { color: '#64748b', offsetY: 0 },
327
+ },
328
+ },
329
+ },
330
+ ```
331
+
332
+ `offsetY` 为 PDF 点、正值向下;波浪线默认 `4`,减轻盖住字形。`markup: false` 关闭划线。
333
+
334
+ ### 点击已有划线:删除
335
+
336
+ 选中高亮/下划线/波浪线/删除线后,默认在标注下方显示「删除」。可自定义:
337
+
338
+ ```ts
339
+ import { h } from 'vue';
340
+
341
+ features: {
342
+ markup: {
343
+ annotationMenu: {
344
+ renderMenu: ({ onDelete }) =>
345
+ h('button', { type: 'button', onClick: onDelete }, '移除'),
346
+ },
347
+ },
348
+ },
349
+ ```
350
+
351
+ `PdfChapterViewport` 上传 `annotation-selection-menu` 时宿主优先,未渲染时再回退默认删除菜单。
352
+
353
+ ### 笔记、书签图标
354
+
355
+ ```ts
356
+ import { h } from 'vue';
357
+
358
+ features: {
359
+ notes: {
360
+ marker: {
361
+ renderIcon: () => h('img', { src: '/icons/note.svg', width: 20, height: 20 }),
362
+ iconSize: 22,
363
+ renderMenuActions: ({ onEdit, onDelete }) =>
364
+ h('div', [
365
+ h('button', { onClick: onEdit }, '编辑'),
366
+ h('button', { onClick: onDelete }, '删除'),
367
+ ]),
368
+ },
369
+ },
370
+ bookmarks: {
371
+ marker: { renderIcon: () => h('img', { src: '/icons/bookmark.svg' }) },
372
+ hover: { renderAddIcon: () => h('span', '+') },
373
+ },
374
+ },
375
+ ```
376
+
377
+ ### 选区工具栏
378
+
379
+ ```ts
380
+ features: {
381
+ selectionToolbar: {
382
+ hiddenBuiltinActions: ['strikeout'],
383
+ extraActions: [{ id: 'cite', label: '引用', order: 10 }],
384
+ },
385
+ },
386
+ ```
387
+
388
+ 配合 `ChapterPdfViewer` 的 `@extra-selection-action` 或 `build-selection-menu`。
389
+
246
390
  ## 进阶组合
247
391
 
248
392
  内置 `ChapterPdfViewer` 已完成插件注册和章节视口渲染。需要插入自定义 shell、目录、工具栏或直接访问 registry 时,可以使用低层组合:
@@ -271,19 +415,24 @@ const { plugins, features } = createChapterViewerBundle(options);
271
415
 
272
416
  ## 标注导入导出
273
417
 
274
- 包内直接导出章节标注 IO:
275
-
276
418
  ```ts
277
419
  import {
420
+ exportChapterAnnotations,
278
421
  exportAllChapterAnnotations,
279
422
  importChapterAnnotationsArchive,
280
- chapterAnnotationsArchiveToJson,
281
- parseChapterAnnotationsArchiveJson,
423
+ CHAPTER_ANNOTATIONS_ARCHIVE_VERSION,
282
424
  useRegistry,
283
425
  } from '@embedpdf-editor/vue3-chapter-viewer';
284
426
  ```
285
427
 
286
- 导出格式包含 `bookmarks`、`notes`、`markup`,版本常量为 `CHAPTER_ANNOTATIONS_ARCHIVE_VERSION`。导入时可选择 `mode: 'replace' | 'merge'`,并可传 `persistNotes` / `persistBookmarks` 把导入结果写回业务存储。
428
+ | 选项 | 说明 |
429
+ | --- | --- |
430
+ | `mode` | `replace` \| `merge` |
431
+ | `bookmarks` / `notes` / `markup` | 导入导出子集,默认 true |
432
+ | `ensureChapterLoaded` | 默认 true |
433
+ | `persistNotes` / `persistBookmarks` | 导入后写回存储 |
434
+
435
+ 详见 [React README 标注章节](../react-chapter-viewer/README.md#标注导入导出)。
287
436
 
288
437
  ## 常见问题
289
438