@yuwenovo/ocr-result-view 2.1.1 → 2.2.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.
package/README.md CHANGED
@@ -4,6 +4,8 @@ Vue 3 OCR 文档比对结果查看器。传入两份文档的页面图片和差
4
4
 
5
5
  组件负责展示与交互;OCR 识别、文档比对、接口请求和审阅保存由接入项目负责。默认只读,无需 Vue Router、Pinia、Axios 或 Tailwind。
6
6
 
7
+ 预览区提供默认关闭的“同步滚动”开关。开启时以最近滚动的一侧为基准(初始为标准文档),按可滚动距离的百分比同步另一侧;滚动任意一侧或使用分页按钮均可联动。两份文档页数不同时仍按整体进度同步,不表示内容逐段对应。点击差异仍分别定位两侧的实际标注,关闭开关后恢复独立滚动。
8
+
7
9
  ## 1. 安装
8
10
 
9
11
  在 Vue 3.5+ 项目中安装:
@@ -1,2 +1,2 @@
1
- [data-v-7344a999],[data-v-7344a999]:before,[data-v-7344a999]:after{box-sizing:border-box}button[data-v-7344a999]{font:inherit;color:inherit;background:0 0;border:0;padding:0}h2[data-v-7344a999],h3[data-v-7344a999],p[data-v-7344a999]{margin:0}svg[data-v-7344a999]{vertical-align:middle;display:inline-block}.diff-cards[data-v-7344a999]{flex-direction:column;gap:10px;display:flex}.diff-card[data-v-7344a999]{--change-color:var(--diff-modify-dot,#f80);border:1px solid var(--viewer-border,#ffffff17);background:var(--diff-card-bg,#ffffff09);border-radius:12px;flex-shrink:0;min-width:0;padding:10px 12px;transition:border-color .15s,box-shadow .15s}.diff-card--insert[data-v-7344a999]{--change-color:var(--diff-insert-dot,#00a870)}.diff-card--delete[data-v-7344a999]{--change-color:var(--diff-delete-dot,#e34d59)}.diff-card[data-v-7344a999]:hover{border-color:color-mix(in srgb, var(--viewer-card-text,#cbd5e1) 30%, transparent)}.diff-card.is-active[data-v-7344a999]{border-color:var(--diff-active-border,#38bdf899);box-shadow:0 0 0 2px color-mix(in srgb, var(--diff-active-border,#38bdf899) 10%, transparent)}.diff-card.is-ignored[data-v-7344a999]{--change-color:var(--ui-text-subtle,#64748b)}.card-heading[data-v-7344a999]{align-items:center;gap:6px;display:flex}.card-select[data-v-7344a999]{text-align:left;cursor:pointer;flex:1;align-items:center;gap:8px;min-width:0;display:flex}.type-icon[data-v-7344a999]{width:24px;height:24px;color:var(--change-color);background:color-mix(in srgb, var(--change-color) 10%, transparent);border-radius:7px;flex-shrink:0;place-items:center;display:grid}.type-icon svg[data-v-7344a999],.card-action svg[data-v-7344a999]{width:14px;height:14px}.card-type[data-v-7344a999]{color:var(--viewer-card-title,#e2e8f0);font-size:12px;font-weight:600}.card-number[data-v-7344a999]{color:var(--ui-text-subtle,#64748b);font-variant-numeric:tabular-nums;font-size:10px}.card-action[data-v-7344a999]{width:28px;height:28px;color:var(--ui-text-subtle,#64748b);cursor:pointer;border-radius:7px;flex-shrink:0;place-items:center;display:grid}.card-action[data-v-7344a999]:hover{color:var(--viewer-card-title,#e2e8f0);background:var(--viewer-card,#ffffff09)}.card-action[data-v-7344a999]:disabled{opacity:.35;cursor:wait}.card-action[data-v-7344a999]:focus-visible,.card-select[data-v-7344a999]:focus-visible{outline:2px solid var(--diff-active-border,#38bdf899);outline-offset:3px;border-radius:6px}.ignored-label[data-v-7344a999]{color:var(--ui-text-subtle,#64748b);white-space:nowrap;font-size:10px}.card-content[data-v-7344a999]{cursor:pointer}.text-row[data-v-7344a999]{background:var(--viewer-card,#ffffff09);border-radius:7px;align-items:flex-start;gap:10px;margin-top:8px;padding:8px 10px;display:flex}.text-row--single[data-v-7344a999]{background:color-mix(in srgb, var(--change-color) 6%, transparent)}.text-label[data-v-7344a999]{color:var(--ui-text-subtle,#64748b);flex-shrink:0;padding-top:1px;font-size:10px;line-height:20px}.card-text[data-v-7344a999]{min-width:0;color:var(--viewer-card-text,#cbd5e1);overflow-wrap:anywhere;white-space:pre-wrap;font-size:13px;line-height:1.65}.change-mark[data-v-7344a999]{background:color-mix(in srgb, var(--change-color) 16%, transparent);border-radius:2px;font-weight:600}.card-location[data-v-7344a999]{color:var(--ui-text-subtle,#64748b);margin:8px 0 0;font-size:10px;line-height:14px}[data-v-c1f84581],[data-v-c1f84581]:before,[data-v-c1f84581]:after{box-sizing:border-box}button[data-v-c1f84581]{font:inherit;color:inherit;background:0 0;border:0;padding:0}h2[data-v-c1f84581],h3[data-v-c1f84581],p[data-v-c1f84581]{margin:0}svg[data-v-c1f84581]{vertical-align:middle;display:inline-block}.ocr-result-view[data-v-c1f84581]{flex-direction:column;height:100%;min-height:0;display:flex}.page-btn svg[data-v-c1f84581]{width:14px;height:14px}.ocr-diff-viewer[data-v-c1f84581]{min-height:0;color:var(--viewer-card-text,#cbd5e1);background:var(--viewer-bg,#0b1220);flex:1;font-family:Segoe UI,Microsoft YaHei,system-ui,sans-serif;display:flex}.viewer-main[data-v-c1f84581]{flex-direction:column;flex:1;min-width:0;display:flex}.compare-row[data-v-c1f84581]{background:var(--viewer-workspace,#080f1c);box-sizing:border-box;flex:1;gap:12px;min-height:0;padding:12px;display:flex;position:relative}.canvas-col[data-v-c1f84581]{border:1px solid var(--viewer-border,#ffffff17);background:var(--viewer-panel,#111827);border-radius:10px;flex-direction:column;flex:1;min-width:0;display:flex;overflow:hidden}.canvas-info-bar[data-v-c1f84581]{height:45px;color:var(--viewer-card-title,#e2e8f0);background:var(--viewer-toolbar,#111a2b);border-bottom:1px solid var(--viewer-border,#ffffff17);white-space:nowrap;text-overflow:ellipsis;flex-shrink:0;align-items:center;padding:6px 10px;font-size:12px;font-weight:600;display:flex;overflow:hidden}.canvas-info-bar-left[data-v-c1f84581]{flex:1;align-items:center;gap:6px;min-width:0;display:flex}.canvas-info-bar-right[data-v-c1f84581]{flex-shrink:0;align-items:center;gap:4px;margin-left:8px;display:flex}.page-num[data-v-c1f84581]{color:var(--ui-text-muted,#94a3b8);text-align:center;-webkit-user-select:none;user-select:none;min-width:50px;font-size:12px}.page-btn[data-v-c1f84581]{border:1px solid var(--viewer-border,#ffffff17);background:var(--viewer-card,#ffffff09);width:24px;height:24px;color:var(--ui-text-muted,#94a3b8);cursor:pointer;border-radius:6px;justify-content:center;align-items:center;padding:0;font-size:10px;line-height:1;transition:background .15s,border-color .15s;display:flex}.page-btn[data-v-c1f84581]:hover:not(:disabled){color:#bfdbfe;background:#3b82f61f;border-color:#60a5fa52}.page-btn[data-v-c1f84581]:disabled{opacity:.35;cursor:default}.canvas-info-bar-left-tag[data-v-c1f84581]{color:#fff;background-color:#10b9812e;border:1px solid #34d39940;border-radius:6px;padding:2px 7px;font-size:12px;line-height:20px}.canvas-info-bar-left-tag.gray[data-v-c1f84581]{color:var(--viewer-card-text,#cbd5e1);background-color:#94a3b824;border-color:#94a3b833}.canvas-info-bar-left-filename[data-v-c1f84581]{white-space:nowrap;text-overflow:ellipsis;flex:1;overflow:hidden}.canvas-scroll[data-v-c1f84581]{background:var(--viewer-scroll,#1a2230);flex:1;min-height:0;position:relative;overflow-y:scroll}.canvas-scroll--flip[data-v-c1f84581]{direction:rtl}.virtual-spacer[data-v-c1f84581]{direction:ltr;width:100%;position:relative}.viewport-canvas-stack[data-v-c1f84581]{direction:ltr;width:100%;position:sticky;top:0}.compare-canvas[data-v-c1f84581],.annotation-canvas[data-v-c1f84581]{width:100%;display:block;position:absolute;inset:0}.compare-canvas[data-v-c1f84581]{pointer-events:none}.annotation-canvas[data-v-c1f84581]{z-index:1}.line-svg[data-v-c1f84581]{pointer-events:none;position:absolute;top:0;left:0}.side-panel[data-v-c1f84581]{border-left:1px solid var(--viewer-border,#ffffff17);background:var(--viewer-side,#0d1626);flex-direction:column;flex-shrink:0;width:clamp(300px,23vw,360px);min-height:0;display:flex;overflow:hidden}.review-header[data-v-c1f84581]{flex-shrink:0;padding:18px 16px 12px}.review-title-row[data-v-c1f84581]{justify-content:space-between;align-items:center;gap:12px;display:flex}.review-title-row h2[data-v-c1f84581]{color:var(--viewer-card-title,#e2e8f0);align-items:center;gap:8px;font-size:14px;font-weight:650;display:flex}.review-title-row svg[data-v-c1f84581]{width:16px;height:16px;color:var(--ui-text-subtle,#64748b)}.review-total[data-v-c1f84581]{color:var(--ui-text-subtle,#64748b);font-variant-numeric:tabular-nums;font-size:11px}.review-segments[data-v-c1f84581]{background:var(--viewer-card,#ffffff09);border-radius:9px;gap:3px;margin-top:16px;padding:3px;display:flex}.review-segments button[data-v-c1f84581]{min-width:0;color:var(--ui-text-subtle,#64748b);white-space:nowrap;cursor:pointer;border-radius:7px;flex:1;justify-content:center;align-items:center;gap:6px;padding:7px 4px;font-size:12px;transition:background .15s,color .15s;display:flex}.review-segments button[aria-pressed=true][data-v-c1f84581]{background:var(--viewer-side,#0d1626);color:var(--viewer-card-title,#e2e8f0);font-weight:600;box-shadow:0 1px 4px #00000014}.review-segments span[data-v-c1f84581]{font-variant-numeric:tabular-nums;opacity:.65;font-size:10px}.review-types[data-v-c1f84581]{border-bottom:1px solid var(--viewer-border,#ffffff17);flex-shrink:0;align-items:center;gap:4px;padding:0 12px 12px;display:flex}.review-type[data-v-c1f84581]{color:var(--ui-text-subtle,#64748b);white-space:nowrap;cursor:pointer;border-radius:6px;flex:1;justify-content:center;align-items:center;gap:4px;padding:5px 3px;font-size:11px;display:flex}.review-type span[data-v-c1f84581]{opacity:.65;font-variant-numeric:tabular-nums;font-size:10px}.review-type[data-v-c1f84581]:hover,.review-type[aria-pressed=true][data-v-c1f84581]{color:var(--viewer-card-title,#e2e8f0);background:var(--viewer-card,#ffffff09)}.review-type[aria-pressed=true][data-v-c1f84581]{font-weight:600}.side-panel[data-v-c1f84581] .diff-cards{overscroll-behavior:contain;scrollbar-gutter:stable;background:color-mix(in srgb, var(--viewer-card,#ffffff09) 38%, var(--viewer-side,#0d1626));flex:1;min-height:0;padding:14px 12px 16px;overflow-y:auto}.review-footer[data-v-c1f84581]{border-top:1px solid var(--viewer-border,#ffffff17);background:var(--viewer-side,#0d1626);flex-shrink:0;align-items:center;gap:8px;padding:12px;display:flex}.review-footer button[data-v-c1f84581]{cursor:pointer;border-radius:8px;justify-content:center;align-items:center;gap:7px;min-width:0;padding:9px 10px;font-size:12px;transition:background .15s;display:flex}.review-footer svg[data-v-c1f84581]{flex-shrink:0;width:14px;height:14px}.batch-ignore[data-v-c1f84581]{color:var(--viewer-card-title,#e2e8f0);background:var(--viewer-card,#ffffff09);flex:1}.batch-ignore span[data-v-c1f84581]{color:var(--ui-text-subtle,#64748b);font-variant-numeric:tabular-nums;font-size:10px}.batch-restore[data-v-c1f84581]{color:var(--ui-text-subtle,#64748b)}.review-footer button[data-v-c1f84581]:hover:not(:disabled){background:var(--diff-card-hover,#3b82f611);color:var(--viewer-card-title,#e2e8f0)}.review-footer button[data-v-c1f84581]:disabled{opacity:.35;cursor:default}.side-panel button[data-v-c1f84581]:focus-visible{outline:2px solid var(--diff-active-border,#38bdf899);outline-offset:2px}.review-empty[data-v-c1f84581]{text-align:center;min-height:0;color:var(--ui-text-subtle,#64748b);flex:1;padding:42px 20px;overflow-y:auto}.empty-symbol[data-v-c1f84581]{background:var(--viewer-card,#ffffff09);border-radius:14px;place-items:center;width:44px;height:44px;margin:0 auto 14px;display:grid}.empty-symbol svg[data-v-c1f84581]{width:22px;height:22px}.empty-symbol.is-passed[data-v-c1f84581]{color:var(--diff-insert-dot,#00a870);background:var(--diff-insert-bg,#34d3991a)}.review-empty h3[data-v-c1f84581]{color:var(--viewer-card-title,#e2e8f0);font-size:14px;font-weight:600}.review-empty p[data-v-c1f84581]{margin-top:8px;font-size:12px;line-height:1.6}.review-empty button[data-v-c1f84581]{color:var(--viewer-card-text,#cbd5e1);cursor:pointer;text-underline-offset:4px;margin-top:20px;font-size:12px;text-decoration:underline}.page-loading[data-v-c1f84581]{height:200px;color:var(--ui-text-muted,#94a3b8);justify-content:center;align-items:center;font-size:13px;display:flex}
1
+ [data-v-7344a999],[data-v-7344a999]:before,[data-v-7344a999]:after{box-sizing:border-box}button[data-v-7344a999]{font:inherit;color:inherit;background:0 0;border:0;padding:0}h2[data-v-7344a999],h3[data-v-7344a999],p[data-v-7344a999]{margin:0}svg[data-v-7344a999]{vertical-align:middle;display:inline-block}.diff-cards[data-v-7344a999]{flex-direction:column;gap:10px;display:flex}.diff-card[data-v-7344a999]{--change-color:var(--diff-modify-dot,#f80);border:1px solid var(--viewer-border,#ffffff17);background:var(--diff-card-bg,#ffffff09);border-radius:12px;flex-shrink:0;min-width:0;padding:10px 12px;transition:border-color .15s,box-shadow .15s}.diff-card--insert[data-v-7344a999]{--change-color:var(--diff-insert-dot,#00a870)}.diff-card--delete[data-v-7344a999]{--change-color:var(--diff-delete-dot,#e34d59)}.diff-card[data-v-7344a999]:hover{border-color:color-mix(in srgb, var(--viewer-card-text,#cbd5e1) 30%, transparent)}.diff-card.is-active[data-v-7344a999]{border-color:var(--diff-active-border,#38bdf899);box-shadow:0 0 0 2px color-mix(in srgb, var(--diff-active-border,#38bdf899) 10%, transparent)}.diff-card.is-ignored[data-v-7344a999]{--change-color:var(--ui-text-subtle,#64748b)}.card-heading[data-v-7344a999]{align-items:center;gap:6px;display:flex}.card-select[data-v-7344a999]{text-align:left;cursor:pointer;flex:1;align-items:center;gap:8px;min-width:0;display:flex}.type-icon[data-v-7344a999]{width:24px;height:24px;color:var(--change-color);background:color-mix(in srgb, var(--change-color) 10%, transparent);border-radius:7px;flex-shrink:0;place-items:center;display:grid}.type-icon svg[data-v-7344a999],.card-action svg[data-v-7344a999]{width:14px;height:14px}.card-type[data-v-7344a999]{color:var(--viewer-card-title,#e2e8f0);font-size:12px;font-weight:600}.card-number[data-v-7344a999]{color:var(--ui-text-subtle,#64748b);font-variant-numeric:tabular-nums;font-size:10px}.card-action[data-v-7344a999]{width:28px;height:28px;color:var(--ui-text-subtle,#64748b);cursor:pointer;border-radius:7px;flex-shrink:0;place-items:center;display:grid}.card-action[data-v-7344a999]:hover{color:var(--viewer-card-title,#e2e8f0);background:var(--viewer-card,#ffffff09)}.card-action[data-v-7344a999]:disabled{opacity:.35;cursor:wait}.card-action[data-v-7344a999]:focus-visible,.card-select[data-v-7344a999]:focus-visible{outline:2px solid var(--diff-active-border,#38bdf899);outline-offset:3px;border-radius:6px}.ignored-label[data-v-7344a999]{color:var(--ui-text-subtle,#64748b);white-space:nowrap;font-size:10px}.card-content[data-v-7344a999]{cursor:pointer}.text-row[data-v-7344a999]{background:var(--viewer-card,#ffffff09);border-radius:7px;align-items:flex-start;gap:10px;margin-top:8px;padding:8px 10px;display:flex}.text-row--single[data-v-7344a999]{background:color-mix(in srgb, var(--change-color) 6%, transparent)}.text-label[data-v-7344a999]{color:var(--ui-text-subtle,#64748b);flex-shrink:0;padding-top:1px;font-size:10px;line-height:20px}.card-text[data-v-7344a999]{min-width:0;color:var(--viewer-card-text,#cbd5e1);overflow-wrap:anywhere;white-space:pre-wrap;font-size:13px;line-height:1.65}.change-mark[data-v-7344a999]{background:color-mix(in srgb, var(--change-color) 16%, transparent);border-radius:2px;font-weight:600}.card-location[data-v-7344a999]{color:var(--ui-text-subtle,#64748b);margin:8px 0 0;font-size:10px;line-height:14px}[data-v-9aa39b2f],[data-v-9aa39b2f]:before,[data-v-9aa39b2f]:after{box-sizing:border-box}button[data-v-9aa39b2f]{font:inherit;color:inherit;background:0 0;border:0;padding:0}h2[data-v-9aa39b2f],h3[data-v-9aa39b2f],p[data-v-9aa39b2f]{margin:0}svg[data-v-9aa39b2f]{vertical-align:middle;display:inline-block}.ocr-result-view[data-v-9aa39b2f]{flex-direction:column;height:100%;min-height:0;display:flex}.page-btn svg[data-v-9aa39b2f]{width:14px;height:14px}.ocr-diff-viewer[data-v-9aa39b2f]{min-height:0;color:var(--viewer-card-text,#cbd5e1);background:var(--viewer-bg,#0b1220);flex:1;font-family:Segoe UI,Microsoft YaHei,system-ui,sans-serif;display:flex}.viewer-main[data-v-9aa39b2f]{flex-direction:column;flex:1;min-width:0;display:flex}.preview-toolbar[data-v-9aa39b2f]{background:var(--viewer-workspace,#080f1c);flex-shrink:0;justify-content:flex-end;padding:8px 12px 0;display:flex}.sync-scroll-toggle[data-v-9aa39b2f]{cursor:pointer;align-items:center;gap:8px;min-height:28px;font-size:12px;display:inline-flex}.sync-scroll-toggle[data-v-9aa39b2f]:focus-visible{outline:2px solid var(--viewer-accent,#60a5fa);outline-offset:4px;border-radius:4px}.sync-scroll-track[data-v-9aa39b2f]{background:var(--ui-text-muted,#64748b);border-radius:9px;align-items:center;width:30px;height:18px;padding:2px;display:inline-flex}.sync-scroll-track>span[data-v-9aa39b2f]{background:#fff;border-radius:50%;width:14px;height:14px}.sync-scroll-toggle[aria-checked=true] .sync-scroll-track[data-v-9aa39b2f]{background:var(--viewer-accent,#3b82f6)}.sync-scroll-toggle[aria-checked=true] .sync-scroll-track>span[data-v-9aa39b2f]{transform:translate(12px)}.compare-row[data-v-9aa39b2f]{background:var(--viewer-workspace,#080f1c);box-sizing:border-box;flex:1;gap:12px;min-height:0;padding:12px;display:flex;position:relative}.canvas-col[data-v-9aa39b2f]{border:1px solid var(--viewer-border,#ffffff17);background:var(--viewer-panel,#111827);border-radius:10px;flex-direction:column;flex:1;min-width:0;display:flex;overflow:hidden}.canvas-info-bar[data-v-9aa39b2f]{height:45px;color:var(--viewer-card-title,#e2e8f0);background:var(--viewer-toolbar,#111a2b);border-bottom:1px solid var(--viewer-border,#ffffff17);white-space:nowrap;text-overflow:ellipsis;flex-shrink:0;align-items:center;padding:6px 10px;font-size:12px;font-weight:600;display:flex;overflow:hidden}.canvas-info-bar-left[data-v-9aa39b2f]{flex:1;align-items:center;gap:6px;min-width:0;display:flex}.canvas-info-bar-right[data-v-9aa39b2f]{flex-shrink:0;align-items:center;gap:4px;margin-left:8px;display:flex}.page-num[data-v-9aa39b2f]{color:var(--ui-text-muted,#94a3b8);text-align:center;-webkit-user-select:none;user-select:none;min-width:50px;font-size:12px}.page-btn[data-v-9aa39b2f]{border:1px solid var(--viewer-border,#ffffff17);background:var(--viewer-card,#ffffff09);width:24px;height:24px;color:var(--ui-text-muted,#94a3b8);cursor:pointer;border-radius:6px;justify-content:center;align-items:center;padding:0;font-size:10px;line-height:1;transition:background .15s,border-color .15s;display:flex}.page-btn[data-v-9aa39b2f]:hover:not(:disabled){color:#bfdbfe;background:#3b82f61f;border-color:#60a5fa52}.page-btn[data-v-9aa39b2f]:disabled{opacity:.35;cursor:default}.canvas-info-bar-left-tag[data-v-9aa39b2f]{color:#fff;background-color:#10b9812e;border:1px solid #34d39940;border-radius:6px;padding:2px 7px;font-size:12px;line-height:20px}.canvas-info-bar-left-tag.gray[data-v-9aa39b2f]{color:var(--viewer-card-text,#cbd5e1);background-color:#94a3b824;border-color:#94a3b833}.canvas-info-bar-left-filename[data-v-9aa39b2f]{white-space:nowrap;text-overflow:ellipsis;flex:1;overflow:hidden}.canvas-scroll[data-v-9aa39b2f]{background:var(--viewer-scroll,#1a2230);flex:1;min-height:0;position:relative;overflow-y:scroll}.canvas-scroll--flip[data-v-9aa39b2f]{direction:rtl}.virtual-spacer[data-v-9aa39b2f]{direction:ltr;width:100%;position:relative}.viewport-canvas-stack[data-v-9aa39b2f]{direction:ltr;width:100%;position:sticky;top:0}.compare-canvas[data-v-9aa39b2f],.annotation-canvas[data-v-9aa39b2f]{width:100%;display:block;position:absolute;inset:0}.compare-canvas[data-v-9aa39b2f]{pointer-events:none}.annotation-canvas[data-v-9aa39b2f]{z-index:1}.line-svg[data-v-9aa39b2f]{pointer-events:none;position:absolute;top:0;left:0}.side-panel[data-v-9aa39b2f]{border-left:1px solid var(--viewer-border,#ffffff17);background:var(--viewer-side,#0d1626);flex-direction:column;flex-shrink:0;width:clamp(300px,23vw,360px);min-height:0;display:flex;overflow:hidden}.review-header[data-v-9aa39b2f]{flex-shrink:0;padding:18px 16px 12px}.review-title-row[data-v-9aa39b2f]{justify-content:space-between;align-items:center;gap:12px;display:flex}.review-title-row h2[data-v-9aa39b2f]{color:var(--viewer-card-title,#e2e8f0);align-items:center;gap:8px;font-size:14px;font-weight:650;display:flex}.review-title-row svg[data-v-9aa39b2f]{width:16px;height:16px;color:var(--ui-text-subtle,#64748b)}.review-total[data-v-9aa39b2f]{color:var(--ui-text-subtle,#64748b);font-variant-numeric:tabular-nums;font-size:11px}.review-segments[data-v-9aa39b2f]{background:var(--viewer-card,#ffffff09);border-radius:9px;gap:3px;margin-top:16px;padding:3px;display:flex}.review-segments button[data-v-9aa39b2f]{min-width:0;color:var(--ui-text-subtle,#64748b);white-space:nowrap;cursor:pointer;border-radius:7px;flex:1;justify-content:center;align-items:center;gap:6px;padding:7px 4px;font-size:12px;transition:background .15s,color .15s;display:flex}.review-segments button[aria-pressed=true][data-v-9aa39b2f]{background:var(--viewer-side,#0d1626);color:var(--viewer-card-title,#e2e8f0);font-weight:600;box-shadow:0 1px 4px #00000014}.review-segments span[data-v-9aa39b2f]{font-variant-numeric:tabular-nums;opacity:.65;font-size:10px}.review-types[data-v-9aa39b2f]{border-bottom:1px solid var(--viewer-border,#ffffff17);flex-shrink:0;align-items:center;gap:4px;padding:0 12px 12px;display:flex}.review-type[data-v-9aa39b2f]{color:var(--ui-text-subtle,#64748b);white-space:nowrap;cursor:pointer;border-radius:6px;flex:1;justify-content:center;align-items:center;gap:4px;padding:5px 3px;font-size:11px;display:flex}.review-type span[data-v-9aa39b2f]{opacity:.65;font-variant-numeric:tabular-nums;font-size:10px}.review-type[data-v-9aa39b2f]:hover,.review-type[aria-pressed=true][data-v-9aa39b2f]{color:var(--viewer-card-title,#e2e8f0);background:var(--viewer-card,#ffffff09)}.review-type[aria-pressed=true][data-v-9aa39b2f]{font-weight:600}.side-panel[data-v-9aa39b2f] .diff-cards{overscroll-behavior:contain;scrollbar-gutter:stable;background:color-mix(in srgb, var(--viewer-card,#ffffff09) 38%, var(--viewer-side,#0d1626));flex:1;min-height:0;padding:14px 12px 16px;overflow-y:auto}.review-footer[data-v-9aa39b2f]{border-top:1px solid var(--viewer-border,#ffffff17);background:var(--viewer-side,#0d1626);flex-shrink:0;align-items:center;gap:8px;padding:12px;display:flex}.review-footer button[data-v-9aa39b2f]{cursor:pointer;border-radius:8px;justify-content:center;align-items:center;gap:7px;min-width:0;padding:9px 10px;font-size:12px;transition:background .15s;display:flex}.review-footer svg[data-v-9aa39b2f]{flex-shrink:0;width:14px;height:14px}.batch-ignore[data-v-9aa39b2f]{color:var(--viewer-card-title,#e2e8f0);background:var(--viewer-card,#ffffff09);flex:1}.batch-ignore span[data-v-9aa39b2f]{color:var(--ui-text-subtle,#64748b);font-variant-numeric:tabular-nums;font-size:10px}.batch-restore[data-v-9aa39b2f]{color:var(--ui-text-subtle,#64748b)}.review-footer button[data-v-9aa39b2f]:hover:not(:disabled){background:var(--diff-card-hover,#3b82f611);color:var(--viewer-card-title,#e2e8f0)}.review-footer button[data-v-9aa39b2f]:disabled{opacity:.35;cursor:default}.side-panel button[data-v-9aa39b2f]:focus-visible{outline:2px solid var(--diff-active-border,#38bdf899);outline-offset:2px}.review-empty[data-v-9aa39b2f]{text-align:center;min-height:0;color:var(--ui-text-subtle,#64748b);flex:1;padding:42px 20px;overflow-y:auto}.empty-symbol[data-v-9aa39b2f]{background:var(--viewer-card,#ffffff09);border-radius:14px;place-items:center;width:44px;height:44px;margin:0 auto 14px;display:grid}.empty-symbol svg[data-v-9aa39b2f]{width:22px;height:22px}.empty-symbol.is-passed[data-v-9aa39b2f]{color:var(--diff-insert-dot,#00a870);background:var(--diff-insert-bg,#34d3991a)}.review-empty h3[data-v-9aa39b2f]{color:var(--viewer-card-title,#e2e8f0);font-size:14px;font-weight:600}.review-empty p[data-v-9aa39b2f]{margin-top:8px;font-size:12px;line-height:1.6}.review-empty button[data-v-9aa39b2f]{color:var(--viewer-card-text,#cbd5e1);cursor:pointer;text-underline-offset:4px;margin-top:20px;font-size:12px;text-decoration:underline}.page-loading[data-v-9aa39b2f]{height:200px;color:var(--ui-text-muted,#94a3b8);justify-content:center;align-items:center;font-size:13px;display:flex}
2
2
  /*$vite$:1*/
@@ -61,13 +61,13 @@ function ae(e, t) {
61
61
  var k = d({
62
62
  name: "lucide-plus",
63
63
  render: ae
64
- }), A = {
64
+ }), oe = {
65
65
  viewBox: "0 0 24 24",
66
66
  width: "1.2em",
67
67
  height: "1.2em"
68
68
  };
69
- function j(e, t) {
70
- return g(), i("svg", A, [...t[0] ||= [a("path", {
69
+ function se(e, t) {
70
+ return g(), i("svg", oe, [...t[0] ||= [a("path", {
71
71
  fill: "none",
72
72
  stroke: "currentColor",
73
73
  "stroke-linecap": "round",
@@ -76,16 +76,16 @@ function j(e, t) {
76
76
  d: "M5 12h14"
77
77
  }, null, -1)]]);
78
78
  }
79
- var oe = d({
79
+ var A = d({
80
80
  name: "lucide-minus",
81
- render: j
82
- }), M = {
81
+ render: se
82
+ }), j = {
83
83
  viewBox: "0 0 24 24",
84
84
  width: "1.2em",
85
85
  height: "1.2em"
86
86
  };
87
- function N(e, t) {
88
- return g(), i("svg", M, [...t[0] ||= [a("path", {
87
+ function M(e, t) {
88
+ return g(), i("svg", j, [...t[0] ||= [a("path", {
89
89
  fill: "none",
90
90
  stroke: "currentColor",
91
91
  "stroke-linecap": "round",
@@ -94,28 +94,28 @@ function N(e, t) {
94
94
  d: "M8 3L4 7l4 4M4 7h16m-4 14l4-4l-4-4m4 4H4"
95
95
  }, null, -1)]]);
96
96
  }
97
- var se = d({
97
+ var ce = d({
98
98
  name: "lucide-arrow-left-right",
99
- render: N
100
- }), ce = ["data-diff-index"], le = { class: "card-heading" }, ue = [
99
+ render: M
100
+ }), N = ["data-diff-index"], P = { class: "card-heading" }, le = [
101
101
  "aria-label",
102
102
  "aria-pressed",
103
103
  "onClick"
104
- ], de = {
104
+ ], ue = {
105
105
  class: "type-icon",
106
106
  "aria-hidden": "true"
107
- }, P = { class: "card-type" }, F = { class: "card-number" }, fe = {
107
+ }, de = { class: "card-type" }, fe = { class: "card-number" }, pe = {
108
108
  key: 0,
109
109
  class: "ignored-label"
110
- }, I = [
110
+ }, F = [
111
111
  "disabled",
112
112
  "title",
113
113
  "aria-label",
114
114
  "onClick"
115
- ], L = ["onClick"], pe = { class: "text-row" }, me = { class: "card-text" }, he = { class: "text-row" }, ge = { class: "card-text" }, _e = {
115
+ ], I = ["onClick"], me = { class: "text-row" }, L = { class: "card-text" }, R = { class: "text-row" }, he = { class: "card-text" }, ge = {
116
116
  key: 1,
117
117
  class: "text-row text-row--single"
118
- }, ve = { class: "card-text" }, R = { class: "card-location" }, ye = /*@__PURE__*/ l({
118
+ }, _e = { class: "card-text" }, ve = { class: "card-location" }, ye = /*@__PURE__*/ l({
119
119
  __name: "DiffCards",
120
120
  props: {
121
121
  diffDetail: {},
@@ -202,18 +202,18 @@ var se = d({
202
202
  ignore: (e) => {
203
203
  !l.readonly && !o.busy && u("ignore", c.data.diffId, e);
204
204
  }
205
- }, () => [a("div", le, [
205
+ }, () => [a("div", P, [
206
206
  a("button", {
207
207
  class: "card-select",
208
208
  "aria-label": `定位第 ${c.idx + 1} 处差异,${te(c.data)}`,
209
209
  "aria-pressed": o.activeIndex === c.idx,
210
210
  onClick: (e) => u("select", c.idx)
211
211
  }, [
212
- a("span", de, [c.type === "insert" ? (g(), n(x(k), { key: 0 })) : c.type === "delete" ? (g(), n(x(oe), { key: 1 })) : (g(), n(x(se), { key: 2 }))]),
213
- a("span", P, b(f(c.data, c.type === "modify" ? "修改" : c.type === "delete" ? "删除" : "新增")), 1),
214
- a("span", F, b(String(c.idx + 1).padStart(2, "0")), 1)
215
- ], 8, ue),
216
- c.data.ignored ? (g(), i("span", fe, "已忽略")) : r("", !0),
212
+ a("span", ue, [c.type === "insert" ? (g(), n(x(k), { key: 0 })) : c.type === "delete" ? (g(), n(x(A), { key: 1 })) : (g(), n(x(ce), { key: 2 }))]),
213
+ a("span", de, b(f(c.data, c.type === "modify" ? "修改" : c.type === "delete" ? "删除" : "新增")), 1),
214
+ a("span", fe, b(String(c.idx + 1).padStart(2, "0")), 1)
215
+ ], 8, le),
216
+ c.data.ignored ? (g(), i("span", pe, "已忽略")) : r("", !0),
217
217
  l.readonly ? r("", !0) : (g(), i("button", {
218
218
  key: 1,
219
219
  class: "card-action",
@@ -227,29 +227,29 @@ var se = d({
227
227
  })) : (g(), n(x(re), {
228
228
  key: 1,
229
229
  "aria-hidden": "true"
230
- }))], 8, I))
230
+ }))], 8, F))
231
231
  ]), a("div", {
232
232
  class: "card-content",
233
233
  onClick: (e) => u("select", c.idx)
234
- }, [c.data.type === "modify" ? (g(), i(e, { key: 0 }, [a("div", pe, [s[0] ||= a("span", { class: "text-label" }, "标准", -1), a("span", me, [(g(!0), i(e, null, v(S(c.data.delChars, c.data.sourceChangeRanges), (e, t) => (g(), i("span", {
234
+ }, [c.data.type === "modify" ? (g(), i(e, { key: 0 }, [a("div", me, [s[0] ||= a("span", { class: "text-label" }, "标准", -1), a("span", L, [(g(!0), i(e, null, v(S(c.data.delChars, c.data.sourceChangeRanges), (e, t) => (g(), i("span", {
235
235
  key: t,
236
236
  class: p({ "change-mark": e.changed })
237
- }, b(e.text), 3))), 128))])]), a("div", he, [s[1] ||= a("span", { class: "text-label" }, "比对", -1), a("span", ge, [(g(!0), i(e, null, v(S(c.data.insChars, c.data.targetChangeRanges), (e, t) => (g(), i("span", {
237
+ }, b(e.text), 3))), 128))])]), a("div", R, [s[1] ||= a("span", { class: "text-label" }, "比对", -1), a("span", he, [(g(!0), i(e, null, v(S(c.data.insChars, c.data.targetChangeRanges), (e, t) => (g(), i("span", {
238
238
  key: t,
239
239
  class: p({ "change-mark": e.changed })
240
- }, b(e.text), 3))), 128))])])], 64)) : (g(), i("div", _e, [a("span", ve, b(c.data.chars || "表格结构变更"), 1)])), a("p", R, b(te(c.data)), 1)], 8, L)], !0)], 10, ce))), 128))], 512));
240
+ }, b(e.text), 3))), 128))])])], 64)) : (g(), i("div", ge, [a("span", _e, b(c.data.chars || "表格结构变更"), 1)])), a("p", ve, b(te(c.data)), 1)], 8, I)], !0)], 10, N))), 128))], 512));
241
241
  }
242
242
  }), z = (e, t) => {
243
243
  let n = e.__vccOpts || e;
244
244
  for (let [e, r] of t) n[e] = r;
245
245
  return n;
246
- }, be = /*#__PURE__*/ z(ye, [["__scopeId", "data-v-7344a999"]]), xe = {
246
+ }, be = /*#__PURE__*/ z(ye, [["__scopeId", "data-v-7344a999"]]), B = {
247
247
  viewBox: "0 0 24 24",
248
248
  width: "1.2em",
249
249
  height: "1.2em"
250
250
  };
251
- function Se(e, t) {
252
- return g(), i("svg", xe, [...t[0] ||= [a("path", {
251
+ function xe(e, t) {
252
+ return g(), i("svg", B, [...t[0] ||= [a("path", {
253
253
  fill: "none",
254
254
  stroke: "currentColor",
255
255
  "stroke-linecap": "round",
@@ -258,16 +258,16 @@ function Se(e, t) {
258
258
  d: "M20 6L9 17l-5-5"
259
259
  }, null, -1)]]);
260
260
  }
261
- var Ce = d({
261
+ var Se = d({
262
262
  name: "lucide-check",
263
- render: Se
264
- }), B = {
263
+ render: xe
264
+ }), Ce = {
265
265
  viewBox: "0 0 24 24",
266
266
  width: "1.2em",
267
267
  height: "1.2em"
268
268
  };
269
- function V(e, t) {
270
- return g(), i("svg", B, [...t[0] ||= [a("path", {
269
+ function we(e, t) {
270
+ return g(), i("svg", Ce, [...t[0] ||= [a("path", {
271
271
  fill: "none",
272
272
  stroke: "currentColor",
273
273
  "stroke-linecap": "round",
@@ -276,16 +276,16 @@ function V(e, t) {
276
276
  d: "M2 5h20M6 12h12m-9 7h6"
277
277
  }, null, -1)]]);
278
278
  }
279
- var we = d({
279
+ var Te = d({
280
280
  name: "lucide-list-filter",
281
- render: V
282
- }), H = {
281
+ render: we
282
+ }), Ee = {
283
283
  viewBox: "0 0 24 24",
284
284
  width: "1.2em",
285
285
  height: "1.2em"
286
286
  };
287
- function Te(e, t) {
288
- return g(), i("svg", H, [...t[0] ||= [a("path", {
287
+ function V(e, t) {
288
+ return g(), i("svg", Ee, [...t[0] ||= [a("path", {
289
289
  fill: "none",
290
290
  stroke: "currentColor",
291
291
  "stroke-linecap": "round",
@@ -294,16 +294,16 @@ function Te(e, t) {
294
294
  d: "m11 17l-5-5l5-5m7 10l-5-5l5-5"
295
295
  }, null, -1)]]);
296
296
  }
297
- var Ee = d({
297
+ var De = d({
298
298
  name: "lucide-chevrons-left",
299
- render: Te
300
- }), U = {
299
+ render: V
300
+ }), H = {
301
301
  viewBox: "0 0 24 24",
302
302
  width: "1.2em",
303
303
  height: "1.2em"
304
304
  };
305
- function W(e, t) {
306
- return g(), i("svg", U, [...t[0] ||= [a("path", {
305
+ function U(e, t) {
306
+ return g(), i("svg", H, [...t[0] ||= [a("path", {
307
307
  fill: "none",
308
308
  stroke: "currentColor",
309
309
  "stroke-linecap": "round",
@@ -312,16 +312,16 @@ function W(e, t) {
312
312
  d: "m15 18l-6-6l6-6"
313
313
  }, null, -1)]]);
314
314
  }
315
- var De = d({
315
+ var Oe = d({
316
316
  name: "lucide-chevron-left",
317
- render: W
318
- }), Oe = {
317
+ render: U
318
+ }), ke = {
319
319
  viewBox: "0 0 24 24",
320
320
  width: "1.2em",
321
321
  height: "1.2em"
322
322
  };
323
- function ke(e, t) {
324
- return g(), i("svg", Oe, [...t[0] ||= [a("path", {
323
+ function W(e, t) {
324
+ return g(), i("svg", ke, [...t[0] ||= [a("path", {
325
325
  fill: "none",
326
326
  stroke: "currentColor",
327
327
  "stroke-linecap": "round",
@@ -332,13 +332,13 @@ function ke(e, t) {
332
332
  }
333
333
  var Ae = d({
334
334
  name: "lucide-chevron-right",
335
- render: ke
335
+ render: W
336
336
  }), G = {
337
337
  viewBox: "0 0 24 24",
338
338
  width: "1.2em",
339
339
  height: "1.2em"
340
340
  };
341
- function K(e, t) {
341
+ function je(e, t) {
342
342
  return g(), i("svg", G, [...t[0] ||= [a("path", {
343
343
  fill: "none",
344
344
  stroke: "currentColor",
@@ -348,32 +348,35 @@ function K(e, t) {
348
348
  d: "m6 17l5-5l-5-5m7 10l5-5l-5-5"
349
349
  }, null, -1)]]);
350
350
  }
351
- var je = d({
351
+ var Me = d({
352
352
  name: "lucide-chevrons-right",
353
- render: K
354
- }), Me = { class: "ocr-result-view" }, Ne = { class: "ocr-diff-viewer" }, Pe = { class: "viewer-main" }, Fe = { class: "canvas-col" }, Ie = {
353
+ render: je
354
+ }), Ne = { class: "ocr-result-view" }, Pe = { class: "ocr-diff-viewer" }, Fe = { class: "viewer-main" }, Ie = {
355
+ key: 0,
356
+ class: "preview-toolbar"
357
+ }, Le = ["aria-checked"], Re = { class: "canvas-col" }, ze = {
355
358
  key: 0,
356
359
  class: "canvas-info-bar"
357
- }, Le = { class: "canvas-info-bar-left" }, Re = { class: "canvas-info-bar-left-filename" }, ze = { class: "canvas-info-bar-right" }, Be = ["disabled"], Ve = ["disabled"], He = { class: "page-num" }, Ue = ["disabled"], We = ["disabled"], Ge = { class: "canvas-col" }, Ke = {
360
+ }, Be = { class: "canvas-info-bar-left" }, Ve = { class: "canvas-info-bar-left-filename" }, He = { class: "canvas-info-bar-right" }, Ue = ["disabled"], We = ["disabled"], Ge = { class: "page-num" }, Ke = ["disabled"], qe = ["disabled"], Je = { class: "canvas-col" }, Ye = {
358
361
  key: 0,
359
362
  class: "canvas-info-bar"
360
- }, qe = { class: "canvas-info-bar-left" }, Je = { class: "canvas-info-bar-left-filename" }, Ye = { class: "canvas-info-bar-right" }, Xe = ["disabled"], Ze = ["disabled"], Qe = { class: "page-num" }, $e = ["disabled"], et = ["disabled"], tt = {
361
- key: 1,
363
+ }, Xe = { class: "canvas-info-bar-left" }, Ze = { class: "canvas-info-bar-left-filename" }, Qe = { class: "canvas-info-bar-right" }, $e = ["disabled"], et = ["disabled"], tt = { class: "page-num" }, nt = ["disabled"], rt = ["disabled"], it = {
364
+ key: 2,
362
365
  class: "page-loading"
363
- }, nt = {
366
+ }, at = {
364
367
  class: "side-panel",
365
368
  "aria-label": "差异审阅"
366
- }, rt = { class: "review-header" }, it = { class: "review-title-row" }, at = { class: "review-total" }, ot = {
369
+ }, ot = { class: "review-header" }, st = { class: "review-title-row" }, ct = { class: "review-total" }, lt = {
367
370
  class: "review-segments",
368
371
  "aria-label": "差异处理状态"
369
- }, st = ["aria-pressed", "onClick"], ct = { key: 0 }, lt = {
372
+ }, ut = ["aria-pressed", "onClick"], dt = { key: 0 }, ft = {
370
373
  class: "review-types",
371
374
  "aria-label": "差异类型"
372
- }, ut = ["aria-pressed", "onClick"], dt = {
375
+ }, pt = ["aria-pressed", "onClick"], mt = {
373
376
  key: 0,
374
377
  class: "review-empty",
375
378
  role: "status"
376
- }, ft = { class: "empty-symbol is-passed" }, pt = { class: "empty-symbol" }, mt = ["aria-busy"], ht = ["disabled"], gt = { key: 0 }, _t = ["disabled"], vt = 5, yt = 16, bt = 4, xt = /*#__PURE__*/ z(/* @__PURE__ */ l({
379
+ }, ht = { class: "empty-symbol is-passed" }, gt = { class: "empty-symbol" }, _t = ["aria-busy"], vt = ["disabled"], yt = { key: 0 }, bt = ["disabled"], xt = 5, St = 16, Ct = 4, wt = /*#__PURE__*/ z(/* @__PURE__ */ l({
377
380
  __name: "OcrDiffViewer",
378
381
  props: {
379
382
  diffDetail: {},
@@ -401,7 +404,10 @@ var je = d({
401
404
  "image-error"
402
405
  ],
403
406
  setup(l, { expose: d, emit: p }) {
404
- let w = l, T = p, E = t(() => w.review), D = _("pending"), O = t(() => ne(w.diffDetail, j.value, D.value)), ae = t(() => new Set(O.value.map((e) => e.idx))), k = t(() => {
407
+ let w = l, T = p, E = t(() => w.review), D = _("pending"), O = t(() => ne(w.diffDetail, M.value, D.value)), ae = t(() => new Set(O.value.map((e) => e.idx))), k = _(!1), oe = "src", se = {
408
+ src: null,
409
+ tgt: null
410
+ }, A = t(() => {
405
411
  let e = [], t = [], n = 0, r = 0, i = 0;
406
412
  for (let a = 0; a < w.diffDetail.length; a++) {
407
413
  let o = w.diffDetail[a];
@@ -486,13 +492,13 @@ var je = d({
486
492
  insertCount: r,
487
493
  modifyCount: i
488
494
  };
489
- }), A = _(0), j = _("all"), oe = t(() => ({
490
- all: k.value.deleteCount + k.value.insertCount + k.value.modifyCount,
491
- modify: k.value.modifyCount,
492
- delete: k.value.deleteCount,
493
- insert: k.value.insertCount
494
- })), M = _(0), N = _(0), se = _(), ce = _(), le = _(), ue = _(), de = _(), P = _(), F = _(), fe = _(), I = _([]), L = _([]), pe = _(1), me = _(1), he = _(1), ge = _(1), _e = Math.SQRT2, ve = /* @__PURE__ */ new Map(), R = /* @__PURE__ */ new Map(), ye = /* @__PURE__ */ new Map(), z = /* @__PURE__ */ new Set(), xe = [], Se = [], B = 0, V = 0, H = 0, Te = 0, U = 0, W = null, Oe = !1, ke = !1, G, K = !1, xt = [];
495
- function St(e) {
495
+ }), j = _(0), M = _("all"), ce = t(() => ({
496
+ all: A.value.deleteCount + A.value.insertCount + A.value.modifyCount,
497
+ modify: A.value.modifyCount,
498
+ delete: A.value.deleteCount,
499
+ insert: A.value.insertCount
500
+ })), N = _(0), P = _(0), le = _(), ue = _(), de = _(), fe = _(), pe = _(), F = _(), I = _(), me = _(), L = _([]), R = _([]), he = _(1), ge = _(1), _e = _(1), ve = _(1), ye = Math.SQRT2, z = /* @__PURE__ */ new Map(), B = /* @__PURE__ */ new Map(), xe = /* @__PURE__ */ new Map(), Ce = /* @__PURE__ */ new Set(), we = [], Ee = [], V = 0, H = 0, U = 0, ke = 0, W = 0, G = null, je = !1, wt = !1, Tt, K = !1, Et = [];
501
+ function Dt(e) {
496
502
  let t = /* @__PURE__ */ new Map();
497
503
  for (let n of e) {
498
504
  let e = t.get(n.pageIndex);
@@ -500,34 +506,34 @@ var je = d({
500
506
  }
501
507
  return t;
502
508
  }
503
- let Ct = t(() => St(k.value.srcBoxes)), wt = t(() => St(k.value.tgtBoxes));
509
+ let Ot = t(() => Dt(A.value.srcBoxes)), kt = t(() => Dt(A.value.tgtBoxes));
504
510
  function q(e) {
505
511
  return e === "src" ? w.sourcePages : w.targetPages;
506
512
  }
507
513
  function J(e) {
508
- return e === "src" ? I.value : L.value;
514
+ return e === "src" ? L.value : R.value;
509
515
  }
510
516
  function Y(e) {
511
- return e === "src" ? P.value : F.value;
512
- }
513
- function Tt(e) {
514
- return e === "src" ? ce.value : le.value;
517
+ return e === "src" ? F.value : I.value;
515
518
  }
516
- function Et(e) {
519
+ function At(e) {
517
520
  return e === "src" ? ue.value : de.value;
518
521
  }
519
- function Dt(e) {
520
- let t = ve.get(e.imageUrl);
522
+ function jt(e) {
523
+ return e === "src" ? fe.value : pe.value;
524
+ }
525
+ function Mt(e) {
526
+ let t = z.get(e.imageUrl);
521
527
  if (t) return t;
522
528
  if (e.width && e.height) return {
523
529
  width: e.width,
524
530
  height: e.height
525
531
  };
526
532
  }
527
- function Ot(e, t) {
528
- let n = e.map(Dt).find(Boolean), r = n ? n.height / n.width : _e, i = [], a = 0;
533
+ function Nt(e, t) {
534
+ let n = e.map(Mt).find(Boolean), r = n ? n.height / n.width : ye, i = [], a = 0;
529
535
  for (let n of e) {
530
- let e = Dt(n), o = e ? e.height / e.width : r, s = Math.max(1, Math.round(t * o));
536
+ let e = Mt(n), o = e ? e.height / e.width : r, s = Math.max(1, Math.round(t * o));
531
537
  i.push({
532
538
  top: a,
533
539
  width: t,
@@ -535,17 +541,17 @@ var je = d({
535
541
  naturalWidth: e?.width ?? t,
536
542
  naturalHeight: e?.height ?? s,
537
543
  measured: !!e
538
- }), a += s + vt;
544
+ }), a += s + xt;
539
545
  }
540
546
  return i;
541
547
  }
542
- function kt(e, t) {
548
+ function Pt(e, t) {
543
549
  if (e.length === 0) return 0;
544
550
  let n = 0, r = e.length - 1;
545
551
  for (; n <= r;) {
546
552
  let i = Math.floor((n + r) / 2), a = e[i];
547
553
  if (t < a.top) r = i - 1;
548
- else if (t >= a.top + a.height + vt) n = i + 1;
554
+ else if (t >= a.top + a.height + xt) n = i + 1;
549
555
  else return i;
550
556
  }
551
557
  return Math.max(0, Math.min(e.length - 1, n));
@@ -553,104 +559,104 @@ var je = d({
553
559
  function X(e, t = !1) {
554
560
  let n = Y(e);
555
561
  if (!n || n.clientWidth <= 0) return;
556
- let r = J(e), i = n.scrollTop, a = r.length > 0 ? kt(r, i) : 0, o = r[a], s = o ? Math.max(0, Math.min(1, (i - o.top) / o.height)) : 0, c = Ot(q(e), n.clientWidth), l = c.length > 0 ? c[c.length - 1].top + c[c.length - 1].height : 1;
557
- if (e === "src" ? (I.value = c, pe.value = l, he.value = Math.max(1, n.clientHeight)) : (L.value = c, me.value = l, ge.value = Math.max(1, n.clientHeight)), t && o && c[a]) {
558
- let e = c[a].top + c[a].height * s;
562
+ let r = J(e), i = n.scrollTop, a = r.length > 0 ? Pt(r, i) : 0, o = r[a], s = o ? Math.max(0, Math.min(1, (i - o.top) / o.height)) : 0, c = Nt(q(e), n.clientWidth), l = c.length > 0 ? c[c.length - 1].top + c[c.length - 1].height : 1;
563
+ if (e === "src" ? (L.value = c, he.value = l, _e.value = Math.max(1, n.clientHeight)) : (R.value = c, ge.value = l, ve.value = Math.max(1, n.clientHeight)), t && o && c[a]) {
564
+ let t = c[a].top + c[a].height * s;
559
565
  f(() => {
560
- n.scrollTop = e;
566
+ Yt(e, t);
561
567
  });
562
568
  }
563
569
  Q(e);
564
570
  }
565
- function At() {
566
- for (; V < bt && xt.length > 0;) xt.shift()?.();
571
+ function Ft() {
572
+ for (; H < Ct && Et.length > 0;) Et.shift()?.();
567
573
  }
568
- function jt(e) {
574
+ function It(e) {
569
575
  for (let t of ["src", "tgt"]) {
570
- let n = q(t), r = It(t);
576
+ let n = q(t), r = Vt(t);
571
577
  if (r) {
572
578
  let t = Math.max(0, r.start - 1), i = Math.min(n.length - 1, r.end + 1);
573
579
  for (let r = t; r <= i; r++) if (n[r]?.imageUrl === e) return !0;
574
580
  }
575
581
  }
576
- let t = w.diffDetail[A.value];
582
+ let t = w.diffDetail[j.value];
577
583
  return !(!t || w.sourcePages[t.srcPage]?.imageUrl !== e && w.targetPages[t.tgtPage]?.imageUrl !== e);
578
584
  }
579
- function Mt(e) {
585
+ function Lt(e) {
580
586
  return new Promise((t, n) => {
581
- xt.push(() => {
582
- if (!jt(e)) {
587
+ Et.push(() => {
588
+ if (!It(e)) {
583
589
  let t = /* @__PURE__ */ Error(`已取消非可见页面加载: ${e}`);
584
590
  t.name = "AbortError", n(t);
585
591
  return;
586
592
  }
587
- if (V++, w.imageLoader) {
593
+ if (H++, w.imageLoader) {
588
594
  Promise.resolve().then(() => w.imageLoader(e)).then(t, (t) => {
589
595
  K || T("image-error", e), n(t);
590
596
  }).finally(() => {
591
- V--, At();
597
+ H--, Ft();
592
598
  });
593
599
  return;
594
600
  }
595
601
  let r = new Image();
596
602
  w.imageCrossOrigin !== null && (r.crossOrigin = w.imageCrossOrigin), r.onload = () => {
597
- r.onload = null, r.onerror = null, V--, At(), t(r);
603
+ r.onload = null, r.onerror = null, H--, Ft(), t(r);
598
604
  }, r.onerror = () => {
599
- r.onload = null, r.onerror = null, V--, At(), K || T("image-error", e), n(/* @__PURE__ */ Error(`图片加载失败: ${e}`));
605
+ r.onload = null, r.onerror = null, H--, Ft(), K || T("image-error", e), n(/* @__PURE__ */ Error(`图片加载失败: ${e}`));
600
606
  }, r.src = e;
601
- }), At();
607
+ }), Ft();
602
608
  });
603
609
  }
604
- function Nt(e) {
605
- let t = R.get(e);
606
- if (t?.image) return t.lastUsed = ++B, Promise.resolve(t.image);
610
+ function Rt(e) {
611
+ let t = B.get(e);
612
+ if (t?.image) return t.lastUsed = ++V, Promise.resolve(t.image);
607
613
  if (t?.promise) return t.promise;
608
- if (z.has(e)) return Promise.reject(/* @__PURE__ */ Error(`图片加载失败: ${e}`));
609
- let n = { lastUsed: ++B };
610
- return n.promise = Mt(e).then((e) => (n.image = e, n.promise = void 0, n.lastUsed = ++B, e)).catch((t) => {
611
- throw R.delete(e), t instanceof Error && t.name !== "AbortError" && z.add(e), t;
612
- }), R.set(e, n), n.promise;
614
+ if (Ce.has(e)) return Promise.reject(/* @__PURE__ */ Error(`图片加载失败: ${e}`));
615
+ let n = { lastUsed: ++V };
616
+ return n.promise = Lt(e).then((e) => (n.image = e, n.promise = void 0, n.lastUsed = ++V, e)).catch((t) => {
617
+ throw B.delete(e), t instanceof Error && t.name !== "AbortError" && Ce.add(e), t;
618
+ }), B.set(e, n), n.promise;
613
619
  }
614
- function Pt() {
615
- let e = [...R.entries()].filter(([, e]) => e.image).sort((e, t) => e[1].lastUsed - t[1].lastUsed);
616
- for (; R.size > yt && e.length > 0;) {
620
+ function zt() {
621
+ let e = [...B.entries()].filter(([, e]) => e.image).sort((e, t) => e[1].lastUsed - t[1].lastUsed);
622
+ for (; B.size > St && e.length > 0;) {
617
623
  let [t, n] = e.shift();
618
- n.image.src = "", R.delete(t);
624
+ n.image.src = "", B.delete(t);
619
625
  }
620
626
  }
621
- function Ft(e, t) {
627
+ function Bt(e, t) {
622
628
  let n = q(e)[t];
623
629
  if (!n) return Promise.resolve();
624
- let r = R.get(n.imageUrl)?.image, i = ve.get(n.imageUrl);
625
- if (r && i) return R.get(n.imageUrl).lastUsed = ++B, Promise.resolve();
626
- let a = `${e}:${t}:${n.imageUrl}`, o = ye.get(a);
630
+ let r = B.get(n.imageUrl)?.image, i = z.get(n.imageUrl);
631
+ if (r && i) return B.get(n.imageUrl).lastUsed = ++V, Promise.resolve();
632
+ let a = `${e}:${t}:${n.imageUrl}`, o = xe.get(a);
627
633
  if (o) return o;
628
- let s = Nt(n.imageUrl).then((r) => {
634
+ let s = Rt(n.imageUrl).then((r) => {
629
635
  if (K || q(e)[t]?.imageUrl !== n.imageUrl) return;
630
- let i = ve.get(n.imageUrl), a = i?.width !== r.naturalWidth || i?.height !== r.naturalHeight;
631
- ve.set(n.imageUrl, {
636
+ let i = z.get(n.imageUrl), a = i?.width !== r.naturalWidth || i?.height !== r.naturalHeight;
637
+ z.set(n.imageUrl, {
632
638
  width: r.naturalWidth,
633
639
  height: r.naturalHeight
634
- }), a ? X(e, !0) : Q(e), Pt();
640
+ }), a ? X(e, !0) : Q(e), zt();
635
641
  }).catch(() => void 0).finally(() => {
636
- ye.delete(a);
642
+ xe.delete(a);
637
643
  });
638
- return ye.set(a, s), s;
644
+ return xe.set(a, s), s;
639
645
  }
640
- function It(e) {
646
+ function Vt(e) {
641
647
  let t = Y(e), n = J(e);
642
648
  if (t && n.length !== 0) return {
643
- start: kt(n, t.scrollTop),
644
- end: kt(n, t.scrollTop + t.clientHeight)
649
+ start: Pt(n, t.scrollTop),
650
+ end: Pt(n, t.scrollTop + t.clientHeight)
645
651
  };
646
652
  }
647
- function Lt(e, t, n) {
653
+ function Ht(e, t, n) {
648
654
  let r = Math.min(window.devicePixelRatio || 1, 2), i = Math.max(1, Math.round(t * r)), a = Math.max(1, Math.round(n * r));
649
655
  (e.width !== i || e.height !== a) && (e.width = i, e.height = a), e.style.width = `${t}px`, e.style.height = `${n}px`;
650
656
  let o = e.getContext("2d");
651
657
  return o.setTransform(r, 0, 0, r, 0, 0), o.clearRect(0, 0, t, n), o;
652
658
  }
653
- let Rt = {
659
+ let Ut = {
654
660
  gray: {
655
661
  fill: "rgba(148,163,184,0.12)",
656
662
  stroke: "#94a3b8",
@@ -672,32 +678,32 @@ var je = d({
672
678
  pulse: "rgba(255,136,0,0.7)"
673
679
  }
674
680
  };
675
- function zt(e) {
681
+ function Wt(e) {
676
682
  return e < .3 ? Math.sin(e / .3 * Math.PI) : e >= .38 && e < .7 ? .85 * Math.sin((e - .38) / .32 * Math.PI) : 0;
677
683
  }
678
684
  function Z(e) {
679
- let t = Et(e), n = Y(e), r = It(e);
685
+ let t = jt(e), n = Y(e), r = Vt(e);
680
686
  if (!t || !n || n.clientWidth <= 0 || n.clientHeight <= 0) return;
681
- let i = Lt(t, n.clientWidth, n.clientHeight);
687
+ let i = Ht(t, n.clientWidth, n.clientHeight);
682
688
  if (!r) {
683
- e === "src" ? xe = [] : Se = [];
689
+ e === "src" ? we = [] : Ee = [];
684
690
  return;
685
691
  }
686
- let a = J(e), o = e === "src" ? Ct.value : wt.value, s = [], c;
692
+ let a = J(e), o = e === "src" ? Ot.value : kt.value, s = [], c;
687
693
  for (let e = r.start; e <= r.end; e++) {
688
694
  let t = a[e];
689
695
  if (!t?.measured) continue;
690
696
  let r = t.width / t.naturalWidth;
691
697
  for (let a of o.get(e) ?? []) {
692
- if (a.isGap && a.pairIndex !== A.value) continue;
693
- let e = Math.round(a.x * r), o = Math.round(t.top - n.scrollTop + a.y * r), l = Math.max(1, Math.round(a.w * r)), u = Math.max(1, Math.round(a.h * r)), d = Rt[a.color];
698
+ if (a.isGap && a.pairIndex !== j.value) continue;
699
+ let e = Math.round(a.x * r), o = Math.round(t.top - n.scrollTop + a.y * r), l = Math.max(1, Math.round(a.w * r)), u = Math.max(1, Math.round(a.h * r)), d = Ut[a.color];
694
700
  i.fillStyle = d.fill, i.fillRect(e, o, l, u), i.strokeStyle = d.stroke, i.lineWidth = 1, i.strokeRect(e, o, l, u), s.push({
695
701
  x: e,
696
702
  y: o,
697
703
  w: l,
698
704
  h: u,
699
705
  pairIndex: a.pairIndex
700
- }), a.pairIndex === A.value && (c = {
706
+ }), a.pairIndex === j.value && (c = {
701
707
  x: e,
702
708
  y: o,
703
709
  w: l,
@@ -706,16 +712,16 @@ var je = d({
706
712
  });
707
713
  }
708
714
  }
709
- if (c && W !== null) {
710
- let e = zt(W);
711
- e > 0 && (i.save(), i.globalAlpha = e, i.strokeStyle = Rt[c.color].pulse, i.lineWidth = 1 + e * 4, i.shadowColor = Rt[c.color].pulse, i.shadowBlur = e * 8, i.strokeRect(c.x, c.y, c.w, c.h), i.restore());
715
+ if (c && G !== null) {
716
+ let e = Wt(G);
717
+ e > 0 && (i.save(), i.globalAlpha = e, i.strokeStyle = Ut[c.color].pulse, i.lineWidth = 1 + e * 4, i.shadowColor = Ut[c.color].pulse, i.shadowBlur = e * 8, i.strokeRect(c.x, c.y, c.w, c.h), i.restore());
712
718
  }
713
- e === "src" ? xe = s : Se = s;
719
+ e === "src" ? we = s : Ee = s;
714
720
  }
715
- function Bt(e) {
716
- let t = Tt(e), n = Y(e), r = It(e);
721
+ function Gt(e) {
722
+ let t = At(e), n = Y(e), r = Vt(e);
717
723
  if (!t || !n || n.clientWidth <= 0 || n.clientHeight <= 0) return;
718
- let i = Lt(t, n.clientWidth, n.clientHeight);
724
+ let i = Ht(t, n.clientWidth, n.clientHeight);
719
725
  if (i.fillStyle = "#eef0f3", i.fillRect(0, 0, n.clientWidth, n.clientHeight), !r) {
720
726
  Z(e);
721
727
  return;
@@ -724,27 +730,27 @@ var je = d({
724
730
  for (let t = r.start; t <= r.end; t++) {
725
731
  let r = o[t], s = a[t], c = s.top - n.scrollTop;
726
732
  i.fillStyle = "#fff", i.fillRect(0, c, s.width, s.height);
727
- let l = R.get(r.imageUrl);
728
- l?.image ? (l.lastUsed = ++B, i.drawImage(l.image, 0, c, s.width, s.height)) : (i.fillStyle = "#8a9099", i.font = "14px Segoe UI, Microsoft YaHei, sans-serif", i.textAlign = "center", i.fillText(`第 ${t + 1} 页加载中…`, s.width / 2, c + Math.min(48, s.height / 2)), Ft(e, t));
733
+ let l = B.get(r.imageUrl);
734
+ l?.image ? (l.lastUsed = ++V, i.drawImage(l.image, 0, c, s.width, s.height)) : (i.fillStyle = "#8a9099", i.font = "14px Segoe UI, Microsoft YaHei, sans-serif", i.textAlign = "center", i.fillText(`第 ${t + 1} 页加载中…`, s.width / 2, c + Math.min(48, s.height / 2)), Bt(e, t));
729
735
  }
730
736
  let s = Math.max(0, r.start - 1), c = Math.min(o.length - 1, r.end + 1);
731
- for (let t = s; t <= c; t++) (t < r.start || t > r.end) && Ft(e, t);
737
+ for (let t = s; t <= c; t++) (t < r.start || t > r.end) && Bt(e, t);
732
738
  Z(e);
733
739
  }
734
740
  function Q(e) {
735
- (!e || e === "src") && (Oe = !0), (!e || e === "tgt") && (ke = !0), !H && (H = requestAnimationFrame(() => {
736
- H = 0;
737
- let e = Oe, t = ke;
738
- Oe = !1, ke = !1, e && Bt("src"), t && Bt("tgt"), Gt(), Ut();
741
+ (!e || e === "src") && (je = !0), (!e || e === "tgt") && (wt = !0), !U && (U = requestAnimationFrame(() => {
742
+ U = 0;
743
+ let e = je, t = wt;
744
+ je = !1, wt = !1, e && Gt("src"), t && Gt("tgt"), $t(), Jt();
739
745
  }));
740
746
  }
741
- function Vt() {
742
- Te ||= requestAnimationFrame(() => {
743
- Te = 0, X("src", !0), X("tgt", !0);
747
+ function Kt() {
748
+ ke ||= requestAnimationFrame(() => {
749
+ ke = 0, X("src", !0), X("tgt", !0);
744
750
  });
745
751
  }
746
- function Ht(e) {
747
- let t = (e === "src" ? k.value.srcBoxes : k.value.tgtBoxes).find((e) => e.pairIndex === A.value), n = Y(e), r = t ? J(e)[t.pageIndex] : void 0;
752
+ function qt(e) {
753
+ let t = (e === "src" ? A.value.srcBoxes : A.value.tgtBoxes).find((e) => e.pairIndex === j.value), n = Y(e), r = t ? J(e)[t.pageIndex] : void 0;
748
754
  if (!t || !n || !r?.measured) return;
749
755
  let i = r.width / r.naturalWidth;
750
756
  return {
@@ -753,14 +759,14 @@ var je = d({
753
759
  color: t.color
754
760
  };
755
761
  }
756
- function Ut() {
757
- if (!fe.value || !se.value || !P.value || !F.value || !ue.value || !de.value) return;
758
- let e = fe.value, t = e.querySelector("path"), n = Ht("src"), r = Ht("tgt");
762
+ function Jt() {
763
+ if (!me.value || !le.value || !F.value || !I.value || !fe.value || !pe.value) return;
764
+ let e = me.value, t = e.querySelector("path"), n = qt("src"), r = qt("tgt");
759
765
  if (!n || !r) {
760
766
  t?.remove();
761
767
  return;
762
768
  }
763
- let i = se.value.getBoundingClientRect(), a = P.value.getBoundingClientRect(), o = F.value.getBoundingClientRect(), s = ue.value.getBoundingClientRect(), c = de.value.getBoundingClientRect(), l = a.top - i.top, u = a.left - i.left, d = o.right - a.left, f = a.height, p = (t, n) => {
769
+ let i = le.value.getBoundingClientRect(), a = F.value.getBoundingClientRect(), o = I.value.getBoundingClientRect(), s = fe.value.getBoundingClientRect(), c = pe.value.getBoundingClientRect(), l = a.top - i.top, u = a.left - i.left, d = o.right - a.left, f = a.height, p = (t, n) => {
764
770
  let r = `${n}px`;
765
771
  e.style[t] !== r && (e.style[t] = r);
766
772
  }, m = (e, t, n) => {
@@ -768,245 +774,275 @@ var je = d({
768
774
  };
769
775
  p("top", l), p("left", u), p("width", d), p("height", f), m(e, "width", String(d)), m(e, "height", String(f));
770
776
  let h = s.left - a.left, ee = c.left - a.left, te = h + n.x, g = n.y, _ = ee + r.x, v = r.y, y = s.right - a.left, b = ee, x = y + (b - y) / 2, S = `M${te},${g} L${y},${g} C${x},${g} ${x},${v} ${b},${v} L${_},${v}`, C = t ?? document.createElementNS("http://www.w3.org/2000/svg", "path");
771
- m(C, "d", S), m(C, "fill", "none"), m(C, "stroke", Rt[n.color].stroke), m(C, "stroke-width", "2"), m(C, "stroke-dasharray", "6 4"), t || e.appendChild(C);
777
+ m(C, "d", S), m(C, "fill", "none"), m(C, "stroke", Ut[n.color].stroke), m(C, "stroke-width", "2"), m(C, "stroke-dasharray", "6 4"), t || e.appendChild(C);
772
778
  }
773
- function Wt(e) {
779
+ function Yt(e, t) {
780
+ let n = Y(e);
781
+ if (!n) return;
782
+ let r = n.scrollTop;
783
+ n.scrollTop = t, n.scrollTop !== r && (se[e] = n.scrollTop), Q(e);
784
+ }
785
+ function Xt(e) {
786
+ if (!k.value) return;
787
+ let t = e === "src" ? "tgt" : "src", n = Y(e), r = Y(t);
788
+ if (!n || !r) return;
789
+ let i = n.scrollHeight - n.clientHeight, a = Math.max(0, r.scrollHeight - r.clientHeight);
790
+ i <= 0 || Yt(t, Math.max(0, Math.min(1, n.scrollTop / i)) * a);
791
+ }
792
+ function Zt(e) {
774
793
  Q(e);
794
+ let t = se[e];
795
+ se[e] = null;
796
+ let n = Y(e);
797
+ !n || t !== null && Math.abs(n.scrollTop - t) < 1 || (oe = e, Xt(e));
775
798
  }
776
- function Gt() {
777
- P.value && I.value.length > 0 && (M.value = kt(I.value, P.value.scrollTop)), F.value && L.value.length > 0 && (N.value = kt(L.value, F.value.scrollTop));
799
+ function Qt() {
800
+ k.value = !k.value, k.value && Xt(oe);
778
801
  }
779
- function Kt(e, t) {
802
+ function $t() {
803
+ F.value && L.value.length > 0 && (N.value = Pt(L.value, F.value.scrollTop)), I.value && R.value.length > 0 && (P.value = Pt(R.value, I.value.scrollTop));
804
+ }
805
+ function en(e, t) {
780
806
  let n = q(e), r = Y(e), i = J(e)[t];
781
- t < 0 || t >= n.length || !r || !i || (e === "src" ? M.value = t : N.value = t, f(() => {
782
- r.scrollTop = i.top, Q(e);
807
+ t < 0 || t >= n.length || !r || !i || (e === "src" ? N.value = t : P.value = t, f(() => {
808
+ Yt(e, i.top), oe = e, Xt(e);
783
809
  }));
784
810
  }
785
- function qt(e) {
786
- Kt("src", e);
811
+ function tn(e) {
812
+ en("src", e);
787
813
  }
788
- function Jt(e) {
789
- Kt("tgt", e);
814
+ function nn(e) {
815
+ en("tgt", e);
790
816
  }
791
- function Yt(e, t, n) {
817
+ function rn(e, t, n) {
792
818
  let r = q(e), i = Y(e), a = J(e)[n];
793
819
  if (n < 0 || n >= r.length || !i || !a) return;
794
- let o = (e === "src" ? k.value.srcBoxes : k.value.tgtBoxes).find((e) => e.pairIndex === t);
795
- e === "src" ? M.value = n : N.value = n, f(() => {
820
+ let o = (e === "src" ? A.value.srcBoxes : A.value.tgtBoxes).find((e) => e.pairIndex === t);
821
+ e === "src" ? N.value = n : P.value = n, f(() => {
796
822
  let t = J(e)[n];
797
823
  if (!t) return;
798
824
  let r = o ? t.top + (o.y + o.h / 2) * (t.width / t.naturalWidth) - i.clientHeight / 2 : t.top, a = Math.max(0, i.scrollHeight - i.clientHeight);
799
- i.scrollTop = Math.max(0, Math.min(a, r)), Q(e);
825
+ Yt(e, Math.max(0, Math.min(a, r)));
800
826
  });
801
827
  }
802
- function Xt(e) {
828
+ function an(e) {
803
829
  let t = w.diffDetail[e];
804
- t && (Yt("src", e, t.srcPage), Yt("tgt", e, t.tgtPage));
830
+ t && (rn("src", e, t.srcPage), rn("tgt", e, t.tgtPage));
805
831
  }
806
- function Zt() {
807
- if (U && cancelAnimationFrame(U), window.matchMedia("(prefers-reduced-motion: reduce)").matches) {
808
- U = 0, W = null, Z("src"), Z("tgt");
832
+ function on() {
833
+ if (W && cancelAnimationFrame(W), window.matchMedia("(prefers-reduced-motion: reduce)").matches) {
834
+ W = 0, G = null, Z("src"), Z("tgt");
809
835
  return;
810
836
  }
811
837
  let e = performance.now(), t = (n) => {
812
- W = Math.min(1, (n - e) / 720), Z("src"), Z("tgt"), W < 1 ? U = requestAnimationFrame(t) : (U = 0, W = null, Z("src"), Z("tgt"));
838
+ G = Math.min(1, (n - e) / 720), Z("src"), Z("tgt"), G < 1 ? W = requestAnimationFrame(t) : (W = 0, G = null, Z("src"), Z("tgt"));
813
839
  };
814
- U = requestAnimationFrame(t);
840
+ W = requestAnimationFrame(t);
815
841
  }
816
- async function Qt(e) {
842
+ async function sn(e) {
817
843
  let t = w.diffDetail[e];
818
- t && (await Promise.all([Ft("src", t.srcPage), Ft("tgt", t.tgtPage)]), !(K || A.value !== e) && (Xt(e), Q(), Zt()));
844
+ t && (await Promise.all([Bt("src", t.srcPage), Bt("tgt", t.tgtPage)]), !(K || j.value !== e) && (an(e), Q(), on()));
819
845
  }
820
- let $t = _(null);
846
+ let cn = _(null);
821
847
  function $(e, t = !0) {
822
- K || (T("select", w.diffDetail[e] ?? null, e), A.value = e, t && f(() => {
823
- !K && A.value === e && $t.value?.scrollToCard(e);
824
- }), Xt(e), Q(), Qt(e));
848
+ K || (T("select", w.diffDetail[e] ?? null, e), j.value = e, t && f(() => {
849
+ !K && j.value === e && cn.value?.scrollToCard(e);
850
+ }), an(e), Q(), sn(e));
825
851
  }
826
- function en(e, t) {
827
- let n = Et(t), r = Y(t);
852
+ function ln(e, t) {
853
+ let n = jt(t), r = Y(t);
828
854
  if (!n || !r) return;
829
- let i = n.getBoundingClientRect(), a = (e.clientX - i.left) * r.clientWidth / i.width, o = (e.clientY - i.top) * r.clientHeight / i.height, s = t === "src" ? xe : Se;
855
+ let i = n.getBoundingClientRect(), a = (e.clientX - i.left) * r.clientWidth / i.width, o = (e.clientY - i.top) * r.clientHeight / i.height, s = t === "src" ? we : Ee;
830
856
  for (let e = s.length - 1; e >= 0; e--) {
831
857
  let t = s[e];
832
858
  if (a >= t.x - 3 && a <= t.x + t.w + 3 && o >= t.y - 3 && o <= t.y + t.h + 3) return t.pairIndex;
833
859
  }
834
860
  }
835
- function tn(e, t) {
836
- let n = en(e, t);
861
+ function un(e, t) {
862
+ let n = ln(e, t);
837
863
  n !== void 0 && $(n);
838
864
  }
839
- function nn(e, t) {
865
+ function dn(e, t) {
840
866
  let n = e.currentTarget;
841
- n.style.cursor = en(e, t) === void 0 ? "default" : "pointer";
867
+ n.style.cursor = ln(e, t) === void 0 ? "default" : "pointer";
842
868
  }
843
- let rn = t(() => O.value[0]?.idx ?? -1);
844
- function an() {
845
- I.value = [], L.value = [], pe.value = 1, me.value = 1, xe = [], Se = [], z.clear();
869
+ let fn = t(() => O.value[0]?.idx ?? -1);
870
+ function pn() {
871
+ L.value = [], R.value = [], he.value = 1, ge.value = 1, we = [], Ee = [], Ce.clear();
846
872
  }
847
873
  te(async () => {
848
- K = !1, await f(), X("src"), X("tgt"), await f(), $(rn.value), G = new ResizeObserver(Vt), P.value && G.observe(P.value), F.value && G.observe(F.value);
874
+ K = !1, await f(), X("src"), X("tgt"), await f(), $(fn.value), Tt = new ResizeObserver(Kt), F.value && Tt.observe(F.value), I.value && Tt.observe(I.value);
849
875
  }), S(() => [w.sourcePages, w.targetPages], async () => {
850
- an(), await f(), X("src"), X("tgt"), await f(), $(rn.value);
851
- }, { deep: !0 }), S([j, D], () => {
852
- T("filter-change", j.value, D.value), $(rn.value);
876
+ pn(), await f(), X("src"), X("tgt"), await f(), $(fn.value);
877
+ }, { deep: !0 }), S([M, D], () => {
878
+ T("filter-change", M.value, D.value), $(fn.value);
853
879
  }), S(() => w.diffDetail, () => {
854
- let e = A.value;
880
+ let e = j.value;
855
881
  $((O.value.find((t) => t.idx >= e) ?? O.value[O.value.length - 1])?.idx ?? -1);
856
882
  }), ee(() => {
857
- K = !0, G?.disconnect(), H && cancelAnimationFrame(H), Te && cancelAnimationFrame(Te), U && cancelAnimationFrame(U);
858
- for (let e of R.values()) e.image && (e.image.src = "");
859
- R.clear();
883
+ K = !0, Tt?.disconnect(), U && cancelAnimationFrame(U), ke && cancelAnimationFrame(ke), W && cancelAnimationFrame(W);
884
+ for (let e of B.values()) e.image && (e.image.src = "");
885
+ B.clear();
860
886
  });
861
- async function on(e) {
887
+ async function mn(e) {
862
888
  let t = typeof e == "string" ? w.diffDetail.findIndex((t) => t.diffId === e) : e;
863
- return !Number.isInteger(t) || !w.diffDetail[t] || K ? !1 : (ae.value.has(t) || (j.value = "all", D.value = "all", await f()), $(t), !0);
889
+ return !Number.isInteger(t) || !w.diffDetail[t] || K ? !1 : (ae.value.has(t) || (M.value = "all", D.value = "all", await f()), $(t), !0);
864
890
  }
865
- function sn(e) {
866
- let t = O.value.findIndex((e) => e.idx === A.value), n = O.value[t + e];
891
+ function hn(e) {
892
+ let t = O.value.findIndex((e) => e.idx === j.value), n = O.value[t + e];
867
893
  return n ? ($(n.idx), !0) : !1;
868
894
  }
869
- function cn(e, t) {
895
+ function gn(e, t) {
870
896
  let n = e === "source" ? "src" : "tgt";
871
- return !Number.isInteger(t) || t < 0 || t >= q(n).length ? !1 : (Kt(n, t), !0);
897
+ return !Number.isInteger(t) || t < 0 || t >= q(n).length ? !1 : (en(n, t), !0);
872
898
  }
873
- function ln(e, t = D.value) {
874
- j.value = e, D.value = t;
899
+ function _n(e, t = D.value) {
900
+ M.value = e, D.value = t;
875
901
  }
876
- function un() {
877
- z.clear(), Q();
902
+ function vn() {
903
+ Ce.clear(), Q();
878
904
  }
879
- return S(M, (e) => T("page-change", "source", e)), S(N, (e) => T("page-change", "target", e)), d({
880
- selectDiff: on,
881
- nextDiff: () => sn(1),
882
- previousDiff: () => sn(-1),
883
- goToPage: cn,
884
- setFilter: ln,
885
- resize: Vt,
886
- retryImages: un
887
- }), (t, d) => (g(), i("div", Me, [
905
+ return S(N, (e) => T("page-change", "source", e)), S(P, (e) => T("page-change", "target", e)), d({
906
+ selectDiff: mn,
907
+ nextDiff: () => hn(1),
908
+ previousDiff: () => hn(-1),
909
+ goToPage: gn,
910
+ setFilter: _n,
911
+ resize: Kt,
912
+ retryImages: vn
913
+ }), (t, d) => (g(), i("div", Ne, [
888
914
  y(t.$slots, "toolbar", {
889
- activeIndex: A.value,
890
- selectDiff: on,
891
- setFilter: ln
915
+ activeIndex: j.value,
916
+ selectDiff: mn,
917
+ setFilter: _n
892
918
  }, void 0, !0),
893
- a("div", Ne, [a("div", Pe, [w.sourcePages.length > 0 || w.targetPages.length > 0 ? (g(), i("div", {
894
- key: 0,
919
+ a("div", Pe, [a("div", Fe, [w.sourcePages.length && w.targetPages.length ? (g(), i("div", Ie, [a("button", {
920
+ type: "button",
921
+ class: "sync-scroll-toggle",
922
+ role: "switch",
923
+ "aria-checked": k.value,
924
+ title: "开启后,两侧预览按文档滚动进度同步",
925
+ onClick: Qt
926
+ }, [...d[19] ||= [a("span", {
927
+ class: "sync-scroll-track",
928
+ "aria-hidden": "true"
929
+ }, [a("span")], -1), s(" 同步滚动 ", -1)]], 8, Le)])) : r("", !0), w.sourcePages.length > 0 || w.targetPages.length > 0 ? (g(), i("div", {
930
+ key: 1,
895
931
  ref_key: "containerRef",
896
- ref: se,
932
+ ref: le,
897
933
  class: "compare-row"
898
934
  }, [
899
- a("div", Fe, [w.sourcePages.length ? (g(), i("div", Ie, [a("div", Le, [d[19] ||= a("div", { class: "canvas-info-bar-left-tag" }, "标准文档", -1), a("div", Re, [y(t.$slots, "source-title", { filename: w.sourceFilename }, () => [s(b(w.sourceFilename || "标准文档"), 1)], !0)])]), a("div", ze, [
935
+ a("div", Re, [w.sourcePages.length ? (g(), i("div", ze, [a("div", Be, [d[20] ||= a("div", { class: "canvas-info-bar-left-tag" }, "标准文档", -1), a("div", Ve, [y(t.$slots, "source-title", { filename: w.sourceFilename }, () => [s(b(w.sourceFilename || "标准文档"), 1)], !0)])]), a("div", He, [
900
936
  a("button", {
901
937
  class: "page-btn",
902
- disabled: M.value <= 0,
938
+ disabled: N.value <= 0,
903
939
  title: "第一页",
904
940
  "aria-label": "标准文档第一页",
905
- onClick: d[0] ||= (e) => qt(0)
906
- }, [c(x(Ee), { "aria-hidden": "true" })], 8, Be),
941
+ onClick: d[0] ||= (e) => tn(0)
942
+ }, [c(x(De), { "aria-hidden": "true" })], 8, Ue),
907
943
  a("button", {
908
944
  class: "page-btn",
909
- disabled: M.value <= 0,
945
+ disabled: N.value <= 0,
910
946
  title: "上一页",
911
947
  "aria-label": "标准文档上一页",
912
- onClick: d[1] ||= (e) => qt(M.value - 1)
913
- }, [c(x(De), { "aria-hidden": "true" })], 8, Ve),
914
- a("span", He, b(M.value + 1) + " / " + b(w.sourcePages.length), 1),
948
+ onClick: d[1] ||= (e) => tn(N.value - 1)
949
+ }, [c(x(Oe), { "aria-hidden": "true" })], 8, We),
950
+ a("span", Ge, b(N.value + 1) + " / " + b(w.sourcePages.length), 1),
915
951
  a("button", {
916
952
  class: "page-btn",
917
- disabled: M.value >= w.sourcePages.length - 1,
953
+ disabled: N.value >= w.sourcePages.length - 1,
918
954
  title: "下一页",
919
955
  "aria-label": "标准文档下一页",
920
- onClick: d[2] ||= (e) => qt(M.value + 1)
921
- }, [c(x(Ae), { "aria-hidden": "true" })], 8, Ue),
956
+ onClick: d[2] ||= (e) => tn(N.value + 1)
957
+ }, [c(x(Ae), { "aria-hidden": "true" })], 8, Ke),
922
958
  a("button", {
923
959
  class: "page-btn",
924
- disabled: M.value >= w.sourcePages.length - 1,
960
+ disabled: N.value >= w.sourcePages.length - 1,
925
961
  title: "最后一页",
926
962
  "aria-label": "标准文档最后一页",
927
- onClick: d[3] ||= (e) => qt(w.sourcePages.length - 1)
928
- }, [c(x(je), { "aria-hidden": "true" })], 8, We)
963
+ onClick: d[3] ||= (e) => tn(w.sourcePages.length - 1)
964
+ }, [c(x(Me), { "aria-hidden": "true" })], 8, qe)
929
965
  ])])) : r("", !0), a("div", {
930
966
  ref_key: "srcScrollRef",
931
- ref: P,
967
+ ref: F,
932
968
  class: "canvas-scroll",
933
- onScroll: d[6] ||= (e) => Wt("src")
969
+ onScroll: d[6] ||= (e) => Zt("src")
934
970
  }, [a("div", {
935
971
  class: "virtual-spacer",
936
- style: h({ height: `${pe.value}px` })
972
+ style: h({ height: `${he.value}px` })
937
973
  }, [a("div", {
938
974
  class: "viewport-canvas-stack",
939
- style: h({ height: `${he.value}px` })
975
+ style: h({ height: `${_e.value}px` })
940
976
  }, [a("canvas", {
941
977
  ref_key: "srcCanvasRef",
942
- ref: ce,
978
+ ref: ue,
943
979
  class: "compare-canvas"
944
980
  }, null, 512), a("canvas", {
945
981
  ref_key: "srcAnnotationCanvasRef",
946
- ref: ue,
982
+ ref: fe,
947
983
  class: "annotation-canvas",
948
- onClick: d[4] ||= (e) => tn(e, "src"),
949
- onMousemove: d[5] ||= (e) => nn(e, "src")
984
+ onClick: d[4] ||= (e) => un(e, "src"),
985
+ onMousemove: d[5] ||= (e) => dn(e, "src")
950
986
  }, null, 544)], 4)], 4)], 544)]),
951
- a("div", Ge, [w.targetPages.length ? (g(), i("div", Ke, [a("div", qe, [d[20] ||= a("div", { class: "canvas-info-bar-left-tag gray" }, "对比文档", -1), a("div", Je, [y(t.$slots, "target-title", { filename: w.targetFilename }, () => [s(b(w.targetFilename || "对比文档"), 1)], !0)])]), a("div", Ye, [
987
+ a("div", Je, [w.targetPages.length ? (g(), i("div", Ye, [a("div", Xe, [d[21] ||= a("div", { class: "canvas-info-bar-left-tag gray" }, "对比文档", -1), a("div", Ze, [y(t.$slots, "target-title", { filename: w.targetFilename }, () => [s(b(w.targetFilename || "对比文档"), 1)], !0)])]), a("div", Qe, [
952
988
  a("button", {
953
989
  class: "page-btn",
954
- disabled: N.value <= 0,
990
+ disabled: P.value <= 0,
955
991
  title: "第一页",
956
992
  "aria-label": "对比文档第一页",
957
- onClick: d[7] ||= (e) => Jt(0)
958
- }, [c(x(Ee), { "aria-hidden": "true" })], 8, Xe),
993
+ onClick: d[7] ||= (e) => nn(0)
994
+ }, [c(x(De), { "aria-hidden": "true" })], 8, $e),
959
995
  a("button", {
960
996
  class: "page-btn",
961
- disabled: N.value <= 0,
997
+ disabled: P.value <= 0,
962
998
  title: "上一页",
963
999
  "aria-label": "对比文档上一页",
964
- onClick: d[8] ||= (e) => Jt(N.value - 1)
965
- }, [c(x(De), { "aria-hidden": "true" })], 8, Ze),
966
- a("span", Qe, b(N.value + 1) + " / " + b(w.targetPages.length), 1),
1000
+ onClick: d[8] ||= (e) => nn(P.value - 1)
1001
+ }, [c(x(Oe), { "aria-hidden": "true" })], 8, et),
1002
+ a("span", tt, b(P.value + 1) + " / " + b(w.targetPages.length), 1),
967
1003
  a("button", {
968
1004
  class: "page-btn",
969
- disabled: N.value >= w.targetPages.length - 1,
1005
+ disabled: P.value >= w.targetPages.length - 1,
970
1006
  title: "下一页",
971
1007
  "aria-label": "对比文档下一页",
972
- onClick: d[9] ||= (e) => Jt(N.value + 1)
973
- }, [c(x(Ae), { "aria-hidden": "true" })], 8, $e),
1008
+ onClick: d[9] ||= (e) => nn(P.value + 1)
1009
+ }, [c(x(Ae), { "aria-hidden": "true" })], 8, nt),
974
1010
  a("button", {
975
1011
  class: "page-btn",
976
- disabled: N.value >= w.targetPages.length - 1,
1012
+ disabled: P.value >= w.targetPages.length - 1,
977
1013
  title: "最后一页",
978
1014
  "aria-label": "对比文档最后一页",
979
- onClick: d[10] ||= (e) => Jt(w.targetPages.length - 1)
980
- }, [c(x(je), { "aria-hidden": "true" })], 8, et)
1015
+ onClick: d[10] ||= (e) => nn(w.targetPages.length - 1)
1016
+ }, [c(x(Me), { "aria-hidden": "true" })], 8, rt)
981
1017
  ])])) : r("", !0), a("div", {
982
1018
  ref_key: "tgtScrollRef",
983
- ref: F,
1019
+ ref: I,
984
1020
  class: "canvas-scroll canvas-scroll--flip",
985
- onScroll: d[13] ||= (e) => Wt("tgt")
1021
+ onScroll: d[13] ||= (e) => Zt("tgt")
986
1022
  }, [a("div", {
987
1023
  class: "virtual-spacer",
988
- style: h({ height: `${me.value}px` })
1024
+ style: h({ height: `${ge.value}px` })
989
1025
  }, [a("div", {
990
1026
  class: "viewport-canvas-stack",
991
- style: h({ height: `${ge.value}px` })
1027
+ style: h({ height: `${ve.value}px` })
992
1028
  }, [a("canvas", {
993
1029
  ref_key: "tgtCanvasRef",
994
- ref: le,
1030
+ ref: de,
995
1031
  class: "compare-canvas"
996
1032
  }, null, 512), a("canvas", {
997
1033
  ref_key: "tgtAnnotationCanvasRef",
998
- ref: de,
1034
+ ref: pe,
999
1035
  class: "annotation-canvas",
1000
- onClick: d[11] ||= (e) => tn(e, "tgt"),
1001
- onMousemove: d[12] ||= (e) => nn(e, "tgt")
1036
+ onClick: d[11] ||= (e) => un(e, "tgt"),
1037
+ onMousemove: d[12] ||= (e) => dn(e, "tgt")
1002
1038
  }, null, 544)], 4)], 4)], 544)]),
1003
1039
  (g(), i("svg", {
1004
1040
  ref_key: "svgRef",
1005
- ref: fe,
1041
+ ref: me,
1006
1042
  class: "line-svg"
1007
1043
  }, null, 512))
1008
- ], 512)) : (g(), i("div", tt, [y(t.$slots, "empty", {}, () => [d[21] ||= s("暂无可展示的页面数据", -1)], !0)]))]), a("aside", nt, [
1009
- a("header", rt, [a("div", it, [a("h2", null, [c(x(we), { "aria-hidden": "true" }), d[22] ||= s("差异审阅", -1)]), a("span", at, "共 " + b(E.value?.total_difference_count ?? w.diffDetail.length) + " 处", 1)]), a("div", ot, [(g(), i(e, null, v([
1044
+ ], 512)) : (g(), i("div", it, [y(t.$slots, "empty", {}, () => [d[22] ||= s("暂无可展示的页面数据", -1)], !0)]))]), a("aside", at, [
1045
+ a("header", ot, [a("div", st, [a("h2", null, [c(x(Te), { "aria-hidden": "true" }), d[23] ||= s("差异审阅", -1)]), a("span", ct, "共 " + b(E.value?.total_difference_count ?? w.diffDetail.length) + " 处", 1)]), a("div", lt, [(g(), i(e, null, v([
1010
1046
  "pending",
1011
1047
  "ignored",
1012
1048
  "all"
@@ -1014,8 +1050,8 @@ var je = d({
1014
1050
  key: e,
1015
1051
  "aria-pressed": D.value === e,
1016
1052
  onClick: (t) => D.value = e
1017
- }, [s(b(e === "pending" ? "未忽略" : e === "ignored" ? "已忽略" : "全部") + " ", 1), E.value && e !== "all" ? (g(), i("span", ct, b(e === "pending" ? E.value.remaining_difference_count : E.value.ignored_difference_count), 1)) : r("", !0)], 8, st)), 64))])]),
1018
- a("div", lt, [(g(), i(e, null, v([
1053
+ }, [s(b(e === "pending" ? "未忽略" : e === "ignored" ? "已忽略" : "全部") + " ", 1), E.value && e !== "all" ? (g(), i("span", dt, b(e === "pending" ? E.value.remaining_difference_count : E.value.ignored_difference_count), 1)) : r("", !0)], 8, ut)), 64))])]),
1054
+ a("div", ft, [(g(), i(e, null, v([
1019
1055
  "all",
1020
1056
  "modify",
1021
1057
  "delete",
@@ -1023,16 +1059,16 @@ var je = d({
1023
1059
  ], (e) => a("button", {
1024
1060
  key: e,
1025
1061
  class: "review-type",
1026
- "aria-pressed": j.value === e,
1027
- onClick: (t) => j.value = e
1028
- }, [s(b(e === "all" ? "所有类型" : e === "modify" ? "修改" : e === "delete" ? "删除" : "新增") + " ", 1), a("span", null, b(oe.value[e]), 1)], 8, ut)), 64))]),
1062
+ "aria-pressed": M.value === e,
1063
+ onClick: (t) => M.value = e
1064
+ }, [s(b(e === "all" ? "所有类型" : e === "modify" ? "修改" : e === "delete" ? "删除" : "新增") + " ", 1), a("span", null, b(ce.value[e]), 1)], 8, pt)), 64))]),
1029
1065
  O.value.length ? (g(), n(be, {
1030
1066
  key: 1,
1031
1067
  ref_key: "diffCardsRef",
1032
- ref: $t,
1068
+ ref: cn,
1033
1069
  "diff-detail": w.diffDetail,
1034
- "active-index": A.value,
1035
- "active-tab": j.value,
1070
+ "active-index": j.value,
1071
+ "active-tab": M.value,
1036
1072
  "review-filter": D.value,
1037
1073
  busy: l.reviewBusy,
1038
1074
  readonly: w.readonly,
@@ -1049,18 +1085,18 @@ var je = d({
1049
1085
  "review-filter",
1050
1086
  "busy",
1051
1087
  "readonly"
1052
- ])) : (g(), i("div", dt, [E.value?.comparison_passed && D.value === "pending" ? (g(), i(e, { key: 0 }, [
1053
- a("span", ft, [c(x(Ce), { "aria-hidden": "true" })]),
1054
- d[23] ||= a("h3", null, "比对通过", -1),
1088
+ ])) : (g(), i("div", mt, [E.value?.comparison_passed && D.value === "pending" ? (g(), i(e, { key: 0 }, [
1089
+ a("span", ht, [c(x(Se), { "aria-hidden": "true" })]),
1090
+ d[24] ||= a("h3", null, "比对通过", -1),
1055
1091
  a("p", null, b(E.value.total_difference_count ? "全部差异已标记为忽略" : "两个文档未发现差异"), 1),
1056
1092
  E.value.ignored_difference_count ? (g(), i("button", {
1057
1093
  key: 0,
1058
1094
  onClick: d[14] ||= (e) => D.value = "ignored"
1059
1095
  }, " 查看已忽略的差异 ")) : r("", !0)
1060
1096
  ], 64)) : (g(), i(e, { key: 1 }, [
1061
- a("span", pt, [c(x(we), { "aria-hidden": "true" })]),
1062
- d[24] ||= a("h3", null, "暂无差异", -1),
1063
- d[25] ||= a("p", null, "当前筛选下没有差异项", -1)
1097
+ a("span", gt, [c(x(Te), { "aria-hidden": "true" })]),
1098
+ d[25] ||= a("h3", null, "暂无差异", -1),
1099
+ d[26] ||= a("p", null, "当前筛选下没有差异项", -1)
1064
1100
  ], 64))])),
1065
1101
  !w.readonly && E.value ? (g(), i("footer", {
1066
1102
  key: 2,
@@ -1074,22 +1110,22 @@ var je = d({
1074
1110
  onClick: d[17] ||= (e) => T("ignore", null, !0)
1075
1111
  }, [
1076
1112
  c(x(re), { "aria-hidden": "true" }),
1077
- d[26] ||= s("忽略全部 ", -1),
1078
- E.value.remaining_difference_count ? (g(), i("span", gt, b(E.value.remaining_difference_count), 1)) : r("", !0)
1079
- ], 8, ht), a("button", {
1113
+ d[27] ||= s("忽略全部 ", -1),
1114
+ E.value.remaining_difference_count ? (g(), i("span", yt, b(E.value.remaining_difference_count), 1)) : r("", !0)
1115
+ ], 8, vt), a("button", {
1080
1116
  class: "batch-restore",
1081
1117
  disabled: l.reviewBusy || !E.value.ignored_difference_count,
1082
1118
  title: "撤销整个任务的所有忽略,包含当前筛选之外的差异",
1083
1119
  "aria-label": "撤销整个任务的所有差异忽略",
1084
1120
  onClick: d[18] ||= (e) => T("ignore", null, !1)
1085
- }, [c(x(ie), { "aria-hidden": "true" }), d[27] ||= s("全部撤销 ", -1)], 8, _t)], 8, mt)) : r("", !0)
1121
+ }, [c(x(ie), { "aria-hidden": "true" }), d[28] ||= s("全部撤销 ", -1)], 8, bt)], 8, _t)) : r("", !0)
1086
1122
  ])]),
1087
1123
  y(t.$slots, "footer", {
1088
- activeIndex: A.value,
1124
+ activeIndex: j.value,
1089
1125
  review: E.value
1090
1126
  }, void 0, !0)
1091
1127
  ]));
1092
1128
  }
1093
- }), [["__scopeId", "data-v-c1f84581"]]);
1129
+ }), [["__scopeId", "data-v-9aa39b2f"]]);
1094
1130
  //#endregion
1095
- export { xt as OcrResultView };
1131
+ export { wt as OcrResultView };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yuwenovo/ocr-result-view",
3
- "version": "2.1.1",
3
+ "version": "2.2.0",
4
4
  "description": "Vue 3 OCR document comparison result viewer with virtualized Canvas rendering",
5
5
  "repository": {
6
6
  "type": "git",