@docx-editor.dev/core 2.30.0 → 2.32.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.
Files changed (133) hide show
  1. package/README.md +24 -0
  2. package/dist/automation.cjs +1 -1
  3. package/dist/automation.d.ts +18 -27
  4. package/dist/automation.js +1 -1
  5. package/dist/binding.cjs +1 -1
  6. package/dist/binding.d.ts +17 -16
  7. package/dist/binding.js +1 -1
  8. package/dist/bookmark-names-DDuAra_V.d.ts +37 -0
  9. package/dist/{chrome-print-BM3Js-6X.d.ts → chrome-print-CznJ0ucN.d.ts} +361 -41
  10. package/dist/chunk-25EXMBV2.cjs +5 -0
  11. package/dist/chunk-2CWQY27B.cjs +1 -0
  12. package/dist/chunk-3IEXDEFH.cjs +7 -0
  13. package/dist/chunk-65XBN67F.cjs +2 -0
  14. package/dist/chunk-6NVZNB7O.cjs +3 -0
  15. package/dist/chunk-6UDJUI3W.cjs +2 -0
  16. package/dist/chunk-ACLR4DMK.js +1 -0
  17. package/dist/{chunk-RJCQGJR7.js → chunk-B2BEELUE.js} +1 -1
  18. package/dist/chunk-DDFHKQFU.js +30 -0
  19. package/dist/chunk-E4IAO4CY.cjs +2 -0
  20. package/dist/chunk-ETDZFNMI.js +2 -0
  21. package/dist/chunk-FDSL5OJU.cjs +30 -0
  22. package/dist/chunk-FS7CMYLT.js +4 -0
  23. package/dist/chunk-GDS24SZN.js +30 -0
  24. package/dist/chunk-GIY6NT2X.js +5 -0
  25. package/dist/chunk-GWM3AKUD.js +18 -0
  26. package/dist/chunk-HDOXACHP.js +2 -0
  27. package/dist/chunk-IILEENID.js +1 -0
  28. package/dist/chunk-L5TYBFDB.js +1 -0
  29. package/dist/chunk-MNF2K7NN.cjs +30 -0
  30. package/dist/chunk-O324RB6R.cjs +1 -0
  31. package/dist/chunk-OKMEMSKB.cjs +1 -0
  32. package/dist/chunk-QXJKYNYZ.js +1 -0
  33. package/dist/chunk-RALTVLB6.js +2 -0
  34. package/dist/chunk-SRVKFUFI.js +3 -0
  35. package/dist/chunk-TELQ52LG.cjs +1 -0
  36. package/dist/chunk-TJHE5EET.cjs +1 -0
  37. package/dist/chunk-UMMRURPE.js +7 -0
  38. package/dist/chunk-WN7ICTA5.js +1 -0
  39. package/dist/{chunk-FLBEJC6X.cjs → chunk-XJYZVGQR.cjs} +1 -1
  40. package/dist/chunk-ZGTIE3QJ.cjs +4 -0
  41. package/dist/chunk-ZOZI27AW.cjs +18 -0
  42. package/dist/collaboration/replication.cjs +1 -1
  43. package/dist/collaboration/replication.d.ts +20 -5
  44. package/dist/collaboration/replication.js +1 -1
  45. package/dist/collaboration.cjs +1 -1
  46. package/dist/collaboration.d.ts +5 -6
  47. package/dist/collaboration.js +1 -1
  48. package/dist/contracts/document.d.ts +3 -3
  49. package/dist/contracts/editor.d.ts +13 -10
  50. package/dist/contracts/interaction.d.ts +2 -2
  51. package/dist/contracts/modules.d.ts +15 -13
  52. package/dist/contracts/types.d.ts +135 -2
  53. package/dist/{custom-node-writes-0v0Kgw1T.d.ts → custom-node-writes-CLJKGD9t.d.ts} +7 -2
  54. package/dist/{diagnostic-context-CcAO4q1s.d.ts → diagnostic-context-BtDUY3v2.d.ts} +3 -2
  55. package/dist/{diagnostic-hints-2Bke6H_w.d.ts → diagnostic-hints-DK8-V0fk.d.ts} +2 -2
  56. package/dist/{document-protection-8eyMWIJ0.d.ts → document-protection-NaniLHWF.d.ts} +1 -1
  57. package/dist/{editor-DaEJd2so.d.ts → editor-DZwOTmlR.d.ts} +386 -279
  58. package/dist/editor-fonts-D_-vjuJi.d.ts +53 -0
  59. package/dist/{editor-scope-7o9xweiJ.d.ts → editor-scope-B3L-1ALc.d.ts} +57 -4
  60. package/dist/editor.cjs +1 -1
  61. package/dist/editor.css +6 -4
  62. package/dist/editor.d.ts +646 -31
  63. package/dist/editor.js +1 -1
  64. package/dist/export.cjs +2 -2
  65. package/dist/export.d.ts +9 -16
  66. package/dist/export.js +2 -2
  67. package/dist/{failure-NS2lsya4.d.ts → failure-6KGFrDO9.d.ts} +1 -1
  68. package/dist/{font-resolver-CL9BVKZo.d.ts → font-resolver-BlQNGdvR.d.ts} +1 -1
  69. package/dist/{headless-document-view-DZQN8Bnx.d.ts → headless-document-view-Bcz9_Qva.d.ts} +115 -4
  70. package/dist/index.cjs +1 -1
  71. package/dist/index.d.ts +27 -26
  72. package/dist/index.js +1 -1
  73. package/dist/{layout-shaping-cEnVrhWg.d.ts → layout-shaping-E5J4Z1Gf.d.ts} +1 -1
  74. package/dist/layout.cjs +1 -1
  75. package/dist/layout.d.ts +95 -23
  76. package/dist/layout.js +1 -1
  77. package/dist/{note-properties-9FH8zAeG.d.ts → note-properties-Ds5R2_3F.d.ts} +1 -1
  78. package/dist/output.cjs +1 -1
  79. package/dist/output.d.ts +24 -10
  80. package/dist/output.js +1 -1
  81. package/dist/{protocol-CZ1uUlPO.d.ts → protocol-DKa4qt7F.d.ts} +167 -5
  82. package/dist/{review-paragraph-order-CqVelc5A.d.ts → review-paragraph-order-Dc17w_6v.d.ts} +1 -1
  83. package/dist/revision-projection-Cn6rZJ7H.d.ts +258 -0
  84. package/dist/{semantic-cell-selection-Dr9yxFZt.d.ts → semantic-cell-selection-BaUR0iJ4.d.ts} +2 -2
  85. package/dist/{semantic-interaction-Dc3pf3hr.d.ts → semantic-interaction-CJoHLoOl.d.ts} +1 -1
  86. package/dist/{semantic-paint-Bz3FBAoH.d.ts → semantic-paint-BPw_n0li.d.ts} +7 -4
  87. package/dist/{semantic-record-queries-Bx0pl6kL.d.ts → semantic-record-queries-C0rJ3sB4.d.ts} +1 -1
  88. package/dist/{semantic-records-CjcF26ZL.d.ts → semantic-records-BvN-WWst.d.ts} +365 -512
  89. package/dist/store.cjs +1 -1
  90. package/dist/store.d.ts +47 -22
  91. package/dist/store.js +1 -1
  92. package/dist/{types-barrel-CA0xB8kH.d.ts → tree-op-types-C_S2niXW.d.ts} +1239 -747
  93. package/dist/{tree-package-store-DKhdEVym.d.ts → tree-package-store-CRHvMyNj.d.ts} +676 -646
  94. package/dist/{tree-session-contract-CwnTEVLF.d.ts → tree-session-contract-D1awo_dA.d.ts} +26 -13
  95. package/dist/unsupported-elements-CVos5cqe.d.ts +23 -0
  96. package/docs/accept-reject-without-scrolling.md +95 -0
  97. package/docs/comment-on-found-text.md +72 -0
  98. package/docs/custom-review-cards.md +178 -0
  99. package/docs/highlight-ranges.md +48 -0
  100. package/docs/index.md +36 -0
  101. package/docs/propose-rewrite.md +247 -0
  102. package/docs/tracked-replacement.md +68 -0
  103. package/package.json +3 -2
  104. package/dist/chunk-2PV5L5NJ.js +0 -5
  105. package/dist/chunk-5OTS2EJ7.js +0 -7
  106. package/dist/chunk-5P4223J4.cjs +0 -27
  107. package/dist/chunk-5RRAZMBU.cjs +0 -1
  108. package/dist/chunk-5SPITS5F.js +0 -18
  109. package/dist/chunk-6JIJOZDW.js +0 -1
  110. package/dist/chunk-7ATNKARV.js +0 -2
  111. package/dist/chunk-BGCUTKWE.cjs +0 -5
  112. package/dist/chunk-BTQKU64Q.cjs +0 -1
  113. package/dist/chunk-EBCXSH2W.js +0 -3
  114. package/dist/chunk-ERECKTIR.cjs +0 -2
  115. package/dist/chunk-HYASLE2G.cjs +0 -1
  116. package/dist/chunk-JC47NRJC.cjs +0 -3
  117. package/dist/chunk-KJRTNY2Q.cjs +0 -2
  118. package/dist/chunk-NKPUH3QJ.js +0 -1
  119. package/dist/chunk-PF5NJWS3.js +0 -2
  120. package/dist/chunk-PWTRJSES.cjs +0 -18
  121. package/dist/chunk-QFKGI242.cjs +0 -30
  122. package/dist/chunk-RPPV4S6T.cjs +0 -4
  123. package/dist/chunk-T32MGBJS.js +0 -1
  124. package/dist/chunk-UM26GH5B.js +0 -30
  125. package/dist/chunk-VRCZBFLH.js +0 -27
  126. package/dist/chunk-WF7JZ755.cjs +0 -1
  127. package/dist/chunk-WK5X2MMA.cjs +0 -7
  128. package/dist/chunk-WPDD2Y32.js +0 -2
  129. package/dist/chunk-YBMWBXST.cjs +0 -2
  130. package/dist/chunk-YZGUBCHP.js +0 -1
  131. package/dist/chunk-ZOS2PM4A.js +0 -4
  132. package/dist/image-resources-Bipz8toD.d.ts +0 -211
  133. package/dist/omml-equation-DP2WpUbK.d.ts +0 -97
@@ -1,5 +1,5 @@
1
- import { aw as AutomationTableMutation, a9 as RevisionBatchResult, a8 as RevisionAuthorResult } from './types-barrel-CA0xB8kH.js';
2
- import { c as HeaderFooterVariant, N as NoteKind } from './tree-package-store-DKhdEVym.js';
1
+ import { aE as AutomationTableMutation, Q as RevisionBatchResult, K as RevisionAuthorResult } from './tree-op-types-C_S2niXW.js';
2
+ import { c as HeaderFooterVariant, N as NoteKind } from './tree-package-store-CRHvMyNj.js';
3
3
 
4
4
  /** Word's shape types, as `Word.ShapeType` spells them. */
5
5
  type AutomationShapeType = 'TextBox' | 'GeometricShape' | 'Picture' | 'Group' | 'Canvas' | 'Unsupported';
@@ -162,6 +162,25 @@ type AutomationAuthoringOperation = {
162
162
  readonly op: 'setFieldCode';
163
163
  readonly field: AutomationHandle;
164
164
  readonly code: string;
165
+ }
166
+ /** The text of a field's cached result, read as a range over the field reads it. */
167
+ | {
168
+ readonly op: 'getFieldResult';
169
+ readonly field: AutomationHandle;
170
+ readonly projection?: AutomationTextProjection;
171
+ }
172
+ /** Replace a field's cached result with plain text. The instruction never changes. */
173
+ | {
174
+ readonly op: 'setFieldResult';
175
+ readonly field: AutomationHandle;
176
+ readonly text: string;
177
+ }
178
+ /** Insert the one equation a Flat OPC package holds. See `equation-snippet.ts`. */
179
+ | {
180
+ readonly op: 'insertOoxml';
181
+ readonly span: AutomationSpanRef;
182
+ readonly location: 'Before' | 'After' | 'Start' | 'End' | 'Replace';
183
+ readonly ooxml: string;
165
184
  } | {
166
185
  readonly op: 'insertField';
167
186
  readonly span: AutomationSpanRef;
@@ -189,6 +208,15 @@ type AutomationAuthoringOperation = {
189
208
  readonly table: AutomationHandle;
190
209
  readonly rowIndex: number;
191
210
  readonly cellIndex: number;
211
+ }
212
+ /** The cell a merge of this rectangle merges into, read before the merge applies. */
213
+ | {
214
+ readonly op: 'getMergedTableCell';
215
+ readonly table: AutomationHandle;
216
+ readonly topRow: number;
217
+ readonly firstCell: number;
218
+ readonly bottomRow: number;
219
+ readonly lastCell: number;
192
220
  } | {
193
221
  readonly op: 'getTableCellProperties' | 'getTableCellBody';
194
222
  readonly cell: AutomationHandle;
@@ -199,6 +227,8 @@ type AutomationAuthoringOperation = {
199
227
  kind: 'cell';
200
228
  } | {
201
229
  kind: 'insertRows';
230
+ } | {
231
+ kind: 'splitCell';
202
232
  }>;
203
233
  } | {
204
234
  readonly op: 'updateTableCell';
@@ -208,6 +238,13 @@ type AutomationAuthoringOperation = {
208
238
  } | {
209
239
  kind: 'insertRows';
210
240
  }>, 'kind' | 'cellId'>;
241
+ }
242
+ /** Split one cell into `rowCount` by `columnCount` cells. */
243
+ | {
244
+ readonly op: 'splitTableCell';
245
+ readonly cell: AutomationHandle;
246
+ readonly rowCount: number;
247
+ readonly columnCount: number;
211
248
  } | {
212
249
  readonly op: 'insertTable';
213
250
  readonly span: AutomationSpanRef;
@@ -344,16 +381,20 @@ type AutomationSpanRef = {
344
381
  readonly body: AutomationHandle;
345
382
  };
346
383
  /**
347
- * Where to look for content controls: a whole story, or inside one control.
384
+ * Where to look for content controls: a whole story, inside one control, or across a span.
348
385
  *
349
386
  * A control's own scope is how nesting is expressed. Listing every control of a story flat
350
387
  * would answer a form field and the group wrapping it as siblings, which is not what either of
351
- * them is.
388
+ * them is. A SPAN scope is the exception on purpose: it answers every control the span
389
+ * overlaps, at any depth, including a control that holds the whole span, because a caller asks
390
+ * a range for its controls to learn what an edit through it would touch.
352
391
  */
353
392
  type AutomationContentControlScope = {
354
393
  readonly body: AutomationHandle;
355
394
  } | {
356
395
  readonly contentControl: AutomationHandle;
396
+ } | {
397
+ readonly span: AutomationSpanRef;
357
398
  };
358
399
  /** The value a control accepts, by what kind of control it is. */
359
400
  type AutomationContentControlValue = {
@@ -496,6 +537,35 @@ type AutomationOperation = AutomationAuthoringOperation | {
496
537
  readonly span: AutomationSpanRef;
497
538
  readonly projection?: AutomationTextProjection;
498
539
  }
540
+ /**
541
+ * A span split into ranges that each end after one of `endingMarks`, or at a paragraph end.
542
+ *
543
+ * Boundaries come from the model text, so a field, an equation, or another atom is never
544
+ * split. `trimSpacing` removes spaces, tabs, and column breaks from each range's edges and
545
+ * drops a range left empty. A range the projection shows no character of is not answered.
546
+ */
547
+ | {
548
+ readonly op: 'getTextRanges';
549
+ readonly scope: AutomationSpanRef;
550
+ readonly endingMarks: readonly string[];
551
+ readonly trimSpacing?: boolean;
552
+ readonly projection?: AutomationTextProjection;
553
+ }
554
+ /** The smallest span covering both spans. Both must be in one story. */
555
+ | {
556
+ readonly op: 'expandSpan';
557
+ readonly span: AutomationSpanRef;
558
+ readonly to: AutomationSpanRef;
559
+ }
560
+ /**
561
+ * A span's text as if every pending revision were accepted (`current`) or rejected
562
+ * (`original`), with a carriage return at each paragraph mark that view keeps.
563
+ */
564
+ | {
565
+ readonly op: 'getReviewedText';
566
+ readonly span: AutomationSpanRef;
567
+ readonly version: 'original' | 'current';
568
+ }
499
569
  /**
500
570
  * A paragraph's own identity as the DOCUMENT writes it (`w14:paraId`).
501
571
  *
@@ -877,6 +947,50 @@ type AutomationOperation = AutomationAuthoringOperation | {
877
947
  readonly op: 'getBookmarkRange';
878
948
  readonly bookmark: AutomationHandle;
879
949
  }
950
+ /**
951
+ * The names of the bookmarks a span overlaps, in document order: `Range.getBookmarks`.
952
+ *
953
+ * A non-empty span holds a bookmark when the two share text, and a point bookmark when the
954
+ * point is inside the span. An empty span holds the bookmarks around it. `includeAdjacent`
955
+ * adds the bookmarks that only touch the span; `includeHidden` adds names starting with `_`.
956
+ */
957
+ | {
958
+ readonly op: 'getBookmarkNames';
959
+ readonly scope: AutomationSpanRef;
960
+ readonly includeHidden: boolean;
961
+ readonly includeAdjacent: boolean;
962
+ }
963
+ /**
964
+ * The range of the bookmark with this name, compared without case, in any story: main text
965
+ * first, then headers, footers and notes. Answers no span when nothing declares the name.
966
+ */
967
+ | {
968
+ readonly op: 'getBookmarkRangeByName';
969
+ readonly document: AutomationHandle;
970
+ readonly name: string;
971
+ }
972
+ /**
973
+ * Add a bookmark around a span, or at a point. A bookmark any story declares under the same
974
+ * name, compared without case, moves here in the same write.
975
+ */
976
+ | {
977
+ readonly op: 'insertBookmark';
978
+ readonly span: AutomationSpanRef;
979
+ readonly name: string;
980
+ }
981
+ /**
982
+ * Remove a bookmark: by name anywhere in the document, or the one a handle names. The text
983
+ * stays. A name nothing declares is not an error and changes nothing.
984
+ */
985
+ | {
986
+ readonly op: 'deleteBookmark';
987
+ readonly target: {
988
+ readonly document: AutomationHandle;
989
+ readonly name: string;
990
+ } | {
991
+ readonly bookmark: AutomationHandle;
992
+ };
993
+ }
880
994
  /**
881
995
  * The comments anchored in a scope, in document order — the TOP-LEVEL ones.
882
996
  *
@@ -990,6 +1104,31 @@ type AutomationOperation = AutomationAuthoringOperation | {
990
1104
  readonly op: 'getRevisions';
991
1105
  readonly body: AutomationHandle;
992
1106
  }
1107
+ /**
1108
+ * The listed tracked changes whose characters a span overlaps, in document order. A collapsed
1109
+ * span lists the changes it touches. Handles are the story-wide listing's handles.
1110
+ */
1111
+ | {
1112
+ readonly op: 'getRevisions';
1113
+ readonly scope: AutomationSpanRef;
1114
+ }
1115
+ /**
1116
+ * The listed tracked changes a review-queue key names: one, or the two halves of a paired
1117
+ * replacement. A key naming nothing answers no handles.
1118
+ */
1119
+ | {
1120
+ readonly op: 'getRevisions';
1121
+ readonly key: string;
1122
+ }
1123
+ /**
1124
+ * The stretch a review-queue key names: `revision-<id>`, a paired `revision-replace:<a>+<b>`,
1125
+ * or `comment-<id>`. Answers `spans` holding one span covering every range of the item, or no
1126
+ * span when the key names nothing this document holds.
1127
+ */
1128
+ | {
1129
+ readonly op: 'getReviewItemRange';
1130
+ readonly key: string;
1131
+ }
993
1132
  /** Resolve eligible decisions in one story. Omit revisions to select every canonical decision. */
994
1133
  | {
995
1134
  readonly op: 'resolveRevisionBatch';
@@ -1061,6 +1200,24 @@ type AutomationOperation = AutomationAuthoringOperation | {
1061
1200
  readonly op: 'rejectAllRevisions';
1062
1201
  readonly document: AutomationHandle;
1063
1202
  }
1203
+ /**
1204
+ * Accept or reject every change a span overlaps, or the changes a review-queue key names, as
1205
+ * one transaction. Structural changes absent from listings are included. Refused whole when
1206
+ * any of them is read-only or cannot be resolved, and when the key names nothing.
1207
+ */
1208
+ | {
1209
+ readonly op: 'acceptAllRevisions';
1210
+ readonly scope: AutomationSpanRef;
1211
+ } | {
1212
+ readonly op: 'rejectAllRevisions';
1213
+ readonly scope: AutomationSpanRef;
1214
+ } | {
1215
+ readonly op: 'acceptAllRevisions';
1216
+ readonly key: string;
1217
+ } | {
1218
+ readonly op: 'rejectAllRevisions';
1219
+ readonly key: string;
1220
+ }
1064
1221
  /**
1065
1222
  * Put the reader's selection on a span. Requires the `selection` capability, so a headless
1066
1223
  * host refuses it rather than pretending to have a caret.
@@ -1493,6 +1650,11 @@ type AutomationValue = {
1493
1650
  } | {
1494
1651
  readonly kind: 'text';
1495
1652
  readonly text: string;
1653
+ }
1654
+ /** Several strings, in document order: the names of the bookmarks a range holds. */
1655
+ | {
1656
+ readonly kind: 'texts';
1657
+ readonly texts: readonly string[];
1496
1658
  } | {
1497
1659
  readonly kind: 'span';
1498
1660
  readonly span: AutomationSpan;
@@ -1648,4 +1810,4 @@ interface AutomationHost {
1648
1810
  dispose(): void;
1649
1811
  }
1650
1812
 
1651
- export type { AutomationOperation as A, AutomationPoint as B, AutomationReadingOrder as C, AutomationSaveResult as D, AutomationSearchOptions as E, AutomationSelectionMode as F, AutomationSpan as G, AutomationSpanRef as H, AutomationTextProjection as I, AutomationUnsubscribe as J, AutomationValue as K, AutomationCapabilities as a, AutomationHost as b, AutomationAlignment as c, AutomationBatchRequest as d, AutomationBatchResponse as e, AutomationChangeEvent as f, AutomationContentControlLock as g, AutomationContentControlRangeLocation as h, AutomationContentControlScope as i, AutomationContentControlSubtype as j, AutomationContentControlValue as k, AutomationError as l, AutomationErrorCode as m, AutomationFontRead as n, AutomationFontWrite as o, AutomationHandle as p, AutomationHandleRef as q, AutomationObjectKind as r, AutomationOperationKind as s, AutomationOperationResult as t, AutomationPageOrientation as u, AutomationPageSetupRead as v, AutomationPageSetupWrite as w, AutomationParagraphFormatRead as x, AutomationParagraphFormatWrite as y, AutomationParagraphRef as z };
1813
+ export type { AutomationOperation as A, AutomationOperationKind as B, AutomationOperationResult as C, AutomationPageOrientation as D, AutomationPageSetupRead as E, AutomationPageSetupWrite as F, AutomationParagraphFormatRead as G, AutomationParagraphFormatWrite as H, AutomationParagraphRef as I, AutomationPoint as J, AutomationReadingOrder as K, AutomationSaveResult as L, AutomationSearchOptions as M, AutomationSelectionMode as N, AutomationShapeRead as O, AutomationShapeType as P, AutomationSpan as Q, AutomationSpanRef as R, AutomationTextProjection as S, AutomationUnsubscribe as T, AutomationValue as U, AutomationCapabilities as a, AutomationHost as b, AutomationAlignment as c, AutomationAuthoringOperation as d, AutomationBatchRequest as e, AutomationBatchResponse as f, AutomationChangeEvent as g, AutomationContentControlLock as h, AutomationContentControlRangeLocation as i, AutomationContentControlScope as j, AutomationContentControlSubtype as k, AutomationContentControlValue as l, AutomationCustomNodePayload as m, AutomationEndpoint as n, AutomationError as o, AutomationErrorCode as p, AutomationFontRead as q, AutomationFontWrite as r, AutomationHandle as s, AutomationHandleRef as t, AutomationInlinePictureRead as u, AutomationInlinePictureWrite as v, AutomationListBullet as w, AutomationListLevelFormat as x, AutomationListNumbering as y, AutomationObjectKind as z };
@@ -1,4 +1,4 @@
1
- import { N as OoxmlNode, ah as OoxmlElement, ai as OoxmlContentControlNode, V as OoxmlGenericElementNode, aj as OoxmlContentControlContentNode, C as CommentRecord, O as OoxmlPart } from './types-barrel-CA0xB8kH.js';
1
+ import { a4 as OoxmlNode, av as OoxmlElement, aw as OoxmlContentControlNode, ax as OoxmlGenericElementNode, ay as OoxmlContentControlContentNode, C as CommentRecord, O as OoxmlPart } from './tree-op-types-C_S2niXW.js';
2
2
 
3
3
  /** Nested content-control wrappers deeper than this stop flattening; content stays preserved. */
4
4
  declare const MAX_CONTENT_CONTROL_NESTING = 32;
@@ -0,0 +1,258 @@
1
+ import { a4 as OoxmlNode } from './tree-op-types-C_S2niXW.js';
2
+
3
+ /** Named revision colors. Identifiers are stable and never contain CSS. @public */
4
+ declare const REVISION_MARKUP_COLORS: readonly ['black', 'blue', 'turquoise', 'green', 'pink', 'red', 'yellow', 'white', 'darkBlue', 'teal', 'darkGreen', 'violet', 'darkRed', 'darkYellow', 'gray50', 'gray25', 'lightBlue', 'lightYellow', 'lightOrange', 'lightPurple', 'lightGreen', 'gray'];
5
+ /** @public */
6
+ type RevisionMarkupNamedColor = (typeof REVISION_MARKUP_COLORS)[number];
7
+ /** @public */
8
+ type RevisionMarkupColor = RevisionMarkupNamedColor | 'byAuthor' | 'auto';
9
+ /** @public */
10
+ type RevisionMarkupMark = 'none' | 'colorOnly' | 'bold' | 'italic' | 'underline' | 'doubleUnderline' | 'strikethrough' | 'doubleStrikethrough';
11
+ /** @public */
12
+ type RevisionDeletionMark = RevisionMarkupMark | 'hidden' | 'caret' | 'pound';
13
+ /** @public */
14
+ type RevisionChangedLinesMark = 'none' | 'leftBorder' | 'rightBorder' | 'outsideBorder';
15
+ /** @public */
16
+ interface RevisionMarkupStyle<Mark extends string = RevisionMarkupMark> {
17
+ readonly mark: Mark;
18
+ readonly color: RevisionMarkupColor;
19
+ }
20
+ /** Viewer-only text styling. Document highlighting remains unchanged. @public */
21
+ interface RevisionMarkupTextStyle<Mark extends string = RevisionMarkupMark> extends RevisionMarkupStyle<Mark> {
22
+ /** Background color behind revision text. Defaults to `none`. */
23
+ readonly background: RevisionMarkupNamedColor | 'byAuthor' | 'none';
24
+ }
25
+ /** Fully resolved, immutable viewer preferences. @public */
26
+ interface ResolvedRevisionMarkup {
27
+ readonly insertions: RevisionMarkupTextStyle;
28
+ readonly deletions: RevisionMarkupTextStyle<RevisionDeletionMark>;
29
+ readonly movedFrom: RevisionMarkupTextStyle<RevisionDeletionMark>;
30
+ readonly movedTo: RevisionMarkupTextStyle;
31
+ readonly formatting: RevisionMarkupTextStyle;
32
+ readonly changedLines: RevisionMarkupStyle<RevisionChangedLinesMark>;
33
+ readonly cells: {
34
+ readonly inserted: RevisionMarkupNamedColor | 'byAuthor' | 'none';
35
+ readonly deleted: RevisionMarkupNamedColor | 'byAuthor' | 'none';
36
+ readonly merged: RevisionMarkupNamedColor | 'byAuthor' | 'none';
37
+ readonly split: RevisionMarkupNamedColor | 'byAuthor' | 'none';
38
+ };
39
+ readonly trackMoves: boolean;
40
+ readonly trackFormatting: boolean;
41
+ }
42
+ /** Partial viewer preferences. Omitted values keep the previous value. @public */
43
+ type RevisionMarkupOptions = {
44
+ readonly [K in keyof ResolvedRevisionMarkup]?: ResolvedRevisionMarkup[K] extends boolean ? boolean : Partial<ResolvedRevisionMarkup[K]>;
45
+ };
46
+ /** Initial viewer preferences. @public */
47
+ declare const DEFAULT_REVISION_MARKUP: ResolvedRevisionMarkup;
48
+ /** Validate and merge preferences without modifying the input. @public */
49
+ declare function resolveRevisionMarkup(input?: RevisionMarkupOptions, previous?: ResolvedRevisionMarkup): ResolvedRevisionMarkup;
50
+ /** CSS token for a validated named color. */
51
+ declare function revisionMarkupColor(color: RevisionMarkupColor, authorColor: string, auto?: string): string;
52
+ /** Select the visual style without changing revision identity. */
53
+ declare function revisionMarkupStyle(settings: ResolvedRevisionMarkup, kind: 'insert' | 'delete' | 'moveFrom' | 'moveTo' | 'format'): RevisionMarkupTextStyle<RevisionDeletionMark>;
54
+ /** A local settings draft owned by the editor. @public */
55
+ interface RevisionMarkupDialogSession {
56
+ /** Aborts on close, replacement, load, detach, destroy, or renderer disposal. */
57
+ readonly signal: AbortSignal;
58
+ /** Read the immutable draft. */
59
+ get(): ResolvedRevisionMarkup;
60
+ /** Merge validated options into the draft without committing preferences. */
61
+ set(options: RevisionMarkupOptions): void;
62
+ /** Restore default preferences in the draft only. */
63
+ reset(): void;
64
+ /** Observe draft changes, including effective external preference changes. */
65
+ subscribe(listener: () => void): () => void;
66
+ canApply(): boolean;
67
+ /** Commit the draft and close. Returns false after cancellation. */
68
+ apply(): boolean;
69
+ /** Close without committing the draft. */
70
+ cancel(): void;
71
+ }
72
+ /** Host rendering for the Track changes options dialog. @public */
73
+ interface RevisionMarkupChromeHandlers {
74
+ readonly onRequest?: (session: RevisionMarkupDialogSession) => void;
75
+ }
76
+
77
+ /**
78
+ * What a revision wrapper asserts about the content inside it.
79
+ *
80
+ * `moveFrom` / `moveTo` are deliberately distinct from `delete` / `insert`: a move is one
81
+ * decision with two halves, and presenting it as an unrelated deletion and insertion invites
82
+ * resolving one without the other, which duplicates or loses the content.
83
+ */
84
+ type RevisionKind = 'insert' | 'delete' | 'moveFrom' | 'moveTo' | 'format';
85
+ /**
86
+ * One revision wrapper's provenance, as authored.
87
+ *
88
+ * `id` is the verbatim `@w:id` string rather than a number: `ST_DecimalNumber` restricts
89
+ * `xsd:integer` with no bounds, so a file may carry a value outside the safe integer range, and
90
+ * parsing it to a number would silently merge two distinct revisions.
91
+ *
92
+ * `date` is absent when the file omits it. `@w:date` is optional on `CT_TrackChange`, and
93
+ * inventing one is a silent content change.
94
+ */
95
+ interface RevisionAttribution {
96
+ readonly kind: RevisionKind;
97
+ readonly id: string;
98
+ readonly author: string;
99
+ readonly date?: string;
100
+ /** The wrapper's node id, so a surface can address this exact site. */
101
+ readonly nodeId: string;
102
+ }
103
+ /**
104
+ * Which revisions layout resolves before producing pages.
105
+ *
106
+ * - `all-markup` shows both halves of every change.
107
+ * - `proposed` shows what the document becomes if every change is accepted.
108
+ * - `original` shows what it was before any of them.
109
+ *
110
+ * The last two are specified as equal to accept-all and reject-all OUTPUT, which is what makes
111
+ * them testable, without either applying an op.
112
+ */
113
+ type RevisionDisplayMode = 'all-markup' | 'proposed' | 'original';
114
+ /**
115
+ * The views the review chrome offers, in Word's terms: the three layout projections plus
116
+ * Simple Markup, which reads as the proposed result with a red change bar beside every line
117
+ * a change touched — the document as accepting everything would leave it, and where.
118
+ */
119
+ type ReviewDisplayMode = RevisionDisplayMode | 'simple-markup';
120
+ /**
121
+ * How a document renders tracked changes when nothing says otherwise.
122
+ *
123
+ * `all-markup` matches Word's own default: a reader who opens a document with pending changes
124
+ * sees them, rather than a clean-looking document hiding edits nobody has accepted.
125
+ */
126
+ declare const DEFAULT_REVISION_DISPLAY_MODE: RevisionDisplayMode;
127
+ /**
128
+ * A view-time tracked-change filter. Revisions rejected by `includes` use the filter's accepted
129
+ * or rejected projection, while included revisions keep the display mode's normal projection.
130
+ *
131
+ * `cacheKey` is a canonical, content-based identity for layout caches. The set itself is kept
132
+ * because author names are attacker-controlled strings and must never be parsed back from a
133
+ * delimiter-based key.
134
+ */
135
+ interface RevisionFilter {
136
+ readonly revisionMarkup?: ResolvedRevisionMarkup;
137
+ readonly hiddenAuthors: ReadonlySet<string>;
138
+ readonly includes?: (revision: RevisionAttribution) => boolean;
139
+ readonly includesNode?: (nodeId: string, author: string) => boolean;
140
+ /** Accepted/original projection for a revision excluded by `includesNode`. */
141
+ readonly excludedNodeMode?: (nodeId: string, author: string) => 'proposed' | 'original';
142
+ /**
143
+ * In a resolved view, content the view keeps paints as ORDINARY text: no author ink, no
144
+ * decoration, no change bar of its own. This is Word's No Markup, Original and Simple
145
+ * Markup, which the review chrome asks for. Without it the accepted projection keeps the
146
+ * attribution on kept insertions, which is what the engine paints when no review module
147
+ * is registered — colour by author, deletions resolved — and what its roster reads.
148
+ */
149
+ readonly resolvedMarkup?: 'plain';
150
+ readonly cacheKey: string;
151
+ /**
152
+ * @internal Revision records the review queue leaves out, by change-element node id, and the
153
+ * paragraphs that hold them. Their paragraphs project without those records, so they paint
154
+ * no markup. Not a selection: it never moves a projection off the unfiltered path.
155
+ */
156
+ readonly unlisted?: {
157
+ readonly sites: ReadonlySet<string>;
158
+ /** Each paragraph that holds one, keyed by the records it holds. */
159
+ readonly paragraphs: ReadonlyMap<string, string>;
160
+ /** Names the styles and numbering the records were decided against. */
161
+ readonly key: string;
162
+ };
163
+ }
164
+ /** @deprecated Use {@link RevisionFilter}. */
165
+ interface RevisionAuthorFilter extends RevisionFilter {
166
+ }
167
+ /** Build a canonical reviewer filter. An empty input returns `undefined` for the fast path. */
168
+ declare function revisionAuthorFilter(hiddenAuthors: Iterable<string>): RevisionAuthorFilter | undefined;
169
+ /**
170
+ * Whether content under this stack of revisions is laid out in the given mode.
171
+ *
172
+ * Containment governs, so a single enclosing wrapper the mode resolves away suppresses
173
+ * everything inside it regardless of what the inner wrappers say. An insertion inside a
174
+ * deletion does not survive the proposed result: the deletion it sits in was accepted.
175
+ */
176
+ declare function revisionsVisible(revisions: readonly RevisionAttribution[], mode: RevisionDisplayMode, authorFilter?: RevisionAuthorFilter): boolean;
177
+ /**
178
+ * Every revision on a paragraph's own MARK, from `w:pPr/w:rPr/w:ins|w:del|w:moveFrom|w:moveTo`.
179
+ *
180
+ * All four members of `EG_ParaRPrTrackChanges`. A moved paragraph carries `w:moveFrom` on the
181
+ * mark of the copy it left and `w:moveTo` on the mark of the copy it arrived at, so a move
182
+ * that spans whole paragraphs is recorded here and nowhere else.
183
+ *
184
+ * `EG_ParaRPrTrackChanges` records that the pilcrow itself was inserted or deleted, which is how
185
+ * Word writes a paragraph split or merge. It is not content — there is no text to decorate — so
186
+ * a surface shows it as a mark of its own beside the paragraph, the way Word draws a struck-
187
+ * through ¶.
188
+ *
189
+ * A LIST, because the group is `ins? del? moveFrom? moveTo?` and the first two can both be
190
+ * there: that pair is what Word writes when a second author proposes removing a mark the first
191
+ * proposed adding, and it is what this engine's own writer emits (`tree-op-tracked.ts`).
192
+ * Answering with the first one hid the second author's decision from the PAGE. The review pane
193
+ * walks the tree itself and always listed both, which is the worse shape of the two: a card
194
+ * offering a decision the reader could see no sign of.
195
+ *
196
+ * Ordered as the file orders them, which is the order the group declares.
197
+ *
198
+ * Property-position `w:ins`/`w:del` stay `generic` in the tree deliberately, so this reads them
199
+ * by name rather than by kind.
200
+ */
201
+ declare function paragraphMarkRevisionsOf(paragraph: OoxmlNode): readonly RevisionAttribution[];
202
+ /**
203
+ * The tracked FORMAT change on a paragraph's own mark, from `w:pPr/w:rPr/w:rPrChange`.
204
+ *
205
+ * `CT_ParaRPr` ends with it (§17.13.5.32), and Word writes it when a user changes the mark's
206
+ * own run properties with tracking on. It reaches the fragment rather than a span because it
207
+ * decorates no characters, and it is not in `props`: a fragment's `props` carry the mark's
208
+ * `w:rPr` by NAME only, with none of its children.
209
+ *
210
+ * Note that `w:rPrChange/w:rPr` is `CT_ParaRPrOriginal`, which may carry its own revision
211
+ * marks. Those describe the mark as it WAS and must not be read as live ones, which is why
212
+ * this reads the change element's own attributes and never descends into it.
213
+ */
214
+ declare function paragraphMarkFormatRevisionOf(paragraph: OoxmlNode): RevisionAttribution | null;
215
+ /**
216
+ * The single decision a one-field reader sees.
217
+ *
218
+ * A DELETION wins when a mark carries both, for the reason paint draws it that way: a break
219
+ * proposed and then unproposed ends up removed, so that is the decision a reader who can only
220
+ * see one must see. One function decides it, so the deprecated field, the deprecated function
221
+ * and the painted glyph cannot answer differently.
222
+ */
223
+ declare function shownMarkRevision(revisions: readonly RevisionAttribution[]): RevisionAttribution | undefined;
224
+ /**
225
+ * Does this decision, taken, remove the paragraph mark?
226
+ *
227
+ * A deletion does, and so does a `moveFrom`: the copy the paragraph moved OUT of goes away
228
+ * when the move is accepted. `insert` and `moveTo` are the other half of each pair, and they
229
+ * keep the break. Paint, the change bar and the resolved views all ask this one question, so
230
+ * a `moveFrom` cannot end up struck through in the margin and blue on the glyph.
231
+ */
232
+ declare function markRevisionRemovesMark(revision: RevisionAttribution): boolean;
233
+ /**
234
+ * The one decision on a paragraph's mark that a single-field reader sees.
235
+ *
236
+ * @deprecated Reads one of the revisions a mark can carry. Use {@link paragraphMarkRevisionsOf},
237
+ * which answers with all of them.
238
+ */
239
+ declare function paragraphMarkRevisionOf(paragraph: OoxmlNode): RevisionAttribution | null;
240
+ /**
241
+ * The tracked FORMAT change on a property list, from `w:rPrChange` or `w:pPrChange`.
242
+ *
243
+ * A property change alters no characters, so it has no span of its own to strike or underline.
244
+ * Word marks the affected text and says what changed; the minimum a reader needs is to see that
245
+ * this text's formatting is itself a pending decision.
246
+ *
247
+ * Read from the flattened property list because that is what layout already carries — the
248
+ * change wrapper is a `w:rPr`/`w:pPr` child like any other.
249
+ */
250
+ declare function formatRevisionOf(properties: readonly {
251
+ readonly localName: string;
252
+ readonly attributes?: Readonly<Record<string, string>>;
253
+ }[]): RevisionAttribution | null;
254
+ /** True when this stack of revisions marks its content as deleted from the live document. */
255
+ declare function revisionsAreDeletion(revisions: readonly RevisionAttribution[]): boolean;
256
+
257
+ export { revisionAuthorFilter as A, revisionsAreDeletion as B, revisionsVisible as C, DEFAULT_REVISION_MARKUP as D, shownMarkRevision as E, REVISION_MARKUP_COLORS as c, revisionMarkupColor as n, revisionMarkupStyle as o, resolveRevisionMarkup as r, DEFAULT_REVISION_DISPLAY_MODE as s, formatRevisionOf as v, markRevisionRemovesMark as w, paragraphMarkFormatRevisionOf as x, paragraphMarkRevisionOf as y, paragraphMarkRevisionsOf as z };
258
+ export type { RevisionMarkupDialogSession as R, ReviewDisplayMode as a, RevisionDisplayMode as b, ResolvedRevisionMarkup as d, RevisionChangedLinesMark as e, RevisionDeletionMark as f, RevisionMarkupChromeHandlers as g, RevisionMarkupColor as h, RevisionMarkupMark as i, RevisionMarkupNamedColor as j, RevisionMarkupOptions as k, RevisionMarkupStyle as l, RevisionMarkupTextStyle as m, RevisionAuthorFilter as p, RevisionAttribution as q, RevisionFilter as t, RevisionKind as u };
@@ -1,5 +1,5 @@
1
- import { S as SemanticPosition, C as CaretGeometry, a as SemanticSelection } from './semantic-interaction-Dc3pf3hr.js';
2
- import { I as InlineDrawingRecord, A as AnchoredDrawingRecord, T as TextMeasurer, L as LineRecord, g as StyleSpanRecord, S as SemanticLayout, C as ContentControlBoundaryRecord, h as TableRowFragmentRecord, i as TableCellFragmentRecord } from './semantic-records-CjcF26ZL.js';
1
+ import { S as SemanticPosition, C as CaretGeometry, a as SemanticSelection } from './semantic-interaction-CJoHLoOl.js';
2
+ import { I as InlineDrawingRecord, A as AnchoredDrawingRecord, T as TextMeasurer, L as LineRecord, g as StyleSpanRecord, S as SemanticLayout, C as ContentControlBoundaryRecord, h as TableRowFragmentRecord, i as TableCellFragmentRecord } from './semantic-records-BvN-WWst.js';
3
3
 
4
4
  /** A point in the coordinate space named by the function taking it. */
5
5
  interface HitPoint {
@@ -1,4 +1,4 @@
1
- import { T as TextMeasurer, S as SemanticLayout, B as BlockFragmentRecord, C as ContentControlBoundaryRecord, g as StyleSpanRecord } from './semantic-records-CjcF26ZL.js';
1
+ import { T as TextMeasurer, S as SemanticLayout, B as BlockFragmentRecord, C as ContentControlBoundaryRecord, g as StyleSpanRecord } from './semantic-records-BvN-WWst.js';
2
2
 
3
3
  /** How `moveCaret` resolves a motion. */
4
4
  interface MoveCaretOptions {
@@ -1,6 +1,7 @@
1
- import { c as PageRecord, q as ResolvedRevisionMarkup, C as ContentControlBoundaryRecord, S as SemanticLayout } from './semantic-records-CjcF26ZL.js';
2
- import { S as SemanticRootStoryKind } from './semantic-record-queries-Bx0pl6kL.js';
3
- import { V as ValidatedImageBytesHandle, R as RenderableImageMime } from './image-resources-Bipz8toD.js';
1
+ import { d as ResolvedRevisionMarkup } from './revision-projection-Cn6rZJ7H.js';
2
+ import { ap as ValidatedImageBytesHandle, al as RenderableImageMime, av as OoxmlElement } from './tree-op-types-C_S2niXW.js';
3
+ import { a as PageRecord, C as ContentControlBoundaryRecord, S as SemanticLayout } from './semantic-records-BvN-WWst.js';
4
+ import { S as SemanticRootStoryKind } from './semantic-record-queries-C0rJ3sB4.js';
4
5
 
5
6
  /**
6
7
  * Everything a host can say about ONE author's presentation. Every field is optional and
@@ -199,6 +200,8 @@ declare const DEFAULT_FIELD_SHADING: FieldShadingMode;
199
200
  * set through these options is ever serialised back into the document.
200
201
  */
201
202
  interface PaintOptions {
203
+ readonly unsupportedOwnerPartName?: (nodeId: string) => string;
204
+ readonly unsupportedSource?: (nodeId: string, ownerPartName?: string) => OoxmlElement | null;
202
205
  /** Points to CSS pixels. 96/72 renders a point as a CSS point at 100% zoom. */
203
206
  readonly scale?: number;
204
207
  /** Generated paragraphs that paint as non-editable navigation surfaces. */
@@ -335,4 +338,4 @@ interface PaintOptions {
335
338
  declare function paintSemanticLayout(container: HTMLElement, layout: SemanticLayout, options?: PaintOptions): void;
336
339
 
337
340
  export { DEFAULT_FIELD_SHADING as D, collectPageChangeBars as e, paintSemanticLayout as p };
338
- export type { BreakMarkStrings as B, ChangeBarsMode as C, FieldShadingMode as F, PageChangeBars as P, ReviewAuthorInfo as R, PaintOptions as a, RevisionAuthorAssignments as b, RevisionAuthorStyle as c, RevisionStyles as d, DrawingPaintStrings as f };
341
+ export type { BreakMarkStrings as B, ChangeBarsMode as C, FieldShadingMode as F, PageChangeBars as P, ReviewAuthorInfo as R, RevisionAuthorAssignments as a, RevisionAuthorStyle as b, RevisionStyles as c, PaintOptions as d, DrawingPaintStrings as f };
@@ -1,4 +1,4 @@
1
- import { I as InlineDrawingRecord, A as AnchoredDrawingRecord, P as ParagraphFragmentRecord, L as LineRecord, c as PageRecord, N as NoteAreaRecord, d as LayoutBox, H as HeaderFooterStoryRecord, e as NoteStoryRecord, B as BlockFragmentRecord, S as SemanticLayout, C as ContentControlBoundaryRecord, f as ContentControlLock } from './semantic-records-CjcF26ZL.js';
1
+ import { I as InlineDrawingRecord, A as AnchoredDrawingRecord, P as ParagraphFragmentRecord, L as LineRecord, a as PageRecord, N as NoteAreaRecord, b as LayoutBox, H as HeaderFooterStoryRecord, c as NoteStoryRecord, B as BlockFragmentRecord, S as SemanticLayout, C as ContentControlBoundaryRecord, d as ContentControlLock } from './semantic-records-BvN-WWst.js';
2
2
 
3
3
  /**
4
4
  * Depth-first paragraph fragments of one page, in reading order.