@beyondwork/docx-react-component 1.0.29 → 1.0.31

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 (383) hide show
  1. package/package.json +65 -96
  2. package/src/README.md +85 -0
  3. package/src/api/README.md +26 -0
  4. package/src/api/public-types.ts +1952 -0
  5. package/src/api/session-state.ts +62 -0
  6. package/src/compare/diff-engine.ts +623 -0
  7. package/src/compare/export-redlines.ts +280 -0
  8. package/src/compare/index.ts +25 -0
  9. package/src/compare/snapshot.ts +97 -0
  10. package/src/component-inventory.md +99 -0
  11. package/src/core/README.md +10 -0
  12. package/src/core/commands/README.md +3 -0
  13. package/{dist/chunk-TJBP2K4T.js → src/core/commands/formatting-commands.ts} +536 -196
  14. package/src/core/commands/image-commands.ts +373 -0
  15. package/src/core/commands/index.ts +1879 -0
  16. package/src/core/commands/list-commands.ts +565 -0
  17. package/src/core/commands/paragraph-layout-commands.ts +339 -0
  18. package/src/core/commands/review-commands.ts +108 -0
  19. package/{dist/core/commands/section-layout-commands.cjs → src/core/commands/section-layout-commands.ts} +340 -137
  20. package/src/core/commands/structural-helpers.ts +309 -0
  21. package/{dist/core/commands/style-commands.cjs → src/core/commands/style-commands.ts} +113 -65
  22. package/src/core/commands/table-structure-commands.ts +854 -0
  23. package/{dist/chunk-UZXBISGO.js → src/core/commands/text-commands.ts} +142 -86
  24. package/src/core/schema/README.md +3 -0
  25. package/src/core/schema/text-schema.ts +516 -0
  26. package/src/core/search/search-text.ts +357 -0
  27. package/src/core/selection/README.md +3 -0
  28. package/src/core/selection/mapping.ts +289 -0
  29. package/src/core/selection/review-anchors.ts +183 -0
  30. package/src/core/state/README.md +3 -0
  31. package/src/core/state/editor-state.ts +892 -0
  32. package/src/core/state/text-transaction.ts +869 -0
  33. package/src/formats/xlsx/io/parse-shared-strings.ts +41 -0
  34. package/src/formats/xlsx/io/parse-sheet.ts +459 -0
  35. package/src/formats/xlsx/io/parse-styles.ts +59 -0
  36. package/src/formats/xlsx/io/parse-workbook.ts +75 -0
  37. package/src/formats/xlsx/io/serialize-shared-strings.ts +72 -0
  38. package/src/formats/xlsx/io/serialize-sheet.ts +333 -0
  39. package/src/formats/xlsx/io/serialize-styles.ts +98 -0
  40. package/src/formats/xlsx/io/serialize-workbook.ts +429 -0
  41. package/src/formats/xlsx/io/xlsx-session.ts +314 -0
  42. package/src/formats/xlsx/model/cell.ts +189 -0
  43. package/src/formats/xlsx/model/sheet.ts +326 -0
  44. package/src/formats/xlsx/model/styles.ts +118 -0
  45. package/src/formats/xlsx/model/workbook.ts +453 -0
  46. package/src/formats/xlsx/runtime/cell-commands.ts +567 -0
  47. package/src/formats/xlsx/runtime/sheet-commands.ts +206 -0
  48. package/src/formats/xlsx/runtime/workbook-runtime.ts +177 -0
  49. package/src/formats/xlsx/runtime/workbook-transaction.ts +822 -0
  50. package/src/index.ts +142 -0
  51. package/src/io/README.md +10 -0
  52. package/src/io/docx-session.ts +3175 -0
  53. package/src/io/export/README.md +3 -0
  54. package/src/io/export/export-session.ts +220 -0
  55. package/src/io/export/minimal-docx.ts +115 -0
  56. package/src/io/export/reattach-preserved-parts.ts +54 -0
  57. package/src/io/export/serialize-comments.ts +947 -0
  58. package/src/io/export/serialize-footnotes.ts +394 -0
  59. package/src/io/export/serialize-headers-footers.ts +368 -0
  60. package/src/io/export/serialize-main-document.ts +1342 -0
  61. package/src/io/export/serialize-numbering.ts +218 -0
  62. package/src/io/export/serialize-revisions.ts +389 -0
  63. package/src/io/export/serialize-runtime-revisions.ts +463 -0
  64. package/src/io/export/serialize-tables.ts +174 -0
  65. package/src/io/export/split-review-boundaries.ts +356 -0
  66. package/src/io/export/split-story-blocks-for-runtime-revisions.ts +252 -0
  67. package/src/io/export/table-properties-xml.ts +318 -0
  68. package/src/io/normalize/README.md +3 -0
  69. package/src/io/normalize/normalize-text.ts +670 -0
  70. package/src/io/ooxml/README.md +3 -0
  71. package/src/io/ooxml/highlight-colors.ts +39 -0
  72. package/src/io/ooxml/numbering-sentinels.ts +44 -0
  73. package/src/io/ooxml/parse-comments.ts +852 -0
  74. package/src/io/ooxml/parse-complex-content.ts +287 -0
  75. package/src/io/ooxml/parse-fields.ts +834 -0
  76. package/src/io/ooxml/parse-footnotes.ts +952 -0
  77. package/src/io/ooxml/parse-headers-footers.ts +1212 -0
  78. package/src/io/ooxml/parse-inline-media.ts +461 -0
  79. package/src/io/ooxml/parse-main-document.ts +2947 -0
  80. package/src/io/ooxml/parse-numbering.ts +747 -0
  81. package/src/io/ooxml/parse-revisions.ts +1045 -0
  82. package/src/io/ooxml/parse-settings.ts +184 -0
  83. package/src/io/ooxml/parse-shapes.ts +296 -0
  84. package/src/io/ooxml/parse-styles.ts +639 -0
  85. package/src/io/ooxml/parse-tables.ts +627 -0
  86. package/src/io/ooxml/parse-theme.ts +346 -0
  87. package/src/io/ooxml/part-manifest.ts +136 -0
  88. package/src/io/ooxml/revision-boundaries.ts +475 -0
  89. package/src/io/ooxml/workflow-payload.ts +544 -0
  90. package/src/io/opc/README.md +3 -0
  91. package/src/io/opc/corrupt-package.ts +166 -0
  92. package/src/io/opc/docx-package.ts +74 -0
  93. package/src/io/opc/package-reader.ts +325 -0
  94. package/src/io/opc/package-writer.ts +273 -0
  95. package/src/io/source-package-provenance.ts +241 -0
  96. package/{dist/chunk-RMH72RZI.js → src/legal/bookmarks.ts} +130 -44
  97. package/src/legal/cross-references.ts +414 -0
  98. package/src/legal/defined-terms.ts +203 -0
  99. package/src/legal/index.ts +32 -0
  100. package/src/legal/signature-blocks.ts +259 -0
  101. package/src/model/README.md +3 -0
  102. package/src/model/canonical-document.ts +2722 -0
  103. package/src/model/cds-1.0.0.ts +212 -0
  104. package/src/model/snapshot.ts +760 -0
  105. package/src/preservation/README.md +3 -0
  106. package/src/preservation/markup-compatibility.ts +48 -0
  107. package/src/preservation/opaque-fragment-store.ts +89 -0
  108. package/src/preservation/opaque-region.ts +233 -0
  109. package/src/preservation/package-preservation.ts +113 -0
  110. package/src/preservation/preserved-part-manifest.ts +56 -0
  111. package/src/preservation/relationship-retention.ts +57 -0
  112. package/src/preservation/store.ts +255 -0
  113. package/src/review/README.md +16 -0
  114. package/src/review/store/README.md +3 -0
  115. package/src/review/store/comment-anchors.ts +70 -0
  116. package/src/review/store/comment-remapping.ts +154 -0
  117. package/src/review/store/comment-store.ts +349 -0
  118. package/src/review/store/comment-thread.ts +109 -0
  119. package/src/review/store/revision-actions.ts +423 -0
  120. package/src/review/store/revision-store.ts +323 -0
  121. package/src/review/store/revision-types.ts +182 -0
  122. package/src/review/store/runtime-comment-store.ts +43 -0
  123. package/src/runtime/README.md +3 -0
  124. package/src/runtime/ai-action-policy.ts +764 -0
  125. package/src/runtime/context-analytics.ts +824 -0
  126. package/src/runtime/document-layout.ts +332 -0
  127. package/src/runtime/document-locations.ts +521 -0
  128. package/src/runtime/document-navigation.ts +616 -0
  129. package/src/runtime/document-outline.ts +440 -0
  130. package/src/runtime/document-runtime.ts +4055 -0
  131. package/src/runtime/document-search.ts +145 -0
  132. package/src/runtime/event-refresh-hints.ts +137 -0
  133. package/src/runtime/numbering-prefix.ts +244 -0
  134. package/src/runtime/page-layout-estimation.ts +305 -0
  135. package/src/runtime/read-only-diagnostics-runtime.ts +241 -0
  136. package/src/runtime/resolved-numbering-geometry.ts +293 -0
  137. package/src/runtime/review-runtime.ts +44 -0
  138. package/src/runtime/revision-runtime.ts +107 -0
  139. package/src/runtime/session-capabilities.ts +192 -0
  140. package/src/runtime/story-context.ts +164 -0
  141. package/src/runtime/story-targeting.ts +162 -0
  142. package/src/runtime/suggestions-snapshot.ts +137 -0
  143. package/src/runtime/surface-projection.ts +1553 -0
  144. package/src/runtime/table-commands.ts +173 -0
  145. package/src/runtime/table-schema.ts +309 -0
  146. package/src/runtime/table-style-resolver.ts +409 -0
  147. package/src/runtime/view-state.ts +493 -0
  148. package/src/runtime/virtualized-rendering.ts +258 -0
  149. package/src/runtime/workflow-markup.ts +393 -0
  150. package/src/ui/README.md +30 -0
  151. package/src/ui/WordReviewEditor.tsx +5268 -0
  152. package/src/ui/browser-export.ts +52 -0
  153. package/src/ui/comments/README.md +3 -0
  154. package/src/ui/compatibility/README.md +3 -0
  155. package/src/ui/editor-command-bag.ts +127 -0
  156. package/src/ui/editor-runtime-boundary.ts +1558 -0
  157. package/src/ui/editor-shell-view.tsx +144 -0
  158. package/src/ui/editor-surface/README.md +3 -0
  159. package/src/ui/editor-surface-controller.tsx +66 -0
  160. package/src/ui/headless/comment-decoration-model.ts +124 -0
  161. package/src/ui/headless/preserve-editor-selection.ts +5 -0
  162. package/src/ui/headless/revision-decoration-model.ts +128 -0
  163. package/src/ui/headless/selection-helpers.ts +54 -0
  164. package/src/ui/headless/selection-tool-context.ts +19 -0
  165. package/src/ui/headless/selection-tool-resolver.ts +752 -0
  166. package/src/ui/headless/selection-tool-types.ts +129 -0
  167. package/src/ui/headless/selection-toolbar-model.ts +11 -0
  168. package/src/ui/headless/use-editor-keyboard.ts +103 -0
  169. package/src/ui/review/README.md +3 -0
  170. package/src/ui/runtime-shortcut-dispatch.ts +365 -0
  171. package/src/ui/runtime-snapshot-selectors.ts +197 -0
  172. package/src/ui/shared/revision-filters.ts +31 -0
  173. package/src/ui/status/README.md +3 -0
  174. package/src/ui/theme/README.md +3 -0
  175. package/src/ui/toolbar/README.md +3 -0
  176. package/src/ui/workflow-surface-blocked-rails.ts +94 -0
  177. package/src/ui-tailwind/chrome/chrome-preset-model.ts +107 -0
  178. package/src/ui-tailwind/chrome/chrome-preset-toolbar.tsx +15 -0
  179. package/src/ui-tailwind/chrome/responsive-chrome.ts +46 -0
  180. package/src/ui-tailwind/chrome/review-queue-bar.tsx +97 -0
  181. package/src/ui-tailwind/chrome/tw-alert-banner.tsx +64 -0
  182. package/src/ui-tailwind/chrome/tw-context-analytics-summary.tsx +122 -0
  183. package/src/ui-tailwind/chrome/tw-image-context-toolbar.tsx +121 -0
  184. package/src/ui-tailwind/chrome/tw-layout-panel.tsx +114 -0
  185. package/src/ui-tailwind/chrome/tw-object-context-toolbar.tsx +30 -0
  186. package/src/ui-tailwind/chrome/tw-page-ruler.tsx +365 -0
  187. package/src/ui-tailwind/chrome/tw-selection-tool-blocked.tsx +23 -0
  188. package/src/ui-tailwind/chrome/tw-selection-tool-comment.tsx +35 -0
  189. package/src/ui-tailwind/chrome/tw-selection-tool-formatting.tsx +37 -0
  190. package/src/ui-tailwind/chrome/tw-selection-tool-host.tsx +303 -0
  191. package/src/ui-tailwind/chrome/tw-selection-tool-structure.tsx +116 -0
  192. package/src/ui-tailwind/chrome/tw-selection-tool-suggestion.tsx +29 -0
  193. package/src/ui-tailwind/chrome/tw-selection-tool-workflow.tsx +27 -0
  194. package/src/ui-tailwind/chrome/tw-selection-toolbar.tsx +186 -0
  195. package/src/ui-tailwind/chrome/tw-suggestion-card.tsx +139 -0
  196. package/src/ui-tailwind/chrome/tw-table-context-toolbar.tsx +250 -0
  197. package/src/ui-tailwind/chrome/tw-unsaved-modal.tsx +58 -0
  198. package/src/ui-tailwind/chrome/use-before-unload.ts +20 -0
  199. package/src/ui-tailwind/editor-surface/perf-probe.ts +179 -0
  200. package/src/ui-tailwind/editor-surface/pm-command-bridge.ts +189 -0
  201. package/src/ui-tailwind/editor-surface/pm-contextual-ui.ts +31 -0
  202. package/src/ui-tailwind/editor-surface/pm-decorations.ts +411 -0
  203. package/src/ui-tailwind/editor-surface/pm-position-map.ts +123 -0
  204. package/src/ui-tailwind/editor-surface/pm-schema.ts +927 -0
  205. package/src/ui-tailwind/editor-surface/pm-state-from-snapshot.ts +567 -0
  206. package/src/ui-tailwind/editor-surface/search-plugin.ts +168 -0
  207. package/src/ui-tailwind/editor-surface/surface-build-keys.ts +63 -0
  208. package/src/ui-tailwind/editor-surface/tw-caret.tsx +12 -0
  209. package/src/ui-tailwind/editor-surface/tw-editor-surface.tsx +150 -0
  210. package/src/ui-tailwind/editor-surface/tw-inline-token.tsx +129 -0
  211. package/src/ui-tailwind/editor-surface/tw-opaque-block.tsx +58 -0
  212. package/src/ui-tailwind/editor-surface/tw-paragraph-block.tsx +151 -0
  213. package/src/ui-tailwind/editor-surface/tw-prosemirror-surface.tsx +1047 -0
  214. package/src/ui-tailwind/editor-surface/tw-segment-view.tsx +111 -0
  215. package/src/ui-tailwind/editor-surface/tw-table-node-view.tsx +503 -0
  216. package/src/ui-tailwind/index.ts +62 -0
  217. package/src/ui-tailwind/page-chrome-model.ts +27 -0
  218. package/src/ui-tailwind/review/tw-comment-sidebar.tsx +406 -0
  219. package/src/ui-tailwind/review/tw-health-panel.tsx +149 -0
  220. package/src/ui-tailwind/review/tw-review-rail.tsx +130 -0
  221. package/src/ui-tailwind/review/tw-revision-sidebar.tsx +164 -0
  222. package/src/ui-tailwind/status/tw-status-bar.tsx +65 -0
  223. package/{dist → src}/ui-tailwind/theme/editor-theme.css +58 -40
  224. package/src/ui-tailwind/toolbar/toolbar-layout.ts +47 -0
  225. package/src/ui-tailwind/toolbar/tw-toolbar-icon-button.tsx +52 -0
  226. package/src/ui-tailwind/toolbar/tw-toolbar.tsx +1478 -0
  227. package/src/ui-tailwind/tw-review-workspace.tsx +1587 -0
  228. package/src/validation/README.md +3 -0
  229. package/src/validation/compatibility-engine.ts +878 -0
  230. package/src/validation/compatibility-report.ts +161 -0
  231. package/src/validation/diagnostics.ts +204 -0
  232. package/src/validation/docx-comment-proof.ts +720 -0
  233. package/src/validation/import-diagnostics.ts +128 -0
  234. package/src/validation/low-priority-word-surfaces.ts +373 -0
  235. package/dist/canonical-document-BLEbzL2J.d.cts +0 -844
  236. package/dist/canonical-document-BLEbzL2J.d.ts +0 -844
  237. package/dist/chunk-2FJS5GZM.js +0 -763
  238. package/dist/chunk-2FJS5GZM.js.map +0 -1
  239. package/dist/chunk-2OQBZS3F.js +0 -446
  240. package/dist/chunk-2OQBZS3F.js.map +0 -1
  241. package/dist/chunk-2S7W4KFO.js +0 -127
  242. package/dist/chunk-2S7W4KFO.js.map +0 -1
  243. package/dist/chunk-2TG72QSW.js +0 -3874
  244. package/dist/chunk-2TG72QSW.js.map +0 -1
  245. package/dist/chunk-36QNIZBO.js +0 -532
  246. package/dist/chunk-36QNIZBO.js.map +0 -1
  247. package/dist/chunk-4AQOYAW4.js +0 -3069
  248. package/dist/chunk-4AQOYAW4.js.map +0 -1
  249. package/dist/chunk-4D5EWJ3P.js +0 -77
  250. package/dist/chunk-4D5EWJ3P.js.map +0 -1
  251. package/dist/chunk-5FN54NDH.js +0 -2257
  252. package/dist/chunk-5FN54NDH.js.map +0 -1
  253. package/dist/chunk-BOYGQYRQ.js +0 -7306
  254. package/dist/chunk-BOYGQYRQ.js.map +0 -1
  255. package/dist/chunk-CN3XMECL.js +0 -212
  256. package/dist/chunk-CN3XMECL.js.map +0 -1
  257. package/dist/chunk-EBI3BX6U.js +0 -164
  258. package/dist/chunk-EBI3BX6U.js.map +0 -1
  259. package/dist/chunk-EILUG3VB.js +0 -1275
  260. package/dist/chunk-EILUG3VB.js.map +0 -1
  261. package/dist/chunk-FUDY333O.js +0 -70
  262. package/dist/chunk-FUDY333O.js.map +0 -1
  263. package/dist/chunk-GBVOWFIK.js +0 -1237
  264. package/dist/chunk-GBVOWFIK.js.map +0 -1
  265. package/dist/chunk-H4TQ3H3Y.js +0 -262
  266. package/dist/chunk-H4TQ3H3Y.js.map +0 -1
  267. package/dist/chunk-JGB3IXZO.js +0 -189
  268. package/dist/chunk-JGB3IXZO.js.map +0 -1
  269. package/dist/chunk-KD2QRQPY.js +0 -4342
  270. package/dist/chunk-KD2QRQPY.js.map +0 -1
  271. package/dist/chunk-KLMXQVYK.js +0 -369
  272. package/dist/chunk-KLMXQVYK.js.map +0 -1
  273. package/dist/chunk-KZUG5KFQ.js +0 -214
  274. package/dist/chunk-KZUG5KFQ.js.map +0 -1
  275. package/dist/chunk-QDAQ4CJU.js +0 -345
  276. package/dist/chunk-QDAQ4CJU.js.map +0 -1
  277. package/dist/chunk-RMH72RZI.js.map +0 -1
  278. package/dist/chunk-SWKWQZXM.js +0 -117
  279. package/dist/chunk-SWKWQZXM.js.map +0 -1
  280. package/dist/chunk-TJBP2K4T.js.map +0 -1
  281. package/dist/chunk-TLCEAQDQ.js +0 -542
  282. package/dist/chunk-TLCEAQDQ.js.map +0 -1
  283. package/dist/chunk-UZXBISGO.js.map +0 -1
  284. package/dist/chunk-WGBAKP3Q.js +0 -3220
  285. package/dist/chunk-WGBAKP3Q.js.map +0 -1
  286. package/dist/compare/index.cjs +0 -5475
  287. package/dist/compare/index.cjs.map +0 -1
  288. package/dist/compare/index.d.cts +0 -114
  289. package/dist/compare/index.d.ts +0 -114
  290. package/dist/compare/index.js +0 -731
  291. package/dist/compare/index.js.map +0 -1
  292. package/dist/core/commands/formatting-commands.cjs +0 -828
  293. package/dist/core/commands/formatting-commands.cjs.map +0 -1
  294. package/dist/core/commands/formatting-commands.d.cts +0 -63
  295. package/dist/core/commands/formatting-commands.d.ts +0 -63
  296. package/dist/core/commands/formatting-commands.js +0 -37
  297. package/dist/core/commands/formatting-commands.js.map +0 -1
  298. package/dist/core/commands/image-commands.cjs +0 -2023
  299. package/dist/core/commands/image-commands.cjs.map +0 -1
  300. package/dist/core/commands/image-commands.d.cts +0 -58
  301. package/dist/core/commands/image-commands.d.ts +0 -58
  302. package/dist/core/commands/image-commands.js +0 -18
  303. package/dist/core/commands/image-commands.js.map +0 -1
  304. package/dist/core/commands/section-layout-commands.cjs.map +0 -1
  305. package/dist/core/commands/section-layout-commands.d.cts +0 -62
  306. package/dist/core/commands/section-layout-commands.d.ts +0 -62
  307. package/dist/core/commands/section-layout-commands.js +0 -21
  308. package/dist/core/commands/section-layout-commands.js.map +0 -1
  309. package/dist/core/commands/style-commands.cjs.map +0 -1
  310. package/dist/core/commands/style-commands.d.cts +0 -13
  311. package/dist/core/commands/style-commands.d.ts +0 -13
  312. package/dist/core/commands/style-commands.js +0 -9
  313. package/dist/core/commands/style-commands.js.map +0 -1
  314. package/dist/core/commands/table-structure-commands.cjs +0 -1883
  315. package/dist/core/commands/table-structure-commands.cjs.map +0 -1
  316. package/dist/core/commands/table-structure-commands.d.cts +0 -59
  317. package/dist/core/commands/table-structure-commands.d.ts +0 -59
  318. package/dist/core/commands/table-structure-commands.js +0 -12
  319. package/dist/core/commands/table-structure-commands.js.map +0 -1
  320. package/dist/core/commands/text-commands.cjs +0 -2391
  321. package/dist/core/commands/text-commands.cjs.map +0 -1
  322. package/dist/core/commands/text-commands.d.cts +0 -24
  323. package/dist/core/commands/text-commands.d.ts +0 -24
  324. package/dist/core/commands/text-commands.js +0 -28
  325. package/dist/core/commands/text-commands.js.map +0 -1
  326. package/dist/core/selection/mapping.cjs +0 -200
  327. package/dist/core/selection/mapping.cjs.map +0 -1
  328. package/dist/core/selection/mapping.d.cts +0 -2
  329. package/dist/core/selection/mapping.d.ts +0 -2
  330. package/dist/core/selection/mapping.js +0 -31
  331. package/dist/core/selection/mapping.js.map +0 -1
  332. package/dist/core/state/editor-state.cjs +0 -2278
  333. package/dist/core/state/editor-state.cjs.map +0 -1
  334. package/dist/core/state/editor-state.d.cts +0 -2
  335. package/dist/core/state/editor-state.d.ts +0 -2
  336. package/dist/core/state/editor-state.js +0 -26
  337. package/dist/core/state/editor-state.js.map +0 -1
  338. package/dist/index.cjs +0 -38553
  339. package/dist/index.cjs.map +0 -1
  340. package/dist/index.d.cts +0 -15
  341. package/dist/index.d.ts +0 -15
  342. package/dist/index.js +0 -7856
  343. package/dist/index.js.map +0 -1
  344. package/dist/io/docx-session.cjs +0 -16236
  345. package/dist/io/docx-session.cjs.map +0 -1
  346. package/dist/io/docx-session.d.cts +0 -21
  347. package/dist/io/docx-session.d.ts +0 -21
  348. package/dist/io/docx-session.js +0 -18
  349. package/dist/io/docx-session.js.map +0 -1
  350. package/dist/legal/index.cjs +0 -3900
  351. package/dist/legal/index.cjs.map +0 -1
  352. package/dist/legal/index.d.cts +0 -86
  353. package/dist/legal/index.d.ts +0 -86
  354. package/dist/legal/index.js +0 -616
  355. package/dist/legal/index.js.map +0 -1
  356. package/dist/public-types-7ZL_94cz.d.ts +0 -1573
  357. package/dist/public-types-CeMaDueh.d.cts +0 -1573
  358. package/dist/public-types.cjs +0 -19
  359. package/dist/public-types.cjs.map +0 -1
  360. package/dist/public-types.d.cts +0 -2
  361. package/dist/public-types.d.ts +0 -2
  362. package/dist/public-types.js +0 -1
  363. package/dist/public-types.js.map +0 -1
  364. package/dist/runtime/document-runtime.cjs +0 -11140
  365. package/dist/runtime/document-runtime.cjs.map +0 -1
  366. package/dist/runtime/document-runtime.d.cts +0 -231
  367. package/dist/runtime/document-runtime.d.ts +0 -231
  368. package/dist/runtime/document-runtime.js +0 -21
  369. package/dist/runtime/document-runtime.js.map +0 -1
  370. package/dist/structural-helpers-CilgOVhh.d.cts +0 -10
  371. package/dist/structural-helpers-q0Gd-eBN.d.ts +0 -10
  372. package/dist/ui-tailwind/editor-surface/search-plugin.cjs +0 -313
  373. package/dist/ui-tailwind/editor-surface/search-plugin.cjs.map +0 -1
  374. package/dist/ui-tailwind/editor-surface/search-plugin.d.cts +0 -67
  375. package/dist/ui-tailwind/editor-surface/search-plugin.d.ts +0 -67
  376. package/dist/ui-tailwind/editor-surface/search-plugin.js +0 -23
  377. package/dist/ui-tailwind/editor-surface/search-plugin.js.map +0 -1
  378. package/dist/ui-tailwind/index.cjs +0 -4833
  379. package/dist/ui-tailwind/index.cjs.map +0 -1
  380. package/dist/ui-tailwind/index.d.cts +0 -617
  381. package/dist/ui-tailwind/index.d.ts +0 -617
  382. package/dist/ui-tailwind/index.js +0 -575
  383. package/dist/ui-tailwind/index.js.map +0 -1
@@ -0,0 +1,62 @@
1
+ import type {
2
+ EditorSessionState,
3
+ PersistedEditorSnapshot,
4
+ } from "./public-types.ts";
5
+
6
+ export const EDITOR_SESSION_STATE_VERSION = "editor-session-state/1" as const;
7
+
8
+ function cloneStructuredValue<T>(value: T): T {
9
+ return structuredClone(value);
10
+ }
11
+
12
+ export function createEditorSessionState(
13
+ input: Omit<EditorSessionState, "sessionVersion">,
14
+ ): EditorSessionState {
15
+ return cloneStructuredValue({
16
+ sessionVersion: EDITOR_SESSION_STATE_VERSION,
17
+ ...input,
18
+ });
19
+ }
20
+
21
+ export function editorSessionStateFromPersistedSnapshot(
22
+ snapshot: PersistedEditorSnapshot,
23
+ ): EditorSessionState {
24
+ return createEditorSessionState({
25
+ schemaVersion: snapshot.schemaVersion,
26
+ documentId: snapshot.documentId,
27
+ docId: snapshot.docId,
28
+ createdAt: snapshot.createdAt,
29
+ updatedAt: snapshot.updatedAt,
30
+ editorBuild: snapshot.editorBuild,
31
+ canonicalDocument: snapshot.canonicalDocument,
32
+ compatibility: snapshot.compatibility,
33
+ warningLog: snapshot.warningLog,
34
+ protectionSnapshot: snapshot.protectionSnapshot,
35
+ sourcePackage: snapshot.sourcePackage,
36
+ workflowMetadata: snapshot.workflowMetadata,
37
+ });
38
+ }
39
+
40
+ export function persistedSnapshotFromEditorSessionState(
41
+ sessionState: EditorSessionState,
42
+ options: {
43
+ savedAt: string;
44
+ },
45
+ ): PersistedEditorSnapshot {
46
+ return cloneStructuredValue({
47
+ snapshotVersion: "persisted-editor-snapshot/2",
48
+ schemaVersion: sessionState.schemaVersion,
49
+ documentId: sessionState.documentId,
50
+ docId: sessionState.docId,
51
+ createdAt: sessionState.createdAt,
52
+ updatedAt: sessionState.updatedAt,
53
+ savedAt: options.savedAt,
54
+ editorBuild: sessionState.editorBuild,
55
+ canonicalDocument: sessionState.canonicalDocument,
56
+ compatibility: sessionState.compatibility,
57
+ warningLog: sessionState.warningLog,
58
+ protectionSnapshot: sessionState.protectionSnapshot,
59
+ sourcePackage: sessionState.sourcePackage,
60
+ workflowMetadata: sessionState.workflowMetadata,
61
+ });
62
+ }
@@ -0,0 +1,623 @@
1
+ import {
2
+ createCanonicalDocumentSignature,
3
+ projectCanonicalDocument,
4
+ type BlockNode,
5
+ type CanonicalDocument,
6
+ type HyperlinkNode,
7
+ type InlineNode,
8
+ type ParagraphNode,
9
+ type RevisionRecord,
10
+ type TextNode,
11
+ } from "../model/canonical-document.ts";
12
+ import type { DocumentVersionSnapshot } from "./snapshot.ts";
13
+
14
+ export interface CompareVersionRef {
15
+ versionId: string;
16
+ name: string;
17
+ signature: string;
18
+ }
19
+
20
+ export type CompareChangeKind =
21
+ | "paragraph-insertion"
22
+ | "paragraph-deletion"
23
+ | "paragraph-modification"
24
+ | "structural-insertion"
25
+ | "structural-deletion";
26
+
27
+ export interface CompareChange {
28
+ changeId: string;
29
+ kind: CompareChangeKind;
30
+ tracked: boolean;
31
+ blockType: BlockNode["type"];
32
+ beforeText?: string;
33
+ afterText?: string;
34
+ targetIndex: number;
35
+ }
36
+
37
+ export interface VersionCompareResult {
38
+ compareVersion: "version-compare-result/1";
39
+ comparedAt: string;
40
+ base: CompareVersionRef;
41
+ target: CompareVersionRef;
42
+ changes: CompareChange[];
43
+ comparedDocument: CanonicalDocument;
44
+ }
45
+
46
+ export interface CompareDocumentVersionsOptions {
47
+ comparedAt?: string;
48
+ authorId?: string;
49
+ }
50
+
51
+ interface BuildEntry {
52
+ changeId?: string;
53
+ block: BlockNode;
54
+ trackChange?: "insertion" | "deletion";
55
+ tracked: boolean;
56
+ blockType: BlockNode["type"];
57
+ beforeText?: string;
58
+ afterText?: string;
59
+ }
60
+
61
+ interface PendingRevision {
62
+ changeId: string;
63
+ kind: "insertion" | "deletion";
64
+ paragraphIndex: number;
65
+ }
66
+
67
+ interface LcsMatch {
68
+ baseIndex: number;
69
+ targetIndex: number;
70
+ }
71
+
72
+ export function compareDocumentSnapshots(
73
+ base: DocumentVersionSnapshot,
74
+ target: DocumentVersionSnapshot,
75
+ options: CompareDocumentVersionsOptions = {},
76
+ ): VersionCompareResult {
77
+ const comparedAt = options.comparedAt ?? target.createdAt;
78
+ const authorId = options.authorId ?? "Version Compare";
79
+ const baseDocument = base.canonicalDocument;
80
+ const targetDocument = target.canonicalDocument;
81
+ const baseBlocks = baseDocument.content.children;
82
+ const targetBlocks = targetDocument.content.children;
83
+ const matches = computeLcs(
84
+ baseBlocks.map(getComparableBlockKey),
85
+ targetBlocks.map(getComparableBlockKey),
86
+ );
87
+
88
+ const buildEntries: BuildEntry[] = [];
89
+ const changes: CompareChange[] = [];
90
+ let nextBaseIndex = 0;
91
+ let nextTargetIndex = 0;
92
+ let nextChangeNumber = 1;
93
+
94
+ for (const match of [...matches, { baseIndex: baseBlocks.length, targetIndex: targetBlocks.length }]) {
95
+ while (nextBaseIndex < match.baseIndex || nextTargetIndex < match.targetIndex) {
96
+ const deleteBlock = nextBaseIndex < match.baseIndex ? baseBlocks[nextBaseIndex] : undefined;
97
+ const insertBlock = nextTargetIndex < match.targetIndex ? targetBlocks[nextTargetIndex] : undefined;
98
+
99
+ if (deleteBlock && insertBlock) {
100
+ if (deleteBlock.type === "paragraph" && insertBlock.type === "paragraph") {
101
+ const modificationId = `change-${nextChangeNumber}`;
102
+ nextChangeNumber += 1;
103
+ addParagraphModificationEntry(
104
+ buildEntries,
105
+ changes,
106
+ modificationId,
107
+ deleteBlock,
108
+ insertBlock,
109
+ nextTargetIndex,
110
+ );
111
+ nextBaseIndex += 1;
112
+ nextTargetIndex += 1;
113
+ continue;
114
+ }
115
+
116
+ const deletionId = `change-${nextChangeNumber}`;
117
+ nextChangeNumber += 1;
118
+ addTrackedOrStructuralEntry(
119
+ buildEntries,
120
+ changes,
121
+ deletionId,
122
+ deleteBlock,
123
+ "deletion",
124
+ nextTargetIndex,
125
+ );
126
+
127
+ const insertionId = `change-${nextChangeNumber}`;
128
+ nextChangeNumber += 1;
129
+ addTrackedOrStructuralEntry(
130
+ buildEntries,
131
+ changes,
132
+ insertionId,
133
+ insertBlock,
134
+ "insertion",
135
+ nextTargetIndex,
136
+ );
137
+ nextBaseIndex += 1;
138
+ nextTargetIndex += 1;
139
+ continue;
140
+ }
141
+
142
+ if (deleteBlock) {
143
+ const changeId = `change-${nextChangeNumber}`;
144
+ nextChangeNumber += 1;
145
+ addTrackedOrStructuralEntry(
146
+ buildEntries,
147
+ changes,
148
+ changeId,
149
+ deleteBlock,
150
+ "deletion",
151
+ nextTargetIndex,
152
+ );
153
+ nextBaseIndex += 1;
154
+ continue;
155
+ }
156
+
157
+ if (insertBlock) {
158
+ const changeId = `change-${nextChangeNumber}`;
159
+ nextChangeNumber += 1;
160
+ addTrackedOrStructuralEntry(
161
+ buildEntries,
162
+ changes,
163
+ changeId,
164
+ insertBlock,
165
+ "insertion",
166
+ nextTargetIndex,
167
+ );
168
+ nextTargetIndex += 1;
169
+ }
170
+ }
171
+
172
+ if (match.baseIndex < baseBlocks.length && match.targetIndex < targetBlocks.length) {
173
+ const baseText = getBlockDisplayText(baseBlocks[match.baseIndex]);
174
+ const targetText = getBlockDisplayText(targetBlocks[match.targetIndex]);
175
+ const isModified =
176
+ baseBlocks[match.baseIndex].type === "paragraph" &&
177
+ targetBlocks[match.targetIndex].type === "paragraph" &&
178
+ baseText !== targetText;
179
+
180
+ if (isModified) {
181
+ const modChangeId = `change-${nextChangeNumber}`;
182
+ nextChangeNumber += 1;
183
+ addParagraphModificationEntry(
184
+ buildEntries,
185
+ changes,
186
+ modChangeId,
187
+ baseBlocks[match.baseIndex] as ParagraphNode,
188
+ targetBlocks[match.targetIndex] as ParagraphNode,
189
+ match.targetIndex,
190
+ );
191
+ } else {
192
+ buildEntries.push({
193
+ block: cloneBlock(targetBlocks[match.targetIndex]),
194
+ tracked: false,
195
+ blockType: targetBlocks[match.targetIndex].type,
196
+ beforeText: baseText,
197
+ afterText: targetText,
198
+ });
199
+ }
200
+
201
+ nextBaseIndex = match.baseIndex + 1;
202
+ nextTargetIndex = match.targetIndex + 1;
203
+ }
204
+ }
205
+
206
+ const built = buildComparedDocument(baseDocument, targetDocument, buildEntries, comparedAt, authorId);
207
+ return {
208
+ compareVersion: "version-compare-result/1",
209
+ comparedAt,
210
+ base: {
211
+ versionId: base.versionId,
212
+ name: base.name,
213
+ signature: base.documentSignature,
214
+ },
215
+ target: {
216
+ versionId: target.versionId,
217
+ name: target.name,
218
+ signature: target.documentSignature,
219
+ },
220
+ changes,
221
+ comparedDocument: built,
222
+ };
223
+ }
224
+
225
+ function addTrackedOrStructuralEntry(
226
+ buildEntries: BuildEntry[],
227
+ changes: CompareChange[],
228
+ changeId: string,
229
+ block: BlockNode,
230
+ direction: "insertion" | "deletion",
231
+ targetIndex: number,
232
+ ): void {
233
+ const tracked = block.type === "paragraph";
234
+ const cloned = cloneBlock(block);
235
+ const text = getBlockDisplayText(block);
236
+
237
+ buildEntries.push({
238
+ ...(tracked ? { changeId } : {}),
239
+ block: cloned,
240
+ ...(tracked ? { trackChange: direction } : {}),
241
+ tracked,
242
+ blockType: cloned.type,
243
+ ...(direction === "deletion" ? { beforeText: text } : { afterText: text }),
244
+ });
245
+
246
+ changes.push({
247
+ changeId,
248
+ kind:
249
+ block.type === "paragraph"
250
+ ? direction === "insertion"
251
+ ? "paragraph-insertion"
252
+ : "paragraph-deletion"
253
+ : direction === "insertion"
254
+ ? "structural-insertion"
255
+ : "structural-deletion",
256
+ tracked,
257
+ blockType: cloned.type,
258
+ ...(direction === "deletion" ? { beforeText: text } : { afterText: text }),
259
+ targetIndex,
260
+ });
261
+ }
262
+
263
+ function addParagraphModificationEntry(
264
+ buildEntries: BuildEntry[],
265
+ changes: CompareChange[],
266
+ changeId: string,
267
+ baseParagraph: ParagraphNode,
268
+ targetParagraph: ParagraphNode,
269
+ targetIndex: number,
270
+ ): void {
271
+ const beforeText = getBlockDisplayText(baseParagraph);
272
+ const afterText = getBlockDisplayText(targetParagraph);
273
+
274
+ buildEntries.push({
275
+ changeId: `${changeId}-before`,
276
+ block: cloneBlock(baseParagraph),
277
+ trackChange: "deletion",
278
+ tracked: true,
279
+ blockType: "paragraph",
280
+ beforeText,
281
+ });
282
+ buildEntries.push({
283
+ changeId: `${changeId}-after`,
284
+ block: cloneBlock(targetParagraph),
285
+ trackChange: "insertion",
286
+ tracked: true,
287
+ blockType: "paragraph",
288
+ afterText,
289
+ });
290
+
291
+ changes.push({
292
+ changeId,
293
+ kind: "paragraph-modification",
294
+ tracked: true,
295
+ blockType: "paragraph",
296
+ beforeText,
297
+ afterText,
298
+ targetIndex,
299
+ });
300
+ }
301
+
302
+ function buildComparedDocument(
303
+ base: CanonicalDocument,
304
+ target: CanonicalDocument,
305
+ entries: readonly BuildEntry[],
306
+ comparedAt: string,
307
+ authorId: string,
308
+ ): CanonicalDocument {
309
+ const contentChildren: BlockNode[] = [];
310
+ const pendingRevisions: PendingRevision[] = [];
311
+ const diagnosticsWarnings = [...target.diagnostics.warnings];
312
+ let paragraphIndex = 0;
313
+ let warningNumber = 1;
314
+
315
+ for (let index = 0; index < entries.length; index += 1) {
316
+ const entry = entries[index];
317
+ if (!entry) {
318
+ continue;
319
+ }
320
+
321
+ contentChildren.push(entry.block);
322
+ if (entry.block.type === "paragraph") {
323
+ if (entry.trackChange) {
324
+ pendingRevisions.push({
325
+ changeId: entry.changeId ?? `change-${pendingRevisions.length + 1}`,
326
+ kind: entry.trackChange,
327
+ paragraphIndex,
328
+ });
329
+ }
330
+ paragraphIndex += 1;
331
+ continue;
332
+ }
333
+
334
+ if (!entry.tracked) {
335
+ diagnosticsWarnings.push({
336
+ diagnosticId: `diagnostic:compare-structural-${warningNumber}`,
337
+ warningId: `warning:compare-structural-${warningNumber}`,
338
+ source: "review",
339
+ message: `Version compare preserved a ${entry.blockType} ${entry.beforeText ? "deletion" : "insertion"} without a Word revision wrapper.`,
340
+ });
341
+ warningNumber += 1;
342
+ }
343
+ }
344
+
345
+ const revisions = createParagraphRevisionRecords(
346
+ contentChildren,
347
+ pendingRevisions,
348
+ comparedAt,
349
+ authorId,
350
+ );
351
+
352
+ return {
353
+ ...projectCanonicalDocument(target),
354
+ updatedAt: comparedAt,
355
+ styles: mergeStyleCatalogs(base.styles, target.styles),
356
+ numbering: mergeRecordCatalog(base.numbering, target.numbering),
357
+ media: mergeRecordCatalog(base.media, target.media),
358
+ content: {
359
+ type: "doc",
360
+ children: contentChildren,
361
+ },
362
+ review: {
363
+ comments: projectValue(target.review.comments),
364
+ revisions,
365
+ },
366
+ preservation: mergePreservationStores(base.preservation, target.preservation),
367
+ diagnostics: {
368
+ warnings: diagnosticsWarnings,
369
+ errors: [...target.diagnostics.errors],
370
+ },
371
+ ...(target.subParts ?? base.subParts ? { subParts: projectValue(target.subParts ?? base.subParts) } : {}),
372
+ };
373
+ }
374
+
375
+ function createParagraphRevisionRecords(
376
+ children: readonly BlockNode[],
377
+ pendingRevisions: readonly PendingRevision[],
378
+ createdAt: string,
379
+ authorId: string,
380
+ ): CanonicalDocument["review"]["revisions"] {
381
+ const positionByParagraphIndex = new Map<number, number>();
382
+ let cursor = 0;
383
+ let paragraphIndex = 0;
384
+ let previousWasParagraph = false;
385
+
386
+ for (const block of children) {
387
+ if (block.type === "paragraph") {
388
+ if (previousWasParagraph) {
389
+ cursor += 1;
390
+ }
391
+ cursor += getParagraphLength(block);
392
+ positionByParagraphIndex.set(paragraphIndex, cursor);
393
+ paragraphIndex += 1;
394
+ previousWasParagraph = true;
395
+ continue;
396
+ }
397
+
398
+ cursor += 1;
399
+ previousWasParagraph = false;
400
+ }
401
+
402
+ const entries: Array<[string, RevisionRecord]> = [];
403
+ pendingRevisions.forEach((revision) => {
404
+ const position = positionByParagraphIndex.get(revision.paragraphIndex);
405
+ if (position === undefined) {
406
+ return;
407
+ }
408
+
409
+ const record: RevisionRecord = {
410
+ changeId: revision.changeId,
411
+ kind: revision.kind,
412
+ anchor: {
413
+ kind: "range",
414
+ range: { from: position, to: position },
415
+ assoc: { start: -1, end: 1 },
416
+ },
417
+ authorId,
418
+ createdAt,
419
+ status: "open",
420
+ warningIds: [],
421
+ metadata: {
422
+ source: "runtime",
423
+ importedRevisionForm:
424
+ revision.kind === "insertion" ? "paragraph-insertion" : "paragraph-deletion",
425
+ },
426
+ };
427
+ entries.push([revision.changeId, record]);
428
+ });
429
+ return Object.fromEntries(entries);
430
+ }
431
+
432
+ function getComparableBlockKey(block: BlockNode): string {
433
+ if (block.type === "paragraph") {
434
+ return `paragraph:${createCanonicalDocumentSignature({
435
+ ...block,
436
+ children: normalizeInlineChildren(block.children),
437
+ })}`;
438
+ }
439
+
440
+ return `${block.type}:${createCanonicalDocumentSignature(block)}`;
441
+ }
442
+
443
+ function normalizeInlineChildren(children: readonly InlineNode[]): InlineNode[] {
444
+ return children.map((child) => {
445
+ if (child.type === "hyperlink") {
446
+ return {
447
+ ...child,
448
+ children: normalizeInlineChildren(child.children) as HyperlinkNode["children"],
449
+ };
450
+ }
451
+ if (child.type === "field") {
452
+ return {
453
+ ...child,
454
+ children: normalizeInlineChildren(child.children),
455
+ };
456
+ }
457
+ return projectValue(child);
458
+ });
459
+ }
460
+
461
+ function computeLcs(baseKeys: readonly string[], targetKeys: readonly string[]): LcsMatch[] {
462
+ const widths = targetKeys.length + 1;
463
+ const matrix = Array.from({ length: baseKeys.length + 1 }, () =>
464
+ Array.from({ length: widths }, () => 0),
465
+ );
466
+
467
+ for (let baseIndex = baseKeys.length - 1; baseIndex >= 0; baseIndex -= 1) {
468
+ for (let targetIndex = targetKeys.length - 1; targetIndex >= 0; targetIndex -= 1) {
469
+ matrix[baseIndex][targetIndex] =
470
+ baseKeys[baseIndex] === targetKeys[targetIndex]
471
+ ? matrix[baseIndex + 1][targetIndex + 1] + 1
472
+ : Math.max(matrix[baseIndex + 1][targetIndex], matrix[baseIndex][targetIndex + 1]);
473
+ }
474
+ }
475
+
476
+ const matches: LcsMatch[] = [];
477
+ let baseIndex = 0;
478
+ let targetIndex = 0;
479
+ while (baseIndex < baseKeys.length && targetIndex < targetKeys.length) {
480
+ if (baseKeys[baseIndex] === targetKeys[targetIndex]) {
481
+ matches.push({ baseIndex, targetIndex });
482
+ baseIndex += 1;
483
+ targetIndex += 1;
484
+ continue;
485
+ }
486
+
487
+ if (matrix[baseIndex + 1][targetIndex] >= matrix[baseIndex][targetIndex + 1]) {
488
+ baseIndex += 1;
489
+ } else {
490
+ targetIndex += 1;
491
+ }
492
+ }
493
+
494
+ return matches;
495
+ }
496
+
497
+ function getParagraphLength(paragraph: ParagraphNode): number {
498
+ return paragraph.children.reduce((length, child) => length + getInlineLength(child), 0);
499
+ }
500
+
501
+ function getInlineLength(node: InlineNode): number {
502
+ switch (node.type) {
503
+ case "text":
504
+ return Array.from(node.text).length;
505
+ case "hyperlink":
506
+ return node.children.reduce((length, child) => length + getInlineLength(child), 0);
507
+ case "field":
508
+ return node.children.reduce((length, child) => length + getInlineLength(child), 0);
509
+ case "tab":
510
+ case "hard_break":
511
+ case "column_break":
512
+ case "symbol":
513
+ case "image":
514
+ case "opaque_inline":
515
+ case "footnote_ref":
516
+ case "bookmark_start":
517
+ case "bookmark_end":
518
+ case "chart_preview":
519
+ case "smartart_preview":
520
+ case "shape":
521
+ case "wordart":
522
+ case "vml_shape":
523
+ return 1;
524
+ }
525
+ }
526
+
527
+ function getBlockDisplayText(block: BlockNode): string {
528
+ switch (block.type) {
529
+ case "paragraph":
530
+ return block.children.map(getInlineDisplayText).join("");
531
+ case "table":
532
+ return "[Table]";
533
+ case "sdt":
534
+ return "[Structured content]";
535
+ case "custom_xml":
536
+ return "[Custom XML block]";
537
+ case "alt_chunk":
538
+ return "[Alt chunk]";
539
+ case "section_break":
540
+ return "[Section break]";
541
+ case "opaque_block":
542
+ return "[Preserved block]";
543
+ }
544
+ }
545
+
546
+ function getInlineDisplayText(node: InlineNode): string {
547
+ switch (node.type) {
548
+ case "text":
549
+ return node.text;
550
+ case "tab":
551
+ return "\t";
552
+ case "hard_break":
553
+ case "column_break":
554
+ return "\n";
555
+ case "symbol":
556
+ return node.char;
557
+ case "hyperlink":
558
+ return node.children.map(getInlineDisplayText).join("");
559
+ case "field":
560
+ return node.children.map(getInlineDisplayText).join("");
561
+ case "image":
562
+ return node.altText ?? "[Image]";
563
+ case "opaque_inline":
564
+ return "[Preserved]";
565
+ case "footnote_ref":
566
+ return "[Footnote]";
567
+ case "bookmark_start":
568
+ case "bookmark_end":
569
+ return "";
570
+ case "chart_preview":
571
+ return "[Chart]";
572
+ case "smartart_preview":
573
+ return "[SmartArt]";
574
+ case "shape":
575
+ return node.text ?? "[Shape]";
576
+ case "wordart":
577
+ return node.text;
578
+ case "vml_shape":
579
+ return node.text ?? "[VML Shape]";
580
+ }
581
+ }
582
+
583
+ function mergeStyleCatalogs(
584
+ base: CanonicalDocument["styles"],
585
+ target: CanonicalDocument["styles"],
586
+ ): CanonicalDocument["styles"] {
587
+ return {
588
+ paragraphs: { ...base.paragraphs, ...target.paragraphs },
589
+ characters: { ...base.characters, ...target.characters },
590
+ tables: { ...base.tables, ...target.tables },
591
+ ...((base.latentStyles || target.latentStyles)
592
+ ? { latentStyles: { ...(base.latentStyles ?? {}), ...(target.latentStyles ?? {}) } }
593
+ : {}),
594
+ };
595
+ }
596
+
597
+ function mergePreservationStores(
598
+ base: CanonicalDocument["preservation"],
599
+ target: CanonicalDocument["preservation"],
600
+ ): CanonicalDocument["preservation"] {
601
+ return {
602
+ opaqueFragments: {
603
+ ...base.opaqueFragments,
604
+ ...target.opaqueFragments,
605
+ },
606
+ packageParts: {
607
+ ...base.packageParts,
608
+ ...target.packageParts,
609
+ },
610
+ };
611
+ }
612
+
613
+ function mergeRecordCatalog<T extends object>(base: T, target: T): T {
614
+ return projectValue({ ...base, ...target });
615
+ }
616
+
617
+ function cloneBlock<T extends BlockNode>(block: T): T {
618
+ return projectValue(block);
619
+ }
620
+
621
+ function projectValue<T>(value: T): T {
622
+ return structuredClone(value);
623
+ }