@docx-editor.dev/core 2.26.0 → 2.28.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 (122) hide show
  1. package/dist/automation.cjs +1 -1
  2. package/dist/automation.d.ts +30 -13
  3. package/dist/automation.js +1 -1
  4. package/dist/binding.cjs +1 -1
  5. package/dist/binding.d.ts +20 -9
  6. package/dist/binding.js +1 -1
  7. package/dist/chunk-2GO5T2JU.cjs +1 -0
  8. package/dist/chunk-2RC2EPND.js +3 -0
  9. package/dist/chunk-4GBTELJV.cjs +28 -0
  10. package/dist/chunk-4R3TEXMN.js +18 -0
  11. package/dist/chunk-5CSUYANV.js +1 -0
  12. package/dist/chunk-6APGXLBB.cjs +3 -0
  13. package/dist/chunk-6AWEKBLB.cjs +1 -0
  14. package/dist/chunk-6EYYL7FL.js +1 -0
  15. package/dist/chunk-E7BQA6UP.js +2 -0
  16. package/dist/chunk-EO4C5QJW.cjs +2 -0
  17. package/dist/chunk-ETTO6GK3.js +1 -0
  18. package/dist/chunk-FIJZIQXA.cjs +18 -0
  19. package/dist/chunk-FRXAOVTB.js +28 -0
  20. package/dist/chunk-J6BVWIDB.js +2 -0
  21. package/dist/chunk-JGNVNT2A.cjs +2 -0
  22. package/dist/chunk-K5U2PLDP.cjs +2 -0
  23. package/dist/chunk-KKIJG3C6.js +2 -0
  24. package/dist/chunk-LWDSDCMO.js +27 -0
  25. package/dist/chunk-NBCVVZOM.cjs +1 -0
  26. package/dist/chunk-O2AL2HSJ.cjs +1 -0
  27. package/dist/{chunk-AJCCS53D.js → chunk-O5INAWZQ.js} +1 -1
  28. package/dist/chunk-QMLCVPCD.cjs +1 -0
  29. package/dist/chunk-RCHS4ZEH.cjs +27 -0
  30. package/dist/chunk-SRPILEWV.cjs +5 -0
  31. package/dist/chunk-TSLBZ26X.js +1 -0
  32. package/dist/chunk-VDNNLG6X.js +2 -0
  33. package/dist/chunk-VHAVHCQY.js +7 -0
  34. package/dist/chunk-VX43VBAX.cjs +7 -0
  35. package/dist/chunk-Z6WBFXJU.js +5 -0
  36. package/dist/chunk-ZUHOMK52.cjs +2 -0
  37. package/dist/collaboration/replication.cjs +1 -1
  38. package/dist/collaboration/replication.d.ts +50 -5
  39. package/dist/collaboration/replication.js +1 -1
  40. package/dist/collaboration.cjs +1 -1
  41. package/dist/collaboration.d.ts +98 -6
  42. package/dist/collaboration.js +1 -1
  43. package/dist/contracts/document.d.ts +17 -2
  44. package/dist/contracts/editor.d.ts +19 -9
  45. package/dist/contracts/interaction.d.ts +29 -0
  46. package/dist/contracts/modules.cjs +1 -1
  47. package/dist/contracts/modules.d.ts +29 -16
  48. package/dist/contracts/modules.js +1 -1
  49. package/dist/contracts/types.d.ts +10 -1
  50. package/dist/{custom-node-writes-Cy9imOjA.d.ts → custom-node-writes-cvL5rhcD.d.ts} +2 -2
  51. package/dist/{document-protection-Bp19Ad4I.d.ts → document-protection-BAGVGqaP.d.ts} +1 -1
  52. package/dist/{editor-DYUlyKmb.d.ts → editor-Ci7IZGmG.d.ts} +410 -163
  53. package/dist/editor.cjs +1 -1
  54. package/dist/editor.css +5 -5
  55. package/dist/editor.d.ts +417 -31
  56. package/dist/editor.js +1 -1
  57. package/dist/export.cjs +2 -2
  58. package/dist/export.d.ts +37 -15
  59. package/dist/export.js +2 -2
  60. package/dist/failure-NS2lsya4.d.ts +115 -0
  61. package/dist/{font-resolver-u_nE0PI1.d.ts → font-resolver-BVQB14qT.d.ts} +1 -1
  62. package/dist/{headless-document-view-R9bzzepb.d.ts → headless-document-view-qH331moE.d.ts} +2 -2
  63. package/dist/{image-resources-DfagDguq.d.ts → image-resources-BN-hUgCn.d.ts} +9 -9
  64. package/dist/{index-Docw8Dcb.d.ts → index-Bsg7oIKP.d.ts} +270 -115
  65. package/dist/index.cjs +1 -1
  66. package/dist/index.d.ts +46 -18
  67. package/dist/index.js +1 -1
  68. package/dist/{layout-shaping-DWitwY73.d.ts → layout-shaping-BEyuiQOk.d.ts} +1 -1
  69. package/dist/layout.cjs +1 -1
  70. package/dist/layout.d.ts +177 -249
  71. package/dist/layout.js +1 -1
  72. package/dist/{note-properties-CmfvOJsi.d.ts → note-properties-4Y9o6Gyk.d.ts} +1 -1
  73. package/dist/{omml-equation-CZ6IG2ja.d.ts → omml-equation-CuzBL5DD.d.ts} +1 -1
  74. package/dist/output.cjs +1 -1
  75. package/dist/output.d.ts +18 -7
  76. package/dist/output.js +1 -1
  77. package/dist/{protocol-DniKeDb8.d.ts → protocol-Bqk4Izjc.d.ts} +48 -7
  78. package/dist/review-pane-D9jm8DcY.d.ts +128 -0
  79. package/dist/{review-paragraph-order-Dc8Q6tfM.d.ts → review-paragraph-order-DT-n6ouC.d.ts} +5 -2
  80. package/dist/{revision-projection-DfWxdBqA.d.ts → revision-projection-DZ4kKVev.d.ts} +74 -3
  81. package/dist/{semantic-cell-selection-Dy_BmmpL.d.ts → semantic-cell-selection-D9D1KSXq.d.ts} +8 -6
  82. package/dist/{semantic-interaction-CvFAj0GR.d.ts → semantic-interaction-CIC-PooQ.d.ts} +25 -34
  83. package/dist/{semantic-paint-Bk9wIXdZ.d.ts → semantic-paint-BME37OMv.d.ts} +57 -5
  84. package/dist/semantic-record-queries-CBlZqZNa.d.ts +177 -0
  85. package/dist/{semantic-records-COqi8pjP.d.ts → semantic-records-4B3WwFAi.d.ts} +84 -42
  86. package/dist/store.cjs +1 -1
  87. package/dist/store.d.ts +165 -137
  88. package/dist/store.js +1 -1
  89. package/dist/{tree-package-fragment-YPyYC1aD.d.ts → tree-package-fragment-BeeKxDw8.d.ts} +77 -57
  90. package/dist/{tree-session-contract-AeY2v0x9.d.ts → tree-session-contract-CVbmlMlq.d.ts} +7 -5
  91. package/dist/{types-barrel-BO73JqHG.d.ts → types-barrel-D3xCgQX6.d.ts} +595 -471
  92. package/package.json +3 -3
  93. package/dist/chunk-2BK4G4ZN.js +0 -2
  94. package/dist/chunk-2SJX44PC.cjs +0 -2
  95. package/dist/chunk-5BIASAN3.js +0 -1
  96. package/dist/chunk-6SEIXJTX.js +0 -1
  97. package/dist/chunk-73PG6L2X.js +0 -1
  98. package/dist/chunk-7RJSH72J.cjs +0 -5
  99. package/dist/chunk-AGKIHLWQ.cjs +0 -1
  100. package/dist/chunk-AN6WM4X4.js +0 -2
  101. package/dist/chunk-ANZ44KQT.cjs +0 -12
  102. package/dist/chunk-CYT3OQFZ.cjs +0 -1
  103. package/dist/chunk-DDGGSBAN.js +0 -12
  104. package/dist/chunk-EEAV3WIN.js +0 -3
  105. package/dist/chunk-ELQFXMJ5.cjs +0 -1
  106. package/dist/chunk-EYK4K2J6.js +0 -1
  107. package/dist/chunk-JNTETUNZ.cjs +0 -1
  108. package/dist/chunk-L6V3IJ3S.js +0 -5
  109. package/dist/chunk-LWCI65EL.js +0 -1
  110. package/dist/chunk-LZDI4P6I.cjs +0 -1
  111. package/dist/chunk-NS22DVWT.cjs +0 -2
  112. package/dist/chunk-QIE3YTU4.cjs +0 -2
  113. package/dist/chunk-QVBFPAGO.js +0 -5
  114. package/dist/chunk-RCCOLZEQ.js +0 -2
  115. package/dist/chunk-SUN62YU6.cjs +0 -5
  116. package/dist/chunk-TKQH7BNE.cjs +0 -1
  117. package/dist/chunk-TKR2MXX4.cjs +0 -3
  118. package/dist/chunk-UJL2GDIM.cjs +0 -25
  119. package/dist/chunk-WQTADNHK.cjs +0 -27
  120. package/dist/chunk-XSHXBJ2J.js +0 -25
  121. package/dist/chunk-YXZEBTDF.js +0 -27
  122. package/dist/failure-BIPVQbRm.d.ts +0 -65
@@ -1,12 +1,13 @@
1
- import { t as DocAnchor, a8 as SourceCrop, a9 as DrawingKind, aa as ImageWrapTarget, ab as DrawingPositionInput, ac as DrawingLocks, r as ColorValue, x as ExecErrorCode, ad as ParagraphFormatCommand, ae as Watermark, E as ExecResult, g as ReviewRevisionKind, c as ReviewCommentItem, b as ReviewRevisionItem, d as ReviewCustomItem, n as ContentControlFilter, o as DocRange, k as RunFormatting, p as Revision, af as Rect, ag as SelectionPin, ah as Unsubscribe } from './types-barrel-BO73JqHG.js';
1
+ import { d as ResolvedRevisionMarkup, a as ReviewDisplayMode } from './revision-projection-DZ4kKVev.js';
2
+ import { a as ResolvedReviewPane } from './review-pane-D9jm8DcY.js';
3
+ import { t as DocAnchor, g as ReviewRevisionKind, c as ReviewCommentItem, b as ReviewRevisionItem, d as ReviewCustomItem, al as SourceCrop, am as DrawingKind, an as ImageWrapTarget, ao as DrawingPositionInput, ap as DrawingLocks, r as ColorValue, x as ExecErrorCode, aq as ParagraphFormatCommand, ar as Watermark, E as ExecResult, n as ContentControlFilter, o as DocRange, k as RunFormatting, p as Revision, as as Rect, at as SelectionPin, au as Unsubscribe } from './types-barrel-D3xCgQX6.js';
2
4
  import { H as HistoryDiagnostic, V as ViewScope, a as HistoryGroup, b as EditorExecOptions, E as EditorScope } from './editor-scope-OHPwVQ5l.js';
3
- import { R as ReviewDisplayMode } from './revision-projection-DfWxdBqA.js';
4
5
  import { DocEdits, DocQueries, DocQueryResults, ContentControlSummary } from './contracts/document.js';
5
6
  import { InteractionOutcome } from './contracts/interaction.js';
6
- import { a as SemanticSelection, S as SemanticPosition } from './semantic-interaction-CvFAj0GR.js';
7
- import { b as ImageResourceState, S as SupportedImageMime } from './image-resources-DfagDguq.js';
8
- import { D as DocumentProtectionState } from './document-protection-Bp19Ad4I.js';
9
- import { C as CollaborationStatus } from './failure-BIPVQbRm.js';
7
+ import { a as SemanticSelection, S as SemanticPosition } from './semantic-interaction-CIC-PooQ.js';
8
+ import { b as ImageResourceState, S as SupportedImageMime } from './image-resources-BN-hUgCn.js';
9
+ import { D as DocumentProtectionState } from './document-protection-BAGVGqaP.js';
10
+ import { C as CollaborationStatus } from './failure-NS2lsya4.js';
10
11
 
11
12
  /**
12
13
  * What a fit mode fits the page to.
@@ -48,13 +49,63 @@ type ZoomMode = {
48
49
  * against these rather than against the snapshot.
49
50
  */
50
51
  interface EditorEvents {
52
+ /** Local viewer preferences changed through the API or review dialog. */
53
+ revisionMarkupChange: (settings: ResolvedRevisionMarkup) => void;
51
54
  /** A document mutation committed, with the ids it touched. */
52
55
  change: (change: DocumentChange) => void;
53
56
  /** The selection or its derived formatting moved. */
54
57
  selectionChange: (snapshot: EditorSnapshot) => void;
55
58
  error: (error: EditorError) => void;
56
59
  historyDiagnostic: (diagnostic: HistoryDiagnostic) => void;
60
+ /**
61
+ * An explicit request landed on a review item, and its card or balloon should open.
62
+ *
63
+ * Fires each time Next Change or Previous Change lands (`source: 'navigate'`), and each time
64
+ * `setActiveReviewItem(key, { announce: true })` succeeds (`source: 'host'`). It fires again
65
+ * when the item was already active, so a card the reader closed can open again.
66
+ *
67
+ * It does not fire for a caret move, a click in the page, a dismissal (`key` of `null`), a
68
+ * refused activation, or `setActiveReviewItem(key)` without `announce: true`. A remote edit in a
69
+ * collaboration session never fires it: it is a local view event.
70
+ *
71
+ * @example
72
+ * ```ts
73
+ * editor.on('reviewItemReveal', ({ key, source }) => {
74
+ * openMyBalloon(key); // `source` is 'navigate' or 'host'
75
+ * });
76
+ * ```
77
+ */
78
+ reviewItemReveal: (event: ReviewItemRevealEvent) => void;
57
79
  }
80
+ /**
81
+ * The payload of the `reviewItemReveal` event.
82
+ *
83
+ * @public
84
+ */
85
+ interface ReviewItemRevealEvent {
86
+ /**
87
+ * The key of the review item to open, as `getReviewItems()` without `pairReplacements`
88
+ * lists it. Next Change and Previous Change step through that unpaired queue, so for a
89
+ * replacement this is the key of its deletion or its insertion. `setActiveReviewItem`
90
+ * reports the key it was given, so a call with a pair's key reports that key here and in
91
+ * {@link ReviewItemRevealEvent.pairKey}.
92
+ */
93
+ readonly key: string;
94
+ /**
95
+ * The key that `getReviewItems({ pairReplacements: true })` gives the replacement this item
96
+ * belongs to. Present only when the item is a paired replacement or one half of one. A
97
+ * host that lists pairs opens `pairKey ?? key`.
98
+ */
99
+ readonly pairKey?: string;
100
+ /**
101
+ * What asked for the item. `'navigate'` is Next Change or Previous Change, from the menu,
102
+ * the toolbar, a shortcut, or `exec({ type: 'navigateReviewChange' })`. `'host'` is a call
103
+ * to `setActiveReviewItem` (and so `useReview().setActive`) with `announce: true`.
104
+ */
105
+ readonly source: ReviewItemRevealSource;
106
+ }
107
+ /** What asked to reveal a review item. See {@link ReviewItemRevealEvent.source}. @public */
108
+ type ReviewItemRevealSource = 'navigate' | 'host';
58
109
  /**
59
110
  * The payload of the `change` event / `onChange`. It carries revision + identity
60
111
  * deltas, NOT serialized bytes: serializing a whole DOCX on every keystroke would
@@ -71,13 +122,30 @@ interface DocumentChange {
71
122
  readonly dirty?: readonly string[];
72
123
  }
73
124
 
125
+ /**
126
+ * Where a scroll places its target in the viewport.
127
+ *
128
+ * - `'start'`: near the top, like a jump to a heading.
129
+ * - `'center'`: centred.
130
+ * - `'centerIfNeeded'`: still while the target is on screen, centred when it has to move.
131
+ * - `'nearest'`: the minimum scroll, which leaves the target at the edge it came in from.
132
+ *
133
+ * Each method that takes a placement states its own default.
134
+ *
135
+ * @public
136
+ */
137
+ type ScrollPlacement = 'start' | 'center' | 'centerIfNeeded' | 'nearest';
74
138
  /**
75
139
  * Scroll settings for {@link EditorAnchorNavigation.scrollToAnchor}. Every field is optional.
76
140
  * The fields match document refresh `NavigateToChangeOptions`. @public
77
141
  */
78
142
  interface ScrollToAnchorOptions {
79
- /** Target alignment. Default: centerIfNeeded, which keeps the viewport still for a visible target. */
80
- readonly block?: 'start' | 'center' | 'centerIfNeeded' | 'nearest';
143
+ /**
144
+ * Target placement. The default depends on the method: `scrollToAnchor` uses
145
+ * `'centerIfNeeded'`, which keeps the viewport still for a visible target, and
146
+ * `scrollToBlock` uses `'start'`.
147
+ */
148
+ readonly block?: ScrollPlacement;
81
149
  /** Default: instant. Reduced motion uses instant even when smooth is requested. */
82
150
  readonly behavior?: 'instant' | 'smooth';
83
151
  /** Edge padding for start/nearest placement, in CSS pixels. Default: 24. Finite and nonnegative. */
@@ -308,6 +376,243 @@ interface EditorHighlights {
308
376
  getHighlightsAt<R extends HighlightRange = HighlightRange>(clientX: number, clientY: number): readonly HighlightHit<R>[];
309
377
  }
310
378
 
379
+ /** One review item under a client point. @public */
380
+ interface ReviewItemHit {
381
+ /** The item, as `getReviewItems()` with the same query returns it. */
382
+ readonly placement: ReviewItemPlacement;
383
+ /**
384
+ * The item's painted band on the line under the point, in client coordinates. It covers the
385
+ * part of the item's range on that line, not the whole range. Anchor popovers to it.
386
+ */
387
+ readonly rect: HighlightRect;
388
+ }
389
+ /** Hit testing for hosts that draw their own review chrome. @public */
390
+ interface EditorReviewHits {
391
+ /**
392
+ * The review items whose text is under a client point, innermost first.
393
+ *
394
+ * An item hits when the CHARACTER under the point is inside one of its ranges, so the
395
+ * right half of a range's last character still hits, and the left half of the next
396
+ * character does not. Ranges that cover no characters, such as a tracked paragraph mark or
397
+ * a comment on an empty range, never hit. Items without a range never hit.
398
+ *
399
+ * The test covers every story the review queue lists and the pages paint: the body,
400
+ * tables, headers, footers, footnotes, and endnotes. Only painted pages are tested, so a
401
+ * point over a page that is not built returns no items.
402
+ *
403
+ * The result reports every item whose range covers the character, including replies,
404
+ * which share their thread's range, and resolved comments. Filter on
405
+ * `placement.parentId`, `placement.parentRevisionId`, or `placement.resolved` to find the
406
+ * card that owns the hit. Order follows the review queue's own rule for the caret: the
407
+ * narrowest range first, then comments before custom nodes before revisions, then the
408
+ * most deeply nested revision.
409
+ *
410
+ * A point hits the glyph band of a line, the same band a text highlight marks. A point in
411
+ * the spacing between lines hits nothing. `query` filters the items the same way it
412
+ * filters `getReviewItems()`. Coordinates that are not finite numbers return an empty
413
+ * array. Each call reads the whole review queue, so call it from a click, not on every
414
+ * pointer move.
415
+ *
416
+ * @example
417
+ * ```ts
418
+ * pages.addEventListener('click', (event) => {
419
+ * const [hit] = editor.getReviewItemsAt(event.clientX, event.clientY);
420
+ * if (hit) showBalloon(hit.placement.key, hit.rect);
421
+ * });
422
+ * ```
423
+ * @public
424
+ */
425
+ getReviewItemsAt(clientX: number, clientY: number, query?: ReviewItemQuery): readonly ReviewItemHit[];
426
+ /**
427
+ * The bands one review item paints, one per line part, in client coordinates.
428
+ *
429
+ * `key` is a `ReviewItemPlacement.key`. Bands follow page order, and within a page the
430
+ * body comes before headers, footers, and notes. Only painted pages contribute. An unknown
431
+ * key, an item without a range, or an item with no text on a painted page returns an
432
+ * empty array. Anchor a balloon to the first band, or join the bands for an outline.
433
+ *
434
+ * @example
435
+ * ```ts
436
+ * const [first] = editor.getReviewItemRects(placement.key);
437
+ * if (first) positionBalloon(first);
438
+ * ```
439
+ * @public
440
+ */
441
+ getReviewItemRects(key: string): readonly HighlightRect[];
442
+ }
443
+
444
+ /**
445
+ * Narrows what `getReviewItems` returns.
446
+ *
447
+ * Filtering revision kinds is how a host hides structural cards it has no UI for,
448
+ * `placement: false` skips the layout pass entirely when only metadata is wanted, and
449
+ * `pairReplacements` lists a typed-over selection as one decision.
450
+ */
451
+ interface ReviewItemQuery {
452
+ /**
453
+ * Revision kinds to leave out of the returned items, for example structural kinds that the
454
+ * host has no card for. Default: none. Comments and custom items are never removed. This
455
+ * filters only the returned data; to stop the caret from activating the same kinds, call
456
+ * `setReviewActivationExclusions`.
457
+ */
458
+ readonly excludeRevisionKinds?: readonly ReviewRevisionKind[];
459
+ /** When false, skip layout geometry; metadata is unchanged and anchors are null. Default true. */
460
+ readonly placement?: boolean;
461
+ /**
462
+ * When true, list a deletion and the insertion that directly follows it as one
463
+ * `'replace'` item. Default false.
464
+ *
465
+ * Two revisions pair when they are next to each other among the queue's revisions, the
466
+ * deletion comes first, both have the same author, nesting level and `readOnly` value, and
467
+ * the deletion's last range ends at the same paragraph and offset where the insertion's
468
+ * first range starts. The pair's `text` is the inserted words and `replacedText` the
469
+ * deleted words. The two halves are not listed separately.
470
+ *
471
+ * Kinds in {@link excludeRevisionKinds} are removed before pairing, so an excluded deletion
472
+ * or insertion never pairs. Excluding `'replace'` removes the pairs too.
473
+ *
474
+ * The pair's `key` is stable while both halves are pending, and every key-addressed verb
475
+ * accepts it whatever query you read it with. Accepting or rejecting it resolves both
476
+ * halves in one transaction and one undo step. Activating it opens the deletion; the pair
477
+ * reports `isActive` while either half is active. A reply anchors over the inserted words,
478
+ * and replies to either half are listed under the pair.
479
+ */
480
+ readonly pairReplacements?: boolean;
481
+ }
482
+
483
+ /**
484
+ * How activating a review item places it in the viewport, and whether it announces the
485
+ * reveal.
486
+ *
487
+ * @public
488
+ */
489
+ interface ReviewActivationOptions {
490
+ /**
491
+ * Where the item lands, or `false` to open it without scrolling at all.
492
+ *
493
+ * Default `'centerIfNeeded'`: silent while the item is already on screen, centred when it
494
+ * has to travel. `'nearest'` scrolls the minimum instead, which parks the item flush
495
+ * against the edge it came in from; `'start'` puts it near the top, the way a jump to a
496
+ * heading reads. `false` is for a host whose own list already drives the scroll and does
497
+ * not want the engine competing with it.
498
+ *
499
+ * It governs the reveal of the ITEM. An item in a header, a footer or a note also opens
500
+ * that story, and opening one always brings its band into view — a story the reader cannot
501
+ * see is one they cannot read the change in, which is the whole point of activating it.
502
+ */
503
+ readonly reveal?: ScrollPlacement | false;
504
+ /**
505
+ * Whether a successful activation fires the `reviewItemReveal` event. Default `false`.
506
+ *
507
+ * Pass `true` to open the item the way Next Change does: the packaged review UI opens its
508
+ * balloon, or opens a closed review pane at its card when the pane's `opening` setting is
509
+ * `'auto'`. The item becomes active either way.
510
+ *
511
+ * @example
512
+ * ```ts
513
+ * editor.setActiveReviewItem(key, { announce: true });
514
+ * ```
515
+ */
516
+ readonly announce?: boolean;
517
+ }
518
+
519
+ /**
520
+ * What every review card carries, whatever kind of decision it represents.
521
+ *
522
+ * Presentation-ready by design: author, initials, date and text are derived by the ENGINE,
523
+ * because deriving them means walking runs and reading `w15:commentsEx`. An adapter doing that
524
+ * walk would put document derivation in the host and would have to be written once per
525
+ * framework.
526
+ */
527
+ interface ReviewItemPlacementBase {
528
+ /** Stable and unique per decision within this editor instance. */
529
+ readonly key: string;
530
+ /** The engine's own id for the comment, the revision, or the custom node. */
531
+ readonly id: string;
532
+ readonly author: string;
533
+ /** Initials for an avatar: `@w:initials` when the file carries one, else from the name. */
534
+ readonly initials: string;
535
+ /** `@w:date`, absent when the file omits it — Word does when date stamping is off. */
536
+ readonly date?: string;
537
+ /**
538
+ * The comment's body, the words the revision covers, or the custom card's detail.
539
+ *
540
+ * PLAIN TEXT, and it must be rendered as text: a `.docx` is a zip of XML an attacker
541
+ * controls end to end, so this string is untrusted and never markup.
542
+ */
543
+ readonly text: string;
544
+ /**
545
+ * Replies to this item, in document order.
546
+ *
547
+ * Comments AND revisions carry them: OOXML gives `w:ins` and `w:del` no body, so replying
548
+ * to a tracked change writes a comment over the change's own range, and the reply belongs
549
+ * inside the card for the change rather than beside it.
550
+ */
551
+ readonly replyIds: readonly string[];
552
+ /**
553
+ * True when the engine cannot resolve this kind structurally, so accept and reject must
554
+ * not be offered. A card offering a button the engine will refuse is worse than one that
555
+ * explains why it cannot.
556
+ */
557
+ readonly readOnly: boolean;
558
+ /**
559
+ * Whether {@link Editor.setActiveReviewItem} would take this key.
560
+ *
561
+ * False for an item with no resolvable range, for a custom node without `reviewCard`
562
+ * (`carded: false`), and for a revision kind the host's rail excluded through
563
+ * {@link Editor.setReviewActivationExclusions} — the queue still LISTS
564
+ * those, because `getReviewItems` answers "what does this document hold" rather than "what
565
+ * may be clicked", and a host filtering the two apart needs to be told which is which. A
566
+ * card drawn for an item that cannot be activated is a card that does nothing when clicked.
567
+ */
568
+ readonly activatable: boolean;
569
+ /** Document-space Y of the anchor, or null when the item has no resolvable range. */
570
+ readonly anchorY: number | null;
571
+ readonly pageIndex: number | null;
572
+ readonly isActive: boolean;
573
+ }
574
+ /** A comment thread's card. @public */
575
+ interface ReviewCommentPlacement extends ReviewItemPlacementBase {
576
+ readonly kind: 'comment';
577
+ /** Whether `w15:commentsEx` marks the thread done. */
578
+ readonly resolved: boolean;
579
+ /** The comment this replies to, absent at the top of a thread. */
580
+ readonly parentId?: string;
581
+ /**
582
+ * The REVISION this comment answers, absent unless it does.
583
+ *
584
+ * A surface listing top-level cards must skip these as well as the ones with a
585
+ * {@link parentId}: the card is rendered inside the change it answers, and a rail that
586
+ * only checked `parentId` drew the reply twice.
587
+ */
588
+ readonly parentRevisionId?: string;
589
+ readonly item: ReviewCommentItem;
590
+ }
591
+ /** A tracked change's card. @public */
592
+ interface ReviewRevisionPlacement extends ReviewItemPlacementBase {
593
+ readonly kind: 'revision';
594
+ /** Which decision this is. */
595
+ readonly revisionKind: ReviewRevisionKind;
596
+ /**
597
+ * The words a replacement decision removes when {@link revisionKind} is `'replace'`.
598
+ * The built-in reader lists separate deletion and insertion cards unless the query sets
599
+ * {@link ReviewItemQuery.pairReplacements}.
600
+ */
601
+ readonly replacedText?: string;
602
+ readonly item: ReviewRevisionItem;
603
+ }
604
+ /** A custom node's card (`defineCustomNode` with a `reviewCard` hook). @public */
605
+ interface ReviewCustomPlacement extends ReviewItemPlacementBase {
606
+ readonly kind: 'custom';
607
+ readonly item: ReviewCustomItem;
608
+ }
609
+ /**
610
+ * A DISCRIMINATED union on {@link ReviewItemPlacementBase.kind}: narrowing the kind
611
+ * narrows `item` and the kind-specific fields with it, so a consumer never writes the
612
+ * `placement.kind === 'custom' && placement.item.kind === 'custom'` double check.
613
+ */
614
+ type ReviewItemPlacement = ReviewCommentPlacement | ReviewRevisionPlacement | ReviewCustomPlacement;
615
+
311
616
  /** Selection and unsupported-change policy for a bulk review decision. @public */
312
617
  interface ResolveReviewChangesOptions {
313
618
  action: 'accept' | 'reject';
@@ -318,6 +623,49 @@ interface ResolveReviewChangesOptions {
318
623
  /** Defaults to skip. Strict refuses the entire selection if any target cannot resolve. */
319
624
  unsupported?: 'skip' | 'fail';
320
625
  }
626
+ /**
627
+ * Who and when a change of tracked-change author records. Shared by both selections.
628
+ * @public
629
+ */
630
+ interface ReviewChangesAttribution {
631
+ /**
632
+ * The author to record. Defaults to the editor's `author`, so a reviewer adopts changes as
633
+ * their own. A command with neither refuses, because `w:author` is required.
634
+ */
635
+ author?: string;
636
+ /** An ISO 8601 `xsd:dateTime` to record. Omit it to keep each change's own date. */
637
+ date?: string;
638
+ /** Defaults to skip. Strict refuses the entire selection if any target cannot change. */
639
+ unsupported?: 'skip' | 'fail';
640
+ }
641
+ /**
642
+ * Selection and attribution for a change of tracked-change author. The changes stay pending.
643
+ *
644
+ * Select exact `keys` from `getReviewItems()`, or a `scope` narrowed by `authors`. The two
645
+ * selections exclude each other.
646
+ * @public
647
+ */
648
+ type SetReviewChangesAuthorOptions = ReviewChangesAttribution & ({
649
+ /** Exact keys from getReviewItems(). Duplicate keys change once. */
650
+ keys: readonly string[];
651
+ scope?: never;
652
+ authors?: never;
653
+ } | {
654
+ keys?: never;
655
+ /** Defaults to revisions shown by author visibility and the tracked-changes filter. */
656
+ scope?: 'visible' | 'document';
657
+ /** Only the changes these authors made, within `scope`. Matches `w:author` exactly. */
658
+ authors?: readonly string[];
659
+ });
660
+
661
+ /**
662
+ * How a keystroke reaches the document.
663
+ *
664
+ * `'suggesting'` changes what an edit MEANS rather than whether it is allowed: typing writes
665
+ * `w:ins` and deleting writes `w:del` over the words it would have removed, so every change
666
+ * arrives as a proposal somebody else accepts or rejects.
667
+ */
668
+ type DocumentEditingMode = 'editing' | 'suggesting' | 'viewing';
321
669
 
322
670
  /**
323
671
  * Header/footer and footnote/endnote public contract types for the Editor facade.
@@ -721,16 +1069,6 @@ interface TableColumnOccurrenceTarget {
721
1069
  readonly isHeaderRepeat: boolean;
722
1070
  }
723
1071
 
724
- /**
725
- * `@docx-editor.dev/core/contracts/editor` — the `Editor` contract adapters are written against.
726
- *
727
- * Commands go through `can` before `exec`; queries answer against the live, laid-out document.
728
- * Type-only declarations let adapters name the surface without importing the engine.
729
- *
730
- * @packageDocumentation
731
- * @public
732
- */
733
-
734
1072
  /**
735
1073
  * An opaque handle to a loaded document — its stable identity and current
736
1074
  * revision. The canonical authored state is the engine's `PackageModel`, NOT a
@@ -879,7 +1217,7 @@ type CanResult = {
879
1217
  * const bytesOut = await editor.save();
880
1218
  * ```
881
1219
  */
882
- interface Editor extends EditorAnchorNavigation, EditorHighlights {
1220
+ interface Editor extends EditorAnchorNavigation, EditorHighlights, EditorReviewHits {
883
1221
  /**
884
1222
  * Load a new document (DOCX bytes, `'blank'`, or a handle), replacing the current one.
885
1223
  *
@@ -1161,11 +1499,40 @@ interface Editor extends EditorAnchorNavigation, EditorHighlights {
1161
1499
  *
1162
1500
  * REPORTS, like {@link acceptReviewItem} and for the same reason. Activation is refused for
1163
1501
  * an item with no resolvable range, for a kind the host's rail excluded (see
1164
- * {@link setReviewActivationExclusions}), and when the story it lives in will not open —
1165
- * and a host walking a queue with next/previous controls has no other way to learn that a
1166
- * step did nothing. Consult {@link ReviewItemPlacement.activatable} to avoid asking.
1502
+ * {@link setReviewActivationExclusions}), for a custom node without `reviewCard`, and when
1503
+ * the story it lives in will not open — and a host walking a queue with next/previous
1504
+ * controls has no other way to learn that a step did nothing. Consult {@link ReviewItemPlacement.activatable} to avoid asking.
1505
+ *
1506
+ * With `options.announce: true`, a call that lands fires `reviewItemReveal` with
1507
+ * `source: 'host'`, also when the item was already active, so the packaged review UI opens
1508
+ * the item's balloon or card. By default it fires nothing. A `null` key fires nothing.
1167
1509
  */
1168
1510
  setActiveReviewItem(key: string | null, options?: ReviewActivationOptions): ExecResult;
1511
+ /**
1512
+ * The key of the ACTIVATED review item: the one {@link setActiveReviewItem}, Next Change, or
1513
+ * Previous Change made active, while the caret stays in it.
1514
+ *
1515
+ * Two ideas of "active" exist. The caret-active item is the one the caret is in, however it
1516
+ * got there: `isActive` on the placements {@link getReviewItems} returns, and `activeKey` in
1517
+ * `useReview()`. The activated item is narrower: only an explicit activation sets it, so a
1518
+ * caret that merely lands in a change leaves this `null`. Open a balloon or card for the
1519
+ * activated item, and highlight the caret-active one.
1520
+ *
1521
+ * Pass the query you read items with, so the key matches theirs: with
1522
+ * `pairReplacements: true`, a paired replacement reports the pair's key; without it, the
1523
+ * key of the half the caret is in. The value changes with the selection, so read it again
1524
+ * on `selectionChange`.
1525
+ *
1526
+ * @example
1527
+ * ```ts
1528
+ * const query = { pairReplacements: true };
1529
+ * editor.on('selectionChange', () => {
1530
+ * const activated = editor.getActivatedReviewItemKey(query);
1531
+ * if (activated !== null) showMyCard(activated);
1532
+ * });
1533
+ * ```
1534
+ */
1535
+ getActivatedReviewItemKey(query?: ReviewItemQuery): string | null;
1169
1536
  /**
1170
1537
  * Revision kinds the caret must never activate, or null for none.
1171
1538
  *
@@ -1255,7 +1622,12 @@ interface Editor extends EditorAnchorNavigation, EditorHighlights {
1255
1622
  * the host has no scroll container — a caller can tell "not found" from "scrolled".
1256
1623
  */
1257
1624
  scrollToPage(pageNumber: number): boolean;
1258
- scrollToBlock(blockId: string): boolean;
1625
+ /**
1626
+ * `options` takes the {@link ScrollToAnchorOptions} fields. `block` defaults to `'start'`
1627
+ * here (`scrollToAnchor` defaults to `'centerIfNeeded'`), `behavior` to `'instant'`, and
1628
+ * `offsetPx` to 24. An invalid option also returns false, and nothing scrolls.
1629
+ */
1630
+ scrollToBlock(blockId: string, options?: ScrollToAnchorOptions): boolean;
1259
1631
  getZoom(): number;
1260
1632
  /**
1261
1633
  * Set the display scale. Values outside a sane range are rejected rather than
@@ -1336,144 +1708,6 @@ type EditorCommandShape<T> = {
1336
1708
  type TrackedChangePredicate = (revision: ReviewRevisionItem) => boolean;
1337
1709
  /** How revisions excluded by a tracked-changes predicate project into the view. */
1338
1710
  type TrackedChangeFilterMode = 'accept' | 'reject';
1339
- /**
1340
- * Narrows what `getReviewItems` returns.
1341
- *
1342
- * Both fields exist to keep the review rail cheap: filtering revision kinds is how a host hides
1343
- * structural cards it has no UI for, and `placement: false` skips the layout pass entirely when
1344
- * only metadata is wanted.
1345
- */
1346
- interface ReviewItemQuery {
1347
- readonly excludeRevisionKinds?: readonly ReviewRevisionKind[];
1348
- /** When false, skip layout geometry; metadata is unchanged and anchors are null. Default true. */
1349
- readonly placement?: boolean;
1350
- }
1351
- /**
1352
- * What every review card carries, whatever kind of decision it represents.
1353
- *
1354
- * Presentation-ready by design: author, initials, date and text are derived by the ENGINE,
1355
- * because deriving them means walking runs and reading `w15:commentsEx`. An adapter doing that
1356
- * walk would put document derivation in the host and would have to be written once per
1357
- * framework.
1358
- */
1359
- interface ReviewItemPlacementBase {
1360
- /** Stable and unique per DECISION — a revision with three ranges is one entry. */
1361
- readonly key: string;
1362
- /** The engine's own id for the comment, the revision, or the custom node. */
1363
- readonly id: string;
1364
- readonly author: string;
1365
- /** Initials for an avatar: `@w:initials` when the file carries one, else from the name. */
1366
- readonly initials: string;
1367
- /** `@w:date`, absent when the file omits it — Word does when date stamping is off. */
1368
- readonly date?: string;
1369
- /**
1370
- * The comment's body, the words the revision covers, or the custom card's detail.
1371
- *
1372
- * PLAIN TEXT, and it must be rendered as text: a `.docx` is a zip of XML an attacker
1373
- * controls end to end, so this string is untrusted and never markup.
1374
- */
1375
- readonly text: string;
1376
- /**
1377
- * Replies to this item, in document order.
1378
- *
1379
- * Comments AND revisions carry them: OOXML gives `w:ins` and `w:del` no body, so replying
1380
- * to a tracked change writes a comment over the change's own range, and the reply belongs
1381
- * inside the card for the change rather than beside it.
1382
- */
1383
- readonly replyIds: readonly string[];
1384
- /**
1385
- * True when the engine cannot resolve this kind structurally, so accept and reject must
1386
- * not be offered. A card offering a button the engine will refuse is worse than one that
1387
- * explains why it cannot.
1388
- */
1389
- readonly readOnly: boolean;
1390
- /**
1391
- * Whether {@link Editor.setActiveReviewItem} would take this key.
1392
- *
1393
- * False for an item with no resolvable range, and for a revision kind the host's rail
1394
- * excluded through {@link Editor.setReviewActivationExclusions} — the queue still LISTS
1395
- * those, because `getReviewItems` answers "what does this document hold" rather than "what
1396
- * may be clicked", and a host filtering the two apart needs to be told which is which. A
1397
- * card drawn for an item that cannot be activated is a card that does nothing when clicked.
1398
- */
1399
- readonly activatable: boolean;
1400
- /** Document-space Y of the anchor, or null when the item has no resolvable range. */
1401
- readonly anchorY: number | null;
1402
- readonly pageIndex: number | null;
1403
- readonly isActive: boolean;
1404
- }
1405
- /**
1406
- * How activating a review item places it in the viewport.
1407
- *
1408
- * @public
1409
- */
1410
- interface ReviewActivationOptions {
1411
- /**
1412
- * Where the item lands, or `false` to open it without scrolling at all.
1413
- *
1414
- * Default `'centerIfNeeded'`: silent while the item is already on screen, centred when it
1415
- * has to travel. `'nearest'` scrolls the minimum instead, which parks the item flush
1416
- * against the edge it came in from; `'start'` puts it near the top, the way a jump to a
1417
- * heading reads. `false` is for a host whose own list already drives the scroll and does
1418
- * not want the engine competing with it.
1419
- *
1420
- * It governs the reveal of the ITEM. An item in a header, a footer or a note also opens
1421
- * that story, and opening one always brings its band into view — a story the reader cannot
1422
- * see is one they cannot read the change in, which is the whole point of activating it.
1423
- */
1424
- readonly reveal?: 'start' | 'center' | 'centerIfNeeded' | 'nearest' | false;
1425
- }
1426
- /** A comment thread's card. @public */
1427
- interface ReviewCommentPlacement extends ReviewItemPlacementBase {
1428
- readonly kind: 'comment';
1429
- /** Whether `w15:commentsEx` marks the thread done. */
1430
- readonly resolved: boolean;
1431
- /** The comment this replies to, absent at the top of a thread. */
1432
- readonly parentId?: string;
1433
- /**
1434
- * The REVISION this comment answers, absent unless it does.
1435
- *
1436
- * A surface listing top-level cards must skip these as well as the ones with a
1437
- * {@link parentId}: the card is rendered inside the change it answers, and a rail that
1438
- * only checked `parentId` drew the reply twice.
1439
- */
1440
- readonly parentRevisionId?: string;
1441
- readonly item: ReviewCommentItem;
1442
- }
1443
- /** A tracked change's card. @public */
1444
- interface ReviewRevisionPlacement extends ReviewItemPlacementBase {
1445
- readonly kind: 'revision';
1446
- /** Which decision this is. */
1447
- readonly revisionKind: ReviewRevisionKind;
1448
- /**
1449
- * The words a REPLACEMENT removes, when {@link revisionKind} is `'replace'`.
1450
- *
1451
- * Paired with {@link ReviewItemPlacementBase.text}, which holds the words it puts in
1452
- * their place, so a card can say `Replaced "x" with "y"` — one decision, the way Word
1453
- * presents it.
1454
- */
1455
- readonly replacedText?: string;
1456
- readonly item: ReviewRevisionItem;
1457
- }
1458
- /** A custom node's card (`defineCustomNode` with a `reviewCard` hook). @public */
1459
- interface ReviewCustomPlacement extends ReviewItemPlacementBase {
1460
- readonly kind: 'custom';
1461
- readonly item: ReviewCustomItem;
1462
- }
1463
- /**
1464
- * A DISCRIMINATED union on {@link ReviewItemPlacementBase.kind}: narrowing the kind
1465
- * narrows `item` and the kind-specific fields with it, so a consumer never writes the
1466
- * `placement.kind === 'custom' && placement.item.kind === 'custom'` double check.
1467
- */
1468
- type ReviewItemPlacement = ReviewCommentPlacement | ReviewRevisionPlacement | ReviewCustomPlacement;
1469
- /**
1470
- * How a keystroke reaches the document.
1471
- *
1472
- * `'suggesting'` changes what an edit MEANS rather than whether it is allowed: typing writes
1473
- * `w:ins` and deleting writes `w:del` over the words it would have removed, so every change
1474
- * arrives as a proposal somebody else accepts or rejects.
1475
- */
1476
- type DocumentEditingMode = 'editing' | 'suggesting' | 'viewing';
1477
1711
 
1478
1712
  /**
1479
1713
  * Every command the editor accepts, keyed by name with its payload as the value.
@@ -1495,6 +1729,8 @@ interface EditorCommands extends EditorCommandShape<DocEdits>, EditorHeaderFoote
1495
1729
  * adapters and any host chrome read one answer.
1496
1730
  */
1497
1731
  toggleReviewPane: Record<never, never>;
1732
+ /** Open the local review settings dialog supplied by the review module. */
1733
+ openRevisionMarkupDialog: Record<never, never>;
1498
1734
  /** Word's Show/Hide paragraph marks; presentation only. */
1499
1735
  toggleParagraphMarks: Record<never, never>;
1500
1736
  /** Word's Protect Document: enforce filling-in-forms protection, or lift the enforced one. */
@@ -1505,6 +1741,8 @@ interface EditorCommands extends EditorCommandShape<DocEdits>, EditorHeaderFoote
1505
1741
  };
1506
1742
  /** Resolve eligible changes shown by the active filters, or an explicit scope, in one undo step. */
1507
1743
  resolveAllReviewChanges: ResolveReviewChangesOptions;
1744
+ /** Attribute eligible changes to another author, keeping them pending, in one undo step. */
1745
+ setReviewChangesAuthor: SetReviewChangesAuthorOptions;
1508
1746
  /** Change the review projection without accepting or rejecting document revisions. */
1509
1747
  setReviewDisplayMode: {
1510
1748
  mode: ReviewDisplayMode;
@@ -2121,12 +2359,21 @@ interface EditorSnapshot {
2121
2359
  * value-equal snapshot correctly refuses to re-render.
2122
2360
  */
2123
2361
  readonly reviewPaneOpen?: boolean;
2362
+ /**
2363
+ * The review pane settings in force: every field of `ReviewPaneOptions`, such as when the
2364
+ * pane opens by itself and what it does when its card column does not fit. Change them with
2365
+ * `setReviewPaneOptions`. Never saved. Always
2366
+ * set: an editor without a review module reports `DEFAULT_REVIEW_PANE`.
2367
+ */
2368
+ readonly reviewPane: ResolvedReviewPane;
2124
2369
  /** Whether Show/Hide paragraph marks is enabled. */
2125
2370
  readonly showParagraphMarks?: boolean;
2126
2371
  /** The document's `w:documentProtection`, as the file states it; null with no document. */
2127
2372
  readonly documentProtection?: DocumentProtectionState | null;
2128
2373
  /** The displayed revision projection. The document and its revision history stay unchanged. */
2129
2374
  readonly reviewDisplayMode?: ReviewDisplayMode;
2375
+ /** Resolved local viewer preferences. Never saved into the document. */
2376
+ readonly revisionMarkup: ResolvedRevisionMarkup;
2130
2377
  /**
2131
2378
  * Whether the document carries review content — tracked changes or comment
2132
2379
  * anchors — independent of any registered review module.
@@ -2197,5 +2444,5 @@ interface EditorError extends Error {
2197
2444
  readonly code?: string;
2198
2445
  }
2199
2446
 
2200
- export { EditorFontError as E, cropPercentFromCropPermille as r, cropPercentFromPermille as s, cropPercentFromSourceCrop as t, cropPermilleFromCropPercent as u, cropPermilleFromPercent as v, sourceCropFromCropPercent as w, validateImageCropPercent as x };
2201
- export type { EditorPosition as $, AnchorHighlightOptions as A, TableBorderSpec as B, CanResult as C, DocumentSource as D, FontFaceRequest as F, TableBorderStyle as G, HighlightRange as H, ImageContext as I, TableContext as J, AuthoredNoteNumbering as K, DocumentChange as L, DocumentEditingMode as M, DocumentHandle as N, EditorAnchorNavigation as O, EditorCommandShape as P, EditorCommands as Q, EditorError as R, ScrollToAnchorOptions as S, TextMatch as T, EditorEvents as U, EditorFontErrorCode as V, EditorFormatPainterCommands as W, EditorHeaderFooterCommands as X, EditorHighlights as Y, ZoomMode as Z, EditorNoteCommands as _, FontConfiguration as a, EditorQueries as a0, EditorQuery as a1, EditorQueryResults as a2, EditorSelection as a3, FormatPainterLevel as a4, FormatPainterMode as a5, FurnitureVariant as a6, HeaderFooterSlotArgs as a7, HeaderFooterState as a8, HyperlinkInfo as a9, NoteKind as aa, NotePropertiesSide as ab, NotePropertiesState as ac, PageSetup as ad, ResolveReviewChangesOptions as ae, ResolvedNoteNumbering as af, ReviewActivationOptions as ag, ReviewCommentPlacement as ah, ReviewCustomPlacement as ai, ReviewItemPlacement as aj, ReviewItemPlacementBase as ak, ReviewItemQuery as al, ReviewRevisionPlacement as am, TableBorderTarget as an, TableCellVerticalAlignment as ao, TableColumnDividerResizeTarget as ap, TableColumnOccurrenceTarget as aq, TableRightEdgeResizeTarget as ar, TableRowOccurrenceTarget as as, ZoomFitTarget as at, FontSource as b, FontSourceSubstitution as c, EditorSnapshot as d, EditorCommand as e, ClearAnchorHighlightOptions as f, AnchorHighlightAnimation as g, Editor as h, HighlightResult as i, HighlightOptions as j, HighlightHit as k, HighlightRect as l, ImageCropPercent as m, ImageCropPermille as n, SelectedImageState as o, TrackedChangeFilterMode as p, TrackedChangePredicate as q, FormatPainterSurfaceState as y, TableBorderEdgeTarget as z };
2447
+ export { EditorFontError as E, cropPercentFromCropPermille as s, cropPercentFromPermille as t, cropPercentFromSourceCrop as u, cropPermilleFromCropPercent as v, cropPermilleFromPercent as w, sourceCropFromCropPercent as x, validateImageCropPercent as y };
2448
+ export type { EditorHighlights as $, AnchorHighlightOptions as A, TableBorderEdgeTarget as B, CanResult as C, DocumentSource as D, FontFaceRequest as F, TableBorderSpec as G, HighlightRange as H, ImageContext as I, TableBorderStyle as J, TableContext as K, AuthoredNoteNumbering as L, DocumentChange as M, DocumentEditingMode as N, DocumentHandle as O, EditorAnchorNavigation as P, EditorCommandShape as Q, ReviewItemHit as R, ScrollToAnchorOptions as S, TextMatch as T, EditorCommands as U, EditorError as V, EditorEvents as W, EditorFontErrorCode as X, EditorFormatPainterCommands as Y, ZoomMode as Z, EditorHeaderFooterCommands as _, FontConfiguration as a, EditorNoteCommands as a0, EditorPosition as a1, EditorQueries as a2, EditorQuery as a3, EditorQueryResults as a4, EditorReviewHits as a5, EditorSelection as a6, FormatPainterLevel as a7, FormatPainterMode as a8, FurnitureVariant as a9, ZoomFitTarget as aA, HeaderFooterSlotArgs as aa, HeaderFooterState as ab, HyperlinkInfo as ac, NoteKind as ad, NotePropertiesSide as ae, NotePropertiesState as af, PageSetup as ag, ResolveReviewChangesOptions as ah, ResolvedNoteNumbering as ai, ReviewActivationOptions as aj, ReviewChangesAttribution as ak, ReviewCommentPlacement as al, ReviewCustomPlacement as am, ReviewItemPlacement as an, ReviewItemPlacementBase as ao, ReviewItemQuery as ap, ReviewItemRevealEvent as aq, ReviewItemRevealSource as ar, ReviewRevisionPlacement as as, SetReviewChangesAuthorOptions as at, TableBorderTarget as au, TableCellVerticalAlignment as av, TableColumnDividerResizeTarget as aw, TableColumnOccurrenceTarget as ax, TableRightEdgeResizeTarget as ay, TableRowOccurrenceTarget as az, FontSource as b, FontSourceSubstitution as c, EditorSnapshot as d, EditorCommand as e, ClearAnchorHighlightOptions as f, ScrollPlacement as g, AnchorHighlightAnimation as h, Editor as i, HighlightResult as j, HighlightOptions as k, HighlightHit as l, HighlightRect as m, ImageCropPercent as n, ImageCropPermille as o, SelectedImageState as p, TrackedChangeFilterMode as q, TrackedChangePredicate as r, FormatPainterSurfaceState as z };