@beyondwork/docx-react-component 1.0.1 → 1.0.3

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 (172) hide show
  1. package/README.md +44 -104
  2. package/package.json +50 -30
  3. package/src/README.md +85 -0
  4. package/src/api/README.md +22 -0
  5. package/src/api/public-types.ts +525 -0
  6. package/src/compare/diff-engine.ts +530 -0
  7. package/src/compare/export-redlines.ts +162 -0
  8. package/src/compare/snapshot.ts +37 -0
  9. package/src/component-inventory.md +99 -0
  10. package/src/core/README.md +10 -0
  11. package/src/core/commands/README.md +3 -0
  12. package/src/core/commands/formatting-commands.ts +161 -0
  13. package/src/core/commands/image-commands.ts +144 -0
  14. package/src/core/commands/index.ts +1013 -0
  15. package/src/core/commands/list-commands.ts +370 -0
  16. package/src/core/commands/review-commands.ts +108 -0
  17. package/src/core/commands/text-commands.ts +119 -0
  18. package/src/core/schema/README.md +3 -0
  19. package/src/core/schema/text-schema.ts +512 -0
  20. package/src/core/selection/README.md +3 -0
  21. package/src/core/selection/mapping.ts +238 -0
  22. package/src/core/selection/review-anchors.ts +94 -0
  23. package/src/core/state/README.md +3 -0
  24. package/src/core/state/editor-state.ts +580 -0
  25. package/src/core/state/text-transaction.ts +276 -0
  26. package/src/formats/xlsx/io/parse-shared-strings.ts +41 -0
  27. package/src/formats/xlsx/io/parse-sheet.ts +289 -0
  28. package/src/formats/xlsx/io/parse-styles.ts +57 -0
  29. package/src/formats/xlsx/io/parse-workbook.ts +75 -0
  30. package/src/formats/xlsx/io/xlsx-session.ts +306 -0
  31. package/src/formats/xlsx/model/cell.ts +189 -0
  32. package/src/formats/xlsx/model/sheet.ts +244 -0
  33. package/src/formats/xlsx/model/styles.ts +118 -0
  34. package/src/formats/xlsx/model/workbook.ts +449 -0
  35. package/src/index.ts +45 -0
  36. package/src/io/README.md +10 -0
  37. package/src/io/docx-session.ts +1763 -0
  38. package/src/io/export/README.md +3 -0
  39. package/src/io/export/export-session.ts +165 -0
  40. package/src/io/export/minimal-docx.ts +115 -0
  41. package/src/io/export/reattach-preserved-parts.ts +54 -0
  42. package/src/io/export/serialize-comments.ts +876 -0
  43. package/src/io/export/serialize-footnotes.ts +217 -0
  44. package/src/io/export/serialize-headers-footers.ts +200 -0
  45. package/src/io/export/serialize-main-document.ts +982 -0
  46. package/src/io/export/serialize-numbering.ts +97 -0
  47. package/src/io/export/serialize-revisions.ts +389 -0
  48. package/src/io/export/serialize-runtime-revisions.ts +265 -0
  49. package/src/io/export/serialize-tables.ts +147 -0
  50. package/src/io/export/split-review-boundaries.ts +194 -0
  51. package/src/io/normalize/README.md +3 -0
  52. package/src/io/normalize/normalize-text.ts +437 -0
  53. package/src/io/ooxml/README.md +3 -0
  54. package/src/io/ooxml/parse-comments.ts +779 -0
  55. package/src/io/ooxml/parse-complex-content.ts +287 -0
  56. package/src/io/ooxml/parse-fields.ts +438 -0
  57. package/src/io/ooxml/parse-footnotes.ts +403 -0
  58. package/src/io/ooxml/parse-headers-footers.ts +483 -0
  59. package/src/io/ooxml/parse-inline-media.ts +431 -0
  60. package/src/io/ooxml/parse-main-document.ts +1846 -0
  61. package/src/io/ooxml/parse-numbering.ts +425 -0
  62. package/src/io/ooxml/parse-revisions.ts +658 -0
  63. package/src/io/ooxml/parse-shapes.ts +271 -0
  64. package/src/io/ooxml/parse-tables.ts +568 -0
  65. package/src/io/ooxml/parse-theme.ts +314 -0
  66. package/src/io/ooxml/part-manifest.ts +136 -0
  67. package/src/io/ooxml/revision-boundaries.ts +351 -0
  68. package/src/io/opc/README.md +3 -0
  69. package/src/io/opc/corrupt-package.ts +166 -0
  70. package/src/io/opc/docx-package.ts +74 -0
  71. package/src/io/opc/package-reader.ts +325 -0
  72. package/src/io/opc/package-writer.ts +273 -0
  73. package/src/legal/bookmarks.ts +196 -0
  74. package/src/legal/cross-references.ts +356 -0
  75. package/src/legal/defined-terms.ts +203 -0
  76. package/src/model/README.md +3 -0
  77. package/src/model/canonical-document.ts +1911 -0
  78. package/src/model/cds-1.0.0.ts +196 -0
  79. package/src/model/snapshot.ts +393 -0
  80. package/src/preservation/README.md +3 -0
  81. package/src/preservation/markup-compatibility.ts +48 -0
  82. package/src/preservation/opaque-fragment-store.ts +89 -0
  83. package/src/preservation/opaque-region.ts +233 -0
  84. package/src/preservation/package-preservation.ts +120 -0
  85. package/src/preservation/preserved-part-manifest.ts +56 -0
  86. package/src/preservation/relationship-retention.ts +57 -0
  87. package/src/preservation/store.ts +185 -0
  88. package/src/review/README.md +16 -0
  89. package/src/review/store/README.md +3 -0
  90. package/src/review/store/comment-anchors.ts +70 -0
  91. package/src/review/store/comment-remapping.ts +154 -0
  92. package/src/review/store/comment-store.ts +331 -0
  93. package/src/review/store/comment-thread.ts +109 -0
  94. package/src/review/store/revision-actions.ts +394 -0
  95. package/src/review/store/revision-store.ts +303 -0
  96. package/src/review/store/revision-types.ts +168 -0
  97. package/src/review/store/runtime-comment-store.ts +43 -0
  98. package/src/runtime/README.md +3 -0
  99. package/src/runtime/ai-action-policy.ts +764 -0
  100. package/src/runtime/document-runtime.ts +967 -0
  101. package/src/runtime/read-only-diagnostics-runtime.ts +232 -0
  102. package/src/runtime/review-runtime.ts +44 -0
  103. package/src/runtime/revision-runtime.ts +107 -0
  104. package/src/runtime/session-capabilities.ts +138 -0
  105. package/src/runtime/surface-projection.ts +570 -0
  106. package/src/runtime/table-commands.ts +87 -0
  107. package/src/runtime/table-schema.ts +140 -0
  108. package/src/runtime/virtualized-rendering.ts +258 -0
  109. package/src/ui/README.md +30 -0
  110. package/src/ui/WordReviewEditor.tsx +1506 -0
  111. package/src/ui/comments/README.md +3 -0
  112. package/src/ui/compatibility/README.md +3 -0
  113. package/src/ui/editor-surface/README.md +3 -0
  114. package/src/ui/headless/comment-decoration-model.ts +124 -0
  115. package/src/ui/headless/revision-decoration-model.ts +128 -0
  116. package/src/ui/headless/selection-helpers.ts +34 -0
  117. package/src/ui/headless/use-editor-keyboard.ts +98 -0
  118. package/src/ui/review/README.md +3 -0
  119. package/src/ui/shared/revision-filters.ts +31 -0
  120. package/src/ui/status/README.md +3 -0
  121. package/src/ui/theme/README.md +3 -0
  122. package/src/ui/toolbar/README.md +3 -0
  123. package/src/ui-tailwind/chrome/tw-alert-banner.tsx +48 -0
  124. package/src/ui-tailwind/chrome/tw-selection-toolbar.tsx +44 -0
  125. package/src/ui-tailwind/chrome/tw-unsaved-modal.tsx +58 -0
  126. package/src/ui-tailwind/chrome/use-before-unload.ts +20 -0
  127. package/src/ui-tailwind/editor-surface/pm-command-bridge.ts +139 -0
  128. package/src/ui-tailwind/editor-surface/pm-decorations.ts +98 -0
  129. package/src/ui-tailwind/editor-surface/pm-position-map.ts +123 -0
  130. package/src/ui-tailwind/editor-surface/pm-schema.ts +452 -0
  131. package/src/ui-tailwind/editor-surface/pm-state-from-snapshot.ts +327 -0
  132. package/src/ui-tailwind/editor-surface/search-plugin.ts +157 -0
  133. package/src/ui-tailwind/editor-surface/tw-caret.tsx +12 -0
  134. package/src/ui-tailwind/editor-surface/tw-editor-surface.tsx +150 -0
  135. package/src/ui-tailwind/editor-surface/tw-inline-token.tsx +118 -0
  136. package/src/ui-tailwind/editor-surface/tw-opaque-block.tsx +52 -0
  137. package/src/ui-tailwind/editor-surface/tw-paragraph-block.tsx +151 -0
  138. package/src/ui-tailwind/editor-surface/tw-prosemirror-surface.tsx +215 -0
  139. package/src/ui-tailwind/editor-surface/tw-segment-view.tsx +111 -0
  140. package/src/ui-tailwind/editor-surface/tw-table-node-view.tsx +122 -0
  141. package/src/ui-tailwind/index.ts +61 -0
  142. package/src/ui-tailwind/review/tw-comment-sidebar.tsx +276 -0
  143. package/src/ui-tailwind/review/tw-health-panel.tsx +120 -0
  144. package/src/ui-tailwind/review/tw-review-rail.tsx +120 -0
  145. package/src/ui-tailwind/review/tw-revision-sidebar.tsx +164 -0
  146. package/src/ui-tailwind/status/tw-status-bar.tsx +58 -0
  147. package/src/ui-tailwind/theme/editor-theme.css +190 -0
  148. package/src/ui-tailwind/toolbar/tw-toolbar-icon-button.tsx +48 -0
  149. package/src/ui-tailwind/toolbar/tw-toolbar.tsx +231 -0
  150. package/src/ui-tailwind/tw-review-workspace.tsx +140 -0
  151. package/src/validation/README.md +3 -0
  152. package/src/validation/compatibility-engine.ts +317 -0
  153. package/src/validation/compatibility-report.ts +160 -0
  154. package/src/validation/diagnostics.ts +203 -0
  155. package/src/validation/import-diagnostics.ts +128 -0
  156. package/src/validation/low-priority-word-surfaces.ts +373 -0
  157. package/dist/chunk-32W6IVQE.js +0 -7725
  158. package/dist/chunk-32W6IVQE.js.map +0 -1
  159. package/dist/index.cjs +0 -23722
  160. package/dist/index.cjs.map +0 -1
  161. package/dist/index.d.cts +0 -7
  162. package/dist/index.d.ts +0 -7
  163. package/dist/index.js +0 -16011
  164. package/dist/index.js.map +0 -1
  165. package/dist/public-types-DqCURAz8.d.cts +0 -1152
  166. package/dist/public-types-DqCURAz8.d.ts +0 -1152
  167. package/dist/tailwind.cjs +0 -8295
  168. package/dist/tailwind.cjs.map +0 -1
  169. package/dist/tailwind.d.cts +0 -323
  170. package/dist/tailwind.d.ts +0 -323
  171. package/dist/tailwind.js +0 -553
  172. package/dist/tailwind.js.map +0 -1
@@ -0,0 +1,238 @@
1
+ export type Position = number;
2
+ export type Assoc = -1 | 1;
3
+
4
+ export interface DocRange {
5
+ from: Position;
6
+ to: Position;
7
+ }
8
+
9
+ export interface BoundaryAssoc {
10
+ start: Assoc;
11
+ end: Assoc;
12
+ }
13
+
14
+ export interface RangeAnchor {
15
+ kind: "range";
16
+ range: DocRange;
17
+ assoc: BoundaryAssoc;
18
+ }
19
+
20
+ export interface NodeAnchor {
21
+ kind: "node";
22
+ at: Position;
23
+ assoc: Assoc;
24
+ }
25
+
26
+ export interface DetachedAnchor {
27
+ kind: "detached";
28
+ lastKnownRange: DocRange;
29
+ reason: "deleted" | "invalidatedByStructureChange" | "importAmbiguity";
30
+ }
31
+
32
+ export type EditorAnchorProjection = RangeAnchor | NodeAnchor | DetachedAnchor;
33
+
34
+ export interface MappingStep {
35
+ from: Position;
36
+ to: Position;
37
+ insertSize: number;
38
+ }
39
+
40
+ export interface MappingResult {
41
+ position: Position;
42
+ deleted: boolean;
43
+ }
44
+
45
+ export interface TransactionMapping {
46
+ steps: MappingStep[];
47
+ metadata?: {
48
+ invalidatesStructures?: boolean;
49
+ affectsComments?: boolean;
50
+ affectsRevisions?: boolean;
51
+ affectsOpaqueFragments?: boolean;
52
+ [key: string]: unknown;
53
+ };
54
+ }
55
+
56
+ export const DEFAULT_BOUNDARY_ASSOC: BoundaryAssoc = {
57
+ start: 1,
58
+ end: -1,
59
+ };
60
+
61
+ export function createRangeAnchor(
62
+ from: Position,
63
+ to = from,
64
+ assoc: BoundaryAssoc = DEFAULT_BOUNDARY_ASSOC,
65
+ ): RangeAnchor {
66
+ return {
67
+ kind: "range",
68
+ range: normalizeRange({ from, to }),
69
+ assoc,
70
+ };
71
+ }
72
+
73
+ export function createNodeAnchor(at: Position, assoc: Assoc = 1): NodeAnchor {
74
+ return {
75
+ kind: "node",
76
+ at,
77
+ assoc,
78
+ };
79
+ }
80
+
81
+ export function createDetachedAnchor(
82
+ lastKnownRange: DocRange,
83
+ reason: DetachedAnchor["reason"],
84
+ ): DetachedAnchor {
85
+ return {
86
+ kind: "detached",
87
+ lastKnownRange: normalizeRange(lastKnownRange),
88
+ reason,
89
+ };
90
+ }
91
+
92
+ export function createEmptyMapping(): TransactionMapping {
93
+ return {
94
+ steps: [],
95
+ };
96
+ }
97
+
98
+ export function normalizeRange(range: DocRange): DocRange {
99
+ return range.from <= range.to
100
+ ? { from: range.from, to: range.to }
101
+ : { from: range.to, to: range.from };
102
+ }
103
+
104
+ export function mapPosition(
105
+ position: Position,
106
+ assoc: Assoc,
107
+ mapping: TransactionMapping,
108
+ ): MappingResult {
109
+ let mappedPosition = position;
110
+ let deleted = false;
111
+
112
+ for (const step of mapping.steps) {
113
+ const next = mapPositionThroughStep(mappedPosition, assoc, step);
114
+ mappedPosition = next.position;
115
+ deleted = deleted || next.deleted;
116
+ }
117
+
118
+ return {
119
+ position: mappedPosition,
120
+ deleted,
121
+ };
122
+ }
123
+
124
+ export function mapAnchor(
125
+ anchor: EditorAnchorProjection,
126
+ mapping: TransactionMapping,
127
+ ): EditorAnchorProjection {
128
+ if (anchor.kind === "detached") {
129
+ return anchor;
130
+ }
131
+
132
+ if (anchor.kind === "node") {
133
+ const mapped = mapPosition(anchor.at, anchor.assoc, mapping);
134
+
135
+ if (mapped.deleted) {
136
+ return createDetachedAnchor(
137
+ { from: anchor.at, to: anchor.at + 1 },
138
+ mapping.metadata?.invalidatesStructures
139
+ ? "invalidatedByStructureChange"
140
+ : "deleted",
141
+ );
142
+ }
143
+
144
+ return createNodeAnchor(mapped.position, anchor.assoc);
145
+ }
146
+
147
+ const from = mapPosition(anchor.range.from, anchor.assoc.start, mapping);
148
+ const to = mapPosition(anchor.range.to, anchor.assoc.end, mapping);
149
+ const mappedRange = normalizeRange({ from: from.position, to: to.position });
150
+
151
+ if (from.deleted && to.deleted && mappedRange.from === mappedRange.to) {
152
+ return createDetachedAnchor(
153
+ anchor.range,
154
+ mapping.metadata?.invalidatesStructures
155
+ ? "invalidatedByStructureChange"
156
+ : "deleted",
157
+ );
158
+ }
159
+
160
+ return createRangeAnchor(mappedRange.from, mappedRange.to, anchor.assoc);
161
+ }
162
+
163
+ export function mapRange(
164
+ range: DocRange,
165
+ assoc: BoundaryAssoc,
166
+ mapping: TransactionMapping,
167
+ ): RangeAnchor | DetachedAnchor {
168
+ const mapped = mapAnchor(createRangeAnchor(range.from, range.to, assoc), mapping);
169
+ return mapped.kind === "node" ? createRangeAnchor(mapped.at, mapped.at, assoc) : mapped;
170
+ }
171
+
172
+ export function areAnchorsEqual(
173
+ left: EditorAnchorProjection,
174
+ right: EditorAnchorProjection,
175
+ ): boolean {
176
+ if (left.kind !== right.kind) {
177
+ return false;
178
+ }
179
+
180
+ if (left.kind === "detached" && right.kind === "detached") {
181
+ return (
182
+ left.reason === right.reason &&
183
+ left.lastKnownRange.from === right.lastKnownRange.from &&
184
+ left.lastKnownRange.to === right.lastKnownRange.to
185
+ );
186
+ }
187
+
188
+ if (left.kind === "node" && right.kind === "node") {
189
+ return left.at === right.at && left.assoc === right.assoc;
190
+ }
191
+
192
+ if (left.kind === "range" && right.kind === "range") {
193
+ return (
194
+ left.range.from === right.range.from &&
195
+ left.range.to === right.range.to &&
196
+ left.assoc.start === right.assoc.start &&
197
+ left.assoc.end === right.assoc.end
198
+ );
199
+ }
200
+
201
+ return false;
202
+ }
203
+
204
+ function mapPositionThroughStep(
205
+ position: Position,
206
+ assoc: Assoc,
207
+ step: MappingStep,
208
+ ): MappingResult {
209
+ if (position < step.from) {
210
+ return { position, deleted: false };
211
+ }
212
+
213
+ if (position > step.to) {
214
+ return {
215
+ position: position + step.insertSize - (step.to - step.from),
216
+ deleted: false,
217
+ };
218
+ }
219
+
220
+ if (position === step.from) {
221
+ return {
222
+ position: assoc < 0 ? step.from : step.from + step.insertSize,
223
+ deleted: false,
224
+ };
225
+ }
226
+
227
+ if (position === step.to) {
228
+ return {
229
+ position: assoc < 0 ? step.from : step.from + step.insertSize,
230
+ deleted: false,
231
+ };
232
+ }
233
+
234
+ return {
235
+ position: assoc < 0 ? step.from : step.from + step.insertSize,
236
+ deleted: true,
237
+ };
238
+ }
@@ -0,0 +1,94 @@
1
+ import { parseTextStory } from "../schema/text-schema.ts";
2
+ import {
3
+ DEFAULT_BOUNDARY_ASSOC,
4
+ createDetachedAnchor,
5
+ createRangeAnchor,
6
+ mapAnchor,
7
+ normalizeRange,
8
+ type BoundaryAssoc,
9
+ type DetachedAnchor,
10
+ type DocRange,
11
+ type EditorAnchorProjection,
12
+ type TransactionMapping,
13
+ } from "./mapping.ts";
14
+
15
+ export type ReviewAnchor = EditorAnchorProjection;
16
+
17
+ export const COMMENT_RANGE_ASSOC: BoundaryAssoc = DEFAULT_BOUNDARY_ASSOC;
18
+
19
+ export function createCommentReviewAnchor(
20
+ from: number,
21
+ to = from,
22
+ assoc: BoundaryAssoc = COMMENT_RANGE_ASSOC,
23
+ ): ReviewAnchor {
24
+ return createRangeAnchor(from, to, assoc);
25
+ }
26
+
27
+ export function detachReviewAnchor(
28
+ lastKnownRange: DocRange,
29
+ reason: DetachedAnchor["reason"],
30
+ ): DetachedAnchor {
31
+ return createDetachedAnchor(lastKnownRange, reason);
32
+ }
33
+
34
+ export function mapReviewAnchor(
35
+ anchor: ReviewAnchor,
36
+ mapping: TransactionMapping,
37
+ ): ReviewAnchor {
38
+ return mapAnchor(anchor, mapping);
39
+ }
40
+
41
+ export function getAnchorRange(anchor: ReviewAnchor): DocRange {
42
+ if (anchor.kind === "range") {
43
+ return normalizeRange(anchor.range);
44
+ }
45
+
46
+ if (anchor.kind === "node") {
47
+ return { from: anchor.at, to: anchor.at };
48
+ }
49
+
50
+ return normalizeRange(anchor.lastKnownRange);
51
+ }
52
+
53
+ export function mappingTouchesAnchorContent(
54
+ anchor: ReviewAnchor,
55
+ mapping: TransactionMapping,
56
+ ): boolean {
57
+ const range = getAnchorRange(anchor);
58
+
59
+ if (range.from === range.to) {
60
+ return mapping.steps.some(
61
+ (step) => step.from <= range.from && step.to >= range.to,
62
+ );
63
+ }
64
+
65
+ return mapping.steps.some(
66
+ (step) => step.from < range.to && step.to > range.from,
67
+ );
68
+ }
69
+
70
+ export function rangeStaysWithinSingleParagraph(
71
+ content: unknown,
72
+ range: DocRange,
73
+ ): boolean {
74
+ const normalized = normalizeRange(range);
75
+ if (normalized.from === normalized.to) {
76
+ return true;
77
+ }
78
+
79
+ const story = parseTextStory(content);
80
+ const upperBound = Math.min(normalized.to, story.units.length);
81
+
82
+ for (let index = Math.max(0, normalized.from); index < upperBound; index += 1) {
83
+ const unit = story.units[index];
84
+ if (!unit) {
85
+ continue;
86
+ }
87
+
88
+ if (unit.kind === "paragraph_break" || unit.kind === "opaque_block") {
89
+ return false;
90
+ }
91
+ }
92
+
93
+ return true;
94
+ }
@@ -0,0 +1,3 @@
1
+ # Core State
2
+
3
+ Canonical state containers, selectors, and structural invariants belong here.