@stll/folio-core 0.46.0 → 0.47.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (370) hide show
  1. package/dist/ai-edits/apply.d.ts +17 -1
  2. package/dist/ai-edits/apply.js +31 -27
  3. package/dist/ai-edits/headless.d.ts +9 -2
  4. package/dist/ai-edits/headless.js +5 -3
  5. package/dist/ai-edits/read.d.ts +1 -0
  6. package/dist/ai-edits/read.js +1 -0
  7. package/dist/ai-edits/snapshot.js +32 -27
  8. package/dist/ai-edits/table-cell-mutations.js +15 -7
  9. package/dist/ai-edits/table-geometry.js +21 -18
  10. package/dist/ai-edits/table-template.js +2 -2
  11. package/dist/compare/compare.js +2 -1
  12. package/dist/compare/content-alignment.js +192 -46
  13. package/dist/compare/content-types.d.ts +8 -2
  14. package/dist/compare/content.js +2 -11
  15. package/dist/compare/plan.js +7 -4
  16. package/dist/compare/section-boundary-properties.js +1 -2
  17. package/dist/content-controls/checkboxDisplay.d.ts +8 -2
  18. package/dist/content-controls/checkboxDisplay.js +11 -5
  19. package/dist/content-controls/mutateContentControls.js +41 -42
  20. package/dist/controller/layoutPipeline.js +8 -3
  21. package/dist/display-list/build/buildDisplayList.js +7 -7
  22. package/dist/display-list/build/imagePrimitives.d.ts +4 -4
  23. package/dist/display-list/build/imagePrimitives.js +38 -20
  24. package/dist/display-list/build/pageBorderPrimitives.js +2 -1
  25. package/dist/display-list/build/paragraphPrimitives.js +93 -13
  26. package/dist/display-list/build/previewPrimitives.d.ts +10 -0
  27. package/dist/display-list/build/previewPrimitives.js +89 -0
  28. package/dist/display-list/build/strokes.d.ts +177 -8
  29. package/dist/display-list/build/strokes.js +167 -47
  30. package/dist/display-list/build/tablePrimitives.js +4 -2
  31. package/dist/display-list/build/textBoxPrimitives.js +6 -4
  32. package/dist/display-list/build/textDecorations.d.ts +15 -1
  33. package/dist/display-list/build/textDecorations.js +15 -1
  34. package/dist/display-list/dom/renderDisplayListToDom.js +1 -19
  35. package/dist/display-list/primitives.d.ts +13 -2
  36. package/dist/display-list/primitives.js +36 -1
  37. package/dist/document-operations.d.ts +9 -2
  38. package/dist/document-operations.js +5 -3
  39. package/dist/docx/attributeRemainder.d.ts +34 -1
  40. package/dist/docx/attributeRemainder.js +49 -3
  41. package/dist/docx/blockContentParser.d.ts +2 -0
  42. package/dist/docx/blockContentParser.js +39 -67
  43. package/dist/docx/blockPlainText.js +3 -1
  44. package/dist/docx/borderParser.js +26 -11
  45. package/dist/docx/builtInStyles.d.ts +8 -16
  46. package/dist/docx/builtInStyles.js +54 -17
  47. package/dist/docx/commentAnchorIndex.js +1 -1
  48. package/dist/docx/commentParser.js +3 -3
  49. package/dist/docx/commentRangeIntegrity.js +1 -1
  50. package/dist/docx/commentRangeJoin.js +1 -1
  51. package/dist/docx/commentReferenceNormalization.js +3 -2
  52. package/dist/docx/commentReplyMarkers.js +1 -1
  53. package/dist/docx/compatibility.js +56 -42
  54. package/dist/docx/containerChildren.d.ts +110 -13
  55. package/dist/docx/containerChildren.gen.d.ts +16 -1
  56. package/dist/docx/containerChildren.gen.js +18 -1
  57. package/dist/docx/containerChildren.js +63 -13
  58. package/dist/docx/diagramPreview.d.ts +14 -2
  59. package/dist/docx/diagramPreview.js +81 -169
  60. package/dist/docx/documentParser.js +4 -1
  61. package/dist/docx/drawingAnchor.d.ts +87 -0
  62. package/dist/docx/drawingAnchor.js +201 -0
  63. package/dist/docx/drawingUtils.d.ts +43 -38
  64. package/dist/docx/drawingUtils.js +205 -118
  65. package/dist/docx/fontTableParser.js +102 -41
  66. package/dist/docx/footnoteParser.js +10 -6
  67. package/dist/docx/groupDrawingParser.js +4 -3
  68. package/dist/docx/headerFooterReferenceNormalization.js +1 -1
  69. package/dist/docx/hyperlinkParser.d.ts +45 -7
  70. package/dist/docx/hyperlinkParser.js +126 -57
  71. package/dist/docx/imageParser.js +127 -107
  72. package/dist/docx/index.d.ts +2 -1
  73. package/dist/docx/index.js +2 -1
  74. package/dist/docx/inlineContentRemovals.d.ts +28 -0
  75. package/dist/docx/inlineContentRemovals.js +46 -0
  76. package/dist/docx/inlineWrapperContent.d.ts +84 -3
  77. package/dist/docx/inlineWrapperContent.js +85 -4
  78. package/dist/docx/inlineWrapperParser.d.ts +11 -0
  79. package/dist/docx/inlineWrapperParser.js +60 -0
  80. package/dist/docx/nonVisualDrawingProps.d.ts +5 -13
  81. package/dist/docx/normalizeBaseDirection.js +4 -2
  82. package/dist/docx/numberingParser.d.ts +25 -2
  83. package/dist/docx/numberingParser.js +264 -361
  84. package/dist/docx/numberingReference.d.ts +9 -16
  85. package/dist/docx/numberingReference.js +17 -16
  86. package/dist/docx/numberingReferenceNormalization.js +7 -7
  87. package/dist/docx/ooxmlCounterFormatter.d.ts +1 -1
  88. package/dist/docx/ooxmlCounterFormatter.js +4 -1
  89. package/dist/docx/paraIdAttribute.d.ts +91 -1
  90. package/dist/docx/paraIdAttribute.js +79 -1
  91. package/dist/docx/paragraphParser.d.ts +9 -24
  92. package/dist/docx/paragraphParser.js +212 -396
  93. package/dist/docx/paragraphProperties.d.ts +23 -0
  94. package/dist/docx/paragraphProperties.js +279 -0
  95. package/dist/docx/paragraphPropertySource.js +2 -0
  96. package/dist/docx/paragraphTextBoxEnrichment.d.ts +2 -1
  97. package/dist/docx/paragraphTextBoxEnrichment.js +14 -7
  98. package/dist/docx/paragraphTraversal.d.ts +14 -10
  99. package/dist/docx/paragraphTraversal.js +47 -49
  100. package/dist/docx/parseWarningMessage.js +3 -0
  101. package/dist/docx/parserEnums.d.ts +6 -8
  102. package/dist/docx/parserEnums.js +4 -6
  103. package/dist/docx/preservedRunContent.js +16 -6
  104. package/dist/docx/previewBudget.d.ts +44 -23
  105. package/dist/docx/previewBudget.js +61 -30
  106. package/dist/docx/propertyElementAttributes.d.ts +178 -0
  107. package/dist/docx/propertyElementAttributes.js +114 -0
  108. package/dist/docx/renderedPageBreakNormalization.js +2 -2
  109. package/dist/docx/rezip.d.ts +28 -2
  110. package/dist/docx/rezip.js +78 -9
  111. package/dist/docx/runConsolidator.d.ts +42 -2
  112. package/dist/docx/runConsolidator.js +60 -6
  113. package/dist/docx/runParser.d.ts +54 -18
  114. package/dist/docx/runParser.js +379 -295
  115. package/dist/docx/runPayload.d.ts +5 -0
  116. package/dist/docx/runPayload.js +4 -0
  117. package/dist/docx/sdtProperties.d.ts +39 -5
  118. package/dist/docx/sdtProperties.js +205 -84
  119. package/dist/docx/sdtPropertiesPatch.d.ts +5 -9
  120. package/dist/docx/sdtPropertiesPatch.js +68 -112
  121. package/dist/docx/sectionParser.d.ts +1 -2
  122. package/dist/docx/sectionParser.js +236 -240
  123. package/dist/docx/selectiveSave.js +3 -2
  124. package/dist/docx/selectiveXmlPatch.d.ts +21 -2
  125. package/dist/docx/selectiveXmlPatch.js +195 -99
  126. package/dist/docx/serializer/blockSdtSerializer.js +2 -96
  127. package/dist/docx/serializer/borderSerializer.d.ts +5 -5
  128. package/dist/docx/serializer/borderSerializer.js +10 -8
  129. package/dist/docx/serializer/documentSerializer.js +3 -0
  130. package/dist/docx/serializer/fontTableSerializer.js +31 -3
  131. package/dist/docx/serializer/headerFooterSerializer.js +3 -0
  132. package/dist/docx/serializer/markupRangeAttributes.d.ts +9 -1
  133. package/dist/docx/serializer/markupRangeAttributes.js +9 -1
  134. package/dist/docx/serializer/noteSerializer.js +3 -0
  135. package/dist/docx/serializer/numberingSerializer.d.ts +1 -6
  136. package/dist/docx/serializer/numberingSerializer.js +81 -79
  137. package/dist/docx/serializer/paragraphSerializer.d.ts +1 -9
  138. package/dist/docx/serializer/paragraphSerializer.js +88 -188
  139. package/dist/docx/serializer/runSerializer.d.ts +1 -5
  140. package/dist/docx/serializer/runSerializer.js +109 -59
  141. package/dist/docx/serializer/sdtPropertiesSerializer.d.ts +26 -0
  142. package/dist/docx/serializer/sdtPropertiesSerializer.js +111 -0
  143. package/dist/docx/serializer/sectionPropertiesSerializer.js +34 -45
  144. package/dist/docx/serializer/settingsSerializer.js +6 -4
  145. package/dist/docx/serializer/stylesSerializer.js +8 -11
  146. package/dist/docx/serializer/tableSerializer.js +268 -100
  147. package/dist/docx/serializer/textFormattingSerializer.d.ts +28 -4
  148. package/dist/docx/serializer/textFormattingSerializer.js +111 -101
  149. package/dist/docx/serializer/xmlUtils.d.ts +1 -1
  150. package/dist/docx/serializer/xmlUtils.js +1 -1
  151. package/dist/docx/server/createBilingualDocument.js +18 -16
  152. package/dist/docx/server/migrateYjsAttrSchema.js +3 -3
  153. package/dist/docx/settingsParser.js +7 -4
  154. package/dist/docx/shadingParser.d.ts +2 -1
  155. package/dist/docx/shadingParser.js +43 -7
  156. package/dist/docx/shapeParser.js +8 -3
  157. package/dist/docx/strictNames.d.ts +11 -0
  158. package/dist/docx/strictNames.gen.d.ts +45 -0
  159. package/dist/docx/strictNames.gen.js +50 -0
  160. package/dist/docx/strictNames.js +43 -0
  161. package/dist/docx/strictValueEncodings.gen.js +133 -131
  162. package/dist/docx/styleParser.js +17 -349
  163. package/dist/docx/tableParser.d.ts +10 -1
  164. package/dist/docx/tableParser.js +505 -181
  165. package/dist/docx/textBoxParser.d.ts +3 -1
  166. package/dist/docx/textBoxParser.js +18 -8
  167. package/dist/docx/themeColorAttribute.d.ts +13 -0
  168. package/dist/docx/themeColorAttribute.js +24 -0
  169. package/dist/docx/trackedMoveRangeNormalization.js +2 -1
  170. package/dist/docx/vmlImageParser.d.ts +13 -4
  171. package/dist/docx/vmlImageParser.js +74 -31
  172. package/dist/docx/vmlPreview.js +2 -2
  173. package/dist/docx/wrapPolygon.d.ts +30 -0
  174. package/dist/docx/wrapPolygon.js +70 -0
  175. package/dist/docx/xmlParser.d.ts +14 -1
  176. package/dist/docx/xmlParser.js +18 -2
  177. package/dist/fonts/embeddedFonts.js +3 -3
  178. package/dist/headless-layout.js +2 -0
  179. package/dist/i18n/messages/catalogs.gen.d.ts +68 -0
  180. package/dist/i18n/messages/catalogs.gen.js +102 -34
  181. package/dist/i18n/messages/messages.gen.d.ts +4 -0
  182. package/dist/internal/headlessRevisionResolution.js +9 -0
  183. package/dist/internal/pageBreakRunSourceDescendantIndex.js +3 -1
  184. package/dist/internal/paragraphFormattingSerialization.d.ts +20 -9
  185. package/dist/internal/paragraphFormattingSerialization.js +118 -83
  186. package/dist/layout-bridge/convert/footnoteLayout.d.ts +1 -0
  187. package/dist/layout-bridge/convert/footnoteLayout.js +1 -0
  188. package/dist/layout-bridge/convert/headerFooterLayout.d.ts +1 -0
  189. package/dist/layout-bridge/convert/headerFooterLayout.js +2 -0
  190. package/dist/layout-bridge/convert/toFlowBlocks.d.ts +17 -12
  191. package/dist/layout-bridge/convert/toFlowBlocks.js +177 -101
  192. package/dist/layout-engine/index.d.ts +2 -2
  193. package/dist/layout-engine/index.js +53 -17
  194. package/dist/layout-engine/measure/measureBlocks.d.ts +3 -0
  195. package/dist/layout-engine/measure/measureBlocks.js +6 -10
  196. package/dist/layout-engine/measure/tableCellGrid.js +2 -1
  197. package/dist/layout-engine/measure/tableFragmentBorderGeometry.js +2 -1
  198. package/dist/layout-engine/measure/tableInlinePlacement.js +2 -5
  199. package/dist/layout-engine/paragraphSequence.js +3 -2
  200. package/dist/layout-engine/renderedBreakReconciliation.js +2 -1
  201. package/dist/layout-engine/section-breaks.d.ts +49 -2
  202. package/dist/layout-engine/section-breaks.js +55 -4
  203. package/dist/layout-engine/types.d.ts +47 -17
  204. package/dist/layout-engine/types.js +16 -1
  205. package/dist/layout-painter/borderStroke.d.ts +18 -4
  206. package/dist/layout-painter/renderPage.js +6 -4
  207. package/dist/layout-painter/renderParagraph.d.ts +2 -1
  208. package/dist/layout-painter/renderParagraph.js +13 -26
  209. package/dist/layout-painter/renderTable.d.ts +4 -1
  210. package/dist/layout-painter/renderTable.js +22 -22
  211. package/dist/layout-painter/renderTextBox.js +5 -3
  212. package/dist/markdown/renderBlock.js +3 -1
  213. package/dist/markdown/renderRuns.js +7 -2
  214. package/dist/markdown/renderTable.js +2 -1
  215. package/dist/model.d.ts +3 -3
  216. package/dist/model.js +2 -2
  217. package/dist/paged-layout/sectionBlockWidths.d.ts +3 -0
  218. package/dist/paged-layout/sectionBlockWidths.js +26 -4
  219. package/dist/prosemirror/attrs/index.d.ts +22 -4
  220. package/dist/prosemirror/attrs/index.js +498 -60
  221. package/dist/prosemirror/bookmarkBoundaryAttrs.d.ts +9 -1
  222. package/dist/prosemirror/bookmarkBoundaryAttrs.js +22 -3
  223. package/dist/prosemirror/commands/comments.js +68 -53
  224. package/dist/prosemirror/commands/contentControls.js +24 -19
  225. package/dist/prosemirror/commands/image.d.ts +1 -1
  226. package/dist/prosemirror/commands/image.js +4 -1
  227. package/dist/prosemirror/commands/paragraph.d.ts +2 -1
  228. package/dist/prosemirror/commands/propertyChangeScope.d.ts +12 -4
  229. package/dist/prosemirror/commands/propertyChangeScope.js +22 -4
  230. package/dist/prosemirror/commands/sectionBreak.d.ts +33 -1
  231. package/dist/prosemirror/commands/sectionBreak.js +187 -11
  232. package/dist/prosemirror/conversion/fromProseDoc.d.ts +18 -2
  233. package/dist/prosemirror/conversion/fromProseDoc.js +330 -183
  234. package/dist/prosemirror/conversion/index.d.ts +2 -2
  235. package/dist/prosemirror/conversion/preservedSinkCarriers.d.ts +39 -0
  236. package/dist/prosemirror/conversion/preservedSinkCarriers.js +19 -0
  237. package/dist/prosemirror/conversion/runShadingMark.js +14 -1
  238. package/dist/prosemirror/conversion/sdtAttrs.d.ts +10 -1
  239. package/dist/prosemirror/conversion/sdtAttrs.js +19 -5
  240. package/dist/prosemirror/conversion/toProseDoc.js +371 -141
  241. package/dist/prosemirror/emptyRangeAnchor.d.ts +53 -0
  242. package/dist/prosemirror/emptyRangeAnchor.js +158 -0
  243. package/dist/prosemirror/extensions/StarterKit.js +8 -2
  244. package/dist/prosemirror/extensions/core/DocExtension.js +1 -1
  245. package/dist/prosemirror/extensions/core/ParagraphExtension.js +19 -15
  246. package/dist/prosemirror/extensions/features/BaseKeymapExtension.js +3 -2
  247. package/dist/prosemirror/extensions/features/ListExtension.js +43 -24
  248. package/dist/prosemirror/extensions/features/ParagraphChangeTrackerExtension.js +4 -3
  249. package/dist/prosemirror/extensions/features/PasteCleanupExtension.d.ts +3 -3
  250. package/dist/prosemirror/extensions/features/PasteCleanupExtension.js +5 -5
  251. package/dist/prosemirror/extensions/features/pasteCleanup.d.ts +3 -1
  252. package/dist/prosemirror/extensions/features/pasteCleanup.js +56 -2
  253. package/dist/prosemirror/extensions/features/pastedHeadingStyles.js +5 -4
  254. package/dist/prosemirror/extensions/markRegistry.d.ts +26 -2
  255. package/dist/prosemirror/extensions/markRegistry.js +73 -10
  256. package/dist/prosemirror/extensions/marks/InlineWrapperExtension.js +17 -3
  257. package/dist/prosemirror/extensions/marks/RunIdentityExtension.d.ts +26 -0
  258. package/dist/prosemirror/extensions/marks/RunIdentityExtension.js +134 -0
  259. package/dist/prosemirror/extensions/marks/TrackedChangeExtensions.js +2 -1
  260. package/dist/prosemirror/extensions/marks/UnderlineExtension.js +12 -18
  261. package/dist/prosemirror/extensions/marks/markUtils.js +2 -1
  262. package/dist/prosemirror/extensions/nodes/BlockBookmarkBoundaryExtension.d.ts +29 -0
  263. package/dist/prosemirror/extensions/nodes/BlockBookmarkBoundaryExtension.js +46 -0
  264. package/dist/prosemirror/extensions/nodes/BlockSdtExtension.d.ts +4 -3
  265. package/dist/prosemirror/extensions/nodes/BlockSdtExtension.js +18 -13
  266. package/dist/prosemirror/extensions/nodes/BookmarkBoundaryExtension.js +28 -53
  267. package/dist/prosemirror/extensions/nodes/CommentReferenceExtension.js +10 -0
  268. package/dist/prosemirror/extensions/nodes/ImageExtension.js +8 -1
  269. package/dist/prosemirror/extensions/nodes/MoveRangeBoundaryExtension.d.ts +11 -0
  270. package/dist/prosemirror/extensions/nodes/MoveRangeBoundaryExtension.js +43 -0
  271. package/dist/prosemirror/extensions/nodes/RangeAnchorExtension.d.ts +13 -0
  272. package/dist/prosemirror/extensions/nodes/RangeAnchorExtension.js +65 -0
  273. package/dist/prosemirror/extensions/nodes/SdtExtension.d.ts +3 -1
  274. package/dist/prosemirror/extensions/nodes/SdtExtension.js +22 -16
  275. package/dist/prosemirror/extensions/nodes/ShapeExtension.js +4 -0
  276. package/dist/prosemirror/extensions/nodes/TableExtension.js +141 -123
  277. package/dist/prosemirror/extensions/nodes/TextBoxExtension.js +4 -0
  278. package/dist/prosemirror/extensions/nodes/bookmarkBoundaryDom.d.ts +23 -0
  279. package/dist/prosemirror/extensions/nodes/bookmarkBoundaryDom.js +57 -0
  280. package/dist/prosemirror/extensions/types.d.ts +12 -3
  281. package/dist/prosemirror/index.d.ts +4 -2
  282. package/dist/prosemirror/index.js +2 -1
  283. package/dist/prosemirror/inlineWrapperStack.js +20 -3
  284. package/dist/prosemirror/listMarker.d.ts +2 -2
  285. package/dist/prosemirror/listMarker.js +7 -8
  286. package/dist/prosemirror/listRenderingAttrs.js +11 -1
  287. package/dist/prosemirror/listState.d.ts +62 -0
  288. package/dist/prosemirror/listState.js +49 -0
  289. package/dist/prosemirror/moveRangeBoundaryAttrs.d.ts +13 -0
  290. package/dist/prosemirror/moveRangeBoundaryAttrs.js +114 -0
  291. package/dist/prosemirror/numberedRefFields.js +4 -4
  292. package/dist/prosemirror/numberingAttr.d.ts +55 -0
  293. package/dist/prosemirror/numberingAttr.js +74 -0
  294. package/dist/prosemirror/outlineLevelAttr.d.ts +29 -0
  295. package/dist/prosemirror/outlineLevelAttr.js +42 -0
  296. package/dist/prosemirror/paragraphFormattingProvenance.d.ts +9 -0
  297. package/dist/prosemirror/paragraphFormattingProvenance.js +4 -1
  298. package/dist/prosemirror/plugins/selectionTracker.d.ts +3 -6
  299. package/dist/prosemirror/plugins/selectionTracker.js +3 -10
  300. package/dist/prosemirror/rangeAnchorAttrs.d.ts +14 -0
  301. package/dist/prosemirror/rangeAnchorAttrs.js +101 -0
  302. package/dist/prosemirror/replacedAnnotations.d.ts +1 -1
  303. package/dist/prosemirror/replacedAnnotations.js +24 -6
  304. package/dist/prosemirror/revisionCarriers.d.ts +86 -2
  305. package/dist/prosemirror/revisionCarriers.js +86 -60
  306. package/dist/prosemirror/runFormattingInlineCarriers.d.ts +2 -0
  307. package/dist/prosemirror/runFormattingInlineCarriers.js +2 -0
  308. package/dist/prosemirror/runIdentity.d.ts +28 -0
  309. package/dist/prosemirror/runIdentity.js +36 -0
  310. package/dist/prosemirror/runStyleFormatting.js +1 -1
  311. package/dist/prosemirror/schema/index.d.ts +2 -2
  312. package/dist/prosemirror/schema/marks.d.ts +23 -4
  313. package/dist/prosemirror/schema/nodes.d.ts +220 -24
  314. package/dist/prosemirror/sectionCarrier.d.ts +37 -0
  315. package/dist/prosemirror/sectionCarrier.js +40 -0
  316. package/dist/prosemirror/selectionState.d.ts +3 -0
  317. package/dist/prosemirror/selectionState.js +4 -1
  318. package/dist/prosemirror/styles/resolvedStyleAttrs.d.ts +5 -4
  319. package/dist/prosemirror/styles/resolvedStyleAttrs.js +15 -13
  320. package/dist/prosemirror/tableResize.js +5 -6
  321. package/dist/prosemirror/trackedRunInlineAtoms.d.ts +2 -0
  322. package/dist/prosemirror/trackedRunInlineAtoms.js +2 -0
  323. package/dist/prosemirror/utils/extractTrackedChanges.d.ts +10 -11
  324. package/dist/prosemirror/utils/extractTrackedChanges.js +109 -92
  325. package/dist/prosemirror/validation.js +17 -6
  326. package/dist/prosemirror/yjsDocumentMetadata.d.ts +2 -2
  327. package/dist/prosemirror/yjsDocumentMetadata.js +428 -7
  328. package/dist/prosemirror/zeroWidthAnchors.js +4 -0
  329. package/dist/style-sets/extract.js +4 -4
  330. package/dist/style-sets/stellaStyle.js +36 -23
  331. package/dist/types/colors.d.ts +2 -2
  332. package/dist/types/content.d.ts +2 -2
  333. package/dist/types/documentEnumValues.d.ts +53 -26
  334. package/dist/types/documentEnumValues.js +72 -174
  335. package/dist/types/formatting.d.ts +2 -2
  336. package/dist/types/index.d.ts +9 -2
  337. package/dist/utils/borderCss.d.ts +246 -0
  338. package/dist/utils/borderCss.js +325 -0
  339. package/dist/utils/colorResolver.d.ts +4 -3
  340. package/dist/utils/colorResolver.js +45 -76
  341. package/dist/utils/createDocument.js +24 -6
  342. package/dist/utils/findReplace.js +52 -10
  343. package/dist/utils/formatToStyle.d.ts +84 -2
  344. package/dist/utils/formatToStyle.js +133 -52
  345. package/dist/utils/headingCollector.js +3 -2
  346. package/dist/utils/mergeDocumentContent.js +5 -3
  347. package/dist/utils/paragraphFormattingMerge.js +27 -6
  348. package/dist/utils/replaceText.js +1 -1
  349. package/dist/utils/tableOperations.d.ts +5 -3
  350. package/dist/utils/tableOperations.js +14 -1
  351. package/dist/utils/tablePlacement.d.ts +7 -0
  352. package/dist/utils/tablePlacement.js +14 -0
  353. package/dist/utils/textDirectionFlow.d.ts +15 -0
  354. package/dist/utils/textDirectionFlow.js +38 -0
  355. package/dist/utils/textFormattingMerge.js +16 -4
  356. package/package.json +10 -10
  357. package/dist/ai-edits/__fixtures__/paragraphs.d.ts +0 -17
  358. package/dist/ai-edits/__fixtures__/paragraphs.js +0 -33
  359. package/dist/compare/__fixtures__/body-sequence.d.ts +0 -119
  360. package/dist/compare/__fixtures__/body-sequence.js +0 -225
  361. package/dist/compare/__fixtures__/nested-table.d.ts +0 -16
  362. package/dist/compare/__fixtures__/nested-table.js +0 -50
  363. package/dist/compare/__fixtures__/numbered-list.d.ts +0 -34
  364. package/dist/compare/__fixtures__/numbered-list.js +0 -85
  365. package/dist/docx/bookmarkPlacement.d.ts +0 -9
  366. package/dist/docx/bookmarkPlacement.js +0 -52
  367. package/dist/fonts/embeddedFontTable.d.ts +0 -45
  368. package/dist/fonts/embeddedFontTable.js +0 -80
  369. package/dist/prosemirror/extensions/marks/PageBreakRunOwnerExtension.d.ts +0 -13
  370. package/dist/prosemirror/extensions/marks/PageBreakRunOwnerExtension.js +0 -39
@@ -1,3 +1,4 @@
1
+ import { alignParagraphOrdinals } from "../docx/paraIdAttribute.js";
1
2
  import { alignTableColumns } from "./column-alignment.js";
2
3
  import { panic } from "better-result";
3
4
  //#region src/compare/content-alignment.ts
@@ -273,6 +274,44 @@ const pairsInAnchorGaps = ({ baseLength, revisedLength, anchors, pairGap }) => {
273
274
  }
274
275
  return pairs;
275
276
  };
277
+ /**
278
+ * Blocks the anchor passes left unpaired whose exact text stands, also
279
+ * unpaired, on the other side.
280
+ *
281
+ * Anchoring is monotone, so content that moved past other content leaves one
282
+ * of its two correspondences unanchored by construction: two paragraphs that
283
+ * swap places produce two exact candidates that cross, and only one survives
284
+ * the increasing subsequence. What is left over is both ends of that crossing.
285
+ * It is not a paragraph rewritten into another, so the positional fallback
286
+ * must not fuse them: a relocation would come back as a replacement neither
287
+ * document contains, and the move pass would never see the removal and the
288
+ * arrival it is there to pair.
289
+ */
290
+ const crossedExactTextBlocks = ({ base, revised, anchors, canPair }) => {
291
+ const uniqueUnanchoredByText = (blocks, anchored) => {
292
+ const blocksByText = /* @__PURE__ */ new Map();
293
+ for (const block of blocks) {
294
+ if (anchored.has(block.index) || !NON_WHITESPACE.test(block.block.text)) continue;
295
+ const { text } = block.block;
296
+ blocksByText.set(text, blocksByText.has(text) ? null : block);
297
+ }
298
+ return blocksByText;
299
+ };
300
+ const baseByText = uniqueUnanchoredByText(base, new Set(anchors.map(({ baseIndex }) => baseIndex)));
301
+ const revisedByText = uniqueUnanchoredByText(revised, new Set(anchors.map(({ revisedIndex }) => revisedIndex)));
302
+ const crossedBase = /* @__PURE__ */ new Set();
303
+ const crossedRevised = /* @__PURE__ */ new Set();
304
+ for (const [text, baseBlock] of baseByText) {
305
+ const revisedBlock = revisedByText.get(text);
306
+ if (!baseBlock || !revisedBlock || !canPair(baseBlock, revisedBlock)) continue;
307
+ crossedBase.add(baseBlock.index);
308
+ crossedRevised.add(revisedBlock.index);
309
+ }
310
+ return {
311
+ base: crossedBase,
312
+ revised: crossedRevised
313
+ };
314
+ };
276
315
  const alignFolioContentBlocksInScope = (baseBlocks, revisedBlocks, options) => {
277
316
  const stableIdMismatch = options.stableIdMismatch ?? "separate";
278
317
  const idStability = options.idStability ?? folioContentIdStability;
@@ -322,13 +361,19 @@ const alignFolioContentBlocksInScope = (baseBlocks, revisedBlocks, options) => {
322
361
  })
323
362
  });
324
363
  const anchors = [...exactAndStableAnchors, ...continuityAnchors].toSorted((left, right) => left.baseIndex - right.baseIndex || left.revisedIndex - right.revisedIndex);
364
+ const crossed = crossedExactTextBlocks({
365
+ base: prepared.base,
366
+ revised: prepared.revised,
367
+ anchors,
368
+ canPair
369
+ });
325
370
  const events = [];
326
371
  const emitPositionalGap = (baseFrom, baseTo, revisedFrom, revisedTo) => {
327
372
  const pairedCount = Math.min(baseTo - baseFrom, revisedTo - revisedFrom);
328
373
  for (let offset = 0; offset < pairedCount; offset++) {
329
374
  const baseBlock = prepared.base[baseFrom + offset];
330
375
  const revisedBlock = prepared.revised[revisedFrom + offset];
331
- if (baseBlock && revisedBlock) if (!canPair(baseBlock, revisedBlock)) {
376
+ if (baseBlock && revisedBlock) if (baseBlock.block.text !== revisedBlock.block.text && crossed.base.has(baseBlock.index) && crossed.revised.has(revisedBlock.index) || !canPair(baseBlock, revisedBlock)) {
332
377
  events.push({
333
378
  type: "baseOnly",
334
379
  block: baseBlock.block
@@ -437,6 +482,37 @@ const groupFolioContentTableRows = (blocks) => {
437
482
  }
438
483
  return [...rows.values()];
439
484
  };
485
+ /**
486
+ * Which uninterrupted run of its own cell each block belongs to.
487
+ *
488
+ * A cell holds paragraphs and nested tables, and the nested table splits the
489
+ * cell's paragraphs into runs: the ones before it and the ones after it are
490
+ * separate sequences, because nothing moves a block from one side of a table
491
+ * to the other. Aligned as one sequence they pair across it, and the plan that
492
+ * follows can neither move the base paragraph past the nested table nor delete
493
+ * the one it left behind when that paragraph ends the cell. So the runs are
494
+ * aligned separately, the way rows and cells already are.
495
+ *
496
+ * Document order is the whole input: a cell's blocks are contiguous until a
497
+ * block of another cell interrupts them, and inside one table segment the only
498
+ * cell that can interrupt another is one of a table nested in it.
499
+ */
500
+ const cellRunOrdinals = (blocks) => {
501
+ const ordinals = /* @__PURE__ */ new Map();
502
+ const runByCell = /* @__PURE__ */ new Map();
503
+ let previousKey = null;
504
+ for (const block of blocks) {
505
+ const { table } = block;
506
+ if (!table) continue;
507
+ const key = `${String(table.tableIndex)}:${String(table.rowIndex)}:${String(table.cellIndex)}`;
508
+ const seen = runByCell.get(key) ?? -1;
509
+ const run = key === previousKey ? seen : seen + 1;
510
+ runByCell.set(key, run);
511
+ ordinals.set(block, run);
512
+ previousKey = key;
513
+ }
514
+ return ordinals;
515
+ };
440
516
  const groupTables = (blocks) => {
441
517
  const tables = /* @__PURE__ */ new Map();
442
518
  for (const block of blocks) {
@@ -644,15 +720,64 @@ const stableContentSequencePairs = (base, revised) => {
644
720
  }
645
721
  return pairs;
646
722
  };
647
- const contentContainerIdentityTransition = (base, revised) => {
648
- if (base === null || revised === null || base.status !== "available" || revised.status !== "available" || base.blockIds.length === 0 || base.blockIds.length !== revised.blockIds.length) return false;
649
- let hasStabilityTransition = false;
650
- for (let index = 0; index < base.blockIds.length; index++) {
651
- if (base.blockIds[index] !== revised.blockIds[index]) return false;
652
- hasStabilityTransition ||= base.idStabilities[index] !== revised.idStabilities[index];
653
- }
654
- return hasStabilityTransition;
723
+ /**
724
+ * A container's blocks as the paragraph identities the save reasons about: a
725
+ * stable id is one the package wrote, a positional id one folio minted for a
726
+ * paragraph that arrived without one.
727
+ */
728
+ const containerParagraphIdentities = (profile) => profile.blockIds.map((paraId, ordinal) => profile.idStabilities[ordinal] === "stable" ? {
729
+ type: "authored",
730
+ paraId,
731
+ ordinal
732
+ } : {
733
+ type: "minted",
734
+ paraId,
735
+ ordinal
736
+ });
737
+ /**
738
+ * Whether two containers are the same container, read from the paragraph ids
739
+ * their blocks carry.
740
+ *
741
+ * This used to ask for a positional-to-stable *transition* with identical ids
742
+ * at every index, which is the shape a save produced when it stamped folio's
743
+ * minted ids into the package it wrote. That made the comparison depend on a
744
+ * side effect of the save rather than on the documents in front of it: once a
745
+ * save stopped persisting a minted id, both sides read positional, the
746
+ * transition never fired, and an edited row was reported deleted and inserted
747
+ * instead of edited.
748
+ *
749
+ * The question is the one {@link alignParagraphOrdinals} answers, and it is
750
+ * asked through the owner the save asks it through, so the two cannot come to
751
+ * disagree about which paragraph is which. A comparison sees two different
752
+ * documents, so absence of contradiction is not enough on its own: most of the
753
+ * container has to actively confirm the ordinals, or every container of equal
754
+ * size would pair with every other on the strength of saying nothing. A
755
+ * positional id is derived from the paragraph's own text and position, so an
756
+ * unedited block keeps it across the edit and supplies that confirmation, while
757
+ * an edited block's id changes with its text. A majority is therefore "the
758
+ * blocks this edit did not touch", and it is what separates a row with an edit
759
+ * in it from a row replaced by a different row, which shares no id at all.
760
+ *
761
+ * This signal only has to carry the containers similarity cannot reach: a pair
762
+ * it declines is still weighed on content, so a two-block container with one
763
+ * block edited pairs on the half it kept rather than on a bare majority.
764
+ */
765
+ const contentContainersShareIdentity = (base, revised) => {
766
+ if (base === null || revised === null || base.status !== "available" || revised.status !== "available" || base.blockIds.length === 0) return false;
767
+ const alignment = alignParagraphOrdinals(containerParagraphIdentities(base), containerParagraphIdentities(revised));
768
+ return alignment.consistent && alignment.sharedOrdinals * 2 > base.blockIds.length;
655
769
  };
770
+ /**
771
+ * Whether two containers carry the same block ids in the same order, over
772
+ * their whole length.
773
+ *
774
+ * Stricter than {@link contentContainersShareIdentity}, which answers which
775
+ * container this is while blocks come and go. This answers whether there is
776
+ * anything left to decide: nothing moved within either container, so paired
777
+ * with equal content they are one container seen twice. An identity a cap
778
+ * withheld is unknown, never equal.
779
+ */
780
+ const contentContainerIdsAreEqual = (base, revised) => base !== null && revised !== null && base.status === "available" && revised.status === "available" && base.blockIds.length > 0 && base.blockIds.length === revised.blockIds.length && base.blockIds.every((id, index) => id === revised.blockIds[index]);
656
781
  const uniqueExactContentSequencePairs = ({ baseKeys, revisedKeys }) => {
657
782
  const uniqueIndexes = (keys) => {
658
783
  const indexes = /* @__PURE__ */ new Map();
@@ -723,7 +848,7 @@ const persistedContentSequencePairs = ({ base, revised, anchors, canPair }) => {
723
848
  baseIndex,
724
849
  revisedIndex
725
850
  };
726
- if (revisedItem && canPair(baseItem, revisedItem) && contentContainerIdentityTransition(baseItem.profile.containerIdentity, revisedItem.profile.containerIdentity) && pairIsCompatibleWithAnchors(pair, anchors)) candidates.push(pair);
851
+ if (revisedItem && canPair(baseItem, revisedItem) && contentContainersShareIdentity(baseItem.profile.containerIdentity, revisedItem.profile.containerIdentity) && pairIsCompatibleWithAnchors(pair, anchors)) candidates.push(pair);
727
852
  }
728
853
  return new Set(monotoneContentSequencePairs(candidates).map(({ baseIndex, revisedIndex }) => baseIndex * revised.length + revisedIndex));
729
854
  };
@@ -742,7 +867,7 @@ const alignProfiledContentSequence = ({ base, revised, workSession, canPair = ()
742
867
  const revisedProfile = revised[index]?.profile;
743
868
  if (!baseProfile || !revisedProfile) continue;
744
869
  const hasContainerIdentity = baseProfile.containerIdentity !== null || revisedProfile.containerIdentity !== null;
745
- let hasProvenanceTransition = contentContainerIdentityTransition(baseProfile.containerIdentity, revisedProfile.containerIdentity);
870
+ let hasProvenanceTransition = contentContainersShareIdentity(baseProfile.containerIdentity, revisedProfile.containerIdentity);
746
871
  if (!hasContainerIdentity) {
747
872
  const revisedIds = new Set(revisedProfile.blockIds);
748
873
  const baseStableIds = new Set(baseProfile.stableIds);
@@ -861,6 +986,7 @@ const alignProfiledContentSequence = ({ base, revised, workSession, canPair = ()
861
986
  let revisedIndex = 0;
862
987
  let pairCount = 0;
863
988
  let solePairIsShifted = false;
989
+ let solePairIsIdentity = false;
864
990
  let hasBaseOnly = false;
865
991
  let hasRevisedOnly = false;
866
992
  while (baseIndex < base.length && revisedIndex < revised.length) {
@@ -875,6 +1001,7 @@ const alignProfiledContentSequence = ({ base, revised, workSession, canPair = ()
875
1001
  });
876
1002
  pairCount += 1;
877
1003
  solePairIsShifted = baseIndex !== revisedIndex;
1004
+ solePairIsIdentity = baseExactSignatureKeys[baseIndex] === revisedExactSignatureKeys[revisedIndex] && contentContainerIdsAreEqual(base[baseIndex]?.profile.containerIdentity ?? null, revised[revisedIndex]?.profile.containerIdentity ?? null);
878
1005
  baseIndex += 1;
879
1006
  revisedIndex += 1;
880
1007
  } else if (direction === ALIGNMENT_DIRECTION.revisedOnly && revisedItem !== void 0) {
@@ -907,7 +1034,7 @@ const alignProfiledContentSequence = ({ base, revised, workSession, canPair = ()
907
1034
  });
908
1035
  hasRevisedOnly = true;
909
1036
  }
910
- if ((soleShiftedPairResiduePolicy === "conservative" || base.length === revised.length) && pairCount === 1 && solePairIsShifted && hasBaseOnly && hasRevisedOnly) return aligned.flatMap((entry) => entry.type === "pair" ? [{
1037
+ if (!solePairIsIdentity && (soleShiftedPairResiduePolicy === "conservative" || base.length === revised.length) && pairCount === 1 && solePairIsShifted && hasBaseOnly && hasRevisedOnly) return aligned.flatMap((entry) => entry.type === "pair" ? [{
911
1038
  type: "baseOnly",
912
1039
  item: entry.base
913
1040
  }, {
@@ -917,7 +1044,7 @@ const alignProfiledContentSequence = ({ base, revised, workSession, canPair = ()
917
1044
  return aligned;
918
1045
  };
919
1046
  const rowLocation = (row) => row.at(0)?.table ?? null;
920
- const alignRowCells = ({ baseRow, revisedRow, workSession, moveScopeContext, stableIdMismatch, idStability, baseColumnKeys, revisedColumnKeys }) => {
1047
+ const alignRowCells = ({ baseRow, revisedRow, workSession, moveScopeContext, stableIdMismatch, idStability, baseColumnKeys, revisedColumnKeys, cellRuns }) => {
921
1048
  const byCell = (row, columnKeys) => {
922
1049
  const cells = /* @__PURE__ */ new Map();
923
1050
  for (const block of row) {
@@ -928,47 +1055,62 @@ const alignRowCells = ({ baseRow, revisedRow, workSession, moveScopeContext, sta
928
1055
  if (alignedColumn === void 0) return panic("A paired table cell has no aligned grid column", { gridColumnIndex: table.gridColumnIndex });
929
1056
  cellIndex = alignedColumn;
930
1057
  }
931
- const blocks = cells.get(cellIndex);
1058
+ const runs = cells.get(cellIndex) ?? /* @__PURE__ */ new Map();
1059
+ cells.set(cellIndex, runs);
1060
+ const run = cellRuns.get(block) ?? 0;
1061
+ const blocks = runs.get(run);
932
1062
  if (blocks) blocks.push(block);
933
- else cells.set(cellIndex, [block]);
1063
+ else runs.set(run, [block]);
934
1064
  }
935
1065
  return cells;
936
1066
  };
1067
+ const ascending = (left, right) => left - right;
937
1068
  const baseCells = byCell(baseRow, baseColumnKeys);
938
1069
  const revisedCells = byCell(revisedRow, revisedColumnKeys);
939
- const cellIndexes = [.../* @__PURE__ */ new Set([...baseCells.keys(), ...revisedCells.keys()])].toSorted((left, right) => left - right);
1070
+ const cellIndexes = [.../* @__PURE__ */ new Set([...baseCells.keys(), ...revisedCells.keys()])].toSorted(ascending);
940
1071
  const steps = [];
941
1072
  for (const cellIndex of cellIndexes) {
942
- const baseBlocks = baseCells.get(cellIndex) ?? [];
943
- const revisedBlocks = revisedCells.get(cellIndex) ?? [];
944
- const aligned = alignFolioContentBlocksInScope(baseBlocks, revisedBlocks, {
1073
+ const baseRuns = baseCells.get(cellIndex) ?? /* @__PURE__ */ new Map();
1074
+ const revisedRuns = revisedCells.get(cellIndex) ?? /* @__PURE__ */ new Map();
1075
+ const runOrdinals = [.../* @__PURE__ */ new Set([...baseRuns.keys(), ...revisedRuns.keys()])].toSorted(ascending);
1076
+ for (const run of runOrdinals) steps.push(...alignCellRun({
1077
+ baseBlocks: baseRuns.get(run) ?? [],
1078
+ revisedBlocks: revisedRuns.get(run) ?? [],
945
1079
  workSession,
946
- idStability,
1080
+ moveScopeContext,
947
1081
  stableIdMismatch,
948
- structuralScope: "pairedTableCell"
949
- }).flatMap((event) => {
950
- if (event.type === "pair" && !contentBlocksShareContainerPath(event.baseBlock, event.revisedBlock)) return [{
951
- type: "baseOnly",
952
- block: event.baseBlock
953
- }, {
954
- type: "revisedOnly",
955
- block: event.revisedBlock
956
- }];
957
- return [event];
958
- });
959
- const bucketByContainerPath = /* @__PURE__ */ new Map();
960
- const bucketForBlock = (block) => {
961
- const path = containerPathKeyOf(block);
962
- const existing = bucketByContainerPath.get(path);
963
- if (existing !== void 0) return existing;
964
- const bucket = moveScopeContext.nextTableCellBucket++;
965
- bucketByContainerPath.set(path, bucket);
966
- return bucket;
967
- };
968
- steps.push(...scopedAlignmentSteps(aligned, moveScopeContext, bucketForBlock));
1082
+ idStability
1083
+ }));
969
1084
  }
970
1085
  return steps;
971
1086
  };
1087
+ const alignCellRun = ({ baseBlocks, revisedBlocks, workSession, moveScopeContext, stableIdMismatch, idStability }) => {
1088
+ const aligned = alignFolioContentBlocksInScope(baseBlocks, revisedBlocks, {
1089
+ workSession,
1090
+ idStability,
1091
+ stableIdMismatch,
1092
+ structuralScope: "pairedTableCell"
1093
+ }).flatMap((event) => {
1094
+ if (event.type === "pair" && !contentBlocksShareContainerPath(event.baseBlock, event.revisedBlock)) return [{
1095
+ type: "baseOnly",
1096
+ block: event.baseBlock
1097
+ }, {
1098
+ type: "revisedOnly",
1099
+ block: event.revisedBlock
1100
+ }];
1101
+ return [event];
1102
+ });
1103
+ const bucketByContainerPath = /* @__PURE__ */ new Map();
1104
+ const bucketForBlock = (block) => {
1105
+ const path = containerPathKeyOf(block);
1106
+ const existing = bucketByContainerPath.get(path);
1107
+ if (existing !== void 0) return existing;
1108
+ const bucket = moveScopeContext.nextTableCellBucket++;
1109
+ bucketByContainerPath.set(path, bucket);
1110
+ return bucket;
1111
+ };
1112
+ return scopedAlignmentSteps(aligned, moveScopeContext, bucketForBlock);
1113
+ };
972
1114
  const pairTableRows = ({ baseRows, revisedRows, workSession, idStability }) => {
973
1115
  const profile = (row) => ({
974
1116
  item: row,
@@ -1001,7 +1143,7 @@ const pairTableRows = ({ baseRows, revisedRows, workSession, idStability }) => {
1001
1143
  }
1002
1144
  });
1003
1145
  };
1004
- const alignTableRows = ({ rows, workSession, moveScopeContext, stableIdMismatch, idStability, baseColumnKeys, revisedColumnKeys }) => {
1146
+ const alignTableRows = ({ rows, workSession, moveScopeContext, stableIdMismatch, idStability, baseColumnKeys, revisedColumnKeys, cellRuns }) => {
1005
1147
  const steps = [];
1006
1148
  const pushRow = (row, side) => {
1007
1149
  const location = rowLocation(row);
@@ -1027,7 +1169,8 @@ const alignTableRows = ({ rows, workSession, moveScopeContext, stableIdMismatch,
1027
1169
  stableIdMismatch,
1028
1170
  idStability,
1029
1171
  baseColumnKeys,
1030
- revisedColumnKeys
1172
+ revisedColumnKeys,
1173
+ cellRuns
1031
1174
  }));
1032
1175
  break;
1033
1176
  default: panic("Unhandled table row alignment", { alignment });
@@ -1052,7 +1195,7 @@ const rowCellSpansEqual = (baseRow, revisedRow) => {
1052
1195
  });
1053
1196
  };
1054
1197
  const rowHasVerticalSpan = (row) => row.some(({ table }) => table !== void 0 && table.rowSpan > 1);
1055
- const buildTablePlan = ({ baseBlocks, revisedBlocks, workSession, moveScopeContext, stableIdMismatch, idStability }) => {
1198
+ const buildTablePlan = ({ baseBlocks, revisedBlocks, workSession, moveScopeContext, stableIdMismatch, idStability, cellRuns }) => {
1056
1199
  const resolveIdStability = idStability ?? folioContentIdStability;
1057
1200
  const columns = alignTableColumns(baseBlocks, revisedBlocks);
1058
1201
  const rows = pairTableRows({
@@ -1073,13 +1216,15 @@ const buildTablePlan = ({ baseBlocks, revisedBlocks, workSession, moveScopeConte
1073
1216
  stableIdMismatch,
1074
1217
  idStability: resolveIdStability,
1075
1218
  baseColumnKeys: columns?.baseColumnKeys,
1076
- revisedColumnKeys: columns?.revisedColumnKeys
1219
+ revisedColumnKeys: columns?.revisedColumnKeys,
1220
+ cellRuns
1077
1221
  })]
1078
1222
  };
1079
1223
  };
1080
1224
  const buildTableSegmentPlan = ({ baseBlocks, revisedBlocks, workSession, moveScopeContext, stableIdMismatch, idStability }) => {
1081
1225
  const baseTables = groupTables(baseBlocks);
1082
1226
  const revisedTables = groupTables(revisedBlocks);
1227
+ const cellRuns = new Map([...cellRunOrdinals(baseBlocks), ...cellRunOrdinals(revisedBlocks)]);
1083
1228
  const resolveIdStability = idStability ?? folioContentIdStability;
1084
1229
  const profile = (blocks) => ({
1085
1230
  item: blocks,
@@ -1101,7 +1246,8 @@ const buildTableSegmentPlan = ({ baseBlocks, revisedBlocks, workSession, moveSco
1101
1246
  workSession,
1102
1247
  moveScopeContext,
1103
1248
  stableIdMismatch,
1104
- idStability: resolveIdStability
1249
+ idStability: resolveIdStability,
1250
+ cellRuns
1105
1251
  });
1106
1252
  steps.push(...table.steps);
1107
1253
  representable &&= table.representable;
@@ -1,3 +1,4 @@
1
+ import { document_d_exports } from "../types/document.js";
1
2
  //#region src/compare/content-types.d.ts
2
3
  /** How callers expect a block identifier to behave across document revisions. */
3
4
  type FolioContentIdStability = "stable" | "positional";
@@ -74,8 +75,13 @@ type FolioContentTableLocation = {
74
75
  rowSpan: number;
75
76
  paragraphIndex: number;
76
77
  };
77
- /** Direct paragraph alignment understood by the neutral comparison model. */
78
- type FolioContentParagraphAlignment = "left" | "center" | "right" | "both" | "distribute" | "mediumKashida" | "highKashida" | "lowKashida" | "thaiDistribute";
78
+ /**
79
+ * Direct paragraph alignment understood by the neutral comparison model.
80
+ *
81
+ * The model's own `ST_Jc` union: a copy spelled here would refuse an alignment
82
+ * a parsed document carries.
83
+ */
84
+ type FolioContentParagraphAlignment = document_d_exports.ParagraphAlignment;
79
85
  /** Line-height interpretation understood by the neutral comparison model. */
80
86
  type FolioContentLineSpacingRule = "auto" | "exact" | "atLeast";
81
87
  /** The complete modeled attribute set of direct paragraph indentation. */
@@ -1,5 +1,6 @@
1
1
  import { WORD_DIFF_GRANULARITIES, createWordDiffSession } from "../ai-edits/word-diff.js";
2
2
  import { paragraphIndentationEqual } from "../prosemirror/paragraphIndentation.js";
3
+ import { PARAGRAPH_ALIGNMENT_VALUES } from "../types/documentEnumValues.js";
3
4
  import { alignFolioContentStructure, contentBlocksShareContainer, createFolioContentAlignmentWorkSession } from "./content-alignment.js";
4
5
  import { inlineFormattingSegments } from "./formatting.js";
5
6
  import { Result, TaggedError, panic } from "better-result";
@@ -67,17 +68,7 @@ const isFiniteInteger = (value) => typeof value === "number" && Number.isSafeInt
67
68
  const isFiniteNumber = (value) => typeof value === "number" && Number.isFinite(value);
68
69
  const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
69
70
  const hasRecordShape = (value) => isRecord(value);
70
- const PARAGRAPH_ALIGNMENTS = /* @__PURE__ */ new Set([
71
- "left",
72
- "center",
73
- "right",
74
- "both",
75
- "distribute",
76
- "mediumKashida",
77
- "highKashida",
78
- "lowKashida",
79
- "thaiDistribute"
80
- ]);
71
+ const PARAGRAPH_ALIGNMENTS = new Set(PARAGRAPH_ALIGNMENT_VALUES);
81
72
  const validateRunFormatting = (block, side, blockIndex) => {
82
73
  for (const [runIndex, run] of (block.previewRuns ?? []).entries()) {
83
74
  if (run.directFormatting !== void 0 && !isRecord(run.directFormatting)) return invalidInput(side, `blocks[${String(blockIndex)}].previewRuns[${String(runIndex)}].directFormatting`, "Direct inline formatting must be an object.", blockIndex);
@@ -178,16 +178,19 @@ const terminalCarrierIsStranded = (steps, baseBlocks) => {
178
178
  * back over the next paragraph. The applier rotates instead — the paragraph
179
179
  * the run was appended after takes the inserted mark, and the last one takes
180
180
  * the free mark — and that rotation reaches only across paragraphs. A table
181
- * among them stops it, and the words the target ends with have to be written
182
- * into the base's own last paragraph instead.
181
+ * among them stops it, and so does removing the paragraph the rotation turns
182
+ * on: a run appended after a paragraph that is itself deleted has no mark to
183
+ * take. Either way the words the target ends with have to be written into the
184
+ * base's own last paragraph instead.
183
185
  */
184
186
  const addedTerminalCarrierIsStranded = (steps, baseBlocks, targetBlocks) => {
185
187
  const baseLast = baseBlocks.at(-1);
186
188
  const targetLast = targetBlocks.at(-1);
187
189
  if (baseLast === void 0 || targetLast === void 0) return false;
188
190
  if (!steps.some((step) => step.type === "targetOnly" && step.block.id === targetLast.id)) return false;
189
- const baseLastStep = steps.findIndex((step) => step.type === "pair" && step.baseBlock.id === baseLast.id || step.type === "baseOnly" && step.block.id === baseLast.id);
190
- return baseLastStep === -1 || steps.slice(baseLastStep + 1).some((step) => step.type !== "targetOnly");
191
+ const baseLastStepIndex = steps.findIndex((step) => step.type === "pair" && step.baseBlock.id === baseLast.id || step.type === "baseOnly" && step.block.id === baseLast.id);
192
+ const baseLastStep = steps[baseLastStepIndex];
193
+ return baseLastStep === void 0 || baseLastStep.type === "baseOnly" || steps.slice(baseLastStepIndex + 1).some((step) => step.type !== "targetOnly");
191
194
  };
192
195
  const buildSteps = ({ baseSnapshot, targetSnapshot, wholeTableReplacement, workSession }) => {
193
196
  const baseBlocks = baseSnapshot.blocks;
@@ -220,8 +220,7 @@ const stageSectionBoundaryProperties = ({ state, target, originalRevisionIdSeed,
220
220
  _sectionProperties: {
221
221
  ...update.target,
222
222
  ...propertyChanges === void 0 ? {} : { propertyChanges }
223
- },
224
- sectionBreakType: update.target.sectionStart ?? null
223
+ }
225
224
  });
226
225
  }
227
226
  return {
@@ -5,7 +5,13 @@ type CheckboxDisplayContent = Extract<document_d_exports.RunContent, {
5
5
  } | {
6
6
  type: "text";
7
7
  }>;
8
- /** Resolve the authored checkbox state into the run payload Word expects. */
9
- declare const checkboxDisplayContent: (rawPropertiesXml: string | undefined, checked: boolean) => CheckboxDisplayContent;
8
+ /**
9
+ * Resolve the authored checkbox state into the run payload Word expects.
10
+ *
11
+ * @param checkboxXml the preserved `w14:checkbox` element, from
12
+ * `SdtProperties.preserved`. A control that carries none — one built in
13
+ * code, or one whose author wrote no glyphs — gets Word's own defaults.
14
+ */
15
+ declare const checkboxDisplayContent: (checkboxXml: string | undefined, checked: boolean) => CheckboxDisplayContent;
10
16
  //#endregion
11
17
  export { checkboxDisplayContent };
@@ -11,16 +11,22 @@ const defaultDisplay = (checked) => ({
11
11
  char: checked ? DEFAULT_CHECKED_CHARACTER : DEFAULT_UNCHECKED_CHARACTER,
12
12
  font: DEFAULT_CHECKBOX_FONT
13
13
  });
14
- /** Resolve the authored checkbox state into the run payload Word expects. */
15
- const checkboxDisplayContent = (rawPropertiesXml, checked) => {
16
- if (!rawPropertiesXml || rawPropertiesXml.length > MAX_CHECKBOX_PROPERTIES_CHARACTERS) return defaultDisplay(checked);
14
+ /**
15
+ * Resolve the authored checkbox state into the run payload Word expects.
16
+ *
17
+ * @param checkboxXml the preserved `w14:checkbox` element, from
18
+ * `SdtProperties.preserved`. A control that carries none — one built in
19
+ * code, or one whose author wrote no glyphs — gets Word's own defaults.
20
+ */
21
+ const checkboxDisplayContent = (checkboxXml, checked) => {
22
+ if (!checkboxXml || checkboxXml.length > MAX_CHECKBOX_PROPERTIES_CHARACTERS) return defaultDisplay(checked);
17
23
  let root;
18
24
  try {
19
- root = parseXml(rawPropertiesXml, OOXML_NAMESPACE_SCOPE);
25
+ root = parseXml(checkboxXml, OOXML_NAMESPACE_SCOPE);
20
26
  } catch {
21
27
  return defaultDisplay(checked);
22
28
  }
23
- const state = findChildByNamespaceUri(findChildByNamespaceUri(findChildByNamespaceUri(root, WORDPROCESSINGML_NAMESPACE_URIS, "sdtPr"), CHECKBOX_NAMESPACE_URIS, "checkbox"), CHECKBOX_NAMESPACE_URIS, checked ? "checkedState" : "uncheckedState");
29
+ const state = findChildByNamespaceUri(findChildByNamespaceUri(root, CHECKBOX_NAMESPACE_URIS, "checkbox"), CHECKBOX_NAMESPACE_URIS, checked ? "checkedState" : "uncheckedState");
24
30
  const rawCharacter = getAttributeByNamespaceUri(state, CHECKBOX_NAMESPACE_URIS, "val");
25
31
  if (!rawCharacter || !HEX_CODE_POINT.test(rawCharacter)) return defaultDisplay(checked);
26
32
  const codePoint = Number.parseInt(rawCharacter, 16);