docxodus 11.0.0 → 12.0.1

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.
Files changed (68) hide show
  1. package/README.md +7 -5
  2. package/dist/editor-comments.d.ts +129 -0
  3. package/dist/editor-comments.d.ts.map +1 -0
  4. package/dist/editor-comments.js +805 -0
  5. package/dist/editor-comments.js.map +1 -0
  6. package/dist/editor-headerfooter.d.ts +125 -85
  7. package/dist/editor-headerfooter.d.ts.map +1 -1
  8. package/dist/editor-headerfooter.js +572 -306
  9. package/dist/editor-headerfooter.js.map +1 -1
  10. package/dist/editor-image-patch.d.ts +38 -0
  11. package/dist/editor-image-patch.d.ts.map +1 -0
  12. package/dist/editor-image-patch.js +101 -0
  13. package/dist/editor-image-patch.js.map +1 -0
  14. package/dist/editor.bundle.js +3760 -785
  15. package/dist/editor.d.ts +237 -5
  16. package/dist/editor.d.ts.map +1 -1
  17. package/dist/editor.js +1063 -112
  18. package/dist/editor.js.map +1 -1
  19. package/dist/embed.bundle.js +3784 -759
  20. package/dist/embed.d.ts +1 -1
  21. package/dist/embed.d.ts.map +1 -1
  22. package/dist/embed.iife.js +3772 -747
  23. package/dist/embed.js +10 -1
  24. package/dist/embed.js.map +1 -1
  25. package/dist/export-assets.json +14 -14
  26. package/dist/export-browser.bundle.js +25 -0
  27. package/dist/index.d.ts +5 -2
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +4 -1
  30. package/dist/index.js.map +1 -1
  31. package/dist/pagination.bundle.js +25 -0
  32. package/dist/pagination.d.ts +6 -0
  33. package/dist/pagination.d.ts.map +1 -1
  34. package/dist/pagination.js +19 -0
  35. package/dist/pagination.js.map +1 -1
  36. package/dist/ribbon-chrome.d.ts +20 -4
  37. package/dist/ribbon-chrome.d.ts.map +1 -1
  38. package/dist/ribbon-chrome.js +550 -182
  39. package/dist/ribbon-chrome.js.map +1 -1
  40. package/dist/ribbon.d.ts +5 -4
  41. package/dist/ribbon.d.ts.map +1 -1
  42. package/dist/ribbon.js +941 -141
  43. package/dist/ribbon.js.map +1 -1
  44. package/dist/session.bundle.js +48 -3
  45. package/dist/session.d.ts +35 -4
  46. package/dist/session.d.ts.map +1 -1
  47. package/dist/session.js +44 -3
  48. package/dist/session.js.map +1 -1
  49. package/dist/types.d.ts +114 -5
  50. package/dist/types.d.ts.map +1 -1
  51. package/dist/types.js.map +1 -1
  52. package/dist/viewport.d.ts +7 -0
  53. package/dist/viewport.d.ts.map +1 -1
  54. package/dist/viewport.js +12 -0
  55. package/dist/viewport.js.map +1 -1
  56. package/dist/wasm/_framework/DocumentFormat.OpenXml.wasm +0 -0
  57. package/dist/wasm/_framework/DocumentFormat.OpenXml.wasm.br +0 -0
  58. package/dist/wasm/_framework/Docxodus.wasm +0 -0
  59. package/dist/wasm/_framework/Docxodus.wasm.br +0 -0
  60. package/dist/wasm/_framework/DocxodusWasm.wasm +0 -0
  61. package/dist/wasm/_framework/DocxodusWasm.wasm.br +0 -0
  62. package/dist/wasm/_framework/System.Private.Xml.Linq.wasm +0 -0
  63. package/dist/wasm/_framework/System.Private.Xml.Linq.wasm.br +0 -0
  64. package/dist/wasm/_framework/dotnet.boot.js +6 -6
  65. package/dist/wasm/_framework/dotnet.boot.js.br +0 -0
  66. package/dist/wasm/_framework/dotnet.native.wasm +0 -0
  67. package/dist/wasm/_framework/dotnet.native.wasm.br +0 -0
  68. 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, anchor rail, table picker, loading overlay.
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@10.0.0/dist/embed.bundle.js';
95
+ import { createRibbonEditor } from 'https://cdn.jsdelivr.net/npm/docxodus@12.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@10.0.0/dist/embed.bundle.js';
583
+ from 'https://cdn.jsdelivr.net/npm/docxodus@12.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@10.0.0/dist/embed.iife.js"></script>
613
+ <script src="https://cdn.jsdelivr.net/npm/docxodus@12.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@10.0.0`, not `@latest`) — CDN responses are
629
+ - **Pin an exact version in production** (`docxodus@12.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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"}