docxodus 11.0.0 → 12.0.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 +7 -5
- package/dist/editor-comments.d.ts +129 -0
- package/dist/editor-comments.d.ts.map +1 -0
- package/dist/editor-comments.js +805 -0
- package/dist/editor-comments.js.map +1 -0
- package/dist/editor-headerfooter.d.ts +125 -85
- package/dist/editor-headerfooter.d.ts.map +1 -1
- package/dist/editor-headerfooter.js +572 -306
- package/dist/editor-headerfooter.js.map +1 -1
- package/dist/editor-image-patch.d.ts +38 -0
- package/dist/editor-image-patch.d.ts.map +1 -0
- package/dist/editor-image-patch.js +101 -0
- package/dist/editor-image-patch.js.map +1 -0
- package/dist/editor.bundle.js +3760 -785
- package/dist/editor.d.ts +237 -5
- package/dist/editor.d.ts.map +1 -1
- package/dist/editor.js +1063 -112
- package/dist/editor.js.map +1 -1
- package/dist/embed.bundle.js +3784 -759
- package/dist/embed.d.ts +1 -1
- package/dist/embed.d.ts.map +1 -1
- package/dist/embed.iife.js +3772 -747
- package/dist/embed.js +10 -1
- package/dist/embed.js.map +1 -1
- package/dist/export-assets.json +14 -14
- package/dist/export-browser.bundle.js +25 -0
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/pagination.bundle.js +25 -0
- package/dist/pagination.d.ts +6 -0
- package/dist/pagination.d.ts.map +1 -1
- package/dist/pagination.js +19 -0
- package/dist/pagination.js.map +1 -1
- package/dist/ribbon-chrome.d.ts +20 -4
- package/dist/ribbon-chrome.d.ts.map +1 -1
- package/dist/ribbon-chrome.js +550 -182
- package/dist/ribbon-chrome.js.map +1 -1
- package/dist/ribbon.d.ts +5 -4
- package/dist/ribbon.d.ts.map +1 -1
- package/dist/ribbon.js +941 -141
- package/dist/ribbon.js.map +1 -1
- package/dist/session.bundle.js +48 -3
- package/dist/session.d.ts +35 -4
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +44 -3
- package/dist/session.js.map +1 -1
- package/dist/types.d.ts +114 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/viewport.d.ts +7 -0
- package/dist/viewport.d.ts.map +1 -1
- package/dist/viewport.js +12 -0
- package/dist/viewport.js.map +1 -1
- package/dist/wasm/_framework/DocumentFormat.OpenXml.wasm +0 -0
- package/dist/wasm/_framework/DocumentFormat.OpenXml.wasm.br +0 -0
- package/dist/wasm/_framework/Docxodus.wasm +0 -0
- package/dist/wasm/_framework/Docxodus.wasm.br +0 -0
- package/dist/wasm/_framework/DocxodusWasm.wasm +0 -0
- package/dist/wasm/_framework/DocxodusWasm.wasm.br +0 -0
- package/dist/wasm/_framework/System.Private.Xml.Linq.wasm +0 -0
- package/dist/wasm/_framework/System.Private.Xml.Linq.wasm.br +0 -0
- package/dist/wasm/_framework/dotnet.boot.js +6 -6
- package/dist/wasm/_framework/dotnet.boot.js.br +0 -0
- package/dist/wasm/_framework/dotnet.native.wasm +0 -0
- package/dist/wasm/_framework/dotnet.native.wasm.br +0 -0
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -72,7 +72,9 @@ Two layers, so you can take as much UI as you want:
|
|
|
72
72
|
import { DocxEditor } from 'docxodus';
|
|
73
73
|
const editor = DocxEditor.open(container, docxBytes, exports);
|
|
74
74
|
|
|
75
|
-
// Or the whole surface: tabbed ribbon,
|
|
75
|
+
// Or the whole surface: Word's tabbed ribbon (fonts, colour, styles, find & replace, links,
|
|
76
|
+
// pictures, tables, page setup, tracked changes), Word-style comment bubbles beside the page,
|
|
77
|
+
// in-place header/footer editing, a status bar with zoom, and the loading overlay.
|
|
76
78
|
import { mountRibbon } from 'docxodus';
|
|
77
79
|
const ribbon = mountRibbon(container, { exports });
|
|
78
80
|
ribbon.open(docxBytes, 'contract.docx');
|
|
@@ -90,7 +92,7 @@ runtime location auto-detected — no build step, no configuration:
|
|
|
90
92
|
```html
|
|
91
93
|
<div id="doc" style="height: 100dvh"></div>
|
|
92
94
|
<script type="module">
|
|
93
|
-
import { createRibbonEditor } from 'https://cdn.jsdelivr.net/npm/docxodus@
|
|
95
|
+
import { createRibbonEditor } from 'https://cdn.jsdelivr.net/npm/docxodus@11.0.0/dist/embed.bundle.js';
|
|
94
96
|
const ribbon = await createRibbonEditor('#doc', './contract.docx'); // or bytes / Blob / File
|
|
95
97
|
// ...later: const editedBytes = ribbon.save();
|
|
96
98
|
</script>
|
|
@@ -578,7 +580,7 @@ so a page can embed a full viewer or editor without hosting anything itself.
|
|
|
578
580
|
<div id="app" style="height: 100dvh"></div>
|
|
579
581
|
<script type="module">
|
|
580
582
|
import { createViewer, createEditor, createRibbonEditor }
|
|
581
|
-
from 'https://cdn.jsdelivr.net/npm/docxodus@
|
|
583
|
+
from 'https://cdn.jsdelivr.net/npm/docxodus@11.0.0/dist/embed.bundle.js';
|
|
582
584
|
|
|
583
585
|
// Choose a factory, or render several into separate containers as shown.
|
|
584
586
|
// Source may be a URL, Uint8Array, ArrayBuffer, Blob, or File.
|
|
@@ -608,7 +610,7 @@ For pages that can't use modules, `dist/embed.iife.js` exposes the same surface
|
|
|
608
610
|
|
|
609
611
|
```html
|
|
610
612
|
<div id="doc"></div>
|
|
611
|
-
<script src="https://cdn.jsdelivr.net/npm/docxodus@
|
|
613
|
+
<script src="https://cdn.jsdelivr.net/npm/docxodus@11.0.0/dist/embed.iife.js"></script>
|
|
612
614
|
<script>
|
|
613
615
|
Docxodus.createRibbonEditor('#doc').then((ribbon) => { /* ... */ });
|
|
614
616
|
</script>
|
|
@@ -624,7 +626,7 @@ first `<bundle dir>/wasm/`, then `<bundle dir>/` as a fallback. On a CDN that re
|
|
|
624
626
|
|
|
625
627
|
### CDN caveats
|
|
626
628
|
|
|
627
|
-
- **Pin an exact version in production** (`docxodus@
|
|
629
|
+
- **Pin an exact version in production** (`docxodus@11.0.0`, not `@latest`) — CDN responses are
|
|
628
630
|
cached as immutable, and the wire shapes between the JS wrappers and the WASM assemblies must
|
|
629
631
|
come from the same release.
|
|
630
632
|
- The build patches the .NET loader to fetch with `credentials: "omit"` — required because the
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CommentGutter — Word-style comment bubbles beside the page.
|
|
3
|
+
*
|
|
4
|
+
* The converter renders a commented range inline (`span.comment-highlight[data-comment-id]`
|
|
5
|
+
* around the runs, `a.comment-marker` at the reference), and `DocxSession.ListComments` is the
|
|
6
|
+
* truth about the threads themselves. This module joins the two: for every thread root it finds
|
|
7
|
+
* the highlight in the live DOM, places a bubble in a column beside the sheet at the highlight's
|
|
8
|
+
* vertical position (stacking bubbles downward when they would overlap, the way Word's markup
|
|
9
|
+
* area does), and draws a leader line from the highlight to the bubble.
|
|
10
|
+
*
|
|
11
|
+
* Nothing here is a second source of state. The bubbles are re-derived from `listComments()`
|
|
12
|
+
* plus the DOM on every layout pass, and every action (reply, resolve, edit, delete, post a new
|
|
13
|
+
* comment) goes through the editor's session commands, then re-lays out.
|
|
14
|
+
*
|
|
15
|
+
* The gutter lives INSIDE the editor's scrolling container so bubbles scroll with the page; the
|
|
16
|
+
* host is responsible for reserving horizontal room for it (the ribbon pads the surface).
|
|
17
|
+
*/
|
|
18
|
+
import type { CommentListEntry } from "./types.js";
|
|
19
|
+
/** What the gutter needs from its editor — the comment commands plus the DOM it overlays. */
|
|
20
|
+
export interface CommentGutterHost {
|
|
21
|
+
/** The element the document renders into; the gutter is appended to it. */
|
|
22
|
+
readonly container: HTMLElement;
|
|
23
|
+
/** Author for comments and replies posted from the gutter. */
|
|
24
|
+
readonly commentAuthor: string;
|
|
25
|
+
listComments(): CommentListEntry[];
|
|
26
|
+
/** Post a comment on `target` (captured at draft time — the live selection is long gone once
|
|
27
|
+
* the user has typed into the bubble). Returns the created thread root, or null. */
|
|
28
|
+
addComment(markdown: string, author: string, target?: CommentTarget): CommentListEntry | null;
|
|
29
|
+
addCommentReply(parentAnchorId: string, markdown: string, author: string): boolean;
|
|
30
|
+
updateComment(anchorId: string, markdown: string): boolean;
|
|
31
|
+
removeComment(anchorId: string): boolean;
|
|
32
|
+
setCommentResolved(anchorId: string, resolved: boolean): boolean;
|
|
33
|
+
/** The block that would receive a new comment, and the selection span inside it. */
|
|
34
|
+
commentTarget(): CommentTarget | null;
|
|
35
|
+
}
|
|
36
|
+
export interface CommentGutterOptions {
|
|
37
|
+
/** Column width in px. Default 248. */
|
|
38
|
+
width?: number;
|
|
39
|
+
/** Vertical gap between stacked bubbles. Default 8. */
|
|
40
|
+
gap?: number;
|
|
41
|
+
/** Called after every layout with the number of visible (unresolved) threads. */
|
|
42
|
+
onChange?: (info: {
|
|
43
|
+
threads: number;
|
|
44
|
+
open: number;
|
|
45
|
+
active: string | null;
|
|
46
|
+
}) => void;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* What a comment is about to be attached to: a block and the selection span in it (null = the
|
|
50
|
+
* whole paragraph). `anchor` and `text` record which paragraph, with what content, the target
|
|
51
|
+
* was captured on, so a post that comes after the block was re-rendered or edited can find the
|
|
52
|
+
* live node and tell whether the span still means the same characters.
|
|
53
|
+
*/
|
|
54
|
+
export interface CommentTarget {
|
|
55
|
+
block: HTMLElement;
|
|
56
|
+
span: {
|
|
57
|
+
start: number;
|
|
58
|
+
length: number;
|
|
59
|
+
} | null;
|
|
60
|
+
anchor?: string;
|
|
61
|
+
text?: string;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Every comment hanging off `rootAnchorId`, transitively — replies to replies included — deepest
|
|
65
|
+
* first, so removing them in order never leaves an orphan behind. The root itself is not listed.
|
|
66
|
+
*/
|
|
67
|
+
export declare function threadMembers(comments: readonly CommentListEntry[], rootAnchorId: string): string[];
|
|
68
|
+
export declare class CommentGutter {
|
|
69
|
+
readonly element: HTMLElement;
|
|
70
|
+
private readonly host;
|
|
71
|
+
private readonly options;
|
|
72
|
+
private readonly leaders;
|
|
73
|
+
private frame;
|
|
74
|
+
private mutations;
|
|
75
|
+
private resize;
|
|
76
|
+
private activeId;
|
|
77
|
+
private draft;
|
|
78
|
+
private draftTarget;
|
|
79
|
+
private draftAnchorTop;
|
|
80
|
+
private editing;
|
|
81
|
+
private replying;
|
|
82
|
+
private expanded;
|
|
83
|
+
private visible;
|
|
84
|
+
private disposed;
|
|
85
|
+
private readonly onContainerClick;
|
|
86
|
+
constructor(host: CommentGutterHost, options?: CommentGutterOptions);
|
|
87
|
+
/** Re-derive and re-position every bubble on the next animation frame. */
|
|
88
|
+
schedule(): void;
|
|
89
|
+
/** Synchronous layout (tests, and callers that need the DOM settled now). */
|
|
90
|
+
layout(): void;
|
|
91
|
+
/** Re-append the gutter's elements after the container was emptied by a mount. */
|
|
92
|
+
reattach(): void;
|
|
93
|
+
/** Show or hide the markup area (Word's "Show Comments"). */
|
|
94
|
+
setVisible(visible: boolean): void;
|
|
95
|
+
get isVisible(): boolean;
|
|
96
|
+
/** The active thread root's anchor id, if any. */
|
|
97
|
+
get active(): string | null;
|
|
98
|
+
/** Activate a thread: its bubble lifts, its highlight darkens, and (optionally) it scrolls
|
|
99
|
+
* into view. Pass null to clear. */
|
|
100
|
+
setActive(id: string | null, opts?: {
|
|
101
|
+
scrollBubble?: boolean;
|
|
102
|
+
scrollAnchor?: boolean;
|
|
103
|
+
}): void;
|
|
104
|
+
/** Thread roots in document order — what Previous/Next step through. */
|
|
105
|
+
threadsInOrder(): CommentListEntry[];
|
|
106
|
+
/** Activate the thread after (or before) the active one, wrapping around. */
|
|
107
|
+
step(direction: 1 | -1): CommentListEntry | null;
|
|
108
|
+
/**
|
|
109
|
+
* Start a new comment on the current selection: a draft bubble appears beside it with a
|
|
110
|
+
* focused textarea. Posting goes through the editor; cancelling removes the draft. Returns
|
|
111
|
+
* false when nothing is selected/focused to comment on.
|
|
112
|
+
*/
|
|
113
|
+
beginDraft(): boolean;
|
|
114
|
+
/** Remove the draft bubble, if any. */
|
|
115
|
+
cancelDraft(): void;
|
|
116
|
+
get hasDraft(): boolean;
|
|
117
|
+
dispose(): void;
|
|
118
|
+
/** The first highlight (else marker) carrying the thread's numeric id, in the live DOM. */
|
|
119
|
+
private anchorFor;
|
|
120
|
+
private markHighlights;
|
|
121
|
+
private bubbleKey;
|
|
122
|
+
private buildBubble;
|
|
123
|
+
private buildEntry;
|
|
124
|
+
}
|
|
125
|
+
/** The gutter's stylesheet — injected once per document by the editor. Scoped to the classes
|
|
126
|
+
* this module emits, so it is safe on a host page. Colours derive from a per-author hue so a
|
|
127
|
+
* reviewer's highlight and bubble read as one. */
|
|
128
|
+
export declare const COMMENT_GUTTER_CSS = "\n.docx-comment-gutter {\n position: absolute; top: 0; right: 0; bottom: 0; z-index: 4;\n pointer-events: none; font: 12.5px/1.4 \"Inter\", system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif;\n}\n.docx-comment-gutter[data-empty] { display: none; }\n.docx-comment-leaders { position: absolute; top: 0; left: 0; z-index: 3; pointer-events: none; overflow: visible; }\n.docx-comment-leader { fill: none; stroke: hsl(var(--docx-comment-hue, 200) 45% 62%); stroke-width: 1; stroke-dasharray: 3 3; opacity: .55; }\n.docx-comment-leader-active { stroke-dasharray: none; opacity: .95; stroke-width: 1.5; }\n.docx-comment-bubble {\n position: absolute; left: 12px; right: 8px; pointer-events: auto;\n padding: 9px 10px 8px; border: 1px solid hsl(var(--docx-comment-hue, 200) 40% 78%);\n border-left: 3px solid hsl(var(--docx-comment-hue, 200) 55% 55%);\n border-radius: 8px; background: #fff; color: #1e293b;\n box-shadow: 0 1px 2px rgba(15, 23, 42, .06), 0 3px 8px rgba(15, 23, 42, .05);\n transition: top .18s cubic-bezier(.4,0,.2,1), box-shadow .15s ease, transform .15s ease;\n}\n.docx-comment-bubble[data-active] {\n border-color: hsl(var(--docx-comment-hue, 200) 55% 55%);\n box-shadow: 0 2px 6px rgba(15, 23, 42, .08), 0 10px 22px rgba(15, 23, 42, .1);\n transform: translateX(-4px); z-index: 2;\n}\n.docx-comment-bubble[data-resolved] { opacity: .72; background: #f8fafc; }\n.docx-comment-bubble[data-collapsed] .docx-comment-text { display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient: vertical; overflow: hidden; color: #64748b; }\n.docx-comment-bubble[data-collapsed] .docx-comment-reply, .docx-comment-bubble[data-collapsed] .docx-comment-bar { display: none; }\n.docx-comment-bubble[data-orphan] { border-style: dashed; }\n.docx-comment-bubble[data-draft] { border-style: solid; }\n.docx-comment-entry + .docx-comment-entry { margin-top: 8px; padding-top: 8px; border-top: 1px solid #f1f5f9; }\n.docx-comment-reply { margin-left: 10px; }\n.docx-comment-head { display: flex; align-items: center; gap: 6px; min-height: 20px; }\n.docx-comment-avatar {\n display: inline-grid; place-items: center; flex: 0 0 auto; width: 20px; height: 20px; border-radius: 50%;\n background: hsl(var(--docx-comment-hue, 200) 55% 45%); color: #fff; font-size: 9px; font-weight: 700; letter-spacing: .02em;\n}\n.docx-comment-author { font-weight: 600; font-size: 12px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.docx-comment-date { color: #94a3b8; font-size: 10.5px; white-space: nowrap; margin-left: auto; }\n.docx-comment-badge { padding: 1px 6px; border-radius: 999px; background: #dcfce7; color: #166534; font-size: 9.5px; font-weight: 600; text-transform: uppercase; letter-spacing: .06em; }\n.docx-comment-menu { display: none; gap: 2px; margin-left: 4px; }\n.docx-comment-bubble:hover .docx-comment-menu, .docx-comment-bubble[data-active] .docx-comment-menu { display: inline-flex; }\n.docx-comment-menu button {\n padding: 0 4px; min-height: 18px; border: 0; border-radius: 4px; background: none; color: #94a3b8; font-size: 12px; line-height: 1; cursor: pointer;\n}\n.docx-comment-menu button:hover { background: #f1f5f9; color: #1e293b; }\n.docx-comment-text { margin: 5px 0 0; white-space: pre-wrap; word-wrap: break-word; color: #334155; }\n.docx-comment-bar { display: flex; gap: 6px; margin-top: 8px; }\n.docx-comment-bar button, .docx-comment-actions button {\n min-height: 24px; padding: 2px 9px; border: 1px solid #e2e8f0; border-radius: 6px; background: #fff; color: #1e293b;\n font: inherit; font-size: 11.5px; font-weight: 500; cursor: pointer;\n}\n.docx-comment-bar button:hover, .docx-comment-actions button:hover { background: #f1f5f9; }\n.docx-comment-actions { display: flex; gap: 6px; margin-top: 6px; }\n.docx-comment-actions .docx-comment-primary { background: #0f766e; border-color: #0f766e; color: #fff; }\n.docx-comment-actions .docx-comment-primary:hover { background: #0d9488; }\n.docx-comment-input {\n display: block; width: 100%; margin-top: 6px; padding: 6px 8px; border: 1px solid #cbd5e1; border-radius: 6px;\n background: #fff; color: #1e293b; font: inherit; font-size: 12.5px; line-height: 1.4; resize: vertical; box-sizing: border-box;\n}\n.docx-comment-input:focus { outline: 2px solid #0f766e; outline-offset: 1px; border-color: #0f766e; }\n/* The commented range itself. The converter's stylesheet paints a flat yellow; the editor\n tints by author and lifts the active thread the way Word does. */\nspan.comment-highlight[data-comment-id] {\n background: hsl(var(--docx-comment-hue, 45) 90% 88%);\n border-bottom: 2px solid hsl(var(--docx-comment-hue, 45) 70% 55%);\n cursor: pointer;\n}\nspan.comment-highlight[data-comment-id][data-comment-resolved] { background: transparent; border-bottom-color: #cbd5e1; }\nspan.comment-highlight.docx-comment-active { background: hsl(var(--docx-comment-hue, 45) 90% 78%); }\n/* The [n] reference marker is engine chrome, not document text: hide it, keep the anchor.\n (Qualified by the editor's roots to outrank the converter's own a.comment-marker rule,\n which is injected later in the document.) */\n.docx-body-flow a.comment-marker, [data-hf-band] a.comment-marker, .page-box a.comment-marker { display: none; }\n[data-comments-hidden] span.comment-highlight[data-comment-id] { background: transparent; border-bottom-color: transparent; }\n";
|
|
129
|
+
//# sourceMappingURL=editor-comments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editor-comments.d.ts","sourceRoot":"","sources":["../src/editor-comments.ts"],"names":[],"mappings":"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"}
|