@embedpdf-editor/chapter-snippet 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
@@ -1,6 +1,8 @@
1
1
  # @embedpdf-editor/chapter-snippet
2
2
 
3
- 框架无关的章节 PDF 阅读器运行时。它把 Preact 阅读器封装成 Web Component,适合 Vue 2、传统页面、微前端或任何不想引入 React/Vue3 渲染器的宿主。
3
+ 框架无关的章节 PDF 阅读器运行时。它把 Preact 阅读器封装成 Web Component
4
+
5
+ **Vue 2 请使用本包**(`@embedpdf-editor/chapter-snippet`),不要用已移除的 `@embedpdf-editor/vue2-chapter-viewer`。宿主为 Vue 2 / 传统页面 / 微前端,或任何不想引入 React/Vue3 渲染器的场景。
4
6
 
5
7
  能力与 React/Vue3 渲染器保持一致:多章连续滚动、划线/高亮、附注、段落书签、章节目录和标注导入导出。
6
8
 
@@ -114,6 +116,62 @@ viewer?.addEventListener(CHAPTER_SNIPPET_EVENTS.ready, (event) => {
114
116
 
115
117
  旧版本的 `editorInput` 仍可使用,但新代码应改为 `options`。`options.features` 会参与合并,顶层 `features` 仅作为兼容覆盖保留。
116
118
 
119
+ ### `ChapterViewerOptions`(与 React / Vue3 一致)
120
+
121
+ | 字段 | 说明 |
122
+ | --- | --- |
123
+ | `manifest` | 章节目录,见 [React README Manifest](../react-chapter-viewer/README.md#manifest) |
124
+ | `notes` | `NoteCallbacks`,见 [React README](../react-chapter-viewer/README.md#notes附注回调) |
125
+ | `bookmarks` | `ParagraphBookmarkCallbacks`,见 [React README](../react-chapter-viewer/README.md#bookmarks段落书签回调) |
126
+ | `chapterPdfLoader` / `overlapStrategy` | 自定义 PDF 加载与重叠页策略 |
127
+ | `features` | 功能开关与 UI 定制,见下 |
128
+
129
+ 加密 PDF 可在底层 `createPdfChapterEditor` 选项中设置 `passwordProvider`(如 `CallbackPasswordProvider` from `@embedpdf-editor/chapter-core`)。
130
+
131
+ ### `features` 配置
132
+
133
+ 与 React / Vue3 **同一套** `ChapterViewerConfig`(`@embedpdf-editor/chapter-viewer`)。完整字段表见 [React README:`features` 配置](../react-chapter-viewer/README.md#features-配置)。
134
+
135
+ | 模块 | 要点 |
136
+ | --- | --- |
137
+ | `markup` | `styles` 四类划线;`annotationMenu` 默认选中后在下方显示「删除」;`squiggly.offsetY` 默认 **4** |
138
+ | `bookmarks` | `marker` / `hover` 自定义图标 |
139
+ | `notes` | `marker.renderIcon`、`renderMenuActions`、`highlightColor` |
140
+ | `zoom` | `pageWidth`、`min` / `max` / `enabled` |
141
+ | `selectionToolbar` | `hiddenBuiltinActions`、`extraActions`;扩展动作监听 `selectionExtraAction` 事件 |
142
+
143
+ ```js
144
+ features: {
145
+ markup: {
146
+ styles: {
147
+ highlight: { color: '#fef08a', opacity: 0.45 },
148
+ underline: { color: '#dc2626', thickness: 1.5, offsetY: 2.5 },
149
+ squiggly: { color: '#dc2626', thickness: 1.5, offsetY: 4 },
150
+ },
151
+ annotationMenu: {
152
+ enabled: true,
153
+ renderMenu: ({ onDelete }) => {
154
+ const btn = document.createElement('button');
155
+ btn.textContent = '移除';
156
+ btn.onclick = onDelete;
157
+ return btn;
158
+ },
159
+ },
160
+ },
161
+ notes: {
162
+ marker: {
163
+ renderIcon: () => /* DOM */,
164
+ renderMenuActions: ({ onEdit, onDelete }) => /* DOM */,
165
+ },
166
+ },
167
+ selectionToolbar: {
168
+ extraActions: [{ id: 'cite', label: '引用', order: 10 }],
169
+ },
170
+ },
171
+ ```
172
+
173
+ `renderMenu` / `renderIcon` 在 snippet(Preact)内执行,请返回 **DOM 或 Preact 节点**;Vue 2 宿主不要用 `h()` 直接塞进 Shadow DOM。
174
+
117
175
  ## 事件
118
176
 
119
177
  snippet 通过 DOM `CustomEvent` 把需要宿主 UI 参与的动作抛出来。
@@ -169,6 +227,24 @@ import {
169
227
 
170
228
  在 snippet 中可通过 `chapter-viewer-ready` 事件拿到 `registry`,再调用这些 API。导出格式包含 `bookmarks`、`notes`、`markup`,版本常量为 `CHAPTER_ANNOTATIONS_ARCHIVE_VERSION`。
171
229
 
230
+ | 选项 | 说明 |
231
+ | --- | --- |
232
+ | `mode` | `replace` 清空后导入;`merge` 合并 |
233
+ | `ensureChapterLoaded` | 默认 true,导入 markup 前打开 PDF |
234
+ | `bookmarks` / `notes` / `markup` | 默认 true,可关闭某一类 |
235
+ | `persistNotes` / `persistBookmarks` | 导入后写回业务存储 |
236
+
237
+ 示例见 `examples/chapter-viewer-demo-vue2/src/components/AnnotationsDemoBar.vue`。
238
+
239
+ ## 与 React / Vue3 渲染器的区别
240
+
241
+ | 项 | React / Vue3 | chapter-snippet(本包,含 Vue 2) |
242
+ | --- | --- | --- |
243
+ | 运行时 | 框架内 `editor-engine` 组件 | Shadow DOM Web Component + Preact |
244
+ | 初始化 | `<ChapterPdfViewer options={...} />` | `ChapterEmbedPDF.init({ type: 'container', target, options })` |
245
+ | Registry | hook / ref | `chapter-viewer-ready` → `detail.registry` |
246
+ | Vite | `chapterViewerViteResolve()` | `chapterSnippetViteResolve()` |
247
+
172
248
  ## 常见问题
173
249
 
174
250
  | 现象 | 处理 |
@@ -320,6 +320,7 @@ export { ChapterViewerCatalog }
320
320
  export declare type ChapterViewerConfig = {
321
321
  markup?: boolean | {
322
322
  styles?: MarkupStylesConfig;
323
+ annotationMenu?: MarkupAnnotationMenuConfig;
323
324
  };
324
325
  bookmarks?: boolean | {
325
326
  marker?: BookmarkMarkerUiConfig;
@@ -341,6 +342,7 @@ export declare interface ChapterViewerFeaturesConfig {
341
342
  markup?: {
342
343
  enabled?: boolean;
343
344
  styles?: MarkupStylesConfig;
345
+ annotationMenu?: MarkupAnnotationMenuConfig;
344
346
  };
345
347
  /** 段落书签(含悬停添加) */
346
348
  bookmarks?: {
@@ -596,6 +598,20 @@ declare interface IPasswordProvider {
596
598
  getCachedPassword?(chapterId: string): string | null;
597
599
  }
598
600
 
601
+ declare interface MarkupAnnotationMenuActionCtx {
602
+ pageIndex: number;
603
+ annotationId: string;
604
+ onDelete: () => void;
605
+ }
606
+
607
+ /** 点击已创建的划线标注时,选区菜单(删除等) */
608
+ declare interface MarkupAnnotationMenuConfig {
609
+ /** 是否显示默认删除按钮,默认 true */
610
+ enabled?: boolean;
611
+ /** 完全自定义菜单;不提供则显示默认「删除」按钮 */
612
+ renderMenu?: (ctx: MarkupAnnotationMenuActionCtx) => unknown;
613
+ }
614
+
599
615
  /** 单种划线的样式(颜色、粗细、垂直偏移,PDF 点) */
600
616
  declare interface MarkupKindStyle {
601
617
  /** 描边/填充色,如 #facc15 */