@hyebook/vue3-adapter 2.3.9 → 2.3.10

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.
@@ -8,6 +8,10 @@ export declare class EBookPlayer implements EBookPlayerHandle {
8
8
  private root;
9
9
  private content;
10
10
  private selectionToolbar;
11
+ private loadWarning;
12
+ private loadWarningToggleBtn;
13
+ private loadWarningCloseBtn;
14
+ private loadWarningMessage;
11
15
  private highlightBtn;
12
16
  private toolbarDivider;
13
17
  private noteBtn;
@@ -22,6 +26,8 @@ export declare class EBookPlayer implements EBookPlayerHandle {
22
26
  private readonly preserveSelectionOnToolbarMouseDownBound;
23
27
  private readonly handleHighlightClickBound;
24
28
  private readonly handleNoteClickBound;
29
+ private readonly handleLoadWarningToggleBound;
30
+ private readonly handleLoadWarningCloseBound;
25
31
  constructor(container: HTMLElement, options: EBookPlayerOptions);
26
32
  load(doc?: EbookDoc): Promise<EbookDoc>;
27
33
  destroy(): void;
@@ -39,6 +45,7 @@ export declare class EBookPlayer implements EBookPlayerHandle {
39
45
  updateNote(noteId: string, patch: Partial<Omit<ReaderNote, "id" | "bookId" | "createdAt">>, source?: "api" | "user"): Promise<ReaderNote | null>;
40
46
  deleteNote(noteId: string, source?: "api" | "user"): Promise<boolean>;
41
47
  setBookmark(options?: EBookPlayerSetBookmarkOptions, source?: "api" | "user"): Promise<ReaderBookmark | null>;
48
+ updateBookmark(bookmarkId: string, options?: EBookPlayerSetBookmarkOptions, source?: "api" | "user"): Promise<ReaderBookmark | null>;
42
49
  deleteBookmark(bookmarkId: string, source?: "api" | "user"): Promise<boolean>;
43
50
  goToHighlight(highlightId: string): number | null;
44
51
  goToNote(noteId: string): number | null;
@@ -80,6 +87,10 @@ export declare class EBookPlayer implements EBookPlayerHandle {
80
87
  private getBoundaryOffsetInContainer;
81
88
  private getRangeTextByOffsets;
82
89
  private hideSelectionToolbar;
90
+ private showLoadWarning;
91
+ private hideLoadWarning;
92
+ private toggleLoadWarning;
93
+ private setLoadWarningExpanded;
83
94
  private clearSelection;
84
95
  private handleDocumentPointerDown;
85
96
  private preserveSelectionOnToolbarMouseDown;
@@ -93,9 +104,14 @@ export declare class EBookPlayer implements EBookPlayerHandle {
93
104
  private normalizeBookmarkContent;
94
105
  private resolveCurrentBlockFromScroll;
95
106
  private extractBlockDataset;
107
+ private findBlockNode;
96
108
  private scrollToBlock;
97
109
  private getCurrentScrollTop;
98
110
  private scrollToStoredPosition;
111
+ private scrollToNodeWithTopOffset;
112
+ private focusAfterJump;
113
+ private deferFocus;
114
+ private playFocusAnimation;
99
115
  private resolveScrollHost;
100
116
  private isWindowScrollHost;
101
117
  private escapeSelectorValue;
@@ -1 +1 @@
1
- {"version":3,"file":"ebook-player.d.ts","sourceRoot":"","sources":["../../../../../core/src/player/ebook-player.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ebook-player.d.ts","sourceRoot":"","sources":["../../../../../core/src/player/ebook-player.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,9 @@
1
1
  import { PlayerEngine } from "./engine";
2
2
  const EBOOK_PLAYER_STYLE_ID = "hy-ebook-lite-player-style";
3
- const EBOOK_PLAYER_STYLE_VERSION = "0.2.0";
3
+ const EBOOK_PLAYER_STYLE_VERSION = "0.2.1";
4
+ const JUMP_SCROLL_FOCUS_DELAY_MS = 360;
5
+ const JUMP_FOCUS_ANIMATION_MS = 560;
6
+ const BOOKMARK_JUMP_REVEAL_TOP_OFFSET_PX = 28;
4
7
  const HIGHLIGHT_ICON_SVG = `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M3 22V12.5H6V8.5H18V12.5H21V22H3Z" stroke="#333333" stroke-width="2" stroke-linejoin="round"/><path d="M8.5 8.5V4L15.5 2V8.5" stroke="#333333" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>`;
5
8
  const NOTE_ICON_SVG = `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M15.4998 4.49951L19.4998 8.4995" stroke="#333333" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M3.99977 15.9995L17.9997 2L21.9998 5.9995L7.99975 19.9995L2.99976 20.9995L3.99977 15.9995Z" stroke="#333333" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M4.49976 15.9995L7.99975 19.4995" stroke="#333333" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M6.49976 17.4995L17.4998 6.4995" stroke="#333333" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>`;
6
9
  const BOOKMARK_ICON_SVG = `<svg width="30" height="40" viewBox="0 0 30 40" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M0 3C0 1.34315 1.34315 0 3 0H27C28.6569 0 30 1.34315 30 3V38.1989C30 38.9837 29.1374 39.4627 28.4713 39.0477L15 30.6562L1.52873 39.0477C0.862627 39.4627 0 38.9837 0 38.1989L0 3Z" fill="#4FCEBB"/></svg>`;
@@ -8,6 +11,15 @@ const EBOOK_PLAYER_CSS = `
8
11
  .hyepl-root{position:relative;max-width:100%;margin:0 auto;color:#0f172a;font-size:14px;line-height:1.7}
9
12
  .hyepl-root ::selection{background:#7DE2D3}
10
13
  .hyepl-root ::-moz-selection{background:#7DE2D3}
14
+ .hyepl-load-warning{position:absolute;top:12px;right:12px;z-index:10080;max-width:min(420px,calc(100% - 24px));display:none;border:1px solid #f5c2c7;background:#fff5f5;color:#7f1d1d;border-radius:10px;box-shadow:0 10px 24px rgba(15,23,42,.12);padding:8px 10px}
15
+ .hyepl-load-warning.show{display:block}
16
+ .hyepl-load-warning-header{display:flex;align-items:center;gap:8px}
17
+ .hyepl-load-warning-title{font-size:12px;font-weight:600;line-height:1.4}
18
+ .hyepl-load-warning-actions{margin-left:auto;display:inline-flex;align-items:center;gap:6px}
19
+ .hyepl-load-warning-btn{border:1px solid #f1b3b3;background:#fff;color:#7f1d1d;border-radius:6px;height:24px;padding:0 8px;font-size:12px;line-height:1;cursor:pointer}
20
+ .hyepl-load-warning-close{width:24px;padding:0}
21
+ .hyepl-load-warning-message{margin:8px 0 0;font-size:12px;line-height:1.5;color:#7f1d1d;white-space:pre-wrap;word-break:break-word;display:none;max-height:180px;overflow:auto}
22
+ .hyepl-load-warning.expanded .hyepl-load-warning-message{display:block}
11
23
  .hyepl-content{position:relative}
12
24
  .hyepl-page{margin:0 0 16px}
13
25
  .hyepl-page:last-child{margin-bottom:0}
@@ -48,6 +60,25 @@ const EBOOK_PLAYER_CSS = `
48
60
  .hyepl-toolbar-icon{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px}
49
61
  .hyepl-toolbar-icon svg{display:block;width:24px;height:24px}
50
62
  .hyepl-toolbar-text{font-size:14px;font-weight:700;color:#111827}
63
+
64
+ .hyepl-jump-focus{animation:hyepl-jump-focus 560ms ease-out}
65
+ .hyepl-jump-focus-mark{animation:hyepl-jump-focus-mark 560ms ease-out}
66
+
67
+ @keyframes hyepl-jump-focus{
68
+ 0%{filter:none;box-shadow:0 0 0 0 rgba(125,226,211,0)}
69
+ 35%{filter:brightness(1.08);box-shadow:0 0 0 4px rgba(125,226,211,.24)}
70
+ 100%{filter:none;box-shadow:0 0 0 0 rgba(125,226,211,0)}
71
+ }
72
+
73
+ @keyframes hyepl-jump-focus-mark{
74
+ 0%{opacity:1;filter:none}
75
+ 35%{opacity:.72;filter:brightness(1.2)}
76
+ 100%{opacity:1;filter:none}
77
+ }
78
+
79
+ @media (prefers-reduced-motion:reduce){
80
+ .hyepl-jump-focus,.hyepl-jump-focus-mark{animation:none}
81
+ }
51
82
  `;
52
83
  export class EBookPlayer {
53
84
  constructor(container, options) {
@@ -73,6 +104,12 @@ export class EBookPlayer {
73
104
  this.handleNoteClickBound = () => {
74
105
  void this.handleNoteClick();
75
106
  };
107
+ this.handleLoadWarningToggleBound = () => {
108
+ this.toggleLoadWarning();
109
+ };
110
+ this.handleLoadWarningCloseBound = () => {
111
+ this.hideLoadWarning();
112
+ };
76
113
  this.container = container;
77
114
  this.options = options;
78
115
  const runtimeProvider = createRuntimeProvider(options.provider, () => this.runtimeDocument);
@@ -87,6 +124,31 @@ export class EBookPlayer {
87
124
  this.content.className = "hyepl-content";
88
125
  this.selectionToolbar = document.createElement("div");
89
126
  this.selectionToolbar.className = "hyepl-selection-toolbar";
127
+ this.loadWarning = document.createElement("div");
128
+ this.loadWarning.className = "hyepl-load-warning";
129
+ const loadWarningHeader = document.createElement("div");
130
+ loadWarningHeader.className = "hyepl-load-warning-header";
131
+ const loadWarningTitle = document.createElement("span");
132
+ loadWarningTitle.className = "hyepl-load-warning-title";
133
+ loadWarningTitle.textContent = "加载数据异常";
134
+ const loadWarningActions = document.createElement("div");
135
+ loadWarningActions.className = "hyepl-load-warning-actions";
136
+ this.loadWarningToggleBtn = document.createElement("button");
137
+ this.loadWarningToggleBtn.type = "button";
138
+ this.loadWarningToggleBtn.className = "hyepl-load-warning-btn";
139
+ this.loadWarningCloseBtn = document.createElement("button");
140
+ this.loadWarningCloseBtn.type = "button";
141
+ this.loadWarningCloseBtn.className =
142
+ "hyepl-load-warning-btn hyepl-load-warning-close";
143
+ this.loadWarningCloseBtn.textContent = "×";
144
+ this.loadWarningCloseBtn.title = "关闭";
145
+ this.loadWarningCloseBtn.setAttribute("aria-label", "关闭加载异常提示");
146
+ this.loadWarningMessage = document.createElement("pre");
147
+ this.loadWarningMessage.className = "hyepl-load-warning-message";
148
+ loadWarningActions.append(this.loadWarningToggleBtn, this.loadWarningCloseBtn);
149
+ loadWarningHeader.append(loadWarningTitle, loadWarningActions);
150
+ this.loadWarning.append(loadWarningHeader, this.loadWarningMessage);
151
+ this.setLoadWarningExpanded(false);
90
152
  this.highlightBtn = document.createElement("button");
91
153
  this.highlightBtn.type = "button";
92
154
  this.highlightBtn.className = "hyepl-toolbar-btn";
@@ -101,13 +163,15 @@ export class EBookPlayer {
101
163
  this.setToolbarButtonContent(this.noteBtn, NOTE_ICON_SVG, this.selectionOptions.noteButtonText);
102
164
  this.noteBtn.setAttribute("aria-label", this.selectionOptions.noteButtonText);
103
165
  this.selectionToolbar.append(this.highlightBtn, this.toolbarDivider, this.noteBtn);
104
- this.root.append(this.content, this.selectionToolbar);
166
+ this.root.append(this.content, this.selectionToolbar, this.loadWarning);
105
167
  this.container.innerHTML = "";
106
168
  this.container.append(this.root);
107
169
  this.highlightBtn.addEventListener("mousedown", this.preserveSelectionOnToolbarMouseDownBound);
108
170
  this.noteBtn.addEventListener("mousedown", this.preserveSelectionOnToolbarMouseDownBound);
109
171
  this.highlightBtn.addEventListener("click", this.handleHighlightClickBound);
110
172
  this.noteBtn.addEventListener("click", this.handleNoteClickBound);
173
+ this.loadWarningToggleBtn.addEventListener("click", this.handleLoadWarningToggleBound);
174
+ this.loadWarningCloseBtn.addEventListener("click", this.handleLoadWarningCloseBound);
111
175
  document.addEventListener("selectionchange", this.handleSelectionChangeBound);
112
176
  document.addEventListener("pointerdown", this.handleDocumentPointerDownBound);
113
177
  window.addEventListener("scroll", this.handleSelectionRepositionBound, true);
@@ -117,16 +181,23 @@ export class EBookPlayer {
117
181
  if (doc) {
118
182
  this.runtimeDocument = cloneEbookDoc(doc);
119
183
  }
120
- if (!this.options.provider && !this.runtimeDocument) {
121
- throw new Error("Provider is not configured. Call load(doc) when using EBookPlayer without provider.");
184
+ try {
185
+ if (!this.options.provider && !this.runtimeDocument) {
186
+ throw new Error("Provider is not configured. Call load(doc) when using EBookPlayer without provider.");
187
+ }
188
+ const loadedDoc = await this.engine.load();
189
+ this.loaded = true;
190
+ if (this.options.initialAnnotations) {
191
+ await this.engine.setAnnotations(this.options.initialAnnotations, "api");
192
+ }
193
+ this.renderDocument();
194
+ this.hideLoadWarning();
195
+ return loadedDoc;
122
196
  }
123
- const loadedDoc = await this.engine.load();
124
- this.loaded = true;
125
- if (this.options.initialAnnotations) {
126
- await this.engine.setAnnotations(this.options.initialAnnotations, "api");
197
+ catch (error) {
198
+ this.showLoadWarning(error);
199
+ throw error;
127
200
  }
128
- this.renderDocument();
129
- return loadedDoc;
130
201
  }
131
202
  destroy() {
132
203
  if (this.destroyed) {
@@ -142,6 +213,8 @@ export class EBookPlayer {
142
213
  this.noteBtn.removeEventListener("mousedown", this.preserveSelectionOnToolbarMouseDownBound);
143
214
  this.highlightBtn.removeEventListener("click", this.handleHighlightClickBound);
144
215
  this.noteBtn.removeEventListener("click", this.handleNoteClickBound);
216
+ this.loadWarningToggleBtn.removeEventListener("click", this.handleLoadWarningToggleBound);
217
+ this.loadWarningCloseBtn.removeEventListener("click", this.handleLoadWarningCloseBound);
145
218
  if (this.root.parentNode === this.container) {
146
219
  this.container.removeChild(this.root);
147
220
  }
@@ -236,6 +309,31 @@ export class EBookPlayer {
236
309
  this.renderDocument();
237
310
  return bookmark;
238
311
  }
312
+ async updateBookmark(bookmarkId, options = {}, source = "api") {
313
+ this.ensureLoaded();
314
+ const current = this.engine
315
+ .getBookmarks()
316
+ .find((item) => item.id === bookmarkId);
317
+ if (!current) {
318
+ return null;
319
+ }
320
+ let content = null;
321
+ if (typeof options.content === "string" && options.content.trim()) {
322
+ content = this.normalizeBookmarkContent(options.content);
323
+ }
324
+ else if (options.prompt === false) {
325
+ throw new Error("Bookmark content is required when prompt is disabled.");
326
+ }
327
+ else {
328
+ content = this.promptTextWithLimit("请输入书签内容", current.content || "", this.inputLimits.bookmarkMaxLength);
329
+ }
330
+ if (content === null) {
331
+ return null;
332
+ }
333
+ const updated = await this.engine.updateBookmark(bookmarkId, { content }, source);
334
+ this.renderDocument();
335
+ return updated;
336
+ }
239
337
  async deleteBookmark(bookmarkId, source = "api") {
240
338
  this.ensureLoaded();
241
339
  const deleted = await this.engine.deleteBookmark(bookmarkId, source);
@@ -254,7 +352,13 @@ export class EBookPlayer {
254
352
  if (pageIndex === null) {
255
353
  return null;
256
354
  }
257
- this.scrollToBlock(target.pageId, target.blockId);
355
+ const blockNode = this.scrollToBlock(target.pageId, target.blockId);
356
+ const selector = `mark.hyepl-highlight[data-highlight-id="${this.escapeSelectorValue(highlightId)}"]`;
357
+ this.focusAfterJump({
358
+ selector,
359
+ focusClass: "hyepl-jump-focus-mark",
360
+ fallbackNode: blockNode,
361
+ });
258
362
  return pageIndex;
259
363
  }
260
364
  goToNote(noteId) {
@@ -267,7 +371,13 @@ export class EBookPlayer {
267
371
  if (pageIndex === null) {
268
372
  return null;
269
373
  }
270
- this.scrollToBlock(target.pageId, target.blockId);
374
+ const blockNode = this.scrollToBlock(target.pageId, target.blockId);
375
+ const selector = `mark.hyepl-note[data-note-id="${this.escapeSelectorValue(noteId)}"]`;
376
+ this.focusAfterJump({
377
+ selector,
378
+ focusClass: "hyepl-jump-focus-mark",
379
+ fallbackNode: blockNode,
380
+ });
271
381
  return pageIndex;
272
382
  }
273
383
  goToBookmark(bookmarkId) {
@@ -282,11 +392,30 @@ export class EBookPlayer {
282
392
  if (pageIndex === null) {
283
393
  return null;
284
394
  }
395
+ const bookmarkSelector = `.hyepl-bookmark-flag[data-bookmark-id="${this.escapeSelectorValue(bookmarkId)}"]`;
396
+ const bookmarkNode = this.content.querySelector(bookmarkSelector);
397
+ const fallbackNode = this.findBlockNode(target.pageId, target.blockId);
285
398
  if (Number.isFinite(target.scrollTop)) {
286
- this.scrollToStoredPosition(target.scrollTop);
399
+ this.scrollToStoredPosition(target.scrollTop - BOOKMARK_JUMP_REVEAL_TOP_OFFSET_PX);
400
+ this.focusAfterJump({
401
+ selector: bookmarkSelector,
402
+ fallbackNode,
403
+ });
287
404
  return pageIndex;
288
405
  }
289
- this.scrollToBlock(target.pageId, target.blockId);
406
+ if (bookmarkNode) {
407
+ this.scrollToNodeWithTopOffset(bookmarkNode, BOOKMARK_JUMP_REVEAL_TOP_OFFSET_PX);
408
+ }
409
+ else if (fallbackNode) {
410
+ this.scrollToNodeWithTopOffset(fallbackNode, BOOKMARK_JUMP_REVEAL_TOP_OFFSET_PX);
411
+ }
412
+ else {
413
+ this.scrollToBlock(target.pageId, target.blockId);
414
+ }
415
+ this.focusAfterJump({
416
+ selector: bookmarkSelector,
417
+ fallbackNode,
418
+ });
290
419
  return pageIndex;
291
420
  }
292
421
  onAnnotationCreate(listener) {
@@ -681,6 +810,7 @@ export class EBookPlayer {
681
810
  }
682
811
  const mark = document.createElement("mark");
683
812
  mark.className = "hyepl-highlight";
813
+ mark.dataset.highlightId = item.id;
684
814
  if (item.color) {
685
815
  mark.style.setProperty("--hyepl-highlight-color", item.color);
686
816
  }
@@ -995,6 +1125,22 @@ export class EBookPlayer {
995
1125
  this.selectionToolbar.classList.remove("show");
996
1126
  this.selectionDraft = null;
997
1127
  }
1128
+ showLoadWarning(error) {
1129
+ this.loadWarningMessage.textContent = resolveErrorMessage(error, "未知加载错误");
1130
+ this.loadWarning.classList.add("show");
1131
+ this.setLoadWarningExpanded(false);
1132
+ }
1133
+ hideLoadWarning() {
1134
+ this.loadWarning.classList.remove("show");
1135
+ this.setLoadWarningExpanded(false);
1136
+ }
1137
+ toggleLoadWarning() {
1138
+ this.setLoadWarningExpanded(!this.loadWarning.classList.contains("expanded"));
1139
+ }
1140
+ setLoadWarningExpanded(expanded) {
1141
+ this.loadWarning.classList.toggle("expanded", expanded);
1142
+ this.loadWarningToggleBtn.textContent = expanded ? "收起" : "详情";
1143
+ }
998
1144
  clearSelection() {
999
1145
  window.getSelection()?.removeAllRanges();
1000
1146
  }
@@ -1220,15 +1366,18 @@ export class EBookPlayer {
1220
1366
  }
1221
1367
  return { pageId, blockId };
1222
1368
  }
1223
- scrollToBlock(pageId, blockId) {
1369
+ findBlockNode(pageId, blockId) {
1224
1370
  const page = this.escapeSelectorValue(pageId);
1225
1371
  const block = this.escapeSelectorValue(blockId);
1226
- const node = this.content.querySelector(`[data-page-id="${page}"][data-block-id="${block}"]`);
1372
+ return this.content.querySelector(`[data-page-id="${page}"][data-block-id="${block}"]`);
1373
+ }
1374
+ scrollToBlock(pageId, blockId, behavior = "smooth") {
1375
+ const node = this.findBlockNode(pageId, blockId);
1227
1376
  if (!node) {
1228
- return false;
1377
+ return null;
1229
1378
  }
1230
- node.scrollIntoView({ block: "start" });
1231
- return true;
1379
+ node.scrollIntoView({ block: "start", behavior });
1380
+ return node;
1232
1381
  }
1233
1382
  getCurrentScrollTop() {
1234
1383
  const scrollHost = this.resolveScrollHost();
@@ -1237,14 +1386,59 @@ export class EBookPlayer {
1237
1386
  }
1238
1387
  return Math.max(0, Math.floor(scrollHost.scrollTop || 0));
1239
1388
  }
1240
- scrollToStoredPosition(scrollTop) {
1389
+ scrollToStoredPosition(scrollTop, behavior = "smooth") {
1241
1390
  const safeTop = Math.max(0, Math.floor(scrollTop || 0));
1242
1391
  const scrollHost = this.resolveScrollHost();
1243
1392
  if (this.isWindowScrollHost(scrollHost)) {
1244
- window.scrollTo({ top: safeTop, behavior: "auto" });
1393
+ window.scrollTo({ top: safeTop, behavior });
1245
1394
  return;
1246
1395
  }
1247
- scrollHost.scrollTo({ top: safeTop, behavior: "auto" });
1396
+ scrollHost.scrollTo({ top: safeTop, behavior });
1397
+ }
1398
+ scrollToNodeWithTopOffset(node, topOffset, behavior = "smooth") {
1399
+ const safeOffset = Math.max(0, Math.floor(topOffset || 0));
1400
+ const scrollHost = this.resolveScrollHost();
1401
+ if (this.isWindowScrollHost(scrollHost)) {
1402
+ const absoluteTop = node.getBoundingClientRect().top + window.scrollY;
1403
+ const targetTop = Math.max(0, Math.floor(absoluteTop - safeOffset));
1404
+ window.scrollTo({ top: targetTop, behavior });
1405
+ return;
1406
+ }
1407
+ const hostRect = scrollHost.getBoundingClientRect();
1408
+ const relativeTop = node.getBoundingClientRect().top - hostRect.top + scrollHost.scrollTop;
1409
+ const targetTop = Math.max(0, Math.floor(relativeTop - safeOffset));
1410
+ scrollHost.scrollTo({ top: targetTop, behavior });
1411
+ }
1412
+ focusAfterJump(options) {
1413
+ const { selector, focusClass = "hyepl-jump-focus", fallbackNode = null, } = options;
1414
+ this.deferFocus(() => {
1415
+ const matched = Array.from(this.content.querySelectorAll(selector));
1416
+ if (matched.length) {
1417
+ this.playFocusAnimation(matched, focusClass);
1418
+ return;
1419
+ }
1420
+ if (fallbackNode) {
1421
+ this.playFocusAnimation([fallbackNode], "hyepl-jump-focus");
1422
+ }
1423
+ });
1424
+ }
1425
+ deferFocus(task) {
1426
+ window.setTimeout(task, JUMP_SCROLL_FOCUS_DELAY_MS);
1427
+ }
1428
+ playFocusAnimation(nodes, className = "hyepl-jump-focus") {
1429
+ const seen = new Set();
1430
+ for (const node of nodes) {
1431
+ if (!node || !this.content.contains(node) || seen.has(node)) {
1432
+ continue;
1433
+ }
1434
+ seen.add(node);
1435
+ node.classList.remove(className);
1436
+ void node.offsetWidth;
1437
+ node.classList.add(className);
1438
+ window.setTimeout(() => {
1439
+ node.classList.remove(className);
1440
+ }, JUMP_FOCUS_ANIMATION_MS + 40);
1441
+ }
1248
1442
  }
1249
1443
  resolveScrollHost() {
1250
1444
  let current = this.container;
@@ -1397,3 +1591,12 @@ function escapeHtml(value) {
1397
1591
  function escapeAttribute(value) {
1398
1592
  return escapeHtml(value);
1399
1593
  }
1594
+ function resolveErrorMessage(error, fallback = "未知错误") {
1595
+ if (error instanceof Error && error.message) {
1596
+ return error.message;
1597
+ }
1598
+ if (typeof error === "string" && error.trim()) {
1599
+ return error.trim();
1600
+ }
1601
+ return fallback;
1602
+ }
@@ -1,5 +1,5 @@
1
1
  import type { EbookDoc } from "../types/ebook";
2
- import type { ReaderAnnotationCreateEvent, ReaderAnnotationDeleteEvent, ReaderAnnotations, ReaderAnnotationsChangeEvent, ReaderAnnotationUpdateEvent, ReaderBookmark, ReaderHighlight, PlayerDataProvider, PlayerEngineOptions, PlayerFeatures, ReaderNote, ReaderProgress } from "../types/player";
2
+ import type { ReaderAnnotationCreateEvent, ReaderAnnotationDeleteEvent, ReaderAnnotations, ReaderAnnotationsChangeEvent, ReaderAnnotationUpdateEvent, ReaderBookmark, ReaderBookmarkPatch, ReaderHighlight, PlayerDataProvider, PlayerEngineOptions, PlayerFeatures, ReaderNote, ReaderProgress } from "../types/player";
3
3
  export interface PlayerState {
4
4
  currentPage: number;
5
5
  zoom: number;
@@ -49,6 +49,7 @@ export declare class PlayerEngine {
49
49
  updateNote(noteId: string, patch: Partial<Omit<ReaderNote, "id" | "bookId" | "createdAt">>, source?: "api" | "user"): Promise<ReaderNote | null>;
50
50
  deleteNote(noteId: string, source?: "api" | "user"): Promise<boolean>;
51
51
  setBookmark(pageId: string, blockId: string, content: string, source?: "api" | "user", scrollTop?: number): Promise<ReaderBookmark>;
52
+ updateBookmark(bookmarkId: string, patch: ReaderBookmarkPatch, source?: "api" | "user"): Promise<ReaderBookmark | null>;
52
53
  deleteBookmark(bookmarkId: string, source?: "api" | "user"): Promise<boolean>;
53
54
  onAnnotationCreate(listener: AnnotationCreateListener): () => void;
54
55
  onAnnotationUpdate(listener: AnnotationUpdateListener): () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../../../core/src/player/engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../../../core/src/player/engine.ts"],"names":[],"mappings":"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"}
@@ -308,6 +308,35 @@ export class PlayerEngine {
308
308
  this.emitAnnotationCreate("bookmark", nextBookmark, source);
309
309
  return clone(nextBookmark);
310
310
  }
311
+ async updateBookmark(bookmarkId, patch, source = "api") {
312
+ const index = this.state.bookmarks.findIndex((item) => item.id === bookmarkId);
313
+ if (index < 0) {
314
+ return null;
315
+ }
316
+ const current = this.state.bookmarks[index];
317
+ if (!current) {
318
+ return null;
319
+ }
320
+ const rawContent = patch.content;
321
+ const hasContent = typeof rawContent === "string";
322
+ const nextContent = hasContent ? rawContent.trim() : current.content;
323
+ if (!nextContent) {
324
+ throw new Error("Bookmark content cannot be empty.");
325
+ }
326
+ const nextScrollTop = Number.isFinite(patch.scrollTop)
327
+ ? Math.max(0, Math.floor(patch.scrollTop))
328
+ : current.scrollTop;
329
+ const nextBookmark = {
330
+ ...current,
331
+ ...(hasContent ? { content: nextContent } : {}),
332
+ ...(nextScrollTop !== undefined ? { scrollTop: nextScrollTop } : {}),
333
+ updatedAt: Date.now(),
334
+ };
335
+ this.state.bookmarks[index] = nextBookmark;
336
+ await this.persistAnnotations();
337
+ this.emitAnnotationUpdate("bookmark", current, nextBookmark, source);
338
+ return clone(nextBookmark);
339
+ }
311
340
  async deleteBookmark(bookmarkId, source = "api") {
312
341
  const index = this.state.bookmarks.findIndex((item) => item.id === bookmarkId);
313
342
  if (index < 0) {
@@ -50,6 +50,10 @@ export interface ReaderBookmark {
50
50
  createdAt: number;
51
51
  updatedAt: number;
52
52
  }
53
+ export interface ReaderBookmarkPatch {
54
+ content?: string;
55
+ scrollTop?: number;
56
+ }
53
57
  export interface ReaderAnnotations {
54
58
  highlights: ReaderHighlight[];
55
59
  notes: ReaderNote[];
@@ -143,6 +147,7 @@ export interface EBookPlayerHandle {
143
147
  updateNote: (noteId: string, patch: Partial<Omit<ReaderNote, "id" | "bookId" | "createdAt">>, source?: "api" | "user") => Promise<ReaderNote | null>;
144
148
  deleteNote: (noteId: string, source?: "api" | "user") => Promise<boolean>;
145
149
  setBookmark: (options?: EBookPlayerSetBookmarkOptions, source?: "api" | "user") => Promise<ReaderBookmark | null>;
150
+ updateBookmark: (bookmarkId: string, options?: EBookPlayerSetBookmarkOptions, source?: "api" | "user") => Promise<ReaderBookmark | null>;
146
151
  deleteBookmark: (bookmarkId: string, source?: "api" | "user") => Promise<boolean>;
147
152
  goToHighlight: (highlightId: string) => number | null;
148
153
  goToNote: (noteId: string) => number | null;
@@ -1 +1 @@
1
- {"version":3,"file":"player.d.ts","sourceRoot":"","sources":["../../../../../core/src/types/player.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"player.d.ts","sourceRoot":"","sources":["../../../../../core/src/types/player.ts"],"names":[],"mappings":"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"}
@@ -23,6 +23,8 @@ export interface EditorWorkbenchOptions {
23
23
  export interface EditorWorkbenchFullscreenOptions {
24
24
  exitButtonText?: string;
25
25
  }
26
+ export type EditorWorkbenchExtensionActionPlacement = "header" | "toolbar";
27
+ export type EditorWorkbenchExtensionActionVisibility = "editor" | "fullscreen" | "always";
26
28
  export interface EditorWorkbenchExtensionActionContext {
27
29
  getDocument: () => EbookDoc;
28
30
  isFullscreen: () => boolean;
@@ -36,6 +38,8 @@ export interface EditorWorkbenchExtensionActionButton {
36
38
  color?: string;
37
39
  textColor?: string;
38
40
  borderColor?: string;
41
+ placement?: EditorWorkbenchExtensionActionPlacement;
42
+ visibility?: EditorWorkbenchExtensionActionVisibility;
39
43
  onClick?: (context: EditorWorkbenchExtensionActionContext, event: MouseEvent) => void | Promise<void>;
40
44
  }
41
45
  export interface EditorWorkbenchExtensionOptions {
@@ -1 +1 @@
1
- {"version":3,"file":"editor-workbench.d.ts","sourceRoot":"","sources":["../../../../../core/src/workbench/editor-workbench.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"editor-workbench.d.ts","sourceRoot":"","sources":["../../../../../core/src/workbench/editor-workbench.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { addPageCommand } from "../editor/commands";
2
2
  import { EditorEngine } from "../editor/engine";
3
3
  const WORKBENCH_STYLE_ID = "hy-ebook-workbench-style";
4
- const WORKBENCH_STYLE_VERSION = "0.3.0";
4
+ const WORKBENCH_STYLE_VERSION = "0.3.1";
5
5
  const WORKBENCH_CSS = `
6
6
  .hyewb-root{font-family:"Noto Sans SC","PingFang SC","Microsoft YaHei",sans-serif;color:#0f172a;background:#f8fbff;border:1px solid #d8e0ea;border-radius:12px;padding:12px;display:grid;gap:10px;position:relative;--hyewb-top-shield-height:0px}
7
7
  .hyewb-root::before{content:"";position:absolute;left:0;right:0;top:0;height:var(--hyewb-top-shield-height);background:#f8fbff;z-index:10030;pointer-events:none}
@@ -138,6 +138,15 @@ const WORKBENCH_CSS = `
138
138
  .hyewb-media-handle[data-handle="w"]{left:-6px;top:calc(50% - 5px);cursor:ew-resize}
139
139
  .hyewb-media-list{margin:0;padding-left:18px;color:#334155;font-size:13px;display:grid;gap:4px}
140
140
  .hyewb-status{font-size:12px;color:#475569}
141
+ .hyewb-load-warning{position:absolute;top:12px;right:12px;z-index:10090;max-width:min(420px,calc(100% - 24px));display:none;border:1px solid #f5c2c7;background:#fff5f5;color:#7f1d1d;border-radius:10px;box-shadow:0 10px 24px rgba(15,23,42,.12);padding:8px 10px}
142
+ .hyewb-load-warning.show{display:block}
143
+ .hyewb-load-warning-header{display:flex;align-items:center;gap:8px}
144
+ .hyewb-load-warning-title{font-size:12px;font-weight:600;line-height:1.4}
145
+ .hyewb-load-warning-actions{margin-left:auto;display:inline-flex;align-items:center;gap:6px}
146
+ .hyewb-load-warning-btn{border:1px solid #f1b3b3;background:#fff;color:#7f1d1d;border-radius:6px;height:24px;padding:0 8px;font-size:12px;line-height:1;cursor:pointer}
147
+ .hyewb-load-warning-close{width:24px;padding:0}
148
+ .hyewb-load-warning-message{margin:8px 0 0;font-size:12px;line-height:1.5;color:#7f1d1d;white-space:pre-wrap;word-break:break-word;display:none;max-height:180px;overflow:auto}
149
+ .hyewb-load-warning.expanded .hyewb-load-warning-message{display:block}
141
150
  .hyewb-upload-backdrop{position:fixed;inset:0;display:none;align-items:center;justify-content:center;background:rgba(15,23,42,.45);z-index:10100;padding:16px}
142
151
  .hyewb-upload-backdrop.show{display:flex}
143
152
  .hyewb-upload-dialog{position:relative;width:min(520px,100%);background:#fff;border:1px solid #cbd5e1;border-radius:12px;padding:14px;display:grid;gap:10px;box-shadow:0 16px 34px rgba(15,23,42,.28)}
@@ -332,6 +341,15 @@ function resolvePreviewAnnotationOptions(options) {
332
341
  },
333
342
  };
334
343
  }
344
+ function resolveExtensionActionPlacement(placement) {
345
+ return placement === "toolbar" ? "toolbar" : "header";
346
+ }
347
+ function resolveExtensionActionVisibility(visibility) {
348
+ if (visibility === "always" || visibility === "fullscreen") {
349
+ return visibility;
350
+ }
351
+ return "editor";
352
+ }
335
353
  export function createDefaultWorkbenchDocument() {
336
354
  const now = new Date().toISOString();
337
355
  return {
@@ -369,54 +387,19 @@ export function createDefaultWorkbenchDocument() {
369
387
  {
370
388
  id: "text-1",
371
389
  type: "text",
372
- rect: { x: 80, y: 80, width: 620, height: 240 },
390
+ rect: { x: 80, y: 80, width: 620, height: 120 },
373
391
  zIndex: 1,
374
392
  content: {
375
393
  paragraphs: [
376
394
  {
377
395
  id: "p-1",
378
- type: "h1",
379
- align: "left",
380
- spacingBefore: 12,
381
- spacingAfter: 12,
382
- runs: [
383
- {
384
- text: "欢迎使用业务系统编辑器",
385
- marks: { bold: true, fontSize: 30 },
386
- },
387
- ],
388
- },
389
- {
390
- id: "p-2",
391
396
  type: "p",
392
397
  align: "left",
393
- lineHeight: 1.6,
394
- spacingBefore: 12,
395
- spacingAfter: 12,
396
- indent: 2,
397
- inlineElements: [
398
- {
399
- id: "inline-image-1",
400
- type: "image",
401
- src: "https://picsum.photos/id/1025/1200/800",
402
- alt: "Classroom",
403
- width: 320,
404
- },
405
- ],
398
+ spacingBefore: 0,
399
+ spacingAfter: 0,
406
400
  runs: [
407
- {
408
- text: "该页面默认包含样式和基础编辑能力。你可以在初始化阶段通过 features 开关关闭不需要的模块。\n",
409
- },
410
401
  {
411
402
  text: "",
412
- inlineRef: "inline-image-1",
413
- },
414
- {
415
- text: "\n图片后依然可以继续输入文字。",
416
- marks: {
417
- color: "#0f766e",
418
- backgroundColor: "#ecfeff",
419
- },
420
403
  },
421
404
  ],
422
405
  },
@@ -430,8 +413,16 @@ export function createDefaultWorkbenchDocument() {
430
413
  }
431
414
  export function mountEditorWorkbench(container, options = {}) {
432
415
  ensureWorkbenchStyles();
433
- const initialDoc = clone(options.initialDoc ?? createDefaultWorkbenchDocument());
434
- const editor = new EditorEngine(initialDoc);
416
+ let initialLoadErrorMessage = null;
417
+ let editor;
418
+ try {
419
+ const initialDoc = clone(options.initialDoc ?? createDefaultWorkbenchDocument());
420
+ editor = new EditorEngine(initialDoc);
421
+ }
422
+ catch (error) {
423
+ initialLoadErrorMessage = resolveErrorMessage(error, "initialDoc 校验失败");
424
+ editor = new EditorEngine(clone(createDefaultWorkbenchDocument()));
425
+ }
435
426
  const state = {
436
427
  mode: "editor",
437
428
  pageIndex: 0,
@@ -443,13 +434,19 @@ export function mountEditorWorkbench(container, options = {}) {
443
434
  const root = document.createElement("section");
444
435
  root.className = "hyewb-root";
445
436
  const extensionActionConfigs = Array.isArray(options.extension?.actions)
446
- ? options.extension.actions.filter((action) => {
437
+ ? options.extension.actions
438
+ .filter((action) => {
447
439
  return (!!action &&
448
440
  typeof action.id === "string" &&
449
441
  action.id.trim().length > 0 &&
450
442
  typeof action.text === "string" &&
451
443
  action.text.trim().length > 0);
452
444
  })
445
+ .map((action) => ({
446
+ ...action,
447
+ placement: resolveExtensionActionPlacement(action.placement),
448
+ visibility: resolveExtensionActionVisibility(action.visibility),
449
+ }))
453
450
  : [];
454
451
  const header = document.createElement("header");
455
452
  header.className = "hyewb-header hyewb-top-control";
@@ -459,32 +456,6 @@ export function mountEditorWorkbench(container, options = {}) {
459
456
  const headerActions = document.createElement("div");
460
457
  headerActions.className = "hyewb-header-actions";
461
458
  const fullscreenBtn = createButton("fullscreen");
462
- const extensionActionButtons = extensionActionConfigs.map((action) => {
463
- const button = document.createElement("button");
464
- button.type = "button";
465
- button.className = "hyewb-btn hyewb-btn-text hyewb-header-action-btn";
466
- const text = action.text.trim();
467
- button.textContent = text;
468
- button.title = text;
469
- button.setAttribute("aria-label", text);
470
- button.style.display = "none";
471
- const color = typeof action.color === "string" ? action.color.trim() : "";
472
- if (color) {
473
- button.style.backgroundColor = color;
474
- button.style.borderColor = color;
475
- }
476
- const textColor = typeof action.textColor === "string" ? action.textColor.trim() : "";
477
- if (textColor) {
478
- button.style.color = textColor;
479
- }
480
- const borderColor = typeof action.borderColor === "string" ? action.borderColor.trim() : "";
481
- if (borderColor) {
482
- button.style.borderColor = borderColor;
483
- }
484
- headerActions.append(button);
485
- return { action, button };
486
- });
487
- headerActions.append(fullscreenBtn);
488
459
  header.append(title, headerActions);
489
460
  const toolbar = document.createElement("div");
490
461
  toolbar.className = "hyewb-row hyewb-top-control";
@@ -607,6 +578,40 @@ export function mountEditorWorkbench(container, options = {}) {
607
578
  const tableAddBtn = createButton("insertTable");
608
579
  const importDocxBtn = createButton("importDocx");
609
580
  toolbar.append(boldBtn, italicBtn, underlineBtn, strikeBtn, superscriptBtn, subscriptBtn, headingSelect, fontSizeSelect, fontFamilySelect, textColorInput, bgColorInput, alignGroup, lineHeightField, spacingField, indentField, tableAddBtn, importDocxBtn, videoAddBtn, imageUploadBtn);
581
+ const extensionActionButtons = extensionActionConfigs.map((action) => {
582
+ const button = document.createElement("button");
583
+ button.type = "button";
584
+ button.className = "hyewb-btn hyewb-btn-text";
585
+ if (action.placement === "header") {
586
+ button.classList.add("hyewb-header-action-btn");
587
+ }
588
+ const text = action.text.trim();
589
+ button.textContent = text;
590
+ button.title = text;
591
+ button.setAttribute("aria-label", text);
592
+ button.style.display = "none";
593
+ const color = typeof action.color === "string" ? action.color.trim() : "";
594
+ if (color) {
595
+ button.style.backgroundColor = color;
596
+ button.style.borderColor = color;
597
+ }
598
+ const textColor = typeof action.textColor === "string" ? action.textColor.trim() : "";
599
+ if (textColor) {
600
+ button.style.color = textColor;
601
+ }
602
+ const borderColor = typeof action.borderColor === "string" ? action.borderColor.trim() : "";
603
+ if (borderColor) {
604
+ button.style.borderColor = borderColor;
605
+ }
606
+ if (action.placement === "toolbar") {
607
+ toolbar.append(button);
608
+ }
609
+ else {
610
+ headerActions.append(button);
611
+ }
612
+ return { action, button };
613
+ });
614
+ headerActions.append(fullscreenBtn);
610
615
  const tablePicker = document.createElement("div");
611
616
  tablePicker.className = "hyewb-table-picker";
612
617
  const tablePickerHint = document.createElement("div");
@@ -883,6 +888,51 @@ export function mountEditorWorkbench(container, options = {}) {
883
888
  const status = document.createElement("p");
884
889
  status.className = "hyewb-status";
885
890
  status.textContent = "已加载默认编辑器能力";
891
+ const loadWarning = document.createElement("div");
892
+ loadWarning.className = "hyewb-load-warning";
893
+ const loadWarningHeader = document.createElement("div");
894
+ loadWarningHeader.className = "hyewb-load-warning-header";
895
+ const loadWarningTitle = document.createElement("span");
896
+ loadWarningTitle.className = "hyewb-load-warning-title";
897
+ loadWarningTitle.textContent = "加载数据异常";
898
+ const loadWarningActions = document.createElement("div");
899
+ loadWarningActions.className = "hyewb-load-warning-actions";
900
+ const loadWarningToggleBtn = document.createElement("button");
901
+ loadWarningToggleBtn.type = "button";
902
+ loadWarningToggleBtn.className = "hyewb-load-warning-btn";
903
+ const loadWarningCloseBtn = document.createElement("button");
904
+ loadWarningCloseBtn.type = "button";
905
+ loadWarningCloseBtn.className = "hyewb-load-warning-btn hyewb-load-warning-close";
906
+ loadWarningCloseBtn.textContent = "×";
907
+ loadWarningCloseBtn.title = "关闭";
908
+ loadWarningCloseBtn.setAttribute("aria-label", "关闭加载异常提示");
909
+ const loadWarningMessage = document.createElement("pre");
910
+ loadWarningMessage.className = "hyewb-load-warning-message";
911
+ const setLoadWarningExpanded = (expanded) => {
912
+ loadWarning.classList.toggle("expanded", expanded);
913
+ loadWarningToggleBtn.textContent = expanded ? "收起" : "详情";
914
+ };
915
+ const hideLoadWarning = () => {
916
+ loadWarning.classList.remove("show");
917
+ setLoadWarningExpanded(false);
918
+ };
919
+ const showLoadWarning = (message) => {
920
+ loadWarningMessage.textContent = message;
921
+ loadWarning.classList.add("show");
922
+ setLoadWarningExpanded(false);
923
+ };
924
+ const handleLoadWarningToggle = () => {
925
+ setLoadWarningExpanded(!loadWarning.classList.contains("expanded"));
926
+ };
927
+ const handleLoadWarningClose = () => {
928
+ hideLoadWarning();
929
+ };
930
+ setLoadWarningExpanded(false);
931
+ loadWarningToggleBtn.addEventListener("click", handleLoadWarningToggle);
932
+ loadWarningCloseBtn.addEventListener("click", handleLoadWarningClose);
933
+ loadWarningActions.append(loadWarningToggleBtn, loadWarningCloseBtn);
934
+ loadWarningHeader.append(loadWarningTitle, loadWarningActions);
935
+ loadWarning.append(loadWarningHeader, loadWarningMessage);
886
936
  const debugConfig = typeof options.debug === "object" && options.debug !== null
887
937
  ? options.debug
888
938
  : undefined;
@@ -1002,10 +1052,14 @@ export function mountEditorWorkbench(container, options = {}) {
1002
1052
  const colorGrid = document.createElement("div");
1003
1053
  colorGrid.className = "hyewb-color-grid";
1004
1054
  colorPalette.append(colorGrid);
1005
- root.append(header, toolbar, pageRow, previewLayout, colorPalette, tablePicker, tableTools, tableRowDeleteBtn, tableMoveHandle, tableScaleHandle, tableColEdgeLayer, tableRowEdgeLayer, tableRowGapInsertBtn, tableColGapInsertBtn, tableDropIndicator, tableContextMenu, uploadBackdrop, previewNoteBackdrop, docxInput, previewSelectionToolbar);
1055
+ root.append(header, toolbar, pageRow, previewLayout, colorPalette, tablePicker, tableTools, tableRowDeleteBtn, tableMoveHandle, tableScaleHandle, tableColEdgeLayer, tableRowEdgeLayer, tableRowGapInsertBtn, tableColGapInsertBtn, tableDropIndicator, tableContextMenu, uploadBackdrop, previewNoteBackdrop, docxInput, previewSelectionToolbar, loadWarning);
1006
1056
  container.innerHTML = "";
1007
1057
  root.append(floatingToolbar);
1008
1058
  container.append(root);
1059
+ if (initialLoadErrorMessage) {
1060
+ status.textContent = `加载数据异常:${initialLoadErrorMessage}`;
1061
+ showLoadWarning(initialLoadErrorMessage);
1062
+ }
1009
1063
  renderWorkbenchIcons();
1010
1064
  let editorRenderKey = "";
1011
1065
  let lastSelection = null;
@@ -1082,8 +1136,24 @@ export function mountEditorWorkbench(container, options = {}) {
1082
1136
  fullscreenBtn.title = ariaLabel;
1083
1137
  fullscreenBtn.setAttribute("aria-label", ariaLabel);
1084
1138
  fullscreenBtn.style.display = isFullscreen ? "inline-flex" : "none";
1085
- extensionActionButtons.forEach(({ button }) => {
1086
- button.style.display = isFullscreen ? "inline-flex" : "none";
1139
+ };
1140
+ const shouldShowExtensionAction = (action) => {
1141
+ const isFullscreen = isWorkbenchFullscreen();
1142
+ const isEditorMode = state.mode === "editor";
1143
+ const visibleByRule = action.visibility === "always"
1144
+ ? true
1145
+ : action.visibility === "fullscreen"
1146
+ ? isFullscreen
1147
+ : isEditorMode;
1148
+ const visibleByPlacement = action.placement === "toolbar"
1149
+ ? isEditorMode && state.features.textToolbar
1150
+ : true;
1151
+ return visibleByRule && visibleByPlacement;
1152
+ };
1153
+ const updateExtensionActionButtonsVisibility = () => {
1154
+ extensionActionButtons.forEach(({ action, button }) => {
1155
+ button.style.display =
1156
+ shouldShowExtensionAction(action) ? "inline-flex" : "none";
1087
1157
  });
1088
1158
  };
1089
1159
  const updateShellViewportHeight = () => {
@@ -1123,6 +1193,7 @@ export function mountEditorWorkbench(container, options = {}) {
1123
1193
  };
1124
1194
  const syncWorkbenchLayoutAfterFullscreenChange = () => {
1125
1195
  updateFullscreenButtonState();
1196
+ updateExtensionActionButtonsVisibility();
1126
1197
  updateShellViewportHeight();
1127
1198
  updateTopControlShieldHeight();
1128
1199
  updateInlineResizeOverlay();
@@ -3437,6 +3508,14 @@ export function mountEditorWorkbench(container, options = {}) {
3437
3508
  });
3438
3509
  return container.innerHTML;
3439
3510
  };
3511
+ const normalizePastedRichHtml = (html) => {
3512
+ const stripped = stripMediaTagsFromHtml(html);
3513
+ if (!stripped.trim()) {
3514
+ return "";
3515
+ }
3516
+ const flowBlocks = parseRichHTMLToFlowBlocks(stripped);
3517
+ return flowBlocksToHTML(flowBlocks);
3518
+ };
3440
3519
  const createPasteAnchor = () => {
3441
3520
  editorArea.focus();
3442
3521
  if (!restoreSelectionRange()) {
@@ -3809,8 +3888,15 @@ export function mountEditorWorkbench(container, options = {}) {
3809
3888
  previewArea.classList.toggle("show", state.mode === "preview");
3810
3889
  editorArea.style.display = state.mode === "editor" ? "block" : "none";
3811
3890
  const showEditorControls = state.mode === "editor";
3891
+ const hasVisibleHeaderExtensionAction = extensionActionButtons.some(({ action }) => {
3892
+ return action.placement === "header" && shouldShowExtensionAction(action);
3893
+ });
3812
3894
  header.style.display =
3813
- showEditorControls || isWorkbenchFullscreen() ? "flex" : "none";
3895
+ showEditorControls ||
3896
+ isWorkbenchFullscreen() ||
3897
+ hasVisibleHeaderExtensionAction
3898
+ ? "flex"
3899
+ : "none";
3814
3900
  toolbar.style.display =
3815
3901
  showEditorControls && state.features.textToolbar ? "flex" : "none";
3816
3902
  pageRow.style.display = "none";
@@ -3829,6 +3915,7 @@ export function mountEditorWorkbench(container, options = {}) {
3829
3915
  hideTablePicker();
3830
3916
  hideTableTools();
3831
3917
  }
3918
+ updateExtensionActionButtonsVisibility();
3832
3919
  updateTopControlShieldHeight();
3833
3920
  prevPageBtn.disabled = state.pageIndex <= 0;
3834
3921
  nextPageBtn.disabled = state.pageIndex >= state.doc.pages.length - 1;
@@ -4054,6 +4141,9 @@ export function mountEditorWorkbench(container, options = {}) {
4054
4141
  tableWidthInput,
4055
4142
  tableHeightInput,
4056
4143
  tableRowHeightInput,
4144
+ ...extensionActionButtons
4145
+ .filter(({ action }) => action.placement === "toolbar")
4146
+ .map(({ button }) => button),
4057
4147
  ].forEach((control) => {
4058
4148
  control.addEventListener("mousedown", preserveSelectionForInputControl);
4059
4149
  control.addEventListener("focus", preserveSelectionForInputControl);
@@ -4215,6 +4305,25 @@ export function mountEditorWorkbench(container, options = {}) {
4215
4305
  if (!clipboard) {
4216
4306
  return;
4217
4307
  }
4308
+ const htmlContent = clipboard.getData("text/html");
4309
+ const plainContent = clipboard.getData("text/plain");
4310
+ const normalizedRichHtml = normalizePastedRichHtml(htmlContent);
4311
+ if (normalizedRichHtml.trim()) {
4312
+ event.preventDefault();
4313
+ cacheSelectionRange();
4314
+ const pasteAnchorId = createPasteAnchor();
4315
+ if (!pasteAnchorId) {
4316
+ status.textContent = "粘贴失败:无法定位插入位置";
4317
+ return;
4318
+ }
4319
+ insertHtmlBeforePasteAnchor(pasteAnchorId, normalizedRichHtml);
4320
+ removePasteAnchor(pasteAnchorId);
4321
+ syncEditorToDoc();
4322
+ status.textContent = "已粘贴富文本内容";
4323
+ updateInlineResizeOverlay();
4324
+ syncToolbarState();
4325
+ return;
4326
+ }
4218
4327
  const mediaFiles = Array.from(clipboard.items)
4219
4328
  .map((item) => item.getAsFile())
4220
4329
  .filter((file) => {
@@ -4226,8 +4335,6 @@ export function mountEditorWorkbench(container, options = {}) {
4226
4335
  }
4227
4336
  event.preventDefault();
4228
4337
  cacheSelectionRange();
4229
- const htmlContent = clipboard.getData("text/html");
4230
- const plainContent = clipboard.getData("text/plain");
4231
4338
  const pasteAnchorId = createPasteAnchor();
4232
4339
  if (!pasteAnchorId) {
4233
4340
  status.textContent = "粘贴失败:无法定位插入位置";
@@ -5030,6 +5137,8 @@ export function mountEditorWorkbench(container, options = {}) {
5030
5137
  closeWorkbenchFullscreen();
5031
5138
  hideTablePicker();
5032
5139
  hideTableTools();
5140
+ loadWarningToggleBtn.removeEventListener("click", handleLoadWarningToggle);
5141
+ loadWarningCloseBtn.removeEventListener("click", handleLoadWarningClose);
5033
5142
  document.removeEventListener("selectionchange", handleSelectionChange);
5034
5143
  document.removeEventListener("pointermove", onMediaPointerMove);
5035
5144
  document.removeEventListener("pointerup", onMediaPointerUp);
@@ -5202,35 +5311,108 @@ function parseRichHTMLToFlowBlocks(html, defaultTextStyle) {
5202
5311
  return [createDefaultTextFlowBlock()];
5203
5312
  }
5204
5313
  const nodes = Array.from(root.childNodes).filter((node) => {
5205
- if (node.nodeType !== Node.TEXT_NODE) {
5206
- return true;
5314
+ if (node.nodeType === Node.TEXT_NODE) {
5315
+ return (node.nodeValue || "").trim().length > 0;
5316
+ }
5317
+ if (node.nodeType !== Node.ELEMENT_NODE) {
5318
+ return false;
5207
5319
  }
5208
- return (node.nodeValue || "").trim().length > 0;
5320
+ return !isIgnorableImportedElementTag(node.tagName);
5209
5321
  });
5210
5322
  if (!nodes.length) {
5211
5323
  return [createDefaultTextFlowBlock()];
5212
5324
  }
5213
5325
  const result = [];
5214
- nodes.forEach((node, index) => {
5326
+ let flowIndex = 0;
5327
+ const pushParagraphIfMeaningful = (paragraph) => {
5328
+ if (!hasMeaningfulParagraphContent(paragraph)) {
5329
+ return;
5330
+ }
5331
+ result.push(createTextFlowBlock(paragraph, flowIndex));
5332
+ flowIndex += 1;
5333
+ };
5334
+ const pushNode = (node) => {
5215
5335
  if (node.nodeType === Node.TEXT_NODE) {
5336
+ const text = node.nodeValue || "";
5337
+ if (!text.trim()) {
5338
+ return;
5339
+ }
5216
5340
  const paragraph = {
5217
- id: `p-${Date.now()}-${index}`,
5341
+ id: `p-${Date.now()}-${flowIndex}`,
5218
5342
  type: "p",
5219
5343
  align: "left",
5220
- runs: applyImportedDefaultTextStyle([{ text: node.nodeValue || "" }], defaultTextStyle),
5344
+ runs: applyImportedDefaultTextStyle([{ text }], defaultTextStyle),
5221
5345
  };
5222
- result.push(createTextFlowBlock(paragraph, index));
5346
+ pushParagraphIfMeaningful(paragraph);
5347
+ return;
5348
+ }
5349
+ if (node.nodeType !== Node.ELEMENT_NODE) {
5223
5350
  return;
5224
5351
  }
5225
5352
  const element = node;
5226
5353
  if (element.tagName === "TABLE") {
5227
- result.push(parseTableElement(element, index));
5354
+ result.push(parseTableElement(element, flowIndex));
5355
+ flowIndex += 1;
5356
+ return;
5357
+ }
5358
+ const hasNestedTable = Boolean(element.querySelector("table"));
5359
+ if (!hasNestedTable) {
5360
+ pushParagraphIfMeaningful(parseElementToParagraph(element, flowIndex, defaultTextStyle));
5228
5361
  return;
5229
5362
  }
5230
- result.push(createTextFlowBlock(parseElementToParagraph(element, index, defaultTextStyle), index));
5363
+ let textContainer = element.cloneNode(false);
5364
+ const flushTextContainer = () => {
5365
+ if (!hasMeaningfulElementContent(textContainer)) {
5366
+ textContainer = element.cloneNode(false);
5367
+ return;
5368
+ }
5369
+ const paragraph = parseElementToParagraph(textContainer, flowIndex, defaultTextStyle);
5370
+ pushParagraphIfMeaningful(paragraph);
5371
+ textContainer = element.cloneNode(false);
5372
+ };
5373
+ Array.from(element.childNodes).forEach((child) => {
5374
+ if (child.nodeType === Node.ELEMENT_NODE) {
5375
+ const childElement = child;
5376
+ if (childElement.tagName === "TABLE") {
5377
+ flushTextContainer();
5378
+ result.push(parseTableElement(childElement, flowIndex));
5379
+ flowIndex += 1;
5380
+ return;
5381
+ }
5382
+ if (childElement.querySelector("table")) {
5383
+ flushTextContainer();
5384
+ pushNode(childElement);
5385
+ return;
5386
+ }
5387
+ }
5388
+ textContainer.append(child.cloneNode(true));
5389
+ });
5390
+ flushTextContainer();
5391
+ };
5392
+ nodes.forEach((node) => {
5393
+ pushNode(node);
5231
5394
  });
5232
5395
  return result.length ? result : [createDefaultTextFlowBlock()];
5233
5396
  }
5397
+ function hasMeaningfulElementContent(element) {
5398
+ const text = (element.textContent || "").replace(/\u00a0/g, " ").trim();
5399
+ if (text.length > 0) {
5400
+ return true;
5401
+ }
5402
+ return Boolean(element.querySelector("img,video,br"));
5403
+ }
5404
+ function hasMeaningfulParagraphContent(paragraph) {
5405
+ if (Array.isArray(paragraph.inlineElements) && paragraph.inlineElements.length) {
5406
+ return true;
5407
+ }
5408
+ const runs = Array.isArray(paragraph.runs) ? paragraph.runs : [];
5409
+ return runs.some((run) => {
5410
+ if (run.inlineRef) {
5411
+ return true;
5412
+ }
5413
+ return (run.text || "").replace(/\u00a0/g, " ").trim().length > 0;
5414
+ });
5415
+ }
5234
5416
  function parseElementToParagraph(element, index, defaultTextStyle) {
5235
5417
  const parsedLineHeight = parseLineHeight(element.style.lineHeight);
5236
5418
  const parsedBefore = parsePx(element.style.marginTop);
@@ -5463,6 +5645,9 @@ function extractRuns(node, inheritedMarks, inlineElements) {
5463
5645
  return [];
5464
5646
  }
5465
5647
  const element = node;
5648
+ if (isIgnorableImportedElementTag(element.tagName)) {
5649
+ return [];
5650
+ }
5466
5651
  if (element.tagName === "BR") {
5467
5652
  const marks = cleanupMarks(inheritedMarks);
5468
5653
  return [marks ? { text: "\n", marks } : { text: "\n" }];
@@ -7055,6 +7240,26 @@ function normalizeStyleAttribute(styleValue) {
7055
7240
  .filter((segment) => segment.length > 0)
7056
7241
  .join(";");
7057
7242
  }
7243
+ function isIgnorableImportedElementTag(tagName) {
7244
+ const normalized = String(tagName || "")
7245
+ .trim()
7246
+ .toUpperCase();
7247
+ if (!normalized) {
7248
+ return false;
7249
+ }
7250
+ if (normalized === "SCRIPT" ||
7251
+ normalized === "STYLE" ||
7252
+ normalized === "META" ||
7253
+ normalized === "LINK" ||
7254
+ normalized === "TITLE" ||
7255
+ normalized === "HEAD" ||
7256
+ normalized === "BASE" ||
7257
+ normalized === "XML" ||
7258
+ normalized === "O:P") {
7259
+ return true;
7260
+ }
7261
+ return normalized.startsWith("W:");
7262
+ }
7058
7263
  function normalizeStoredTableCellHTML(html) {
7059
7264
  const source = String(html || "").trim();
7060
7265
  if (!source) {
@@ -7066,7 +7271,20 @@ function normalizeStoredTableCellHTML(html) {
7066
7271
  if (!root) {
7067
7272
  return "";
7068
7273
  }
7069
- root.querySelectorAll("script,style").forEach((node) => node.remove());
7274
+ const allElements = Array.from(root.querySelectorAll("*"));
7275
+ allElements.forEach((node) => {
7276
+ if (isIgnorableImportedElementTag(node.tagName)) {
7277
+ node.remove();
7278
+ }
7279
+ });
7280
+ const commentWalker = doc.createTreeWalker(root, NodeFilter.SHOW_COMMENT);
7281
+ const comments = [];
7282
+ while (commentWalker.nextNode()) {
7283
+ comments.push(commentWalker.currentNode);
7284
+ }
7285
+ comments.forEach((commentNode) => {
7286
+ commentNode.remove();
7287
+ });
7070
7288
  root.querySelectorAll("*").forEach((node) => {
7071
7289
  Array.from(node.attributes).forEach((attr) => {
7072
7290
  if (attr.name.toLowerCase().startsWith("on")) {
@@ -7658,3 +7876,12 @@ function isRecord(value) {
7658
7876
  function clone(value) {
7659
7877
  return JSON.parse(JSON.stringify(value));
7660
7878
  }
7879
+ function resolveErrorMessage(error, fallback = "未知错误") {
7880
+ if (error instanceof Error && error.message) {
7881
+ return error.message;
7882
+ }
7883
+ if (typeof error === "string" && error.trim()) {
7884
+ return error.trim();
7885
+ }
7886
+ return fallback;
7887
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hyebook/vue3-adapter",
3
- "version": "2.3.9",
3
+ "version": "2.3.10",
4
4
  "description": "Vue3 adapter for hy-ebook core",
5
5
  "repository": {
6
6
  "type": "git",