ai-word-editor 0.0.21 → 0.0.23

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.
@@ -1 +1 @@
1
- .comment-panel[data-v-870abb9c]{width:280px;min-width:280px;height:100%;border-left:1px solid #e5e7eb;background:#fafafa;display:flex;flex-direction:column;overflow:hidden}.comment-panel__header[data-v-870abb9c]{padding:14px 16px 10px;border-bottom:1px solid #e5e7eb;background:#fff}.comment-panel__title[data-v-870abb9c]{margin:0;font-size:14px;font-weight:600;color:#374151;display:flex;align-items:center;gap:6px}.comment-panel__badge[data-v-870abb9c]{background:#f59e0b;color:#fff;border-radius:10px;font-size:11px;padding:1px 6px;font-weight:500}.comment-panel__empty[data-v-870abb9c]{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;color:#9ca3af;gap:4px;padding:24px;text-align:center}.comment-panel__empty p[data-v-870abb9c]{margin:0;font-size:13px}.comment-panel__empty-icon[data-v-870abb9c]{font-size:32px;margin-bottom:8px;opacity:.5}.comment-panel__empty-hint[data-v-870abb9c]{font-size:12px!important;color:#d1d5db}.comment-panel__list[data-v-870abb9c]{list-style:none;margin:0;padding:8px;overflow-y:auto;flex:1;display:flex;flex-direction:column;gap:8px}.comment-item[data-v-870abb9c]{background:#fff;border:1px solid #e5e7eb;border-radius:8px;padding:10px 12px;cursor:pointer;transition:border-color .15s,box-shadow .15s}.comment-item[data-v-870abb9c]:hover{border-color:#fbbf24;box-shadow:0 1px 4px #fbbf2426}.comment-item--active[data-v-870abb9c]{border-color:#f59e0b;box-shadow:0 0 0 2px #f59e0b33}.comment-item--resolved[data-v-870abb9c]{opacity:.55}.comment-item--resolved .comment-item__note[data-v-870abb9c]{text-decoration:line-through;color:#9ca3af}.comment-item__quote[data-v-870abb9c]{font-size:12px;color:#6b7280;background:#fef9c3;border-left:3px solid #fbbf24;padding:4px 8px;border-radius:0 4px 4px 0;margin-bottom:6px;line-height:1.4}.comment-item__quote-icon[data-v-870abb9c]{color:#fbbf24;margin-right:2px}.comment-item--c0 .comment-item__quote[data-v-870abb9c]{background:#fef3c7cc;border-left-color:#f97316}.comment-item--c0 .comment-item__quote-icon[data-v-870abb9c]{color:#f97316}.comment-item--c1 .comment-item__quote[data-v-870abb9c]{background:#d1fae5d9;border-left-color:#22c55e}.comment-item--c1 .comment-item__quote-icon[data-v-870abb9c]{color:#22c55e}.comment-item--c2 .comment-item__quote[data-v-870abb9c]{background:#dbeafed9;border-left-color:#3b82f6}.comment-item--c2 .comment-item__quote-icon[data-v-870abb9c]{color:#3b82f6}.comment-item--c3 .comment-item__quote[data-v-870abb9c]{background:#ede9fee6;border-left-color:#a855f7}.comment-item--c3 .comment-item__quote-icon[data-v-870abb9c]{color:#a855f7}.comment-item--c4 .comment-item__quote[data-v-870abb9c]{background:#fce7f3e6;border-left-color:#ec4899}.comment-item--c4 .comment-item__quote-icon[data-v-870abb9c]{color:#ec4899}.comment-item--c5 .comment-item__quote[data-v-870abb9c]{background:#ccfbf1d9;border-left-color:#14b8a6}.comment-item--c5 .comment-item__quote-icon[data-v-870abb9c]{color:#14b8a6}.comment-item--c6 .comment-item__quote[data-v-870abb9c]{background:#fef9c3e6;border-left-color:#eab308}.comment-item--c6 .comment-item__quote-icon[data-v-870abb9c]{color:#eab308}.comment-item--c7 .comment-item__quote[data-v-870abb9c]{background:#ffe4e6e6;border-left-color:#f43f5e}.comment-item--c7 .comment-item__quote-icon[data-v-870abb9c]{color:#f43f5e}.comment-item--c8 .comment-item__quote[data-v-870abb9c]{background:#e0e7ffe6;border-left-color:#6366f1}.comment-item--c8 .comment-item__quote-icon[data-v-870abb9c]{color:#6366f1}.comment-item--c9 .comment-item__quote[data-v-870abb9c]{background:#ecfdc8e6;border-left-color:#84cc16}.comment-item--c9 .comment-item__quote-icon[data-v-870abb9c]{color:#84cc16}.comment-item--c10 .comment-item__quote[data-v-870abb9c]{background:#cffafee6;border-left-color:#06b6d4}.comment-item--c10 .comment-item__quote-icon[data-v-870abb9c]{color:#06b6d4}.comment-item--c11 .comment-item__quote[data-v-870abb9c]{background:#d1fae5d9;border-left-color:#10b981}.comment-item--c11 .comment-item__quote-icon[data-v-870abb9c]{color:#10b981}.comment-item--c12 .comment-item__quote[data-v-870abb9c]{background:#ede9fee6;border-left-color:#8b5cf6}.comment-item--c12 .comment-item__quote-icon[data-v-870abb9c]{color:#8b5cf6}.comment-item--c13 .comment-item__quote[data-v-870abb9c]{background:#faf0ffe6;border-left-color:#d946ef}.comment-item--c13 .comment-item__quote-icon[data-v-870abb9c]{color:#d946ef}.comment-item--c14 .comment-item__quote[data-v-870abb9c]{background:#e0f2fee6;border-left-color:#0ea5e9}.comment-item--c14 .comment-item__quote-icon[data-v-870abb9c]{color:#0ea5e9}.comment-item--c15 .comment-item__quote[data-v-870abb9c]{background:#ffedd5e6;border-left-color:#ea580c}.comment-item--c15 .comment-item__quote-icon[data-v-870abb9c]{color:#ea580c}.comment-item--c16 .comment-item__quote[data-v-870abb9c]{background:#fefce8e6;border-left-color:#ca8a04}.comment-item--c16 .comment-item__quote-icon[data-v-870abb9c]{color:#ca8a04}.comment-item--c17 .comment-item__quote[data-v-870abb9c]{background:#fee2e2e6;border-left-color:#dc2626}.comment-item--c17 .comment-item__quote-icon[data-v-870abb9c]{color:#dc2626}.comment-item--c18 .comment-item__quote[data-v-870abb9c]{background:#ccfbf1d9;border-left-color:#0d9488}.comment-item--c18 .comment-item__quote-icon[data-v-870abb9c]{color:#0d9488}.comment-item--c19 .comment-item__quote[data-v-870abb9c]{background:#f1f5f9e6;border-left-color:#64748b}.comment-item--c19 .comment-item__quote-icon[data-v-870abb9c]{color:#64748b}.comment-item__note[data-v-870abb9c]{font-size:13px;color:#374151;line-height:1.5;margin-bottom:6px;word-break:break-word}.comment-item__meta[data-v-870abb9c]{display:flex;justify-content:space-between;font-size:11px;color:#9ca3af;margin-bottom:8px}.comment-item__author[data-v-870abb9c]{font-weight:500}.comment-item__actions[data-v-870abb9c]{display:flex;gap:6px;justify-content:flex-end}.comment-btn[data-v-870abb9c]{border:none;border-radius:4px;padding:3px 8px;font-size:11px;cursor:pointer;transition:background .15s}.comment-btn--resolve[data-v-870abb9c]{background:#ecfdf5;color:#059669}.comment-btn--resolve[data-v-870abb9c]:hover{background:#d1fae5}.comment-btn--delete[data-v-870abb9c]{background:#fef2f2;color:#dc2626}.comment-btn--delete[data-v-870abb9c]:hover{background:#fee2e2}.dialog-backdrop[data-v-8cbc8293]{position:fixed;inset:0;background:#00000073;display:flex;align-items:center;justify-content:center;z-index:9999}.dialog[data-v-8cbc8293]{background:#fff;border-radius:10px;box-shadow:0 20px 60px #00000026,0 4px 12px #00000014;width:460px;max-width:calc(100vw - 32px);overflow:hidden}.dialog__header[data-v-8cbc8293]{display:flex;align-items:center;justify-content:space-between;padding:16px 20px 12px;border-bottom:1px solid #e5e7eb}.dialog__title[data-v-8cbc8293]{margin:0;font-size:15px;font-weight:600;color:#111827}.dialog__close[data-v-8cbc8293]{border:none;background:none;font-size:14px;color:#9ca3af;cursor:pointer;padding:4px 6px;border-radius:4px;line-height:1}.dialog__close[data-v-8cbc8293]:hover{background:#f3f4f6;color:#374151}.dialog__quote[data-v-8cbc8293]{padding:12px 20px 0}.dialog__quote-label[data-v-8cbc8293]{font-size:11px;font-weight:500;color:#9ca3af;text-transform:uppercase;letter-spacing:.05em}.dialog__quote-text[data-v-8cbc8293]{margin:4px 0 0;padding:8px 12px;background:#fef9c3;border-left:3px solid #fbbf24;border-radius:0 4px 4px 0;font-size:13px;color:#374151;line-height:1.5}.dialog__body[data-v-8cbc8293]{padding:16px 20px 0}.dialog__label[data-v-8cbc8293]{display:block;font-size:12px;font-weight:500;color:#374151;margin-bottom:6px}.dialog__textarea[data-v-8cbc8293]{width:100%;border:1px solid #d1d5db;border-radius:6px;padding:10px 12px;font-size:14px;font-family:inherit;resize:vertical;box-sizing:border-box;transition:border-color .15s,box-shadow .15s;outline:none;color:#111827;line-height:1.5}.dialog__textarea[data-v-8cbc8293]:focus{border-color:#f59e0b;box-shadow:0 0 0 3px #f59e0b26}.dialog__hint[data-v-8cbc8293]{margin:6px 0 0;font-size:11px;color:#9ca3af}.dialog__footer[data-v-8cbc8293]{display:flex;justify-content:flex-end;gap:8px;padding:16px 20px}.dialog__btn[data-v-8cbc8293]{border:none;border-radius:6px;padding:8px 16px;font-size:13px;font-weight:500;cursor:pointer;transition:background .15s}.dialog__btn--cancel[data-v-8cbc8293]{background:#f3f4f6;color:#374151}.dialog__btn--cancel[data-v-8cbc8293]:hover{background:#e5e7eb}.dialog__btn--confirm[data-v-8cbc8293]{background:#f59e0b;color:#fff}.dialog__btn--confirm[data-v-8cbc8293]:hover:not(:disabled){background:#d97706}.dialog__btn--confirm[data-v-8cbc8293]:disabled{opacity:.45;cursor:not-allowed}.comment-gutter[data-v-ac6164bd]{position:absolute;top:12px;right:-300px;width:280px;pointer-events:none;display:flex;flex-direction:column}.gutter-item-wrapper[data-v-ac6164bd]{pointer-events:auto}.gutter-item[data-v-ac6164bd]{position:relative;width:100%;background:#fff;border:1px solid #e5e7eb;border-left-width:4px;border-radius:8px;padding:8px 10px;box-shadow:0 8px 18px #0000000f;cursor:pointer;-webkit-user-select:none;user-select:none;outline:none;transition:transform .12s,box-shadow .12s,border-color .12s}.gutter-item[data-v-ac6164bd]:hover{transform:translateY(-1px);box-shadow:0 10px 22px #00000014}.gutter-item--active[data-v-ac6164bd]{border-color:#f59e0b;box-shadow:0 0 0 2px #f59e0b38,0 10px 22px #00000014}.gutter-item--resolved[data-v-ac6164bd]{opacity:.6}.gutter-item__quote[data-v-ac6164bd]{font-size:12px;color:#6b7280;margin-bottom:4px}.gutter-item__note[data-v-ac6164bd]{font-size:13px;color:#374151;line-height:1.35;margin-bottom:6px;word-break:break-word}.gutter-item__meta[data-v-ac6164bd]{display:flex;justify-content:space-between;font-size:11px;color:#9ca3af}.gutter-item--c0[data-v-ac6164bd]{border-left-color:#f97316}.gutter-item--c1[data-v-ac6164bd]{border-left-color:#22c55e}.gutter-item--c2[data-v-ac6164bd]{border-left-color:#3b82f6}.gutter-item--c3[data-v-ac6164bd]{border-left-color:#a855f7}.gutter-item--c4[data-v-ac6164bd]{border-left-color:#ec4899}.gutter-item--c5[data-v-ac6164bd]{border-left-color:#14b8a6}.gutter-item--c6[data-v-ac6164bd]{border-left-color:#eab308}.gutter-item--c7[data-v-ac6164bd]{border-left-color:#f43f5e}.gutter-item--c8[data-v-ac6164bd]{border-left-color:#6366f1}.gutter-item--c9[data-v-ac6164bd]{border-left-color:#84cc16}.gutter-item--c10[data-v-ac6164bd]{border-left-color:#06b6d4}.gutter-item--c11[data-v-ac6164bd]{border-left-color:#10b981}.gutter-item--c12[data-v-ac6164bd]{border-left-color:#8b5cf6}.gutter-item--c13[data-v-ac6164bd]{border-left-color:#d946ef}.gutter-item--c14[data-v-ac6164bd]{border-left-color:#0ea5e9}.gutter-item--c15[data-v-ac6164bd]{border-left-color:#ea580c}.gutter-item--c16[data-v-ac6164bd]{border-left-color:#ca8a04}.gutter-item--c17[data-v-ac6164bd]{border-left-color:#dc2626}.gutter-item--c18[data-v-ac6164bd]{border-left-color:#0d9488}.gutter-item--c19[data-v-ac6164bd]{border-left-color:#64748b}.umo-editor-content table:has(colgroup[data-word-col-layout]) td,.umo-editor-content table:has(colgroup[data-word-col-layout]) th,.umo-editor-content table:has(colgroup[data-word-col-layout]){border:none!important;outline:none!important}.umo-editor-content table:has(colgroup col:nth-child(2)){table-layout:fixed}.auth-page[data-v-a584dfe0]{min-height:100vh;display:flex;align-items:center;justify-content:center;background:#f3f4f6}.auth-card[data-v-a584dfe0]{background:#fff;border-radius:12px;padding:40px 36px;width:340px;box-shadow:0 4px 24px #0000001a}.auth-title[data-v-a584dfe0]{font-size:20px;font-weight:700;color:#111827;text-align:center;margin:0 0 24px}.auth-tabs[data-v-a584dfe0]{display:flex;gap:0;border:1px solid #e5e7eb;border-radius:8px;overflow:hidden;margin-bottom:20px}.auth-tab[data-v-a584dfe0]{flex:1;padding:8px;border:none;background:transparent;cursor:pointer;font-size:14px;color:#6b7280;transition:background .15s,color .15s}.auth-tab--active[data-v-a584dfe0]{background:#3b82f6;color:#fff}.auth-form[data-v-a584dfe0]{display:flex;flex-direction:column;gap:12px}.auth-input[data-v-a584dfe0]{padding:10px 14px;border:1px solid #d1d5db;border-radius:8px;font-size:14px;outline:none;transition:border-color .15s}.auth-input[data-v-a584dfe0]:focus{border-color:#3b82f6}.auth-submit[data-v-a584dfe0]{padding:10px;border:none;border-radius:8px;background:#3b82f6;color:#fff;font-size:14px;font-weight:600;cursor:pointer;transition:background .15s}.auth-submit[data-v-a584dfe0]:hover:not(:disabled){background:#2563eb}.auth-submit[data-v-a584dfe0]:disabled{opacity:.6;cursor:not-allowed}.auth-error[data-v-a584dfe0]{color:#ef4444;font-size:13px;margin:0}.app-layout[data-v-a584dfe0]{display:flex;width:100%;height:100vh;overflow:hidden}.editor-wrapper[data-v-a584dfe0]{flex:1;display:flex;flex-direction:column;min-width:0;overflow:hidden}.comment-toolbar[data-v-a584dfe0]{display:flex;align-items:center;gap:8px;padding:8px 16px;background:#fff;border-bottom:1px solid #e5e7eb;z-index:10;flex-shrink:0}.toolbar-docname[data-v-a584dfe0]{flex:1;min-width:0}.toolbar-docname__input[data-v-a584dfe0]{width:100%;border:1px solid transparent;border-radius:4px;padding:3px 6px;font-size:14px;font-weight:600;color:#111827;background:transparent;outline:none;transition:border-color .15s,background .15s}.toolbar-docname__input[data-v-a584dfe0]:hover,.toolbar-docname__input[data-v-a584dfe0]:focus{border-color:#d1d5db;background:#f9fafb}.toolbar-docname--empty[data-v-a584dfe0]{font-size:13px;color:#9ca3af}.toolbar-actions[data-v-a584dfe0]{display:flex;gap:8px;flex-shrink:0}.toolbar-btn[data-v-a584dfe0]{display:inline-flex;align-items:center;gap:5px;border:none;border-radius:6px;padding:6px 14px;font-size:13px;font-weight:500;cursor:pointer;transition:background .15s,opacity .15s}.toolbar-btn[data-v-a584dfe0]:disabled{opacity:.5;cursor:not-allowed}.toolbar-btn__icon[data-v-a584dfe0]{font-size:15px}.toolbar-btn--save[data-v-a584dfe0]{background:#d1fae5;color:#065f46}.toolbar-btn--save[data-v-a584dfe0]:hover:not(:disabled){background:#a7f3d0}.toolbar-btn--primary[data-v-a584dfe0]{background:#fef3c7;color:#92400e}.toolbar-btn--primary[data-v-a584dfe0]:hover:not(:disabled){background:#fde68a}.toolbar-btn--ai[data-v-a584dfe0]{background:#ede9fe;color:#5b21b6}.toolbar-btn--ai[data-v-a584dfe0]:hover:not(:disabled){background:#ddd6fe}.umo-editor-instance[data-v-a584dfe0]{flex:1;min-height:0;overflow:hidden;display:flex;flex-direction:column}.umo-editor-stage[data-v-a584dfe0]{position:relative;flex:1;min-height:0;overflow:hidden}.editor-placeholder[data-v-a584dfe0]{flex:1;display:flex;align-items:center;justify-content:center;color:#9ca3af;font-size:14px}.umo-custom-huge-btn[data-v-a584dfe0]{display:inline-flex;align-items:center;justify-content:center;flex-direction:column;width:auto;height:56px;padding:0 5px;margin:0;border:none;border-radius:var(--umo-radius, 3px);background:transparent;cursor:pointer;transition:background .2s;white-space:nowrap}.umo-custom-huge-btn[data-v-a584dfe0]:hover:not(:disabled){background:var(--umo-button-hover-background, rgba(0, 0, 0, .06))}.umo-custom-huge-btn[data-v-a584dfe0]:disabled{opacity:.5;cursor:not-allowed}.umo-custom-huge-btn__icon[data-v-a584dfe0]{display:flex;align-items:center;justify-content:center;color:var(--umo-text-color, #3d3d3d);margin-top:3px}.umo-custom-huge-btn__icon svg[data-v-a584dfe0]{width:24px;height:24px}.umo-custom-huge-btn__text[data-v-a584dfe0]{display:block;font-size:12px;color:var(--umo-text-color, #3d3d3d);margin-top:2px;line-height:1.2}.html-dialog-mask[data-v-a584dfe0]{position:fixed;inset:0;background:#00000073;display:flex;align-items:center;justify-content:center;z-index:9999}.html-dialog[data-v-a584dfe0]{background:#1e1e2e;border-radius:10px;width:min(860px,92vw);max-height:80vh;display:flex;flex-direction:column;overflow:hidden;box-shadow:0 20px 60px #0006}.html-dialog__header[data-v-a584dfe0]{display:flex;align-items:center;justify-content:space-between;padding:14px 20px;border-bottom:1px solid #313244;flex-shrink:0}.html-dialog__title[data-v-a584dfe0]{font-size:14px;font-weight:600;color:#cdd6f4}.html-dialog__close[data-v-a584dfe0]{background:none;border:none;color:#6c7086;font-size:16px;cursor:pointer;padding:2px 6px;border-radius:4px;line-height:1;transition:color .15s,background .15s}.html-dialog__close[data-v-a584dfe0]:hover{color:#cdd6f4;background:#313244}.html-dialog__toolbar[data-v-a584dfe0]{display:flex;justify-content:flex-end;padding:8px 16px;border-bottom:1px solid #313244;flex-shrink:0}.html-dialog__copy-btn[data-v-a584dfe0]{font-size:12px;padding:4px 14px;border-radius:5px;border:1px solid #45475a;background:#313244;color:#cdd6f4;cursor:pointer;transition:background .15s,border-color .15s}.html-dialog__copy-btn[data-v-a584dfe0]:hover{background:#45475a;border-color:#89b4fa;color:#89b4fa}.html-dialog__content[data-v-a584dfe0]{flex:1;overflow:auto;margin:0;padding:16px 20px;font-family:Fira Code,Consolas,Courier New,monospace;font-size:12.5px;line-height:1.7;color:#a6e3a1;white-space:pre-wrap;word-break:break-all}[data-v-a584dfe0] table:has(colgroup[data-word-col-layout]) td,[data-v-a584dfe0] table:has(colgroup[data-word-col-layout]) th,[data-v-a584dfe0] table:has(colgroup[data-word-col-layout]){border:none!important;outline:none!important}
1
+ .comment-panel[data-v-870abb9c]{width:280px;min-width:280px;height:100%;border-left:1px solid #e5e7eb;background:#fafafa;display:flex;flex-direction:column;overflow:hidden}.comment-panel__header[data-v-870abb9c]{padding:14px 16px 10px;border-bottom:1px solid #e5e7eb;background:#fff}.comment-panel__title[data-v-870abb9c]{margin:0;font-size:14px;font-weight:600;color:#374151;display:flex;align-items:center;gap:6px}.comment-panel__badge[data-v-870abb9c]{background:#f59e0b;color:#fff;border-radius:10px;font-size:11px;padding:1px 6px;font-weight:500}.comment-panel__empty[data-v-870abb9c]{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;color:#9ca3af;gap:4px;padding:24px;text-align:center}.comment-panel__empty p[data-v-870abb9c]{margin:0;font-size:13px}.comment-panel__empty-icon[data-v-870abb9c]{font-size:32px;margin-bottom:8px;opacity:.5}.comment-panel__empty-hint[data-v-870abb9c]{font-size:12px!important;color:#d1d5db}.comment-panel__list[data-v-870abb9c]{list-style:none;margin:0;padding:8px;overflow-y:auto;flex:1;display:flex;flex-direction:column;gap:8px}.comment-item[data-v-870abb9c]{background:#fff;border:1px solid #e5e7eb;border-radius:8px;padding:10px 12px;cursor:pointer;transition:border-color .15s,box-shadow .15s}.comment-item[data-v-870abb9c]:hover{border-color:#fbbf24;box-shadow:0 1px 4px #fbbf2426}.comment-item--active[data-v-870abb9c]{border-color:#f59e0b;box-shadow:0 0 0 2px #f59e0b33}.comment-item--resolved[data-v-870abb9c]{opacity:.55}.comment-item--resolved .comment-item__note[data-v-870abb9c]{text-decoration:line-through;color:#9ca3af}.comment-item__quote[data-v-870abb9c]{font-size:12px;color:#6b7280;background:#fef9c3;border-left:3px solid #fbbf24;padding:4px 8px;border-radius:0 4px 4px 0;margin-bottom:6px;line-height:1.4}.comment-item__quote-icon[data-v-870abb9c]{color:#fbbf24;margin-right:2px}.comment-item--c0 .comment-item__quote[data-v-870abb9c]{background:#fef3c7cc;border-left-color:#f97316}.comment-item--c0 .comment-item__quote-icon[data-v-870abb9c]{color:#f97316}.comment-item--c1 .comment-item__quote[data-v-870abb9c]{background:#d1fae5d9;border-left-color:#22c55e}.comment-item--c1 .comment-item__quote-icon[data-v-870abb9c]{color:#22c55e}.comment-item--c2 .comment-item__quote[data-v-870abb9c]{background:#dbeafed9;border-left-color:#3b82f6}.comment-item--c2 .comment-item__quote-icon[data-v-870abb9c]{color:#3b82f6}.comment-item--c3 .comment-item__quote[data-v-870abb9c]{background:#ede9fee6;border-left-color:#a855f7}.comment-item--c3 .comment-item__quote-icon[data-v-870abb9c]{color:#a855f7}.comment-item--c4 .comment-item__quote[data-v-870abb9c]{background:#fce7f3e6;border-left-color:#ec4899}.comment-item--c4 .comment-item__quote-icon[data-v-870abb9c]{color:#ec4899}.comment-item--c5 .comment-item__quote[data-v-870abb9c]{background:#ccfbf1d9;border-left-color:#14b8a6}.comment-item--c5 .comment-item__quote-icon[data-v-870abb9c]{color:#14b8a6}.comment-item--c6 .comment-item__quote[data-v-870abb9c]{background:#fef9c3e6;border-left-color:#eab308}.comment-item--c6 .comment-item__quote-icon[data-v-870abb9c]{color:#eab308}.comment-item--c7 .comment-item__quote[data-v-870abb9c]{background:#ffe4e6e6;border-left-color:#f43f5e}.comment-item--c7 .comment-item__quote-icon[data-v-870abb9c]{color:#f43f5e}.comment-item--c8 .comment-item__quote[data-v-870abb9c]{background:#e0e7ffe6;border-left-color:#6366f1}.comment-item--c8 .comment-item__quote-icon[data-v-870abb9c]{color:#6366f1}.comment-item--c9 .comment-item__quote[data-v-870abb9c]{background:#ecfdc8e6;border-left-color:#84cc16}.comment-item--c9 .comment-item__quote-icon[data-v-870abb9c]{color:#84cc16}.comment-item--c10 .comment-item__quote[data-v-870abb9c]{background:#cffafee6;border-left-color:#06b6d4}.comment-item--c10 .comment-item__quote-icon[data-v-870abb9c]{color:#06b6d4}.comment-item--c11 .comment-item__quote[data-v-870abb9c]{background:#d1fae5d9;border-left-color:#10b981}.comment-item--c11 .comment-item__quote-icon[data-v-870abb9c]{color:#10b981}.comment-item--c12 .comment-item__quote[data-v-870abb9c]{background:#ede9fee6;border-left-color:#8b5cf6}.comment-item--c12 .comment-item__quote-icon[data-v-870abb9c]{color:#8b5cf6}.comment-item--c13 .comment-item__quote[data-v-870abb9c]{background:#faf0ffe6;border-left-color:#d946ef}.comment-item--c13 .comment-item__quote-icon[data-v-870abb9c]{color:#d946ef}.comment-item--c14 .comment-item__quote[data-v-870abb9c]{background:#e0f2fee6;border-left-color:#0ea5e9}.comment-item--c14 .comment-item__quote-icon[data-v-870abb9c]{color:#0ea5e9}.comment-item--c15 .comment-item__quote[data-v-870abb9c]{background:#ffedd5e6;border-left-color:#ea580c}.comment-item--c15 .comment-item__quote-icon[data-v-870abb9c]{color:#ea580c}.comment-item--c16 .comment-item__quote[data-v-870abb9c]{background:#fefce8e6;border-left-color:#ca8a04}.comment-item--c16 .comment-item__quote-icon[data-v-870abb9c]{color:#ca8a04}.comment-item--c17 .comment-item__quote[data-v-870abb9c]{background:#fee2e2e6;border-left-color:#dc2626}.comment-item--c17 .comment-item__quote-icon[data-v-870abb9c]{color:#dc2626}.comment-item--c18 .comment-item__quote[data-v-870abb9c]{background:#ccfbf1d9;border-left-color:#0d9488}.comment-item--c18 .comment-item__quote-icon[data-v-870abb9c]{color:#0d9488}.comment-item--c19 .comment-item__quote[data-v-870abb9c]{background:#f1f5f9e6;border-left-color:#64748b}.comment-item--c19 .comment-item__quote-icon[data-v-870abb9c]{color:#64748b}.comment-item__note[data-v-870abb9c]{font-size:13px;color:#374151;line-height:1.5;margin-bottom:6px;word-break:break-word}.comment-item__meta[data-v-870abb9c]{display:flex;justify-content:space-between;font-size:11px;color:#9ca3af;margin-bottom:8px}.comment-item__author[data-v-870abb9c]{font-weight:500}.comment-item__actions[data-v-870abb9c]{display:flex;gap:6px;justify-content:flex-end}.comment-btn[data-v-870abb9c]{border:none;border-radius:4px;padding:3px 8px;font-size:11px;cursor:pointer;transition:background .15s}.comment-btn--resolve[data-v-870abb9c]{background:#ecfdf5;color:#059669}.comment-btn--resolve[data-v-870abb9c]:hover{background:#d1fae5}.comment-btn--delete[data-v-870abb9c]{background:#fef2f2;color:#dc2626}.comment-btn--delete[data-v-870abb9c]:hover{background:#fee2e2}.dialog-backdrop[data-v-8cbc8293]{position:fixed;inset:0;background:#00000073;display:flex;align-items:center;justify-content:center;z-index:9999}.dialog[data-v-8cbc8293]{background:#fff;border-radius:10px;box-shadow:0 20px 60px #00000026,0 4px 12px #00000014;width:460px;max-width:calc(100vw - 32px);overflow:hidden}.dialog__header[data-v-8cbc8293]{display:flex;align-items:center;justify-content:space-between;padding:16px 20px 12px;border-bottom:1px solid #e5e7eb}.dialog__title[data-v-8cbc8293]{margin:0;font-size:15px;font-weight:600;color:#111827}.dialog__close[data-v-8cbc8293]{border:none;background:none;font-size:14px;color:#9ca3af;cursor:pointer;padding:4px 6px;border-radius:4px;line-height:1}.dialog__close[data-v-8cbc8293]:hover{background:#f3f4f6;color:#374151}.dialog__quote[data-v-8cbc8293]{padding:12px 20px 0}.dialog__quote-label[data-v-8cbc8293]{font-size:11px;font-weight:500;color:#9ca3af;text-transform:uppercase;letter-spacing:.05em}.dialog__quote-text[data-v-8cbc8293]{margin:4px 0 0;padding:8px 12px;background:#fef9c3;border-left:3px solid #fbbf24;border-radius:0 4px 4px 0;font-size:13px;color:#374151;line-height:1.5}.dialog__body[data-v-8cbc8293]{padding:16px 20px 0}.dialog__label[data-v-8cbc8293]{display:block;font-size:12px;font-weight:500;color:#374151;margin-bottom:6px}.dialog__textarea[data-v-8cbc8293]{width:100%;border:1px solid #d1d5db;border-radius:6px;padding:10px 12px;font-size:14px;font-family:inherit;resize:vertical;box-sizing:border-box;transition:border-color .15s,box-shadow .15s;outline:none;color:#111827;line-height:1.5}.dialog__textarea[data-v-8cbc8293]:focus{border-color:#f59e0b;box-shadow:0 0 0 3px #f59e0b26}.dialog__hint[data-v-8cbc8293]{margin:6px 0 0;font-size:11px;color:#9ca3af}.dialog__footer[data-v-8cbc8293]{display:flex;justify-content:flex-end;gap:8px;padding:16px 20px}.dialog__btn[data-v-8cbc8293]{border:none;border-radius:6px;padding:8px 16px;font-size:13px;font-weight:500;cursor:pointer;transition:background .15s}.dialog__btn--cancel[data-v-8cbc8293]{background:#f3f4f6;color:#374151}.dialog__btn--cancel[data-v-8cbc8293]:hover{background:#e5e7eb}.dialog__btn--confirm[data-v-8cbc8293]{background:#f59e0b;color:#fff}.dialog__btn--confirm[data-v-8cbc8293]:hover:not(:disabled){background:#d97706}.dialog__btn--confirm[data-v-8cbc8293]:disabled{opacity:.45;cursor:not-allowed}.comment-gutter[data-v-ac6164bd]{position:absolute;top:12px;right:-300px;width:280px;pointer-events:none;display:flex;flex-direction:column}.gutter-item-wrapper[data-v-ac6164bd]{pointer-events:auto}.gutter-item[data-v-ac6164bd]{position:relative;width:100%;background:#fff;border:1px solid #e5e7eb;border-left-width:4px;border-radius:8px;padding:8px 10px;box-shadow:0 8px 18px #0000000f;cursor:pointer;-webkit-user-select:none;user-select:none;outline:none;transition:transform .12s,box-shadow .12s,border-color .12s}.gutter-item[data-v-ac6164bd]:hover{transform:translateY(-1px);box-shadow:0 10px 22px #00000014}.gutter-item--active[data-v-ac6164bd]{border-color:#f59e0b;box-shadow:0 0 0 2px #f59e0b38,0 10px 22px #00000014}.gutter-item--resolved[data-v-ac6164bd]{opacity:.6}.gutter-item__quote[data-v-ac6164bd]{font-size:12px;color:#6b7280;margin-bottom:4px}.gutter-item__note[data-v-ac6164bd]{font-size:13px;color:#374151;line-height:1.35;margin-bottom:6px;word-break:break-word}.gutter-item__meta[data-v-ac6164bd]{display:flex;justify-content:space-between;font-size:11px;color:#9ca3af}.gutter-item--c0[data-v-ac6164bd]{border-left-color:#f97316}.gutter-item--c1[data-v-ac6164bd]{border-left-color:#22c55e}.gutter-item--c2[data-v-ac6164bd]{border-left-color:#3b82f6}.gutter-item--c3[data-v-ac6164bd]{border-left-color:#a855f7}.gutter-item--c4[data-v-ac6164bd]{border-left-color:#ec4899}.gutter-item--c5[data-v-ac6164bd]{border-left-color:#14b8a6}.gutter-item--c6[data-v-ac6164bd]{border-left-color:#eab308}.gutter-item--c7[data-v-ac6164bd]{border-left-color:#f43f5e}.gutter-item--c8[data-v-ac6164bd]{border-left-color:#6366f1}.gutter-item--c9[data-v-ac6164bd]{border-left-color:#84cc16}.gutter-item--c10[data-v-ac6164bd]{border-left-color:#06b6d4}.gutter-item--c11[data-v-ac6164bd]{border-left-color:#10b981}.gutter-item--c12[data-v-ac6164bd]{border-left-color:#8b5cf6}.gutter-item--c13[data-v-ac6164bd]{border-left-color:#d946ef}.gutter-item--c14[data-v-ac6164bd]{border-left-color:#0ea5e9}.gutter-item--c15[data-v-ac6164bd]{border-left-color:#ea580c}.gutter-item--c16[data-v-ac6164bd]{border-left-color:#ca8a04}.gutter-item--c17[data-v-ac6164bd]{border-left-color:#dc2626}.gutter-item--c18[data-v-ac6164bd]{border-left-color:#0d9488}.gutter-item--c19[data-v-ac6164bd]{border-left-color:#64748b}.umo-editor-content table:has(colgroup[data-word-col-layout]) td,.umo-editor-content table:has(colgroup[data-word-col-layout]) th,.umo-editor-content table:has(colgroup[data-word-col-layout]){border:none!important;outline:none!important}.umo-editor-content table:has(colgroup col:nth-child(2)){table-layout:fixed}.auth-page[data-v-d6ad3b04]{min-height:100vh;display:flex;align-items:center;justify-content:center;background:#f3f4f6}.auth-card[data-v-d6ad3b04]{background:#fff;border-radius:12px;padding:40px 36px;width:340px;box-shadow:0 4px 24px #0000001a}.auth-title[data-v-d6ad3b04]{font-size:20px;font-weight:700;color:#111827;text-align:center;margin:0 0 24px}.auth-tabs[data-v-d6ad3b04]{display:flex;gap:0;border:1px solid #e5e7eb;border-radius:8px;overflow:hidden;margin-bottom:20px}.auth-tab[data-v-d6ad3b04]{flex:1;padding:8px;border:none;background:transparent;cursor:pointer;font-size:14px;color:#6b7280;transition:background .15s,color .15s}.auth-tab--active[data-v-d6ad3b04]{background:#3b82f6;color:#fff}.auth-form[data-v-d6ad3b04]{display:flex;flex-direction:column;gap:12px}.auth-input[data-v-d6ad3b04]{padding:10px 14px;border:1px solid #d1d5db;border-radius:8px;font-size:14px;outline:none;transition:border-color .15s}.auth-input[data-v-d6ad3b04]:focus{border-color:#3b82f6}.auth-submit[data-v-d6ad3b04]{padding:10px;border:none;border-radius:8px;background:#3b82f6;color:#fff;font-size:14px;font-weight:600;cursor:pointer;transition:background .15s}.auth-submit[data-v-d6ad3b04]:hover:not(:disabled){background:#2563eb}.auth-submit[data-v-d6ad3b04]:disabled{opacity:.6;cursor:not-allowed}.auth-error[data-v-d6ad3b04]{color:#ef4444;font-size:13px;margin:0}.app-layout[data-v-d6ad3b04]{display:flex;width:100%;height:100vh;overflow:hidden}.editor-wrapper[data-v-d6ad3b04]{flex:1;display:flex;flex-direction:column;min-width:0;overflow:hidden}.comment-toolbar[data-v-d6ad3b04]{display:flex;align-items:center;gap:8px;padding:8px 16px;background:#fff;border-bottom:1px solid #e5e7eb;z-index:10;flex-shrink:0}.toolbar-docname[data-v-d6ad3b04]{flex:1;min-width:0}.toolbar-docname__input[data-v-d6ad3b04]{width:100%;border:1px solid transparent;border-radius:4px;padding:3px 6px;font-size:14px;font-weight:600;color:#111827;background:transparent;outline:none;transition:border-color .15s,background .15s}.toolbar-docname__input[data-v-d6ad3b04]:hover,.toolbar-docname__input[data-v-d6ad3b04]:focus{border-color:#d1d5db;background:#f9fafb}.toolbar-docname--empty[data-v-d6ad3b04]{font-size:13px;color:#9ca3af}.toolbar-actions[data-v-d6ad3b04]{display:flex;gap:8px;flex-shrink:0}.toolbar-btn[data-v-d6ad3b04]{display:inline-flex;align-items:center;gap:5px;border:none;border-radius:6px;padding:6px 14px;font-size:13px;font-weight:500;cursor:pointer;transition:background .15s,opacity .15s}.toolbar-btn[data-v-d6ad3b04]:disabled{opacity:.5;cursor:not-allowed}.toolbar-btn__icon[data-v-d6ad3b04]{font-size:15px}.toolbar-btn--save[data-v-d6ad3b04]{background:#d1fae5;color:#065f46}.toolbar-btn--save[data-v-d6ad3b04]:hover:not(:disabled){background:#a7f3d0}.toolbar-btn--primary[data-v-d6ad3b04]{background:#fef3c7;color:#92400e}.toolbar-btn--primary[data-v-d6ad3b04]:hover:not(:disabled){background:#fde68a}.toolbar-btn--ai[data-v-d6ad3b04]{background:#ede9fe;color:#5b21b6}.toolbar-btn--ai[data-v-d6ad3b04]:hover:not(:disabled){background:#ddd6fe}.umo-editor-instance[data-v-d6ad3b04]{flex:1;min-height:0;overflow:hidden;display:flex;flex-direction:column}.umo-editor-stage[data-v-d6ad3b04]{position:relative;flex:1;min-height:0;overflow:hidden}.editor-placeholder[data-v-d6ad3b04]{flex:1;display:flex;align-items:center;justify-content:center;color:#9ca3af;font-size:14px}.umo-custom-huge-btn[data-v-d6ad3b04]{display:inline-flex;align-items:center;justify-content:center;flex-direction:column;width:auto;height:56px;padding:0 5px;margin:0;border:none;border-radius:var(--umo-radius, 3px);background:transparent;cursor:pointer;transition:background .2s;white-space:nowrap}.umo-custom-huge-btn[data-v-d6ad3b04]:hover:not(:disabled){background:var(--umo-button-hover-background, rgba(0, 0, 0, .06))}.umo-custom-huge-btn[data-v-d6ad3b04]:disabled{opacity:.5;cursor:not-allowed}.umo-custom-huge-btn__icon[data-v-d6ad3b04]{display:flex;align-items:center;justify-content:center;color:var(--umo-text-color, #3d3d3d);margin-top:3px}.umo-custom-huge-btn__icon svg[data-v-d6ad3b04]{width:24px;height:24px}.umo-custom-huge-btn__text[data-v-d6ad3b04]{display:block;font-size:12px;color:var(--umo-text-color, #3d3d3d);margin-top:2px;line-height:1.2}.html-dialog-mask[data-v-d6ad3b04]{position:fixed;inset:0;background:#00000073;display:flex;align-items:center;justify-content:center;z-index:9999}.html-dialog[data-v-d6ad3b04]{background:#1e1e2e;border-radius:10px;width:min(860px,92vw);max-height:80vh;display:flex;flex-direction:column;overflow:hidden;box-shadow:0 20px 60px #0006}.html-dialog__header[data-v-d6ad3b04]{display:flex;align-items:center;justify-content:space-between;padding:14px 20px;border-bottom:1px solid #313244;flex-shrink:0}.html-dialog__title[data-v-d6ad3b04]{font-size:14px;font-weight:600;color:#cdd6f4}.html-dialog__close[data-v-d6ad3b04]{background:none;border:none;color:#6c7086;font-size:16px;cursor:pointer;padding:2px 6px;border-radius:4px;line-height:1;transition:color .15s,background .15s}.html-dialog__close[data-v-d6ad3b04]:hover{color:#cdd6f4;background:#313244}.html-dialog__toolbar[data-v-d6ad3b04]{display:flex;justify-content:flex-end;padding:8px 16px;border-bottom:1px solid #313244;flex-shrink:0}.html-dialog__copy-btn[data-v-d6ad3b04]{font-size:12px;padding:4px 14px;border-radius:5px;border:1px solid #45475a;background:#313244;color:#cdd6f4;cursor:pointer;transition:background .15s,border-color .15s}.html-dialog__copy-btn[data-v-d6ad3b04]:hover{background:#45475a;border-color:#89b4fa;color:#89b4fa}.html-dialog__content[data-v-d6ad3b04]{flex:1;overflow:auto;margin:0;padding:16px 20px;font-family:Fira Code,Consolas,Courier New,monospace;font-size:12.5px;line-height:1.7;color:#a6e3a1;white-space:pre-wrap;word-break:break-all}[data-v-d6ad3b04] table:has(colgroup[data-word-col-layout]) td,[data-v-d6ad3b04] table:has(colgroup[data-word-col-layout]) th,[data-v-d6ad3b04] table:has(colgroup[data-word-col-layout]){border:none!important;outline:none!important}
package/dist/index.js CHANGED
@@ -1,7 +1,6 @@
1
1
  import { useUmoEditor as bo } from "@umoteam/editor";
2
2
  import { ref as z, computed as Ne, openBlock as q, createElementBlock as rt, createElementVNode as y, createTextVNode as Ln, toDisplayString as Y, createCommentVNode as le, unref as oe, Fragment as pr, renderList as mr, normalizeClass as gr, onMounted as yr, createBlock as Ie, Teleport as wr, withModifiers as ze, withDirectives as vo, withKeys as hn, vModelText as So, watch as pn, normalizeStyle as Co, onUnmounted as To, resolveComponent as Ao, mergeProps as Mo, withCtx as Eo, createVNode as No, createApp as Io, h as Oo } from "vue";
3
- import { saveAs as $o } from "file-saver";
4
- import { exportToDocx as Bo, exportHtmlToDocxBlob as Ro } from "./wordDocxExport.js";
3
+ import { e as $o, a as Bo, s as Ro } from "./wordDocxExport-CYxYyGfR.js";
5
4
  import * as Pe from "jszip";
6
5
  const zo = "http://localhost:8000";
7
6
  async function Tt(r, t = {}) {
@@ -6899,7 +6898,7 @@ const ga = { class: "app-layout" }, ya = { class: "editor-wrapper" }, wa = { cla
6899
6898
  }
6900
6899
  T.value = !0;
6901
6900
  try {
6902
- await Bo(w, f.value, e.value || "文档");
6901
+ await $o(w, f.value, e.value || "文档");
6903
6902
  } catch (C) {
6904
6903
  console.error("导出 Word 失败:", C), alert("导出 Word 失败,请稍后重试");
6905
6904
  } finally {
@@ -6914,8 +6913,8 @@ const ga = { class: "app-layout" }, ya = { class: "editor-wrapper" }, wa = { cla
6914
6913
  }
6915
6914
  B.value = !0;
6916
6915
  try {
6917
- const C = await Ro(w, e.value || "文档");
6918
- $o(C, `${e.value || "文档"}.docx`);
6916
+ const C = await Bo(w, e.value || "文档");
6917
+ Ro(C, `${e.value || "文档"}.docx`);
6919
6918
  } catch (C) {
6920
6919
  console.error("Word 流导出失败:", C), alert("Word 流导出失败,请稍后重试");
6921
6920
  } finally {
@@ -7462,16 +7461,16 @@ const ga = { class: "app-layout" }, ya = { class: "editor-wrapper" }, wa = { cla
7462
7461
  ]);
7463
7462
  };
7464
7463
  }
7465
- }, za = /* @__PURE__ */ Ue(Ra, [["__scopeId", "data-v-a584dfe0"]]);
7466
- function Ja() {
7464
+ }, za = /* @__PURE__ */ Ue(Ra, [["__scopeId", "data-v-d6ad3b04"]]);
7465
+ function Da() {
7467
7466
  }
7468
- const La = {
7467
+ const Ja = {
7469
7468
  install(r, t) {
7470
7469
  r.use(bo, t ?? {}), r.component("UmoEditorApp", za);
7471
7470
  }
7472
7471
  };
7473
7472
  export {
7474
7473
  za as UmoEditorApp,
7475
- La as UmoEditorAppPlugin,
7476
- Ja as ensureUmoEditorGlobals
7474
+ Ja as UmoEditorAppPlugin,
7475
+ Da as ensureUmoEditorGlobals
7477
7476
  };
@@ -0,0 +1,6 @@
1
+ /**
2
+ * 使用原生 API 触发 Blob/File 下载。
3
+ * 不依赖 file-saver,避免其 UMD 在 ESM 环境下报 "Cannot set properties of undefined (setting 'FileSaver')"。
4
+ */
5
+ export declare function saveAsBlob(blob: Blob | File, filename?: string): void;
6
+ //# sourceMappingURL=saveAsBlob.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"saveAsBlob.d.ts","sourceRoot":"","sources":["../../../src/utils/saveAsBlob.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,QAAQ,SAAa,GAAG,IAAI,CAUzE"}
@@ -1 +1 @@
1
- {"version":3,"file":"wordDocxExport.d.ts","sourceRoot":"","sources":["../../../src/utils/wordDocxExport.ts"],"names":[],"mappings":"AA2BA,MAAM,WAAW,WAAW;IAC1B,wCAAwC;IACxC,EAAE,EAAE,MAAM,CAAA;IACV,WAAW;IACX,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW;IACX,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;IAClC,YAAY;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,eAAe;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAuBD;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,WAAW,EAAE,EACvB,QAAQ,SAAO,GACd,OAAO,CAAC,IAAI,CAAC,CAqCf;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnF;AAED;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,SAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBxF"}
1
+ {"version":3,"file":"wordDocxExport.d.ts","sourceRoot":"","sources":["../../../src/utils/wordDocxExport.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,WAAW;IAC1B,wCAAwC;IACxC,EAAE,EAAE,MAAM,CAAA;IACV,WAAW;IACX,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW;IACX,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;IAClC,YAAY;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,eAAe;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAuBD;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,WAAW,EAAE,EACvB,QAAQ,SAAO,GACd,OAAO,CAAC,IAAI,CAAC,CAqCf;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnF;AAED;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,SAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBxF"}
@@ -0,0 +1,448 @@
1
+ import * as _ from "jszip";
2
+ function K(o, r = "download") {
3
+ const t = URL.createObjectURL(o), e = document.createElement("a");
4
+ e.href = t, e.download = r, e.style.display = "none", document.body.appendChild(e), e.click(), document.body.removeChild(e), URL.revokeObjectURL(t);
5
+ }
6
+ const L = _.default || _;
7
+ async function V(o, r, t = "文档") {
8
+ const s = new DOMParser().parseFromString(o, "text/html"), n = /* @__PURE__ */ new Map(), l = [], w = new Map((r || []).map((v) => [v.id, v]));
9
+ s.body.querySelectorAll("span[data-comment-id]").forEach((v) => {
10
+ const a = v.getAttribute("data-comment-id");
11
+ if (a && w.has(a) && !n.has(a)) {
12
+ const u = l.length;
13
+ n.set(a, u), l.push({ ...w.get(a), ooxmlId: u });
14
+ }
15
+ });
16
+ const i = U(s.body, n), m = l.length > 0, d = new L();
17
+ d.file("[Content_Types].xml", E(m)), d.file("_rels/.rels", W()), d.file("word/document.xml", X(i)), d.file("word/styles.xml", Z()), d.file("word/_rels/document.xml.rels", G(m)), m && d.file("word/comments.xml", wt(l));
18
+ const c = await d.generateAsync({
19
+ type: "blob",
20
+ mimeType: "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
21
+ });
22
+ K(c, `${t}.docx`);
23
+ }
24
+ async function it(o, r = "文档") {
25
+ return V(o, [], r);
26
+ }
27
+ async function ct(o, r = "文档") {
28
+ const e = new DOMParser().parseFromString(o, "text/html"), s = U(e.body, /* @__PURE__ */ new Map()), n = new L();
29
+ return n.file("[Content_Types].xml", E(!1)), n.file("_rels/.rels", W()), n.file("word/document.xml", X(s)), n.file("word/styles.xml", Z()), n.file("word/_rels/document.xml.rels", G(!1)), n.generateAsync({
30
+ type: "blob",
31
+ mimeType: "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
32
+ });
33
+ }
34
+ const Y = /* @__PURE__ */ new Set(["p", "div", "h1", "h2", "h3", "h4", "h5", "h6", "li", "blockquote", "pre"]), Q = /* @__PURE__ */ new Set(["script", "style", "head"]), tt = {
35
+ signle: { val: "single", sz: "6" },
36
+ "signle-bold": { val: "thick", sz: "12" },
37
+ double: { val: "double", sz: "6" },
38
+ dotted: { val: "dotted", sz: "6" },
39
+ dashed: { val: "dashed", sz: "6" },
40
+ "dashed-double": { val: "dashSmallGap", sz: "6" },
41
+ "double-bold-top": { val: "thinThickSmallGap", sz: "24" },
42
+ "double-bold-bottom": { val: "thickThinSmallGap", sz: "24" },
43
+ wavy: { val: "wave", sz: "6" }
44
+ };
45
+ function U(o, r) {
46
+ let t = "";
47
+ for (const e of o.childNodes)
48
+ t += k(e, r);
49
+ return t.includes("<w:p") || (t = "<w:p><w:r><w:t></w:t></w:r></w:p>"), t;
50
+ }
51
+ function k(o, r) {
52
+ if (o.nodeType === 3) {
53
+ const n = o.textContent;
54
+ return !n || !n.trim() ? "" : `<w:p><w:r><w:t xml:space="preserve">${N(n)}</w:t></w:r></w:p>`;
55
+ }
56
+ if (o.nodeType !== 1) return "";
57
+ const t = o, e = t.tagName.toLowerCase();
58
+ if (Q.has(e)) return "";
59
+ if (Y.has(e)) {
60
+ const n = lt(e, t), l = S(t, r, {});
61
+ return e === "p" ? `<w:p>${n}${l || "<w:r><w:t></w:t></w:r>"}</w:p>` : l ? `<w:p>${n}${l}</w:p>` : "";
62
+ }
63
+ if (e === "table") {
64
+ const n = t.querySelector("colgroup[data-word-col-layout]"), l = t.querySelectorAll("tbody tr, tr"), w = l.length === 1, i = l[0] ? [...l[0].querySelectorAll("td, th")] : [];
65
+ return n || w && i.length >= 2 ? ot(t, r) : et(t, r);
66
+ }
67
+ if (["ul", "ol", "tbody", "thead", "tfoot", "tr", "td", "th"].includes(e)) {
68
+ let n = "";
69
+ for (const l of t.childNodes)
70
+ n += k(l, r);
71
+ return n;
72
+ }
73
+ if (e === "hr") {
74
+ const n = t.getAttribute("data-type") || "signle", w = (t.getAttribute("data-color") || "#000000").replace(/^#/, ""), i = tt[n] || { val: "single", sz: "6" };
75
+ return `<w:p><w:pPr><w:pBdr><w:bottom w:val="${i.val}" w:color="${w}" w:sz="${i.sz}" w:space="1"/></w:pBdr></w:pPr></w:p>`;
76
+ }
77
+ const s = S(t, r, {});
78
+ return s ? `<w:p>${s}</w:p>` : "";
79
+ }
80
+ function et(o, r) {
81
+ const t = o.querySelectorAll("tr");
82
+ if (!t.length) return "";
83
+ const e = o.querySelector("colgroup"), s = e ? [...e.querySelectorAll("col")] : [], n = t[0], l = n ? [...n.querySelectorAll("td, th")] : [], w = Math.max(s.length, l.length, 1), i = 8306, m = (f, b) => {
84
+ const h = (f && f.getAttribute("style") || "").match(/width\s*:\s*([\d.]+)%/);
85
+ return h ? parseFloat(h[1]) : 100 / b;
86
+ }, d = Array.from({ length: w }).map((f, b) => {
87
+ const $ = s[b], h = m($, w);
88
+ return Math.round(h / 100 * i);
89
+ }), c = d.map((f) => `<w:gridCol w:w="${f}"/>`).join(""), v = o.getAttribute("data-word-tbl-borders");
90
+ let a = null;
91
+ if (v)
92
+ try {
93
+ const f = JSON.parse(v), b = f.val || "single", $ = f.sz || "4", h = f.color || "auto", C = f.space || "0";
94
+ a = `
95
+ <w:tblBorders>
96
+ <w:top w:val="${b}" w:sz="${$}" w:space="${C}" w:color="${h}"/>
97
+ <w:left w:val="${b}" w:sz="${$}" w:space="${C}" w:color="${h}"/>
98
+ <w:bottom w:val="${b}" w:sz="${$}" w:space="${C}" w:color="${h}"/>
99
+ <w:right w:val="${b}" w:sz="${$}" w:space="${C}" w:color="${h}"/>
100
+ <w:insideH w:val="${b}" w:sz="${$}" w:space="${C}" w:color="${h}"/>
101
+ <w:insideV w:val="${b}" w:sz="${$}" w:space="${C}" w:color="${h}"/>
102
+ </w:tblBorders>`;
103
+ } catch {
104
+ a = null;
105
+ }
106
+ a || (a = `
107
+ <w:tblBorders>
108
+ <w:top w:val="single" w:sz="8" w:color="000000"/>
109
+ <w:left w:val="single" w:sz="8" w:color="000000"/>
110
+ <w:bottom w:val="single" w:sz="8" w:color="000000"/>
111
+ <w:right w:val="single" w:sz="8" w:color="000000"/>
112
+ <w:insideH w:val="single" w:sz="8" w:color="000000"/>
113
+ <w:insideV w:val="single" w:sz="8" w:color="000000"/>
114
+ </w:tblBorders>`);
115
+ const u = `
116
+ <w:tblPr>
117
+ <w:tblW w:w="${i}" w:type="dxa"/>
118
+ <w:tblLayout w:type="fixed"/>${a}
119
+ </w:tblPr>`, p = Array(w).fill(0);
120
+ let z = "";
121
+ return t.forEach((f) => {
122
+ const b = [...f.querySelectorAll("td, th")];
123
+ if (!b.length) return;
124
+ const $ = [];
125
+ let h = 0;
126
+ b.forEach((A) => {
127
+ for (; h < w && p[h] > 0; )
128
+ h++;
129
+ const g = parseInt(A.getAttribute("colspan") ?? "", 10), y = !Number.isNaN(g) && g > 1 ? g : 1, x = parseInt(A.getAttribute("rowspan") ?? "", 10), R = !Number.isNaN(x) && x > 1 ? x : 1;
130
+ $.push({
131
+ startCol: h,
132
+ colspan: y,
133
+ rowspan: R,
134
+ el: A
135
+ }), h += y;
136
+ });
137
+ let C = "", P = 0;
138
+ for (; P < w; ) {
139
+ const A = $.find((g) => g.startCol === P);
140
+ if (A) {
141
+ const { el: g, colspan: y, rowspan: x } = A, R = y > 1, F = x > 1, D = (g.getAttribute("style") || "").match(/vertical-align\s*:\s*(top|middle|bottom)/i), q = D ? D[1].toLowerCase() : "middle", j = { top: "top", middle: "center", bottom: "bottom" };
142
+ let I = 0;
143
+ for (let T = 0; T < y; T++) {
144
+ const B = d[P + T];
145
+ I += Number.isFinite(B) ? B : Math.round(i / w);
146
+ }
147
+ const M = [];
148
+ if (R && M.push(`<w:gridSpan w:val="${y}"/>`), q && j[q] && M.push(`<w:vAlign w:val="${j[q]}"/>`), F) {
149
+ M.push('<w:vMerge w:val="restart"/>');
150
+ for (let T = 0; T < y; T++)
151
+ p[P + T] = x;
152
+ }
153
+ I > 0 && M.push(`<w:tcW w:w="${I}" w:type="dxa"/>`);
154
+ const J = `<w:tcPr>${M.join("")}</w:tcPr>`;
155
+ let H = "";
156
+ for (const T of g.childNodes)
157
+ H += k(T, r);
158
+ H || (H = "<w:p><w:r><w:t></w:t></w:r></w:p>"), C += `<w:tc>${J}${H}</w:tc>`, P += y;
159
+ } else if (p[P] > 0) {
160
+ let g = 0;
161
+ for (; P + g < w && p[P + g] > 0; )
162
+ g += 1;
163
+ const y = Math.max(g, 1);
164
+ let x = 0;
165
+ for (let O = 0; O < y; O++) {
166
+ const D = d[P + O];
167
+ x += Number.isFinite(D) ? D : Math.round(i / w);
168
+ }
169
+ const F = `<w:tcPr>${[
170
+ y > 1 ? `<w:gridSpan w:val="${y}"/>` : "",
171
+ "<w:vMerge/>",
172
+ '<w:vAlign w:val="center"/>',
173
+ x > 0 ? `<w:tcW w:w="${x}" w:type="dxa"/>` : ""
174
+ ].filter(Boolean).join("")}</w:tcPr>`;
175
+ C += `<w:tc>${F}<w:p/></w:tc>`, P += y;
176
+ } else {
177
+ const g = d[P], y = Number.isFinite(g) ? g : Math.round(i / w), x = [];
178
+ y > 0 && x.push(`<w:tcW w:w="${y}" w:type="dxa"/>`);
179
+ const R = `<w:tcPr>${x.join("")}</w:tcPr>`;
180
+ C += `<w:tc>${R}<w:p><w:r><w:t></w:t></w:r></w:p></w:tc>`, P += 1;
181
+ }
182
+ }
183
+ for (let A = 0; A < p.length; A++)
184
+ p[A] > 0 && (p[A] -= 1);
185
+ z += `<w:tr>${C}</w:tr>`;
186
+ }), z ? `<w:tbl>${u}<w:tblGrid>${c}</w:tblGrid>${z}</w:tbl>` : "";
187
+ }
188
+ function ot(o, r) {
189
+ const t = o.querySelector("colgroup"), e = t ? [...t.querySelectorAll("col")] : [], s = o.querySelectorAll("tbody tr, tr"), n = s[0] ? [...s[0].querySelectorAll("td, th")] : [], l = Math.max(e.length, n.length, 1), w = 8306, i = 720, m = (a) => {
190
+ const p = (a && a.getAttribute("style") || "").match(/width\s*:\s*([\d.]+)%/);
191
+ return p ? parseFloat(p[1]) : 100 / l;
192
+ }, d = e.length > 0 ? e.map((a) => Math.round(m(a) / 100 * w)) : Array.from({ length: l }, () => Math.round((w - i * (l - 1)) / l));
193
+ let c = "";
194
+ n.forEach((a, u) => {
195
+ for (const p of a.childNodes)
196
+ c += k(p, r);
197
+ u < n.length - 1 && (c += '<w:p><w:r><w:br w:type="column"/></w:r></w:p>');
198
+ });
199
+ const v = d.map((a) => `<w:col w:w="${a}" w:space="${i}"/>`).join("");
200
+ return c += `<w:p><w:pPr><w:sectPr>
201
+ <w:cols w:num="${l}" w:space="${i}" w:equalWidth="0">${v}</w:cols>
202
+ <w:pgSz w:w="11906" w:h="16838"/>
203
+ <w:pgMar w:top="1800" w:right="1800" w:bottom="1800" w:left="1800" w:header="851" w:footer="992" w:gutter="0"/>
204
+ </w:sectPr></w:pPr></w:p>`, c;
205
+ }
206
+ function S(o, r, t) {
207
+ let e = "";
208
+ for (const s of o.childNodes)
209
+ e += rt(s, r, t);
210
+ return e;
211
+ }
212
+ function rt(o, r, t) {
213
+ if (o.nodeType === 3) {
214
+ const n = o.textContent;
215
+ return n ? st(n, t) : "";
216
+ }
217
+ if (o.nodeType !== 1) return "";
218
+ const e = o, s = e.tagName.toLowerCase();
219
+ if (s === "span" && e.hasAttribute("data-comment-id")) {
220
+ const n = e.getAttribute("data-comment-id"), l = n !== null ? r.get(n) : void 0;
221
+ if (l !== void 0) {
222
+ const w = S(e, r, t);
223
+ return `<w:commentRangeStart w:id="${l}"/>` + w + `<w:commentRangeEnd w:id="${l}"/><w:r><w:rPr><w:rStyle w:val="CommentReference"/></w:rPr><w:commentReference w:id="${l}"/></w:r>`;
224
+ }
225
+ return S(e, r, t);
226
+ }
227
+ if (s === "span") {
228
+ const n = nt(e, t);
229
+ return S(e, r, n);
230
+ }
231
+ return s === "strong" || s === "b" ? S(e, r, { ...t, bold: !0 }) : s === "em" || s === "i" ? S(e, r, { ...t, italic: !0 }) : s === "u" ? S(e, r, { ...t, underline: !0 }) : s === "s" || s === "del" || s === "strike" ? S(e, r, { ...t, strike: !0 }) : s === "br" ? "<w:r><w:br/></w:r>" : S(e, r, t);
232
+ }
233
+ function nt(o, r) {
234
+ const t = o.getAttribute("style") || "", e = t.match(/font-family\s*:\s*([^;]+)/i), s = e ? e[1].trim().replace(/["']/g, "") : null, n = t.match(/font-size\s*:\s*([\d.]+)(px|pt)/i);
235
+ let l = null;
236
+ if (n) {
237
+ const m = parseFloat(n[1]);
238
+ l = n[2].toLowerCase() === "pt" ? Math.round(m * 2) : Math.round(m * 1.5);
239
+ }
240
+ const w = t.match(/(?:^|;)\s*color\s*:\s*([^;]+)/i), i = w ? at(w[1].trim()) : null;
241
+ return {
242
+ ...r,
243
+ bold: r.bold || /font-weight\s*:\s*(bold|[789]\d\d)/i.test(t),
244
+ italic: r.italic || /font-style\s*:\s*italic/i.test(t),
245
+ underline: r.underline || /text-decoration[^;]*underline/i.test(t),
246
+ strike: r.strike || /text-decoration[^;]*line-through/i.test(t),
247
+ fontFamily: s || r.fontFamily,
248
+ fontSize: l ?? r.fontSize,
249
+ color: i || r.color,
250
+ // 从导入阶段保留下来的语言 / 拼写检查标记(data-word-*)
251
+ lang: o.getAttribute("data-word-lang") || r.lang || null,
252
+ langEastAsia: o.getAttribute("data-word-lang-eastAsia") || // 兼容一下大小写差异
253
+ o.getAttribute("data-word-lang-eastasia") || r.langEastAsia || null,
254
+ noProof: o.hasAttribute("data-word-no-proof") ? o.getAttribute("data-word-no-proof") !== "0" && o.getAttribute("data-word-no-proof") !== "false" : r.noProof
255
+ };
256
+ }
257
+ function st(o, { bold: r, italic: t, underline: e, strike: s, fontFamily: n, fontSize: l, color: w, lang: i, langEastAsia: m, noProof: d } = {}) {
258
+ let c = "";
259
+ if (n) {
260
+ const a = N(n);
261
+ c += `<w:rFonts w:ascii="${a}" w:eastAsia="${a}" w:hAnsi="${a}" w:cs="${a}"/>`;
262
+ }
263
+ if (l && (c += `<w:sz w:val="${l}"/><w:szCs w:val="${l}"/>`), w && (c += `<w:color w:val="${w}"/>`), r && (c += "<w:b/><w:bCs/>"), t && (c += "<w:i/><w:iCs/>"), e && (c += '<w:u w:val="single"/>'), s && (c += "<w:strike/>"), i || m) {
264
+ const a = [];
265
+ i && a.push(`w:val="${N(i)}"`), m && a.push(`w:eastAsia="${N(m)}"`), c += `<w:lang ${a.join(" ")}/>`;
266
+ }
267
+ return d && (c += "<w:noProof/>"), `<w:r>${c ? `<w:rPr>${c}</w:rPr>` : ""}<w:t xml:space="preserve">${N(o)}</w:t></w:r>`;
268
+ }
269
+ function lt(o, r) {
270
+ let t = "";
271
+ const e = { h1: "Heading1", h2: "Heading2", h3: "Heading3", h4: "Heading4", h5: "Heading5", h6: "Heading6" };
272
+ e[o] && (t += `<w:pStyle w:val="${e[o]}"/>`), (o === "li" || o === "blockquote" || o === "pre") && (t = '<w:ind w:left="720"/>');
273
+ const s = r.getAttribute("style") || "", n = r.closest ? r.closest("td,th") : null, l = n && n.getAttribute("style") || "", w = (r.getAttribute("align") || n?.getAttribute("align") || "").toLowerCase(), i = s.match(/text-align\s*:\s*(left|center|right|justify)/i) || l.match(/text-align\s*:\s*(left|center|right|justify)/i), m = { left: "left", center: "center", right: "right", justify: "both" };
274
+ i ? t += `<w:jc w:val="${m[i[1].toLowerCase()]}"/>` : w && m[w] && (t += `<w:jc w:val="${m[w]}"/>`);
275
+ const d = s.match(/line-height\s*:\s*([^;]+)/i), c = s.match(/margin-top\s*:\s*([\d.]+)px/i), v = s.match(/margin-bottom\s*:\s*([\d.]+)px/i);
276
+ let a = "";
277
+ if (d) {
278
+ const u = d[1].trim(), p = parseFloat(u);
279
+ if (!Number.isNaN(p) && p > 0.25 && p < 4) {
280
+ const z = Math.round(p * 240);
281
+ a += ` w:line="${z}" w:lineRule="auto"`;
282
+ } else {
283
+ const z = u.match(/([\d.]+)px/i);
284
+ if (z) {
285
+ const f = parseFloat(z[1]);
286
+ if (!Number.isNaN(f) && f > 0) {
287
+ const b = Math.round(f * 15);
288
+ a += ` w:line="${b}" w:lineRule="exact"`;
289
+ }
290
+ }
291
+ }
292
+ }
293
+ if (c) {
294
+ const u = parseFloat(c[1]);
295
+ if (!Number.isNaN(u) && u > 0) {
296
+ const p = Math.round(u * 15);
297
+ a += ` w:before="${p}"`;
298
+ }
299
+ }
300
+ if (v) {
301
+ const u = parseFloat(v[1]);
302
+ if (!Number.isNaN(u) && u > 0) {
303
+ const p = Math.round(u * 15);
304
+ a += ` w:after="${p}"`;
305
+ }
306
+ }
307
+ return a && (t += `<w:spacing${a}/>`), t ? `<w:pPr>${t}</w:pPr>` : "";
308
+ }
309
+ function N(o) {
310
+ return String(o).replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
311
+ }
312
+ function at(o) {
313
+ if (!o || typeof o != "string") return null;
314
+ const r = o.trim();
315
+ if (/^#[0-9a-f]{3,6}$/i.test(r)) {
316
+ let e = r.slice(1);
317
+ return e.length === 3 && (e = e.split("").map((s) => s + s).join("")), e.toUpperCase();
318
+ }
319
+ const t = r.match(/rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/);
320
+ return t ? [t[1], t[2], t[3]].map((e) => (+e).toString(16).padStart(2, "0")).join("").toUpperCase() : null;
321
+ }
322
+ function E(o) {
323
+ return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
324
+ <Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
325
+ <Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/>
326
+ <Default Extension="xml" ContentType="application/xml"/>
327
+ <Override PartName="/word/document.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"/>
328
+ <Override PartName="/word/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml"/>${o ? `
329
+ <Override PartName="/word/comments.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml"/>` : ""}
330
+ </Types>`;
331
+ }
332
+ function W() {
333
+ return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
334
+ <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
335
+ <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="word/document.xml"/>
336
+ </Relationships>`;
337
+ }
338
+ function G(o) {
339
+ return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
340
+ <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
341
+ <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/>${o ? `
342
+ <Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments" Target="comments.xml"/>` : ""}
343
+ </Relationships>`;
344
+ }
345
+ function X(o) {
346
+ return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
347
+ <w:document xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas"
348
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
349
+ xmlns:o="urn:schemas-microsoft-com:office:office"
350
+ xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
351
+ xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"
352
+ xmlns:v="urn:schemas-microsoft-com:vml"
353
+ xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing"
354
+ xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
355
+ xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml"
356
+ xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml"
357
+ mc:Ignorable="w14 w15">
358
+ <w:body>
359
+ ${o}
360
+ <w:sectPr>
361
+ <w:pgSz w:w="11906" w:h="16838"/>
362
+ <w:pgMar w:top="1800" w:right="1800" w:bottom="1800" w:left="1800" w:header="851" w:footer="992" w:gutter="0"/>
363
+ </w:sectPr>
364
+ </w:body>
365
+ </w:document>`;
366
+ }
367
+ function wt(o) {
368
+ return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
369
+ <w:comments xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
370
+ xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
371
+ ${o.map(({ ooxmlId: t, author: e, createdAt: s, note: n }) => {
372
+ const l = N(String(e || "作者")), w = N(String(e || "作").charAt(0)), i = s ? new Date(s).toISOString().slice(0, 19) + "Z" : (/* @__PURE__ */ new Date()).toISOString().slice(0, 19) + "Z", m = N(String(n || ""));
373
+ return ` <w:comment w:id="${t}" w:author="${l}" w:date="${i}" w:initials="${w}">
374
+ <w:p>
375
+ <w:pPr><w:pStyle w:val="CommentText"/></w:pPr>
376
+ <w:r><w:rPr><w:rStyle w:val="CommentReference"/></w:rPr><w:annotationRef/></w:r>
377
+ <w:r><w:t>${m}</w:t></w:r>
378
+ </w:p>
379
+ </w:comment>`;
380
+ }).join(`
381
+ `)}
382
+ </w:comments>`;
383
+ }
384
+ function Z() {
385
+ return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
386
+ <w:styles xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
387
+ xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
388
+ <w:docDefaults>
389
+ <w:rPrDefault>
390
+ <w:rPr>
391
+ <w:rFonts w:ascii="宋体" w:eastAsia="宋体" w:hAnsi="宋体" w:cs="宋体"/>
392
+ <w:sz w:val="24"/>
393
+ <w:szCs w:val="24"/>
394
+ <w:lang w:val="zh-CN" w:eastAsia="zh-CN" w:bidi="zh-CN"/>
395
+ </w:rPr>
396
+ </w:rPrDefault>
397
+ </w:docDefaults>
398
+ <w:style w:type="paragraph" w:default="1" w:styleId="Normal">
399
+ <w:name w:val="Normal"/>
400
+ <w:qFormat/>
401
+ </w:style>
402
+ <w:style w:type="paragraph" w:styleId="Heading1">
403
+ <w:name w:val="heading 1"/>
404
+ <w:basedOn w:val="Normal"/>
405
+ <w:rPr><w:b/><w:sz w:val="40"/></w:rPr>
406
+ </w:style>
407
+ <w:style w:type="paragraph" w:styleId="Heading2">
408
+ <w:name w:val="heading 2"/>
409
+ <w:basedOn w:val="Normal"/>
410
+ <w:rPr><w:b/><w:sz w:val="32"/></w:rPr>
411
+ </w:style>
412
+ <w:style w:type="paragraph" w:styleId="Heading3">
413
+ <w:name w:val="heading 3"/>
414
+ <w:basedOn w:val="Normal"/>
415
+ <w:rPr><w:b/><w:sz w:val="28"/></w:rPr>
416
+ </w:style>
417
+ <w:style w:type="paragraph" w:styleId="Heading4">
418
+ <w:name w:val="heading 4"/>
419
+ <w:basedOn w:val="Normal"/>
420
+ <w:rPr><w:b/><w:sz w:val="26"/></w:rPr>
421
+ </w:style>
422
+ <w:style w:type="paragraph" w:styleId="Heading5">
423
+ <w:name w:val="heading 5"/>
424
+ <w:basedOn w:val="Normal"/>
425
+ <w:rPr><w:b/><w:sz w:val="24"/></w:rPr>
426
+ </w:style>
427
+ <w:style w:type="paragraph" w:styleId="Heading6">
428
+ <w:name w:val="heading 6"/>
429
+ <w:basedOn w:val="Normal"/>
430
+ <w:rPr><w:sz w:val="24"/></w:rPr>
431
+ </w:style>
432
+ <w:style w:type="paragraph" w:styleId="CommentText">
433
+ <w:name w:val="annotation text"/>
434
+ <w:basedOn w:val="Normal"/>
435
+ <w:rPr><w:sz w:val="20"/><w:szCs w:val="20"/></w:rPr>
436
+ </w:style>
437
+ <w:style w:type="character" w:styleId="CommentReference">
438
+ <w:name w:val="annotation reference"/>
439
+ <w:rPr><w:sz w:val="16"/><w:szCs w:val="16"/></w:rPr>
440
+ </w:style>
441
+ </w:styles>`;
442
+ }
443
+ export {
444
+ ct as a,
445
+ it as b,
446
+ V as e,
447
+ K as s
448
+ };
@@ -1,448 +1,7 @@
1
- import * as L from "jszip";
2
- import * as k from "file-saver";
3
- const W = L.default || L, V = (
4
- // ESM 构建下常见:具名导出 saveAs
5
- k.saveAs || // UMD / default 导出下可能直接是函数
6
- k.default || k
7
- );
8
- async function Y(e, o, t = "文档") {
9
- const s = new DOMParser().parseFromString(e, "text/html"), n = /* @__PURE__ */ new Map(), l = [], w = new Map((o || []).map((v) => [v.id, v]));
10
- s.body.querySelectorAll("span[data-comment-id]").forEach((v) => {
11
- const a = v.getAttribute("data-comment-id");
12
- if (a && w.has(a) && !n.has(a)) {
13
- const u = l.length;
14
- n.set(a, u), l.push({ ...w.get(a), ooxmlId: u });
15
- }
16
- });
17
- const i = E(s.body, n), m = l.length > 0, d = new W();
18
- d.file("[Content_Types].xml", G(m)), d.file("_rels/.rels", U()), d.file("word/document.xml", Z(i)), d.file("word/styles.xml", J()), d.file("word/_rels/document.xml.rels", X(m)), m && d.file("word/comments.xml", it(l));
19
- const c = await d.generateAsync({
20
- type: "blob",
21
- mimeType: "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
22
- });
23
- V(c, `${t}.docx`);
24
- }
25
- async function ct(e, o = "文档") {
26
- return Y(e, [], o);
27
- }
28
- async function mt(e, o = "文档") {
29
- const r = new DOMParser().parseFromString(e, "text/html"), s = E(r.body, /* @__PURE__ */ new Map()), n = new W();
30
- return n.file("[Content_Types].xml", G(!1)), n.file("_rels/.rels", U()), n.file("word/document.xml", Z(s)), n.file("word/styles.xml", J()), n.file("word/_rels/document.xml.rels", X(!1)), n.generateAsync({
31
- type: "blob",
32
- mimeType: "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
33
- });
34
- }
35
- const Q = /* @__PURE__ */ new Set(["p", "div", "h1", "h2", "h3", "h4", "h5", "h6", "li", "blockquote", "pre"]), tt = /* @__PURE__ */ new Set(["script", "style", "head"]), et = {
36
- signle: { val: "single", sz: "6" },
37
- "signle-bold": { val: "thick", sz: "12" },
38
- double: { val: "double", sz: "6" },
39
- dotted: { val: "dotted", sz: "6" },
40
- dashed: { val: "dashed", sz: "6" },
41
- "dashed-double": { val: "dashSmallGap", sz: "6" },
42
- "double-bold-top": { val: "thinThickSmallGap", sz: "24" },
43
- "double-bold-bottom": { val: "thickThinSmallGap", sz: "24" },
44
- wavy: { val: "wave", sz: "6" }
45
- };
46
- function E(e, o) {
47
- let t = "";
48
- for (const r of e.childNodes)
49
- t += q(r, o);
50
- return t.includes("<w:p") || (t = "<w:p><w:r><w:t></w:t></w:r></w:p>"), t;
51
- }
52
- function q(e, o) {
53
- if (e.nodeType === 3) {
54
- const n = e.textContent;
55
- return !n || !n.trim() ? "" : `<w:p><w:r><w:t xml:space="preserve">${N(n)}</w:t></w:r></w:p>`;
56
- }
57
- if (e.nodeType !== 1) return "";
58
- const t = e, r = t.tagName.toLowerCase();
59
- if (tt.has(r)) return "";
60
- if (Q.has(r)) {
61
- const n = at(r, t), l = S(t, o, {});
62
- return r === "p" ? `<w:p>${n}${l || "<w:r><w:t></w:t></w:r>"}</w:p>` : l ? `<w:p>${n}${l}</w:p>` : "";
63
- }
64
- if (r === "table") {
65
- const n = t.querySelector("colgroup[data-word-col-layout]"), l = t.querySelectorAll("tbody tr, tr"), w = l.length === 1, i = l[0] ? [...l[0].querySelectorAll("td, th")] : [];
66
- return n || w && i.length >= 2 ? rt(t, o) : ot(t, o);
67
- }
68
- if (["ul", "ol", "tbody", "thead", "tfoot", "tr", "td", "th"].includes(r)) {
69
- let n = "";
70
- for (const l of t.childNodes)
71
- n += q(l, o);
72
- return n;
73
- }
74
- if (r === "hr") {
75
- const n = t.getAttribute("data-type") || "signle", w = (t.getAttribute("data-color") || "#000000").replace(/^#/, ""), i = et[n] || { val: "single", sz: "6" };
76
- return `<w:p><w:pPr><w:pBdr><w:bottom w:val="${i.val}" w:color="${w}" w:sz="${i.sz}" w:space="1"/></w:pBdr></w:pPr></w:p>`;
77
- }
78
- const s = S(t, o, {});
79
- return s ? `<w:p>${s}</w:p>` : "";
80
- }
81
- function ot(e, o) {
82
- const t = e.querySelectorAll("tr");
83
- if (!t.length) return "";
84
- const r = e.querySelector("colgroup"), s = r ? [...r.querySelectorAll("col")] : [], n = t[0], l = n ? [...n.querySelectorAll("td, th")] : [], w = Math.max(s.length, l.length, 1), i = 8306, m = (h, b) => {
85
- const f = (h && h.getAttribute("style") || "").match(/width\s*:\s*([\d.]+)%/);
86
- return f ? parseFloat(f[1]) : 100 / b;
87
- }, d = Array.from({ length: w }).map((h, b) => {
88
- const $ = s[b], f = m($, w);
89
- return Math.round(f / 100 * i);
90
- }), c = d.map((h) => `<w:gridCol w:w="${h}"/>`).join(""), v = e.getAttribute("data-word-tbl-borders");
91
- let a = null;
92
- if (v)
93
- try {
94
- const h = JSON.parse(v), b = h.val || "single", $ = h.sz || "4", f = h.color || "auto", C = h.space || "0";
95
- a = `
96
- <w:tblBorders>
97
- <w:top w:val="${b}" w:sz="${$}" w:space="${C}" w:color="${f}"/>
98
- <w:left w:val="${b}" w:sz="${$}" w:space="${C}" w:color="${f}"/>
99
- <w:bottom w:val="${b}" w:sz="${$}" w:space="${C}" w:color="${f}"/>
100
- <w:right w:val="${b}" w:sz="${$}" w:space="${C}" w:color="${f}"/>
101
- <w:insideH w:val="${b}" w:sz="${$}" w:space="${C}" w:color="${f}"/>
102
- <w:insideV w:val="${b}" w:sz="${$}" w:space="${C}" w:color="${f}"/>
103
- </w:tblBorders>`;
104
- } catch {
105
- a = null;
106
- }
107
- a || (a = `
108
- <w:tblBorders>
109
- <w:top w:val="single" w:sz="8" w:color="000000"/>
110
- <w:left w:val="single" w:sz="8" w:color="000000"/>
111
- <w:bottom w:val="single" w:sz="8" w:color="000000"/>
112
- <w:right w:val="single" w:sz="8" w:color="000000"/>
113
- <w:insideH w:val="single" w:sz="8" w:color="000000"/>
114
- <w:insideV w:val="single" w:sz="8" w:color="000000"/>
115
- </w:tblBorders>`);
116
- const u = `
117
- <w:tblPr>
118
- <w:tblW w:w="${i}" w:type="dxa"/>
119
- <w:tblLayout w:type="fixed"/>${a}
120
- </w:tblPr>`, p = Array(w).fill(0);
121
- let z = "";
122
- return t.forEach((h) => {
123
- const b = [...h.querySelectorAll("td, th")];
124
- if (!b.length) return;
125
- const $ = [];
126
- let f = 0;
127
- b.forEach((A) => {
128
- for (; f < w && p[f] > 0; )
129
- f++;
130
- const g = parseInt(A.getAttribute("colspan") ?? "", 10), y = !Number.isNaN(g) && g > 1 ? g : 1, x = parseInt(A.getAttribute("rowspan") ?? "", 10), R = !Number.isNaN(x) && x > 1 ? x : 1;
131
- $.push({
132
- startCol: f,
133
- colspan: y,
134
- rowspan: R,
135
- el: A
136
- }), f += y;
137
- });
138
- let C = "", P = 0;
139
- for (; P < w; ) {
140
- const A = $.find((g) => g.startCol === P);
141
- if (A) {
142
- const { el: g, colspan: y, rowspan: x } = A, R = y > 1, F = x > 1, D = (g.getAttribute("style") || "").match(/vertical-align\s*:\s*(top|middle|bottom)/i), I = D ? D[1].toLowerCase() : "middle", B = { top: "top", middle: "center", bottom: "bottom" };
143
- let _ = 0;
144
- for (let T = 0; T < y; T++) {
145
- const j = d[P + T];
146
- _ += Number.isFinite(j) ? j : Math.round(i / w);
147
- }
148
- const M = [];
149
- if (R && M.push(`<w:gridSpan w:val="${y}"/>`), I && B[I] && M.push(`<w:vAlign w:val="${B[I]}"/>`), F) {
150
- M.push('<w:vMerge w:val="restart"/>');
151
- for (let T = 0; T < y; T++)
152
- p[P + T] = x;
153
- }
154
- _ > 0 && M.push(`<w:tcW w:w="${_}" w:type="dxa"/>`);
155
- const K = `<w:tcPr>${M.join("")}</w:tcPr>`;
156
- let H = "";
157
- for (const T of g.childNodes)
158
- H += q(T, o);
159
- H || (H = "<w:p><w:r><w:t></w:t></w:r></w:p>"), C += `<w:tc>${K}${H}</w:tc>`, P += y;
160
- } else if (p[P] > 0) {
161
- let g = 0;
162
- for (; P + g < w && p[P + g] > 0; )
163
- g += 1;
164
- const y = Math.max(g, 1);
165
- let x = 0;
166
- for (let O = 0; O < y; O++) {
167
- const D = d[P + O];
168
- x += Number.isFinite(D) ? D : Math.round(i / w);
169
- }
170
- const F = `<w:tcPr>${[
171
- y > 1 ? `<w:gridSpan w:val="${y}"/>` : "",
172
- "<w:vMerge/>",
173
- '<w:vAlign w:val="center"/>',
174
- x > 0 ? `<w:tcW w:w="${x}" w:type="dxa"/>` : ""
175
- ].filter(Boolean).join("")}</w:tcPr>`;
176
- C += `<w:tc>${F}<w:p/></w:tc>`, P += y;
177
- } else {
178
- const g = d[P], y = Number.isFinite(g) ? g : Math.round(i / w), x = [];
179
- y > 0 && x.push(`<w:tcW w:w="${y}" w:type="dxa"/>`);
180
- const R = `<w:tcPr>${x.join("")}</w:tcPr>`;
181
- C += `<w:tc>${R}<w:p><w:r><w:t></w:t></w:r></w:p></w:tc>`, P += 1;
182
- }
183
- }
184
- for (let A = 0; A < p.length; A++)
185
- p[A] > 0 && (p[A] -= 1);
186
- z += `<w:tr>${C}</w:tr>`;
187
- }), z ? `<w:tbl>${u}<w:tblGrid>${c}</w:tblGrid>${z}</w:tbl>` : "";
188
- }
189
- function rt(e, o) {
190
- const t = e.querySelector("colgroup"), r = t ? [...t.querySelectorAll("col")] : [], s = e.querySelectorAll("tbody tr, tr"), n = s[0] ? [...s[0].querySelectorAll("td, th")] : [], l = Math.max(r.length, n.length, 1), w = 8306, i = 720, m = (a) => {
191
- const p = (a && a.getAttribute("style") || "").match(/width\s*:\s*([\d.]+)%/);
192
- return p ? parseFloat(p[1]) : 100 / l;
193
- }, d = r.length > 0 ? r.map((a) => Math.round(m(a) / 100 * w)) : Array.from({ length: l }, () => Math.round((w - i * (l - 1)) / l));
194
- let c = "";
195
- n.forEach((a, u) => {
196
- for (const p of a.childNodes)
197
- c += q(p, o);
198
- u < n.length - 1 && (c += '<w:p><w:r><w:br w:type="column"/></w:r></w:p>');
199
- });
200
- const v = d.map((a) => `<w:col w:w="${a}" w:space="${i}"/>`).join("");
201
- return c += `<w:p><w:pPr><w:sectPr>
202
- <w:cols w:num="${l}" w:space="${i}" w:equalWidth="0">${v}</w:cols>
203
- <w:pgSz w:w="11906" w:h="16838"/>
204
- <w:pgMar w:top="1800" w:right="1800" w:bottom="1800" w:left="1800" w:header="851" w:footer="992" w:gutter="0"/>
205
- </w:sectPr></w:pPr></w:p>`, c;
206
- }
207
- function S(e, o, t) {
208
- let r = "";
209
- for (const s of e.childNodes)
210
- r += nt(s, o, t);
211
- return r;
212
- }
213
- function nt(e, o, t) {
214
- if (e.nodeType === 3) {
215
- const n = e.textContent;
216
- return n ? lt(n, t) : "";
217
- }
218
- if (e.nodeType !== 1) return "";
219
- const r = e, s = r.tagName.toLowerCase();
220
- if (s === "span" && r.hasAttribute("data-comment-id")) {
221
- const n = r.getAttribute("data-comment-id"), l = n !== null ? o.get(n) : void 0;
222
- if (l !== void 0) {
223
- const w = S(r, o, t);
224
- return `<w:commentRangeStart w:id="${l}"/>` + w + `<w:commentRangeEnd w:id="${l}"/><w:r><w:rPr><w:rStyle w:val="CommentReference"/></w:rPr><w:commentReference w:id="${l}"/></w:r>`;
225
- }
226
- return S(r, o, t);
227
- }
228
- if (s === "span") {
229
- const n = st(r, t);
230
- return S(r, o, n);
231
- }
232
- return s === "strong" || s === "b" ? S(r, o, { ...t, bold: !0 }) : s === "em" || s === "i" ? S(r, o, { ...t, italic: !0 }) : s === "u" ? S(r, o, { ...t, underline: !0 }) : s === "s" || s === "del" || s === "strike" ? S(r, o, { ...t, strike: !0 }) : s === "br" ? "<w:r><w:br/></w:r>" : S(r, o, t);
233
- }
234
- function st(e, o) {
235
- const t = e.getAttribute("style") || "", r = t.match(/font-family\s*:\s*([^;]+)/i), s = r ? r[1].trim().replace(/["']/g, "") : null, n = t.match(/font-size\s*:\s*([\d.]+)(px|pt)/i);
236
- let l = null;
237
- if (n) {
238
- const m = parseFloat(n[1]);
239
- l = n[2].toLowerCase() === "pt" ? Math.round(m * 2) : Math.round(m * 1.5);
240
- }
241
- const w = t.match(/(?:^|;)\s*color\s*:\s*([^;]+)/i), i = w ? wt(w[1].trim()) : null;
242
- return {
243
- ...o,
244
- bold: o.bold || /font-weight\s*:\s*(bold|[789]\d\d)/i.test(t),
245
- italic: o.italic || /font-style\s*:\s*italic/i.test(t),
246
- underline: o.underline || /text-decoration[^;]*underline/i.test(t),
247
- strike: o.strike || /text-decoration[^;]*line-through/i.test(t),
248
- fontFamily: s || o.fontFamily,
249
- fontSize: l ?? o.fontSize,
250
- color: i || o.color,
251
- // 从导入阶段保留下来的语言 / 拼写检查标记(data-word-*)
252
- lang: e.getAttribute("data-word-lang") || o.lang || null,
253
- langEastAsia: e.getAttribute("data-word-lang-eastAsia") || // 兼容一下大小写差异
254
- e.getAttribute("data-word-lang-eastasia") || o.langEastAsia || null,
255
- noProof: e.hasAttribute("data-word-no-proof") ? e.getAttribute("data-word-no-proof") !== "0" && e.getAttribute("data-word-no-proof") !== "false" : o.noProof
256
- };
257
- }
258
- function lt(e, { bold: o, italic: t, underline: r, strike: s, fontFamily: n, fontSize: l, color: w, lang: i, langEastAsia: m, noProof: d } = {}) {
259
- let c = "";
260
- if (n) {
261
- const a = N(n);
262
- c += `<w:rFonts w:ascii="${a}" w:eastAsia="${a}" w:hAnsi="${a}" w:cs="${a}"/>`;
263
- }
264
- if (l && (c += `<w:sz w:val="${l}"/><w:szCs w:val="${l}"/>`), w && (c += `<w:color w:val="${w}"/>`), o && (c += "<w:b/><w:bCs/>"), t && (c += "<w:i/><w:iCs/>"), r && (c += '<w:u w:val="single"/>'), s && (c += "<w:strike/>"), i || m) {
265
- const a = [];
266
- i && a.push(`w:val="${N(i)}"`), m && a.push(`w:eastAsia="${N(m)}"`), c += `<w:lang ${a.join(" ")}/>`;
267
- }
268
- return d && (c += "<w:noProof/>"), `<w:r>${c ? `<w:rPr>${c}</w:rPr>` : ""}<w:t xml:space="preserve">${N(e)}</w:t></w:r>`;
269
- }
270
- function at(e, o) {
271
- let t = "";
272
- const r = { h1: "Heading1", h2: "Heading2", h3: "Heading3", h4: "Heading4", h5: "Heading5", h6: "Heading6" };
273
- r[e] && (t += `<w:pStyle w:val="${r[e]}"/>`), (e === "li" || e === "blockquote" || e === "pre") && (t = '<w:ind w:left="720"/>');
274
- const s = o.getAttribute("style") || "", n = o.closest ? o.closest("td,th") : null, l = n && n.getAttribute("style") || "", w = (o.getAttribute("align") || n?.getAttribute("align") || "").toLowerCase(), i = s.match(/text-align\s*:\s*(left|center|right|justify)/i) || l.match(/text-align\s*:\s*(left|center|right|justify)/i), m = { left: "left", center: "center", right: "right", justify: "both" };
275
- i ? t += `<w:jc w:val="${m[i[1].toLowerCase()]}"/>` : w && m[w] && (t += `<w:jc w:val="${m[w]}"/>`);
276
- const d = s.match(/line-height\s*:\s*([^;]+)/i), c = s.match(/margin-top\s*:\s*([\d.]+)px/i), v = s.match(/margin-bottom\s*:\s*([\d.]+)px/i);
277
- let a = "";
278
- if (d) {
279
- const u = d[1].trim(), p = parseFloat(u);
280
- if (!Number.isNaN(p) && p > 0.25 && p < 4) {
281
- const z = Math.round(p * 240);
282
- a += ` w:line="${z}" w:lineRule="auto"`;
283
- } else {
284
- const z = u.match(/([\d.]+)px/i);
285
- if (z) {
286
- const h = parseFloat(z[1]);
287
- if (!Number.isNaN(h) && h > 0) {
288
- const b = Math.round(h * 15);
289
- a += ` w:line="${b}" w:lineRule="exact"`;
290
- }
291
- }
292
- }
293
- }
294
- if (c) {
295
- const u = parseFloat(c[1]);
296
- if (!Number.isNaN(u) && u > 0) {
297
- const p = Math.round(u * 15);
298
- a += ` w:before="${p}"`;
299
- }
300
- }
301
- if (v) {
302
- const u = parseFloat(v[1]);
303
- if (!Number.isNaN(u) && u > 0) {
304
- const p = Math.round(u * 15);
305
- a += ` w:after="${p}"`;
306
- }
307
- }
308
- return a && (t += `<w:spacing${a}/>`), t ? `<w:pPr>${t}</w:pPr>` : "";
309
- }
310
- function N(e) {
311
- return String(e).replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
312
- }
313
- function wt(e) {
314
- if (!e || typeof e != "string") return null;
315
- const o = e.trim();
316
- if (/^#[0-9a-f]{3,6}$/i.test(o)) {
317
- let r = o.slice(1);
318
- return r.length === 3 && (r = r.split("").map((s) => s + s).join("")), r.toUpperCase();
319
- }
320
- const t = o.match(/rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/);
321
- return t ? [t[1], t[2], t[3]].map((r) => (+r).toString(16).padStart(2, "0")).join("").toUpperCase() : null;
322
- }
323
- function G(e) {
324
- return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
325
- <Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
326
- <Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/>
327
- <Default Extension="xml" ContentType="application/xml"/>
328
- <Override PartName="/word/document.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"/>
329
- <Override PartName="/word/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml"/>${e ? `
330
- <Override PartName="/word/comments.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml"/>` : ""}
331
- </Types>`;
332
- }
333
- function U() {
334
- return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
335
- <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
336
- <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="word/document.xml"/>
337
- </Relationships>`;
338
- }
339
- function X(e) {
340
- return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
341
- <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
342
- <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/>${e ? `
343
- <Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments" Target="comments.xml"/>` : ""}
344
- </Relationships>`;
345
- }
346
- function Z(e) {
347
- return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
348
- <w:document xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas"
349
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
350
- xmlns:o="urn:schemas-microsoft-com:office:office"
351
- xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
352
- xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"
353
- xmlns:v="urn:schemas-microsoft-com:vml"
354
- xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing"
355
- xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
356
- xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml"
357
- xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml"
358
- mc:Ignorable="w14 w15">
359
- <w:body>
360
- ${e}
361
- <w:sectPr>
362
- <w:pgSz w:w="11906" w:h="16838"/>
363
- <w:pgMar w:top="1800" w:right="1800" w:bottom="1800" w:left="1800" w:header="851" w:footer="992" w:gutter="0"/>
364
- </w:sectPr>
365
- </w:body>
366
- </w:document>`;
367
- }
368
- function it(e) {
369
- return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
370
- <w:comments xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
371
- xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
372
- ${e.map(({ ooxmlId: t, author: r, createdAt: s, note: n }) => {
373
- const l = N(String(r || "作者")), w = N(String(r || "作").charAt(0)), i = s ? new Date(s).toISOString().slice(0, 19) + "Z" : (/* @__PURE__ */ new Date()).toISOString().slice(0, 19) + "Z", m = N(String(n || ""));
374
- return ` <w:comment w:id="${t}" w:author="${l}" w:date="${i}" w:initials="${w}">
375
- <w:p>
376
- <w:pPr><w:pStyle w:val="CommentText"/></w:pPr>
377
- <w:r><w:rPr><w:rStyle w:val="CommentReference"/></w:rPr><w:annotationRef/></w:r>
378
- <w:r><w:t>${m}</w:t></w:r>
379
- </w:p>
380
- </w:comment>`;
381
- }).join(`
382
- `)}
383
- </w:comments>`;
384
- }
385
- function J() {
386
- return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
387
- <w:styles xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
388
- xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
389
- <w:docDefaults>
390
- <w:rPrDefault>
391
- <w:rPr>
392
- <w:rFonts w:ascii="宋体" w:eastAsia="宋体" w:hAnsi="宋体" w:cs="宋体"/>
393
- <w:sz w:val="24"/>
394
- <w:szCs w:val="24"/>
395
- <w:lang w:val="zh-CN" w:eastAsia="zh-CN" w:bidi="zh-CN"/>
396
- </w:rPr>
397
- </w:rPrDefault>
398
- </w:docDefaults>
399
- <w:style w:type="paragraph" w:default="1" w:styleId="Normal">
400
- <w:name w:val="Normal"/>
401
- <w:qFormat/>
402
- </w:style>
403
- <w:style w:type="paragraph" w:styleId="Heading1">
404
- <w:name w:val="heading 1"/>
405
- <w:basedOn w:val="Normal"/>
406
- <w:rPr><w:b/><w:sz w:val="40"/></w:rPr>
407
- </w:style>
408
- <w:style w:type="paragraph" w:styleId="Heading2">
409
- <w:name w:val="heading 2"/>
410
- <w:basedOn w:val="Normal"/>
411
- <w:rPr><w:b/><w:sz w:val="32"/></w:rPr>
412
- </w:style>
413
- <w:style w:type="paragraph" w:styleId="Heading3">
414
- <w:name w:val="heading 3"/>
415
- <w:basedOn w:val="Normal"/>
416
- <w:rPr><w:b/><w:sz w:val="28"/></w:rPr>
417
- </w:style>
418
- <w:style w:type="paragraph" w:styleId="Heading4">
419
- <w:name w:val="heading 4"/>
420
- <w:basedOn w:val="Normal"/>
421
- <w:rPr><w:b/><w:sz w:val="26"/></w:rPr>
422
- </w:style>
423
- <w:style w:type="paragraph" w:styleId="Heading5">
424
- <w:name w:val="heading 5"/>
425
- <w:basedOn w:val="Normal"/>
426
- <w:rPr><w:b/><w:sz w:val="24"/></w:rPr>
427
- </w:style>
428
- <w:style w:type="paragraph" w:styleId="Heading6">
429
- <w:name w:val="heading 6"/>
430
- <w:basedOn w:val="Normal"/>
431
- <w:rPr><w:sz w:val="24"/></w:rPr>
432
- </w:style>
433
- <w:style w:type="paragraph" w:styleId="CommentText">
434
- <w:name w:val="annotation text"/>
435
- <w:basedOn w:val="Normal"/>
436
- <w:rPr><w:sz w:val="20"/><w:szCs w:val="20"/></w:rPr>
437
- </w:style>
438
- <w:style w:type="character" w:styleId="CommentReference">
439
- <w:name w:val="annotation reference"/>
440
- <w:rPr><w:sz w:val="16"/><w:szCs w:val="16"/></w:rPr>
441
- </w:style>
442
- </w:styles>`;
443
- }
1
+ import "jszip";
2
+ import { b as r, a as e, e as p } from "./wordDocxExport-CYxYyGfR.js";
444
3
  export {
445
- ct as exportHtmlToDocx,
446
- mt as exportHtmlToDocxBlob,
447
- Y as exportToDocx
4
+ r as exportHtmlToDocx,
5
+ e as exportHtmlToDocxBlob,
6
+ p as exportToDocx
448
7
  };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "ai-word-editor",
3
3
  "private": false,
4
- "version": "0.0.21",
4
+ "version": "0.0.23",
5
5
  "type": "module",
6
6
  "main": "./src/lib/index.ts",
7
7
  "module": "./src/lib/index.ts",
package/src/App.vue CHANGED
@@ -137,7 +137,7 @@
137
137
 
138
138
  <script setup>
139
139
  import { ref, onMounted, onUnmounted, watch, createApp, h } from 'vue'
140
- import { saveAs } from 'file-saver'
140
+ import { saveAsBlob } from './utils/saveAsBlob'
141
141
  import CommentPanel from './components/CommentPanel.vue'
142
142
  import CommentAddDialog from './components/CommentAddDialog.vue'
143
143
  import { CommentMark } from './extensions/CommentMark.js'
@@ -394,7 +394,7 @@ const exportWordBlob = async () => {
394
394
  exportBlobLoading.value = true
395
395
  try {
396
396
  const blob = await exportHtmlToDocxBlob(html, currentDocTitle.value || '文档')
397
- saveAs(blob, `${currentDocTitle.value || '文档'}.docx`)
397
+ saveAsBlob(blob, `${currentDocTitle.value || '文档'}.docx`)
398
398
  } catch (err) {
399
399
  console.error('Word 流导出失败:', err)
400
400
  alert('Word 流导出失败,请稍后重试')
@@ -0,0 +1,15 @@
1
+ /**
2
+ * 使用原生 API 触发 Blob/File 下载。
3
+ * 不依赖 file-saver,避免其 UMD 在 ESM 环境下报 "Cannot set properties of undefined (setting 'FileSaver')"。
4
+ */
5
+ export function saveAsBlob(blob: Blob | File, filename = 'download'): void {
6
+ const url = URL.createObjectURL(blob)
7
+ const a = document.createElement('a')
8
+ a.href = url
9
+ a.download = filename
10
+ a.style.display = 'none'
11
+ document.body.appendChild(a)
12
+ a.click()
13
+ document.body.removeChild(a)
14
+ URL.revokeObjectURL(url)
15
+ }
@@ -10,19 +10,11 @@
10
10
  * word/_rels/document.xml.rels
11
11
  */
12
12
  import * as JSZipNS from 'jszip'
13
- import * as FileSaverNS from 'file-saver'
13
+ import { saveAsBlob } from './saveAsBlob'
14
14
 
15
15
  // jszip 在不同打包方式下可能没有 default 导出,这里做一层兼容
16
16
  const JSZip = (JSZipNS as any).default || (JSZipNS as any)
17
17
 
18
- // file-saver 在不同打包方式下也可能没有命名导出 saveAs,这里统一兼容
19
- const saveAs: (data: Blob | File, filename?: string) => void =
20
- // ESM 构建下常见:具名导出 saveAs
21
- ((FileSaverNS as any).saveAs as any) ||
22
- // UMD / default 导出下可能直接是函数
23
- ((FileSaverNS as any).default as any) ||
24
- (FileSaverNS as any)
25
-
26
18
  // ─── 公开类型 ─────────────────────────────────────────────────
27
19
 
28
20
  export interface WordComment {
@@ -108,7 +100,7 @@ export async function exportToDocx(
108
100
  mimeType:
109
101
  'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
110
102
  })
111
- saveAs(blob, `${filename}.docx`)
103
+ saveAsBlob(blob, `${filename}.docx`)
112
104
  }
113
105
 
114
106
  /**