@docx-editor.dev/core 0.0.1 → 2.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.
- package/LICENSE +201 -0
- package/README.md +92 -2
- package/THIRD_PARTY_NOTICES.md +18 -0
- package/dist/automation.cjs +1 -0
- package/dist/automation.d.cts +74 -0
- package/dist/automation.d.ts +74 -0
- package/dist/automation.js +1 -0
- package/dist/binding.cjs +1 -0
- package/dist/binding.d.cts +82 -0
- package/dist/binding.d.ts +82 -0
- package/dist/binding.js +1 -0
- package/dist/chunk-5KSCB2OZ.js +2 -0
- package/dist/chunk-BSC44TIT.js +5 -0
- package/dist/chunk-DLPL5DAG.js +12 -0
- package/dist/chunk-DOEIARE2.js +2 -0
- package/dist/chunk-G7YCQBZE.cjs +5 -0
- package/dist/chunk-HBL3NNH5.cjs +1 -0
- package/dist/chunk-HR7K3W6A.js +1 -0
- package/dist/chunk-HVAV2JSN.js +11 -0
- package/dist/chunk-MYH2HCUJ.cjs +2 -0
- package/dist/chunk-NSM75TN6.cjs +1 -0
- package/dist/chunk-PHDVKUWZ.js +1 -0
- package/dist/chunk-QADYGK5L.cjs +12 -0
- package/dist/chunk-REZUWYB7.js +1 -0
- package/dist/chunk-RNBHTPW7.js +10 -0
- package/dist/chunk-UD2ZXLFI.cjs +2 -0
- package/dist/chunk-VYAVK2AH.cjs +1 -0
- package/dist/chunk-YUK46A2N.cjs +11 -0
- package/dist/chunk-ZMIX42J7.cjs +10 -0
- package/dist/chunk-ZT55Q52J.cjs +2 -0
- package/dist/chunk-ZUALAR4M.js +2 -0
- package/dist/content-control-walk-CbTqHq6O.d.cts +56 -0
- package/dist/content-control-walk-D06GijR0.d.ts +56 -0
- package/dist/contracts/document.cjs +1 -0
- package/dist/contracts/document.d.cts +246 -0
- package/dist/contracts/document.d.ts +246 -0
- package/dist/contracts/document.js +0 -0
- package/dist/contracts/editor.cjs +1 -0
- package/dist/contracts/editor.d.cts +11 -0
- package/dist/contracts/editor.d.ts +11 -0
- package/dist/contracts/editor.js +1 -0
- package/dist/contracts/interaction.cjs +1 -0
- package/dist/contracts/interaction.d.cts +11 -0
- package/dist/contracts/interaction.d.ts +11 -0
- package/dist/contracts/interaction.js +0 -0
- package/dist/contracts/modules.cjs +1 -0
- package/dist/contracts/modules.d.cts +90 -0
- package/dist/contracts/modules.d.ts +90 -0
- package/dist/contracts/modules.js +1 -0
- package/dist/contracts/types.cjs +1 -0
- package/dist/contracts/types.d.cts +452 -0
- package/dist/contracts/types.d.ts +452 -0
- package/dist/contracts/types.js +0 -0
- package/dist/editor-C1QRi1v4.d.ts +1671 -0
- package/dist/editor-D0UDock4.d.cts +1671 -0
- package/dist/editor.cjs +1 -0
- package/dist/editor.css +6017 -0
- package/dist/editor.d.cts +271 -0
- package/dist/editor.d.ts +271 -0
- package/dist/editor.js +1 -0
- package/dist/hf-references-BdjsQNE_.d.ts +71 -0
- package/dist/hf-references-CgEOSw3i.d.cts +71 -0
- package/dist/image-resources-BJnTpG66.d.ts +195 -0
- package/dist/image-resources-BpIydXtU.d.cts +195 -0
- package/dist/index-CrW-IxXt.d.cts +2515 -0
- package/dist/index-ZqBEOrTV.d.ts +2515 -0
- package/dist/index.cjs +1 -0
- package/dist/index.d.cts +22 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.js +1 -0
- package/dist/layout.cjs +1 -0
- package/dist/layout.d.cts +2316 -0
- package/dist/layout.d.ts +2316 -0
- package/dist/layout.js +1 -0
- package/dist/note-nodes-BPSTVDMr.d.ts +108 -0
- package/dist/note-nodes-C6DLxlvj.d.cts +108 -0
- package/dist/note-properties-CnmCoory.d.cts +68 -0
- package/dist/note-properties-m75hmP70.d.ts +68 -0
- package/dist/ooxml-package-CR5us6ad.d.cts +354 -0
- package/dist/ooxml-package-D_CtywTW.d.ts +354 -0
- package/dist/ooxml-tree-BU0e3DVi.d.cts +871 -0
- package/dist/ooxml-tree-BU0e3DVi.d.ts +871 -0
- package/dist/output.cjs +1 -0
- package/dist/output.d.cts +158 -0
- package/dist/output.d.ts +158 -0
- package/dist/output.js +1 -0
- package/dist/protocol-CAkOBBGE.d.cts +1201 -0
- package/dist/protocol-oxHaWmt4.d.ts +1201 -0
- package/dist/review-support-DS8DYX2a.d.cts +326 -0
- package/dist/review-support-Fy3vdIea.d.ts +326 -0
- package/dist/revision-projection-72ZApe-g.d.cts +84 -0
- package/dist/revision-projection-DHAkcD_L.d.ts +84 -0
- package/dist/semantic-cell-selection-CZjBSmMv.d.cts +427 -0
- package/dist/semantic-cell-selection-DsmHmLJ5.d.ts +427 -0
- package/dist/semantic-interaction-D-Dszxrn.d.cts +187 -0
- package/dist/semantic-interaction-Dy-dCUFF.d.ts +187 -0
- package/dist/semantic-paint-drawings-BA3z9jl8.d.ts +21 -0
- package/dist/semantic-paint-drawings-D7qbB0E2.d.cts +21 -0
- package/dist/semantic-records-CJR3BvHs.d.cts +1432 -0
- package/dist/semantic-records-CWodBJsz.d.ts +1432 -0
- package/dist/shaped-measurer-B-TAtcQU.d.ts +613 -0
- package/dist/shaped-measurer-CNIT_svZ.d.cts +613 -0
- package/dist/store.cjs +1 -0
- package/dist/store.d.cts +2247 -0
- package/dist/store.d.ts +2247 -0
- package/dist/store.js +1 -0
- package/dist/tree-op-types-CwOeiaQ8.d.ts +1431 -0
- package/dist/tree-op-types-DMiW6nIH.d.cts +1431 -0
- package/dist/tree-package-store-D5S7VKs5.d.ts +708 -0
- package/dist/tree-package-store-DOKMtCnh.d.cts +708 -0
- package/dist/tree-session-CiUel5Kz.d.ts +542 -0
- package/dist/tree-session-D47_imvR.d.cts +542 -0
- package/dist/tree-store-CxifqwIv.d.cts +273 -0
- package/dist/tree-store-hLtjeyWE.d.ts +273 -0
- package/package.json +105 -8
- package/index.js +0 -1
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
import { e as OoxmlPart, a as OoxmlElement } from './ooxml-tree-BU0e3DVi.cjs';
|
|
2
|
+
import { R as RevisionAddress } from './tree-op-types-DMiW6nIH.cjs';
|
|
3
|
+
|
|
4
|
+
/** The `w15` namespace: `commentsExtended.xml` — thread parent and resolved state. */
|
|
5
|
+
declare const W15_NAMESPACE_URI = "http://schemas.microsoft.com/office/word/2012/wordml";
|
|
6
|
+
/** A position in one story: a paragraph node id plus a UTF-16 offset inside it. */
|
|
7
|
+
interface CommentPosition {
|
|
8
|
+
readonly paragraphId: string;
|
|
9
|
+
readonly offset: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Where a comment is anchored, as a range.
|
|
13
|
+
*
|
|
14
|
+
* `orphaned` records that the file did not give this comment a usable range — a reference with
|
|
15
|
+
* no range markers, or a start with no end. The comment is still listed, marked orphaned,
|
|
16
|
+
* rather than dropped: a reviewer's remark disappearing silently is worse than one that says
|
|
17
|
+
* it lost its text.
|
|
18
|
+
*/
|
|
19
|
+
interface CommentAnchor {
|
|
20
|
+
readonly commentId: string;
|
|
21
|
+
/** Canonical name of the part the range lives in, so a header comment is attributable. */
|
|
22
|
+
readonly partName: string;
|
|
23
|
+
readonly start: CommentPosition;
|
|
24
|
+
readonly end: CommentPosition;
|
|
25
|
+
readonly orphaned: boolean;
|
|
26
|
+
}
|
|
27
|
+
/** One comment as authored in `word/comments.xml`. */
|
|
28
|
+
interface CommentRecord {
|
|
29
|
+
readonly id: string;
|
|
30
|
+
readonly author: string;
|
|
31
|
+
readonly initials?: string;
|
|
32
|
+
readonly date?: string;
|
|
33
|
+
/** Body paragraphs, as tree nodes, so the surface renders measured text rather than a string. */
|
|
34
|
+
readonly blocks: readonly OoxmlElement[];
|
|
35
|
+
/** `w14:paraId` of the first body paragraph — the key thread state is stored under. */
|
|
36
|
+
readonly paraId?: string;
|
|
37
|
+
/** `@w16cid:parentId` — the `w:id` of the comment this replies to, when the file names it. */
|
|
38
|
+
readonly parentCommentId?: string;
|
|
39
|
+
}
|
|
40
|
+
/** Thread state for one comment, read from `commentsExtended.xml`. */
|
|
41
|
+
interface CommentThreadState {
|
|
42
|
+
/** `@w15:paraIdParent` — the comment this one replies to, absent for a top-level comment. */
|
|
43
|
+
readonly parentParaId?: string;
|
|
44
|
+
readonly done: boolean;
|
|
45
|
+
}
|
|
46
|
+
/** A position in the model offset space of one story. */
|
|
47
|
+
interface ReviewPosition {
|
|
48
|
+
readonly paragraphId: string;
|
|
49
|
+
readonly offset: number;
|
|
50
|
+
}
|
|
51
|
+
/** Where an item is anchored: a range in one story. */
|
|
52
|
+
interface ReviewRange {
|
|
53
|
+
readonly partName: string;
|
|
54
|
+
readonly start: ReviewPosition;
|
|
55
|
+
readonly end: ReviewPosition;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* What kind of decision a revision card represents.
|
|
59
|
+
*
|
|
60
|
+
* Wider than the four content wrappers, because a reviewer has to be shown every pending
|
|
61
|
+
* decision, including the ones that decorate no characters. A card the surface cannot show is
|
|
62
|
+
* a change the reviewer never learns about — and `acceptAllRevisions` refuses if ANY revision
|
|
63
|
+
* in the document is one the engine cannot resolve, so an invisible one makes Accept All fail
|
|
64
|
+
* for a reason nothing on screen explains.
|
|
65
|
+
*/
|
|
66
|
+
type ReviewRevisionKind = 'insert' | 'delete'
|
|
67
|
+
/**
|
|
68
|
+
* A deletion and an insertion that are one edit: text typed over a selection.
|
|
69
|
+
*
|
|
70
|
+
* Word shows these as a single `Replaced "x" with "y"` card, and resolving one half
|
|
71
|
+
* without the other is never what the reviewer meant — accepting the deletion alone
|
|
72
|
+
* leaves the replacement text unproposed, rejecting it alone leaves both.
|
|
73
|
+
*/
|
|
74
|
+
| 'replace' | 'moveFrom' | 'moveTo'
|
|
75
|
+
/** `w:rPrChange` / `w:pPrChange` — the words are unchanged, their formatting is not. */
|
|
76
|
+
| 'format'
|
|
77
|
+
/** `w:pPr/w:rPr/w:ins|w:del` — a paragraph split or merge. */
|
|
78
|
+
| 'paragraphMark'
|
|
79
|
+
/** A row, cell, section or grid revision. Supported row revisions are resolvable. */
|
|
80
|
+
| 'structural';
|
|
81
|
+
/**
|
|
82
|
+
* One tracked change as a review card.
|
|
83
|
+
*
|
|
84
|
+
* Keyed per DECISION rather than per site: a revision spanning three ranges is one card, because
|
|
85
|
+
* accepting it accepts all three.
|
|
86
|
+
*/
|
|
87
|
+
interface ReviewRevisionItem {
|
|
88
|
+
readonly kind: 'revision';
|
|
89
|
+
/** Stable across renders and unique per DECISION, not per site. */
|
|
90
|
+
readonly id: string;
|
|
91
|
+
/** The payload `acceptRevision` / `rejectRevision` take. */
|
|
92
|
+
readonly address: RevisionAddress;
|
|
93
|
+
/**
|
|
94
|
+
* EVERY address this decision covers, `address` first.
|
|
95
|
+
*
|
|
96
|
+
* More than one only for a replacement, whose halves a foreign editor may have written
|
|
97
|
+
* as two independent revisions. Accept and reject walk all of them in one transaction:
|
|
98
|
+
* resolving one half and leaving the other is a state no reviewer asked for.
|
|
99
|
+
*/
|
|
100
|
+
readonly addresses: readonly RevisionAddress[];
|
|
101
|
+
/** The words a replacement removes. Empty for every other kind. */
|
|
102
|
+
readonly replacedText: string;
|
|
103
|
+
readonly revisionKind: ReviewRevisionKind;
|
|
104
|
+
readonly author: string;
|
|
105
|
+
readonly date?: string;
|
|
106
|
+
/** Text the revision covers, for the card summary. Empty for changes with no characters. */
|
|
107
|
+
readonly text: string;
|
|
108
|
+
/** Every site this decision touches, in document order. */
|
|
109
|
+
readonly ranges: readonly ReviewRange[];
|
|
110
|
+
/**
|
|
111
|
+
* How many leading `ranges` are the STRUCK half of a replacement.
|
|
112
|
+
*
|
|
113
|
+
* A replacement's card is one decision but its ranges are two colours — red over what is
|
|
114
|
+
* going, green over what takes its place. ABSENT when the halves do not split at a single
|
|
115
|
+
* point, which is what a file recording both under one revision id can produce; a surface
|
|
116
|
+
* then has no basis for two colours and should paint one neutral band rather than guess.
|
|
117
|
+
*/
|
|
118
|
+
readonly replacedRangeCount?: number;
|
|
119
|
+
/**
|
|
120
|
+
* True when the engine cannot resolve this kind, so accept and reject must not be offered.
|
|
121
|
+
*
|
|
122
|
+
* Derived by the MODULE rather than from a caller-supplied predicate: the refusal list is
|
|
123
|
+
* internal, and a surface asked to compute it would have to guess. A card that offers a
|
|
124
|
+
* button the engine will refuse is worse than one that explains why it cannot.
|
|
125
|
+
*/
|
|
126
|
+
readonly readOnly: boolean;
|
|
127
|
+
/** The other half of a move, or the other side of a delete/insert replacement. */
|
|
128
|
+
readonly pairedWith?: string;
|
|
129
|
+
/**
|
|
130
|
+
* Comments answering this change, in document order.
|
|
131
|
+
*
|
|
132
|
+
* A reply to a tracked change IS a comment: `w:ins` and `w:del` carry no body, so the text
|
|
133
|
+
* is written as a comment over the revision's own range and the range is what links them.
|
|
134
|
+
*/
|
|
135
|
+
readonly replyIds: readonly string[];
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* One comment as a review card. A reply carries `parentId`; OOXML gives replies no separate
|
|
139
|
+
* element, so threads are reconstructed from that link.
|
|
140
|
+
*/
|
|
141
|
+
interface ReviewCommentItem {
|
|
142
|
+
readonly kind: 'comment';
|
|
143
|
+
readonly id: string;
|
|
144
|
+
readonly comment: CommentRecord;
|
|
145
|
+
readonly range: ReviewRange | null;
|
|
146
|
+
readonly resolved: boolean;
|
|
147
|
+
/** The comment this replies to, absent for a top-level comment. */
|
|
148
|
+
readonly parentId?: string;
|
|
149
|
+
/** The REVISION this comment answers, when it covers exactly that change's characters. */
|
|
150
|
+
readonly parentRevisionId?: string;
|
|
151
|
+
/** Replies to this comment, in document order. Empty for a reply or a childless comment. */
|
|
152
|
+
readonly replyIds: readonly string[];
|
|
153
|
+
/** True when the file gave this comment no usable range. */
|
|
154
|
+
readonly orphaned: boolean;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* A card contributed by a recognized custom node (`defineCustomNode` with a `reviewCard`
|
|
158
|
+
* hook), anchored at the node's range.
|
|
159
|
+
*
|
|
160
|
+
* Informational, never resolvable: there is nothing to accept or reject, so the engine
|
|
161
|
+
* refuses those verbs on it. `title` and `detail` are HOST-authored (the definition's hook
|
|
162
|
+
* produced them), but `attrs` and `text` originate in a file an attacker controls — a
|
|
163
|
+
* surface renders every one of these as text, never markup.
|
|
164
|
+
*/
|
|
165
|
+
interface ReviewCustomItem {
|
|
166
|
+
readonly kind: 'custom';
|
|
167
|
+
/** The SDT node's stable id in the canonical tree. */
|
|
168
|
+
readonly id: string;
|
|
169
|
+
/** The definition's `name`. */
|
|
170
|
+
readonly name: string;
|
|
171
|
+
/** The raw `w:tag` the node was recognized from. Untrusted input. */
|
|
172
|
+
readonly tag: string;
|
|
173
|
+
/** Attrs decoded from the tag, after the definition's recognition hook. Untrusted input. */
|
|
174
|
+
readonly attrs: Readonly<Record<string, string>>;
|
|
175
|
+
/** The SDT's literal content text. Untrusted input. */
|
|
176
|
+
readonly text: string;
|
|
177
|
+
/** Card title, from the definition's `reviewCard` hook. */
|
|
178
|
+
readonly title: string;
|
|
179
|
+
/** Card body, from the definition's `reviewCard` hook. */
|
|
180
|
+
readonly detail?: string;
|
|
181
|
+
readonly range: ReviewRange | null;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* One pending decision in the review queue: a tracked change, a comment thread, or a pro
|
|
185
|
+
* custom-node card. Discriminate on `kind`.
|
|
186
|
+
*/
|
|
187
|
+
type ReviewItem = ReviewRevisionItem | ReviewCommentItem | ReviewCustomItem;
|
|
188
|
+
/** What the review queue derivation reads: one story part plus its comment parts. */
|
|
189
|
+
interface ReviewModelInput {
|
|
190
|
+
/** The story the ranges live in — the main document, a header, a note. */
|
|
191
|
+
readonly storyPart: OoxmlPart;
|
|
192
|
+
/**
|
|
193
|
+
* Header/footer story parts, in section order. Their revisions and comment anchors join
|
|
194
|
+
* the queue: a tracked change in a header is a pending decision like any other, and a
|
|
195
|
+
* queue that only walked the body silently hid it from the rail AND from Accept All.
|
|
196
|
+
*/
|
|
197
|
+
readonly furnitureParts?: readonly OoxmlPart[] | undefined;
|
|
198
|
+
/** `word/comments.xml`, absent when the package has none. */
|
|
199
|
+
readonly commentsPart?: OoxmlPart | undefined;
|
|
200
|
+
/** `word/commentsExtended.xml`, absent when the package has none. */
|
|
201
|
+
readonly commentsExtendedPart?: OoxmlPart | undefined;
|
|
202
|
+
/**
|
|
203
|
+
* Custom node definitions from the module registry, forwarded OPAQUELY.
|
|
204
|
+
*
|
|
205
|
+
* Core carries them the way the registry does — as unknowns — so the definition shape
|
|
206
|
+
* stays a capability-package concern. The pro derivation narrows them and contributes
|
|
207
|
+
* `kind: 'custom'` cards for definitions that opted in.
|
|
208
|
+
*/
|
|
209
|
+
readonly customNodes?: readonly unknown[] | undefined;
|
|
210
|
+
}
|
|
211
|
+
/** The stable key a surface uses for the active item and for a React list. */
|
|
212
|
+
declare function reviewItemKey(item: ReviewItem): string;
|
|
213
|
+
/** Plain text of a comment's body, so a card never re-implements the run walk. */
|
|
214
|
+
declare function commentBodyText(comment: CommentRecord): string;
|
|
215
|
+
/** Author initials for an avatar, from `@w:initials` or the name. */
|
|
216
|
+
declare function commentInitials(comment: CommentRecord): string;
|
|
217
|
+
/** Paragraph node id → document position, from the TREE rather than from a layout. */
|
|
218
|
+
declare function paragraphOrderOfPart(part: OoxmlPart): Map<string, number>;
|
|
219
|
+
/** Every range a decision touches. One card can cover several, in different paragraphs. */
|
|
220
|
+
declare function reviewItemRanges(item: ReviewItem): readonly ReviewRange[];
|
|
221
|
+
/** The first range of an item, in authored order, or null when it has none. */
|
|
222
|
+
declare function firstReviewRange(item: ReviewItem): ReviewRange | null;
|
|
223
|
+
/**
|
|
224
|
+
* A single comparable number for document order.
|
|
225
|
+
*
|
|
226
|
+
* Paragraph index dominates offset, so a revision spanning paragraphs still sorts by where it
|
|
227
|
+
* STARTS. An item with no resolvable range sorts last rather than to position zero, which is
|
|
228
|
+
* where an orphan used to land — tearing an orphaned reply out of its own thread.
|
|
229
|
+
*/
|
|
230
|
+
declare function reviewItemPositionRank(item: ReviewItem, order: ReadonlyMap<string, number>): number;
|
|
231
|
+
/**
|
|
232
|
+
* Every item covering a position, innermost first.
|
|
233
|
+
*
|
|
234
|
+
* Returning the whole stack rather than one winner is what lets a surface offer cycling, a
|
|
235
|
+
* stacked card, or a "1 of 3" affordance. A comment wrapping a revision used to be unreachable
|
|
236
|
+
* because only the tightest range was ever returned.
|
|
237
|
+
*/
|
|
238
|
+
declare function reviewItemsAt(items: readonly ReviewItem[], position: ReviewPosition, order: ReadonlyMap<string, number>): ReviewItem[];
|
|
239
|
+
/**
|
|
240
|
+
* The item the caret is in, or null.
|
|
241
|
+
*
|
|
242
|
+
* A resolved comment never activates: a settled thread must not reopen itself as the reviewer
|
|
243
|
+
* types near it.
|
|
244
|
+
*
|
|
245
|
+
* A REPLY resolves to the thread it belongs to. A reply is anchored over its parent's range,
|
|
246
|
+
* so both cover the caret — and the reply, being newer, wins the innermost test. It is not a
|
|
247
|
+
* card of its own (it renders inside its parent's), so the thread would have gone active with
|
|
248
|
+
* nothing on screen showing it: the reply box vanished from a comment the moment somebody
|
|
249
|
+
* replied to it.
|
|
250
|
+
*/
|
|
251
|
+
declare function activeReviewItem(items: readonly ReviewItem[], position: ReviewPosition, order: ReadonlyMap<string, number>): ReviewItem | null;
|
|
252
|
+
/**
|
|
253
|
+
* Walk a reply up to the card that heads its thread. Guarded against a cyclic file.
|
|
254
|
+
*
|
|
255
|
+
* The head is not always a comment. A reply to a tracked change renders inside the REVISION's
|
|
256
|
+
* card, so resolving it to itself opened an item nothing on screen was drawing — the reply box
|
|
257
|
+
* vanished the moment somebody answered a change.
|
|
258
|
+
*
|
|
259
|
+
* EXPORTED because the paginated surface answers "which card is open" itself, against its own
|
|
260
|
+
* dismissed-key state, rather than through {@link activeReviewItem}. Two copies of the
|
|
261
|
+
* innermost-wins rule was survivable while a reply could only be a comment — the parent came
|
|
262
|
+
* first in `comments.xml` order and won the tie by accident. It stopped being survivable the
|
|
263
|
+
* moment a reply could answer a revision, which outranks it outright.
|
|
264
|
+
*/
|
|
265
|
+
declare function reviewThreadRootOf(items: readonly ReviewItem[], comment: ReviewCommentItem): ReviewItem;
|
|
266
|
+
/** Where one paragraph sits, resolved once so a card is an O(1) lookup. */
|
|
267
|
+
interface ReviewParagraphAnchor {
|
|
268
|
+
readonly pageIndex: number;
|
|
269
|
+
/** Sheet-absolute y of the page's content box. */
|
|
270
|
+
readonly contentY: number;
|
|
271
|
+
/** The fragment's own y, measured from that content box. */
|
|
272
|
+
readonly fragmentY: number;
|
|
273
|
+
readonly lines?: readonly {
|
|
274
|
+
readonly range: {
|
|
275
|
+
readonly end: number;
|
|
276
|
+
};
|
|
277
|
+
readonly box: {
|
|
278
|
+
readonly y: number;
|
|
279
|
+
};
|
|
280
|
+
}[];
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Paragraph id to its place on the page, in ONE pass over the layout.
|
|
284
|
+
*
|
|
285
|
+
* Built once per layout and reused by every card. The straightforward version — scan the
|
|
286
|
+
* pages until the paragraph turns up, per card — is a full-document walk per card, and a
|
|
287
|
+
* contract with two hundred comments walked the document two hundred times every time the
|
|
288
|
+
* caret moved. Toggling the pane was visibly slow for exactly that reason.
|
|
289
|
+
*/
|
|
290
|
+
declare function reviewAnchorIndex<TPage extends {
|
|
291
|
+
readonly index: number;
|
|
292
|
+
readonly contentBox: {
|
|
293
|
+
readonly y: number;
|
|
294
|
+
};
|
|
295
|
+
}>(layout: {
|
|
296
|
+
readonly pages: readonly TPage[];
|
|
297
|
+
}, paragraphFragments: (page: TPage) => readonly {
|
|
298
|
+
readonly paragraphId: string;
|
|
299
|
+
readonly box: {
|
|
300
|
+
readonly y: number;
|
|
301
|
+
};
|
|
302
|
+
readonly lines?: readonly {
|
|
303
|
+
readonly range: {
|
|
304
|
+
readonly end: number;
|
|
305
|
+
};
|
|
306
|
+
readonly box: {
|
|
307
|
+
readonly y: number;
|
|
308
|
+
};
|
|
309
|
+
}[];
|
|
310
|
+
}[]): Map<string, ReviewParagraphAnchor>;
|
|
311
|
+
/**
|
|
312
|
+
* Where a card belongs beside the page, from LAYOUT RECORDS.
|
|
313
|
+
*
|
|
314
|
+
* The one question the tree cannot answer, and the one a surface must not answer for itself:
|
|
315
|
+
* measuring painted DOM puts the sidebar a repaint behind the document and breaks outright
|
|
316
|
+
* while pagination is in flight.
|
|
317
|
+
*
|
|
318
|
+
* Returns null when the item has no resolvable range, or when its paragraph is not in this
|
|
319
|
+
* layout — a comment anchored in a header belongs to a story the body layout never saw.
|
|
320
|
+
*/
|
|
321
|
+
declare function reviewItemGeometry(item: ReviewItem, index: ReadonlyMap<string, ReviewParagraphAnchor>): {
|
|
322
|
+
readonly pageIndex: number;
|
|
323
|
+
readonly y: number;
|
|
324
|
+
} | null;
|
|
325
|
+
|
|
326
|
+
export { type CommentRecord as C, type ReviewModelInput as R, W15_NAMESPACE_URI as W, type ReviewItem as a, type ReviewRevisionItem as b, type ReviewCommentItem as c, type ReviewCustomItem as d, type ReviewPosition as e, type ReviewRange as f, type ReviewRevisionKind as g, type CommentAnchor as h, type CommentPosition as i, type CommentThreadState as j, type ReviewParagraphAnchor as k, activeReviewItem as l, commentBodyText as m, commentInitials as n, firstReviewRange as o, paragraphOrderOfPart as p, reviewItemGeometry as q, reviewAnchorIndex as r, reviewItemKey as s, reviewItemPositionRank as t, reviewItemRanges as u, reviewItemsAt as v, reviewThreadRootOf as w };
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
import { e as OoxmlPart, a as OoxmlElement } from './ooxml-tree-BU0e3DVi.js';
|
|
2
|
+
import { R as RevisionAddress } from './tree-op-types-CwOeiaQ8.js';
|
|
3
|
+
|
|
4
|
+
/** The `w15` namespace: `commentsExtended.xml` — thread parent and resolved state. */
|
|
5
|
+
declare const W15_NAMESPACE_URI = "http://schemas.microsoft.com/office/word/2012/wordml";
|
|
6
|
+
/** A position in one story: a paragraph node id plus a UTF-16 offset inside it. */
|
|
7
|
+
interface CommentPosition {
|
|
8
|
+
readonly paragraphId: string;
|
|
9
|
+
readonly offset: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Where a comment is anchored, as a range.
|
|
13
|
+
*
|
|
14
|
+
* `orphaned` records that the file did not give this comment a usable range — a reference with
|
|
15
|
+
* no range markers, or a start with no end. The comment is still listed, marked orphaned,
|
|
16
|
+
* rather than dropped: a reviewer's remark disappearing silently is worse than one that says
|
|
17
|
+
* it lost its text.
|
|
18
|
+
*/
|
|
19
|
+
interface CommentAnchor {
|
|
20
|
+
readonly commentId: string;
|
|
21
|
+
/** Canonical name of the part the range lives in, so a header comment is attributable. */
|
|
22
|
+
readonly partName: string;
|
|
23
|
+
readonly start: CommentPosition;
|
|
24
|
+
readonly end: CommentPosition;
|
|
25
|
+
readonly orphaned: boolean;
|
|
26
|
+
}
|
|
27
|
+
/** One comment as authored in `word/comments.xml`. */
|
|
28
|
+
interface CommentRecord {
|
|
29
|
+
readonly id: string;
|
|
30
|
+
readonly author: string;
|
|
31
|
+
readonly initials?: string;
|
|
32
|
+
readonly date?: string;
|
|
33
|
+
/** Body paragraphs, as tree nodes, so the surface renders measured text rather than a string. */
|
|
34
|
+
readonly blocks: readonly OoxmlElement[];
|
|
35
|
+
/** `w14:paraId` of the first body paragraph — the key thread state is stored under. */
|
|
36
|
+
readonly paraId?: string;
|
|
37
|
+
/** `@w16cid:parentId` — the `w:id` of the comment this replies to, when the file names it. */
|
|
38
|
+
readonly parentCommentId?: string;
|
|
39
|
+
}
|
|
40
|
+
/** Thread state for one comment, read from `commentsExtended.xml`. */
|
|
41
|
+
interface CommentThreadState {
|
|
42
|
+
/** `@w15:paraIdParent` — the comment this one replies to, absent for a top-level comment. */
|
|
43
|
+
readonly parentParaId?: string;
|
|
44
|
+
readonly done: boolean;
|
|
45
|
+
}
|
|
46
|
+
/** A position in the model offset space of one story. */
|
|
47
|
+
interface ReviewPosition {
|
|
48
|
+
readonly paragraphId: string;
|
|
49
|
+
readonly offset: number;
|
|
50
|
+
}
|
|
51
|
+
/** Where an item is anchored: a range in one story. */
|
|
52
|
+
interface ReviewRange {
|
|
53
|
+
readonly partName: string;
|
|
54
|
+
readonly start: ReviewPosition;
|
|
55
|
+
readonly end: ReviewPosition;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* What kind of decision a revision card represents.
|
|
59
|
+
*
|
|
60
|
+
* Wider than the four content wrappers, because a reviewer has to be shown every pending
|
|
61
|
+
* decision, including the ones that decorate no characters. A card the surface cannot show is
|
|
62
|
+
* a change the reviewer never learns about — and `acceptAllRevisions` refuses if ANY revision
|
|
63
|
+
* in the document is one the engine cannot resolve, so an invisible one makes Accept All fail
|
|
64
|
+
* for a reason nothing on screen explains.
|
|
65
|
+
*/
|
|
66
|
+
type ReviewRevisionKind = 'insert' | 'delete'
|
|
67
|
+
/**
|
|
68
|
+
* A deletion and an insertion that are one edit: text typed over a selection.
|
|
69
|
+
*
|
|
70
|
+
* Word shows these as a single `Replaced "x" with "y"` card, and resolving one half
|
|
71
|
+
* without the other is never what the reviewer meant — accepting the deletion alone
|
|
72
|
+
* leaves the replacement text unproposed, rejecting it alone leaves both.
|
|
73
|
+
*/
|
|
74
|
+
| 'replace' | 'moveFrom' | 'moveTo'
|
|
75
|
+
/** `w:rPrChange` / `w:pPrChange` — the words are unchanged, their formatting is not. */
|
|
76
|
+
| 'format'
|
|
77
|
+
/** `w:pPr/w:rPr/w:ins|w:del` — a paragraph split or merge. */
|
|
78
|
+
| 'paragraphMark'
|
|
79
|
+
/** A row, cell, section or grid revision. Supported row revisions are resolvable. */
|
|
80
|
+
| 'structural';
|
|
81
|
+
/**
|
|
82
|
+
* One tracked change as a review card.
|
|
83
|
+
*
|
|
84
|
+
* Keyed per DECISION rather than per site: a revision spanning three ranges is one card, because
|
|
85
|
+
* accepting it accepts all three.
|
|
86
|
+
*/
|
|
87
|
+
interface ReviewRevisionItem {
|
|
88
|
+
readonly kind: 'revision';
|
|
89
|
+
/** Stable across renders and unique per DECISION, not per site. */
|
|
90
|
+
readonly id: string;
|
|
91
|
+
/** The payload `acceptRevision` / `rejectRevision` take. */
|
|
92
|
+
readonly address: RevisionAddress;
|
|
93
|
+
/**
|
|
94
|
+
* EVERY address this decision covers, `address` first.
|
|
95
|
+
*
|
|
96
|
+
* More than one only for a replacement, whose halves a foreign editor may have written
|
|
97
|
+
* as two independent revisions. Accept and reject walk all of them in one transaction:
|
|
98
|
+
* resolving one half and leaving the other is a state no reviewer asked for.
|
|
99
|
+
*/
|
|
100
|
+
readonly addresses: readonly RevisionAddress[];
|
|
101
|
+
/** The words a replacement removes. Empty for every other kind. */
|
|
102
|
+
readonly replacedText: string;
|
|
103
|
+
readonly revisionKind: ReviewRevisionKind;
|
|
104
|
+
readonly author: string;
|
|
105
|
+
readonly date?: string;
|
|
106
|
+
/** Text the revision covers, for the card summary. Empty for changes with no characters. */
|
|
107
|
+
readonly text: string;
|
|
108
|
+
/** Every site this decision touches, in document order. */
|
|
109
|
+
readonly ranges: readonly ReviewRange[];
|
|
110
|
+
/**
|
|
111
|
+
* How many leading `ranges` are the STRUCK half of a replacement.
|
|
112
|
+
*
|
|
113
|
+
* A replacement's card is one decision but its ranges are two colours — red over what is
|
|
114
|
+
* going, green over what takes its place. ABSENT when the halves do not split at a single
|
|
115
|
+
* point, which is what a file recording both under one revision id can produce; a surface
|
|
116
|
+
* then has no basis for two colours and should paint one neutral band rather than guess.
|
|
117
|
+
*/
|
|
118
|
+
readonly replacedRangeCount?: number;
|
|
119
|
+
/**
|
|
120
|
+
* True when the engine cannot resolve this kind, so accept and reject must not be offered.
|
|
121
|
+
*
|
|
122
|
+
* Derived by the MODULE rather than from a caller-supplied predicate: the refusal list is
|
|
123
|
+
* internal, and a surface asked to compute it would have to guess. A card that offers a
|
|
124
|
+
* button the engine will refuse is worse than one that explains why it cannot.
|
|
125
|
+
*/
|
|
126
|
+
readonly readOnly: boolean;
|
|
127
|
+
/** The other half of a move, or the other side of a delete/insert replacement. */
|
|
128
|
+
readonly pairedWith?: string;
|
|
129
|
+
/**
|
|
130
|
+
* Comments answering this change, in document order.
|
|
131
|
+
*
|
|
132
|
+
* A reply to a tracked change IS a comment: `w:ins` and `w:del` carry no body, so the text
|
|
133
|
+
* is written as a comment over the revision's own range and the range is what links them.
|
|
134
|
+
*/
|
|
135
|
+
readonly replyIds: readonly string[];
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* One comment as a review card. A reply carries `parentId`; OOXML gives replies no separate
|
|
139
|
+
* element, so threads are reconstructed from that link.
|
|
140
|
+
*/
|
|
141
|
+
interface ReviewCommentItem {
|
|
142
|
+
readonly kind: 'comment';
|
|
143
|
+
readonly id: string;
|
|
144
|
+
readonly comment: CommentRecord;
|
|
145
|
+
readonly range: ReviewRange | null;
|
|
146
|
+
readonly resolved: boolean;
|
|
147
|
+
/** The comment this replies to, absent for a top-level comment. */
|
|
148
|
+
readonly parentId?: string;
|
|
149
|
+
/** The REVISION this comment answers, when it covers exactly that change's characters. */
|
|
150
|
+
readonly parentRevisionId?: string;
|
|
151
|
+
/** Replies to this comment, in document order. Empty for a reply or a childless comment. */
|
|
152
|
+
readonly replyIds: readonly string[];
|
|
153
|
+
/** True when the file gave this comment no usable range. */
|
|
154
|
+
readonly orphaned: boolean;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* A card contributed by a recognized custom node (`defineCustomNode` with a `reviewCard`
|
|
158
|
+
* hook), anchored at the node's range.
|
|
159
|
+
*
|
|
160
|
+
* Informational, never resolvable: there is nothing to accept or reject, so the engine
|
|
161
|
+
* refuses those verbs on it. `title` and `detail` are HOST-authored (the definition's hook
|
|
162
|
+
* produced them), but `attrs` and `text` originate in a file an attacker controls — a
|
|
163
|
+
* surface renders every one of these as text, never markup.
|
|
164
|
+
*/
|
|
165
|
+
interface ReviewCustomItem {
|
|
166
|
+
readonly kind: 'custom';
|
|
167
|
+
/** The SDT node's stable id in the canonical tree. */
|
|
168
|
+
readonly id: string;
|
|
169
|
+
/** The definition's `name`. */
|
|
170
|
+
readonly name: string;
|
|
171
|
+
/** The raw `w:tag` the node was recognized from. Untrusted input. */
|
|
172
|
+
readonly tag: string;
|
|
173
|
+
/** Attrs decoded from the tag, after the definition's recognition hook. Untrusted input. */
|
|
174
|
+
readonly attrs: Readonly<Record<string, string>>;
|
|
175
|
+
/** The SDT's literal content text. Untrusted input. */
|
|
176
|
+
readonly text: string;
|
|
177
|
+
/** Card title, from the definition's `reviewCard` hook. */
|
|
178
|
+
readonly title: string;
|
|
179
|
+
/** Card body, from the definition's `reviewCard` hook. */
|
|
180
|
+
readonly detail?: string;
|
|
181
|
+
readonly range: ReviewRange | null;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* One pending decision in the review queue: a tracked change, a comment thread, or a pro
|
|
185
|
+
* custom-node card. Discriminate on `kind`.
|
|
186
|
+
*/
|
|
187
|
+
type ReviewItem = ReviewRevisionItem | ReviewCommentItem | ReviewCustomItem;
|
|
188
|
+
/** What the review queue derivation reads: one story part plus its comment parts. */
|
|
189
|
+
interface ReviewModelInput {
|
|
190
|
+
/** The story the ranges live in — the main document, a header, a note. */
|
|
191
|
+
readonly storyPart: OoxmlPart;
|
|
192
|
+
/**
|
|
193
|
+
* Header/footer story parts, in section order. Their revisions and comment anchors join
|
|
194
|
+
* the queue: a tracked change in a header is a pending decision like any other, and a
|
|
195
|
+
* queue that only walked the body silently hid it from the rail AND from Accept All.
|
|
196
|
+
*/
|
|
197
|
+
readonly furnitureParts?: readonly OoxmlPart[] | undefined;
|
|
198
|
+
/** `word/comments.xml`, absent when the package has none. */
|
|
199
|
+
readonly commentsPart?: OoxmlPart | undefined;
|
|
200
|
+
/** `word/commentsExtended.xml`, absent when the package has none. */
|
|
201
|
+
readonly commentsExtendedPart?: OoxmlPart | undefined;
|
|
202
|
+
/**
|
|
203
|
+
* Custom node definitions from the module registry, forwarded OPAQUELY.
|
|
204
|
+
*
|
|
205
|
+
* Core carries them the way the registry does — as unknowns — so the definition shape
|
|
206
|
+
* stays a capability-package concern. The pro derivation narrows them and contributes
|
|
207
|
+
* `kind: 'custom'` cards for definitions that opted in.
|
|
208
|
+
*/
|
|
209
|
+
readonly customNodes?: readonly unknown[] | undefined;
|
|
210
|
+
}
|
|
211
|
+
/** The stable key a surface uses for the active item and for a React list. */
|
|
212
|
+
declare function reviewItemKey(item: ReviewItem): string;
|
|
213
|
+
/** Plain text of a comment's body, so a card never re-implements the run walk. */
|
|
214
|
+
declare function commentBodyText(comment: CommentRecord): string;
|
|
215
|
+
/** Author initials for an avatar, from `@w:initials` or the name. */
|
|
216
|
+
declare function commentInitials(comment: CommentRecord): string;
|
|
217
|
+
/** Paragraph node id → document position, from the TREE rather than from a layout. */
|
|
218
|
+
declare function paragraphOrderOfPart(part: OoxmlPart): Map<string, number>;
|
|
219
|
+
/** Every range a decision touches. One card can cover several, in different paragraphs. */
|
|
220
|
+
declare function reviewItemRanges(item: ReviewItem): readonly ReviewRange[];
|
|
221
|
+
/** The first range of an item, in authored order, or null when it has none. */
|
|
222
|
+
declare function firstReviewRange(item: ReviewItem): ReviewRange | null;
|
|
223
|
+
/**
|
|
224
|
+
* A single comparable number for document order.
|
|
225
|
+
*
|
|
226
|
+
* Paragraph index dominates offset, so a revision spanning paragraphs still sorts by where it
|
|
227
|
+
* STARTS. An item with no resolvable range sorts last rather than to position zero, which is
|
|
228
|
+
* where an orphan used to land — tearing an orphaned reply out of its own thread.
|
|
229
|
+
*/
|
|
230
|
+
declare function reviewItemPositionRank(item: ReviewItem, order: ReadonlyMap<string, number>): number;
|
|
231
|
+
/**
|
|
232
|
+
* Every item covering a position, innermost first.
|
|
233
|
+
*
|
|
234
|
+
* Returning the whole stack rather than one winner is what lets a surface offer cycling, a
|
|
235
|
+
* stacked card, or a "1 of 3" affordance. A comment wrapping a revision used to be unreachable
|
|
236
|
+
* because only the tightest range was ever returned.
|
|
237
|
+
*/
|
|
238
|
+
declare function reviewItemsAt(items: readonly ReviewItem[], position: ReviewPosition, order: ReadonlyMap<string, number>): ReviewItem[];
|
|
239
|
+
/**
|
|
240
|
+
* The item the caret is in, or null.
|
|
241
|
+
*
|
|
242
|
+
* A resolved comment never activates: a settled thread must not reopen itself as the reviewer
|
|
243
|
+
* types near it.
|
|
244
|
+
*
|
|
245
|
+
* A REPLY resolves to the thread it belongs to. A reply is anchored over its parent's range,
|
|
246
|
+
* so both cover the caret — and the reply, being newer, wins the innermost test. It is not a
|
|
247
|
+
* card of its own (it renders inside its parent's), so the thread would have gone active with
|
|
248
|
+
* nothing on screen showing it: the reply box vanished from a comment the moment somebody
|
|
249
|
+
* replied to it.
|
|
250
|
+
*/
|
|
251
|
+
declare function activeReviewItem(items: readonly ReviewItem[], position: ReviewPosition, order: ReadonlyMap<string, number>): ReviewItem | null;
|
|
252
|
+
/**
|
|
253
|
+
* Walk a reply up to the card that heads its thread. Guarded against a cyclic file.
|
|
254
|
+
*
|
|
255
|
+
* The head is not always a comment. A reply to a tracked change renders inside the REVISION's
|
|
256
|
+
* card, so resolving it to itself opened an item nothing on screen was drawing — the reply box
|
|
257
|
+
* vanished the moment somebody answered a change.
|
|
258
|
+
*
|
|
259
|
+
* EXPORTED because the paginated surface answers "which card is open" itself, against its own
|
|
260
|
+
* dismissed-key state, rather than through {@link activeReviewItem}. Two copies of the
|
|
261
|
+
* innermost-wins rule was survivable while a reply could only be a comment — the parent came
|
|
262
|
+
* first in `comments.xml` order and won the tie by accident. It stopped being survivable the
|
|
263
|
+
* moment a reply could answer a revision, which outranks it outright.
|
|
264
|
+
*/
|
|
265
|
+
declare function reviewThreadRootOf(items: readonly ReviewItem[], comment: ReviewCommentItem): ReviewItem;
|
|
266
|
+
/** Where one paragraph sits, resolved once so a card is an O(1) lookup. */
|
|
267
|
+
interface ReviewParagraphAnchor {
|
|
268
|
+
readonly pageIndex: number;
|
|
269
|
+
/** Sheet-absolute y of the page's content box. */
|
|
270
|
+
readonly contentY: number;
|
|
271
|
+
/** The fragment's own y, measured from that content box. */
|
|
272
|
+
readonly fragmentY: number;
|
|
273
|
+
readonly lines?: readonly {
|
|
274
|
+
readonly range: {
|
|
275
|
+
readonly end: number;
|
|
276
|
+
};
|
|
277
|
+
readonly box: {
|
|
278
|
+
readonly y: number;
|
|
279
|
+
};
|
|
280
|
+
}[];
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Paragraph id to its place on the page, in ONE pass over the layout.
|
|
284
|
+
*
|
|
285
|
+
* Built once per layout and reused by every card. The straightforward version — scan the
|
|
286
|
+
* pages until the paragraph turns up, per card — is a full-document walk per card, and a
|
|
287
|
+
* contract with two hundred comments walked the document two hundred times every time the
|
|
288
|
+
* caret moved. Toggling the pane was visibly slow for exactly that reason.
|
|
289
|
+
*/
|
|
290
|
+
declare function reviewAnchorIndex<TPage extends {
|
|
291
|
+
readonly index: number;
|
|
292
|
+
readonly contentBox: {
|
|
293
|
+
readonly y: number;
|
|
294
|
+
};
|
|
295
|
+
}>(layout: {
|
|
296
|
+
readonly pages: readonly TPage[];
|
|
297
|
+
}, paragraphFragments: (page: TPage) => readonly {
|
|
298
|
+
readonly paragraphId: string;
|
|
299
|
+
readonly box: {
|
|
300
|
+
readonly y: number;
|
|
301
|
+
};
|
|
302
|
+
readonly lines?: readonly {
|
|
303
|
+
readonly range: {
|
|
304
|
+
readonly end: number;
|
|
305
|
+
};
|
|
306
|
+
readonly box: {
|
|
307
|
+
readonly y: number;
|
|
308
|
+
};
|
|
309
|
+
}[];
|
|
310
|
+
}[]): Map<string, ReviewParagraphAnchor>;
|
|
311
|
+
/**
|
|
312
|
+
* Where a card belongs beside the page, from LAYOUT RECORDS.
|
|
313
|
+
*
|
|
314
|
+
* The one question the tree cannot answer, and the one a surface must not answer for itself:
|
|
315
|
+
* measuring painted DOM puts the sidebar a repaint behind the document and breaks outright
|
|
316
|
+
* while pagination is in flight.
|
|
317
|
+
*
|
|
318
|
+
* Returns null when the item has no resolvable range, or when its paragraph is not in this
|
|
319
|
+
* layout — a comment anchored in a header belongs to a story the body layout never saw.
|
|
320
|
+
*/
|
|
321
|
+
declare function reviewItemGeometry(item: ReviewItem, index: ReadonlyMap<string, ReviewParagraphAnchor>): {
|
|
322
|
+
readonly pageIndex: number;
|
|
323
|
+
readonly y: number;
|
|
324
|
+
} | null;
|
|
325
|
+
|
|
326
|
+
export { type CommentRecord as C, type ReviewModelInput as R, W15_NAMESPACE_URI as W, type ReviewItem as a, type ReviewRevisionItem as b, type ReviewCommentItem as c, type ReviewCustomItem as d, type ReviewPosition as e, type ReviewRange as f, type ReviewRevisionKind as g, type CommentAnchor as h, type CommentPosition as i, type CommentThreadState as j, type ReviewParagraphAnchor as k, activeReviewItem as l, commentBodyText as m, commentInitials as n, firstReviewRange as o, paragraphOrderOfPart as p, reviewItemGeometry as q, reviewAnchorIndex as r, reviewItemKey as s, reviewItemPositionRank as t, reviewItemRanges as u, reviewItemsAt as v, reviewThreadRootOf as w };
|