docxmlater 10.4.0 → 11.0.4

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 (699) hide show
  1. package/README.md +3 -3
  2. package/dist/constants/legacyCompatFlags.d.ts +1 -1
  3. package/dist/constants/legacyCompatFlags.d.ts.map +1 -1
  4. package/dist/constants/legacyCompatFlags.js.map +1 -1
  5. package/dist/core/Document.d.ts +75 -67
  6. package/dist/core/Document.d.ts.map +1 -1
  7. package/dist/core/Document.js +618 -414
  8. package/dist/core/Document.js.map +1 -1
  9. package/dist/core/DocumentContent.d.ts +11 -10
  10. package/dist/core/DocumentContent.d.ts.map +1 -1
  11. package/dist/core/DocumentContent.js +19 -19
  12. package/dist/core/DocumentContent.js.map +1 -1
  13. package/dist/core/DocumentEvents.d.ts +39 -0
  14. package/dist/core/DocumentEvents.d.ts.map +1 -0
  15. package/dist/core/DocumentEvents.js +51 -0
  16. package/dist/core/DocumentEvents.js.map +1 -0
  17. package/dist/core/DocumentGenerator.d.ts +11 -11
  18. package/dist/core/DocumentGenerator.d.ts.map +1 -1
  19. package/dist/core/DocumentGenerator.js +72 -52
  20. package/dist/core/DocumentGenerator.js.map +1 -1
  21. package/dist/core/DocumentParser.d.ts +15 -15
  22. package/dist/core/DocumentParser.d.ts.map +1 -1
  23. package/dist/core/DocumentParser.js +2100 -1076
  24. package/dist/core/DocumentParser.js.map +1 -1
  25. package/dist/core/DocumentValidator.d.ts +3 -3
  26. package/dist/core/DocumentValidator.d.ts.map +1 -1
  27. package/dist/core/DocumentValidator.js +31 -31
  28. package/dist/core/DocumentValidator.js.map +1 -1
  29. package/dist/core/ElementRegistry.d.ts +22 -0
  30. package/dist/core/ElementRegistry.d.ts.map +1 -0
  31. package/dist/core/ElementRegistry.js +27 -0
  32. package/dist/core/ElementRegistry.js.map +1 -0
  33. package/dist/core/Relationship.js +4 -4
  34. package/dist/core/Relationship.js.map +1 -1
  35. package/dist/core/RelationshipManager.d.ts +1 -1
  36. package/dist/core/RelationshipManager.d.ts.map +1 -1
  37. package/dist/core/RelationshipManager.js +32 -32
  38. package/dist/core/RelationshipManager.js.map +1 -1
  39. package/dist/elements/AlternateContent.d.ts +1 -1
  40. package/dist/elements/AlternateContent.d.ts.map +1 -1
  41. package/dist/elements/AlternateContent.js.map +1 -1
  42. package/dist/elements/Bookmark.d.ts +6 -1
  43. package/dist/elements/Bookmark.d.ts.map +1 -1
  44. package/dist/elements/Bookmark.js +19 -3
  45. package/dist/elements/Bookmark.js.map +1 -1
  46. package/dist/elements/BookmarkManager.d.ts +1 -1
  47. package/dist/elements/BookmarkManager.d.ts.map +1 -1
  48. package/dist/elements/BookmarkManager.js +7 -7
  49. package/dist/elements/BookmarkManager.js.map +1 -1
  50. package/dist/elements/Comment.d.ts +2 -2
  51. package/dist/elements/Comment.d.ts.map +1 -1
  52. package/dist/elements/Comment.js +4 -4
  53. package/dist/elements/Comment.js.map +1 -1
  54. package/dist/elements/CommentManager.d.ts +2 -2
  55. package/dist/elements/CommentManager.d.ts.map +1 -1
  56. package/dist/elements/CommentManager.js +9 -9
  57. package/dist/elements/CommentManager.js.map +1 -1
  58. package/dist/elements/CommonTypes.d.ts +9 -4
  59. package/dist/elements/CommonTypes.d.ts.map +1 -1
  60. package/dist/elements/CommonTypes.js +1 -0
  61. package/dist/elements/CommonTypes.js.map +1 -1
  62. package/dist/elements/CustomXml.d.ts +1 -1
  63. package/dist/elements/CustomXml.d.ts.map +1 -1
  64. package/dist/elements/CustomXml.js.map +1 -1
  65. package/dist/elements/Endnote.d.ts +2 -2
  66. package/dist/elements/Endnote.d.ts.map +1 -1
  67. package/dist/elements/Endnote.js +9 -9
  68. package/dist/elements/Endnote.js.map +1 -1
  69. package/dist/elements/EndnoteManager.d.ts +1 -1
  70. package/dist/elements/EndnoteManager.d.ts.map +1 -1
  71. package/dist/elements/EndnoteManager.js +11 -11
  72. package/dist/elements/EndnoteManager.js.map +1 -1
  73. package/dist/elements/Field.d.ts +9 -5
  74. package/dist/elements/Field.d.ts.map +1 -1
  75. package/dist/elements/Field.js +21 -9
  76. package/dist/elements/Field.js.map +1 -1
  77. package/dist/elements/FieldHelpers.d.ts +1 -1
  78. package/dist/elements/FieldHelpers.d.ts.map +1 -1
  79. package/dist/elements/FieldHelpers.js +10 -10
  80. package/dist/elements/FieldHelpers.js.map +1 -1
  81. package/dist/elements/Footer.d.ts +3 -3
  82. package/dist/elements/Footer.d.ts.map +1 -1
  83. package/dist/elements/Footer.js +5 -5
  84. package/dist/elements/Footer.js.map +1 -1
  85. package/dist/elements/Footnote.d.ts +2 -2
  86. package/dist/elements/Footnote.d.ts.map +1 -1
  87. package/dist/elements/Footnote.js +9 -9
  88. package/dist/elements/Footnote.js.map +1 -1
  89. package/dist/elements/FootnoteManager.d.ts +1 -1
  90. package/dist/elements/FootnoteManager.d.ts.map +1 -1
  91. package/dist/elements/FootnoteManager.js +11 -11
  92. package/dist/elements/FootnoteManager.js.map +1 -1
  93. package/dist/elements/Header.d.ts +3 -3
  94. package/dist/elements/Header.d.ts.map +1 -1
  95. package/dist/elements/Header.js +5 -5
  96. package/dist/elements/Header.js.map +1 -1
  97. package/dist/elements/HeaderFooterManager.d.ts +2 -2
  98. package/dist/elements/HeaderFooterManager.d.ts.map +1 -1
  99. package/dist/elements/HeaderFooterManager.js.map +1 -1
  100. package/dist/elements/Hyperlink.d.ts +5 -5
  101. package/dist/elements/Hyperlink.d.ts.map +1 -1
  102. package/dist/elements/Hyperlink.js +29 -29
  103. package/dist/elements/Hyperlink.js.map +1 -1
  104. package/dist/elements/Image.d.ts +1 -1
  105. package/dist/elements/Image.d.ts.map +1 -1
  106. package/dist/elements/Image.js +67 -67
  107. package/dist/elements/Image.js.map +1 -1
  108. package/dist/elements/ImageManager.d.ts +1 -1
  109. package/dist/elements/ImageManager.d.ts.map +1 -1
  110. package/dist/elements/ImageManager.js +4 -4
  111. package/dist/elements/ImageManager.js.map +1 -1
  112. package/dist/elements/ImageRun.d.ts +3 -3
  113. package/dist/elements/ImageRun.d.ts.map +1 -1
  114. package/dist/elements/ImageRun.js +2 -2
  115. package/dist/elements/ImageRun.js.map +1 -1
  116. package/dist/elements/MathElement.d.ts +1 -1
  117. package/dist/elements/MathElement.d.ts.map +1 -1
  118. package/dist/elements/MathElement.js.map +1 -1
  119. package/dist/elements/Paragraph.d.ts +34 -19
  120. package/dist/elements/Paragraph.d.ts.map +1 -1
  121. package/dist/elements/Paragraph.js +286 -231
  122. package/dist/elements/Paragraph.js.map +1 -1
  123. package/dist/elements/PreservedElement.d.ts +1 -1
  124. package/dist/elements/PreservedElement.d.ts.map +1 -1
  125. package/dist/elements/PreservedElement.js.map +1 -1
  126. package/dist/elements/PropertyChangeTypes.d.ts +2 -2
  127. package/dist/elements/PropertyChangeTypes.d.ts.map +1 -1
  128. package/dist/elements/PropertyChangeTypes.js.map +1 -1
  129. package/dist/elements/RangeMarker.d.ts +14 -1
  130. package/dist/elements/RangeMarker.d.ts.map +1 -1
  131. package/dist/elements/RangeMarker.js +46 -8
  132. package/dist/elements/RangeMarker.js.map +1 -1
  133. package/dist/elements/RegisteredBodyElement.d.ts +15 -0
  134. package/dist/elements/RegisteredBodyElement.d.ts.map +1 -0
  135. package/dist/elements/RegisteredBodyElement.js +44 -0
  136. package/dist/elements/RegisteredBodyElement.js.map +1 -0
  137. package/dist/elements/Revision.d.ts +8 -8
  138. package/dist/elements/Revision.d.ts.map +1 -1
  139. package/dist/elements/Revision.js +12 -12
  140. package/dist/elements/Revision.js.map +1 -1
  141. package/dist/elements/RevisionContent.d.ts +3 -3
  142. package/dist/elements/RevisionContent.d.ts.map +1 -1
  143. package/dist/elements/RevisionContent.js.map +1 -1
  144. package/dist/elements/RevisionManager.d.ts +2 -2
  145. package/dist/elements/RevisionManager.d.ts.map +1 -1
  146. package/dist/elements/RevisionManager.js +2 -2
  147. package/dist/elements/RevisionManager.js.map +1 -1
  148. package/dist/elements/Run.d.ts +16 -10
  149. package/dist/elements/Run.d.ts.map +1 -1
  150. package/dist/elements/Run.js +199 -173
  151. package/dist/elements/Run.js.map +1 -1
  152. package/dist/elements/Section.d.ts +4 -2
  153. package/dist/elements/Section.d.ts.map +1 -1
  154. package/dist/elements/Section.js +152 -145
  155. package/dist/elements/Section.js.map +1 -1
  156. package/dist/elements/Shape.d.ts +3 -3
  157. package/dist/elements/Shape.d.ts.map +1 -1
  158. package/dist/elements/Shape.js +12 -12
  159. package/dist/elements/Shape.js.map +1 -1
  160. package/dist/elements/StructuredDocumentTag.d.ts +3 -3
  161. package/dist/elements/StructuredDocumentTag.d.ts.map +1 -1
  162. package/dist/elements/StructuredDocumentTag.js +39 -39
  163. package/dist/elements/StructuredDocumentTag.js.map +1 -1
  164. package/dist/elements/Table.d.ts +16 -10
  165. package/dist/elements/Table.d.ts.map +1 -1
  166. package/dist/elements/Table.js +118 -89
  167. package/dist/elements/Table.js.map +1 -1
  168. package/dist/elements/TableCell.d.ts +11 -11
  169. package/dist/elements/TableCell.d.ts.map +1 -1
  170. package/dist/elements/TableCell.js +108 -78
  171. package/dist/elements/TableCell.js.map +1 -1
  172. package/dist/elements/TableGridChange.d.ts +1 -1
  173. package/dist/elements/TableGridChange.d.ts.map +1 -1
  174. package/dist/elements/TableGridChange.js +3 -3
  175. package/dist/elements/TableGridChange.js.map +1 -1
  176. package/dist/elements/TableOfContents.d.ts +1 -1
  177. package/dist/elements/TableOfContents.d.ts.map +1 -1
  178. package/dist/elements/TableOfContents.js +2 -2
  179. package/dist/elements/TableOfContents.js.map +1 -1
  180. package/dist/elements/TableOfContentsElement.d.ts +2 -2
  181. package/dist/elements/TableOfContentsElement.d.ts.map +1 -1
  182. package/dist/elements/TableOfContentsElement.js +5 -5
  183. package/dist/elements/TableOfContentsElement.js.map +1 -1
  184. package/dist/elements/TableRow.d.ts +18 -7
  185. package/dist/elements/TableRow.d.ts.map +1 -1
  186. package/dist/elements/TableRow.js +127 -74
  187. package/dist/elements/TableRow.js.map +1 -1
  188. package/dist/elements/TextBox.d.ts +4 -4
  189. package/dist/elements/TextBox.d.ts.map +1 -1
  190. package/dist/elements/TextBox.js +6 -6
  191. package/dist/elements/TextBox.js.map +1 -1
  192. package/dist/esm/constants/legacyCompatFlags.js +97 -0
  193. package/dist/esm/constants/legacyCompatFlags.js.map +1 -0
  194. package/dist/esm/constants/limits.js +36 -0
  195. package/dist/esm/constants/limits.js.map +1 -0
  196. package/dist/esm/core/Document.js +8498 -0
  197. package/dist/esm/core/Document.js.map +1 -0
  198. package/dist/esm/core/DocumentContent.js +190 -0
  199. package/dist/esm/core/DocumentContent.js.map +1 -0
  200. package/dist/esm/core/DocumentEvents.js +47 -0
  201. package/dist/esm/core/DocumentEvents.js.map +1 -0
  202. package/dist/esm/core/DocumentGenerator.js +764 -0
  203. package/dist/esm/core/DocumentGenerator.js.map +1 -0
  204. package/dist/esm/core/DocumentIdManager.js +67 -0
  205. package/dist/esm/core/DocumentIdManager.js.map +1 -0
  206. package/dist/esm/core/DocumentParser.js +8760 -0
  207. package/dist/esm/core/DocumentParser.js.map +1 -0
  208. package/dist/esm/core/DocumentValidator.js +222 -0
  209. package/dist/esm/core/DocumentValidator.js.map +1 -0
  210. package/dist/esm/core/ElementRegistry.js +24 -0
  211. package/dist/esm/core/ElementRegistry.js.map +1 -0
  212. package/dist/esm/core/Relationship.js +177 -0
  213. package/dist/esm/core/Relationship.js.map +1 -0
  214. package/dist/esm/core/RelationshipManager.js +202 -0
  215. package/dist/esm/core/RelationshipManager.js.map +1 -0
  216. package/dist/esm/elements/AlternateContent.js +19 -0
  217. package/dist/esm/elements/AlternateContent.js.map +1 -0
  218. package/dist/esm/elements/Bookmark.js +115 -0
  219. package/dist/esm/elements/Bookmark.js.map +1 -0
  220. package/dist/esm/elements/BookmarkManager.js +99 -0
  221. package/dist/esm/elements/BookmarkManager.js.map +1 -0
  222. package/dist/esm/elements/Comment.js +181 -0
  223. package/dist/esm/elements/Comment.js.map +1 -0
  224. package/dist/esm/elements/CommentManager.js +233 -0
  225. package/dist/esm/elements/CommentManager.js.map +1 -0
  226. package/dist/esm/elements/CommonTypes.js +106 -0
  227. package/dist/esm/elements/CommonTypes.js.map +1 -0
  228. package/dist/esm/elements/CustomXml.js +19 -0
  229. package/dist/esm/elements/CustomXml.js.map +1 -0
  230. package/dist/esm/elements/Endnote.js +107 -0
  231. package/dist/esm/elements/Endnote.js.map +1 -0
  232. package/dist/esm/elements/EndnoteManager.js +119 -0
  233. package/dist/esm/elements/EndnoteManager.js.map +1 -0
  234. package/dist/esm/elements/Field.js +856 -0
  235. package/dist/esm/elements/Field.js.map +1 -0
  236. package/dist/esm/elements/FieldHelpers.js +134 -0
  237. package/dist/esm/elements/FieldHelpers.js.map +1 -0
  238. package/dist/esm/elements/FontManager.js +158 -0
  239. package/dist/esm/elements/FontManager.js.map +1 -0
  240. package/dist/esm/elements/Footer.js +141 -0
  241. package/dist/esm/elements/Footer.js.map +1 -0
  242. package/dist/esm/elements/Footnote.js +107 -0
  243. package/dist/esm/elements/Footnote.js.map +1 -0
  244. package/dist/esm/elements/FootnoteManager.js +119 -0
  245. package/dist/esm/elements/FootnoteManager.js.map +1 -0
  246. package/dist/esm/elements/Header.js +141 -0
  247. package/dist/esm/elements/Header.js.map +1 -0
  248. package/dist/esm/elements/HeaderFooterManager.js +87 -0
  249. package/dist/esm/elements/HeaderFooterManager.js.map +1 -0
  250. package/dist/esm/elements/Hyperlink.js +586 -0
  251. package/dist/esm/elements/Hyperlink.js.map +1 -0
  252. package/dist/esm/elements/Image.js +1288 -0
  253. package/dist/esm/elements/Image.js.map +1 -0
  254. package/dist/esm/elements/ImageManager.js +223 -0
  255. package/dist/esm/elements/ImageManager.js.map +1 -0
  256. package/dist/esm/elements/ImageRun.js +29 -0
  257. package/dist/esm/elements/ImageRun.js.map +1 -0
  258. package/dist/esm/elements/MathElement.js +37 -0
  259. package/dist/esm/elements/MathElement.js.map +1 -0
  260. package/dist/esm/elements/Paragraph.js +2308 -0
  261. package/dist/esm/elements/Paragraph.js.map +1 -0
  262. package/dist/esm/elements/PreservedElement.js +29 -0
  263. package/dist/esm/elements/PreservedElement.js.map +1 -0
  264. package/dist/esm/elements/PropertyChangeTypes.js +53 -0
  265. package/dist/esm/elements/PropertyChangeTypes.js.map +1 -0
  266. package/dist/esm/elements/RangeMarker.js +219 -0
  267. package/dist/esm/elements/RangeMarker.js.map +1 -0
  268. package/dist/esm/elements/RegisteredBodyElement.js +40 -0
  269. package/dist/esm/elements/RegisteredBodyElement.js.map +1 -0
  270. package/dist/esm/elements/Revision.js +498 -0
  271. package/dist/esm/elements/Revision.js.map +1 -0
  272. package/dist/esm/elements/RevisionContent.js +18 -0
  273. package/dist/esm/elements/RevisionContent.js.map +1 -0
  274. package/dist/esm/elements/RevisionManager.js +486 -0
  275. package/dist/esm/elements/RevisionManager.js.map +1 -0
  276. package/dist/esm/elements/Run.js +1465 -0
  277. package/dist/esm/elements/Run.js.map +1 -0
  278. package/dist/esm/elements/Section.js +978 -0
  279. package/dist/esm/elements/Section.js.map +1 -0
  280. package/dist/esm/elements/Shape.js +493 -0
  281. package/dist/esm/elements/Shape.js.map +1 -0
  282. package/dist/esm/elements/StructuredDocumentTag.js +471 -0
  283. package/dist/esm/elements/StructuredDocumentTag.js.map +1 -0
  284. package/dist/esm/elements/Table.js +1456 -0
  285. package/dist/esm/elements/Table.js.map +1 -0
  286. package/dist/esm/elements/TableCell.js +835 -0
  287. package/dist/esm/elements/TableCell.js.map +1 -0
  288. package/dist/esm/elements/TableGridChange.js +52 -0
  289. package/dist/esm/elements/TableGridChange.js.map +1 -0
  290. package/dist/esm/elements/TableOfContents.js +389 -0
  291. package/dist/esm/elements/TableOfContents.js.map +1 -0
  292. package/dist/esm/elements/TableOfContentsElement.js +29 -0
  293. package/dist/esm/elements/TableOfContentsElement.js.map +1 -0
  294. package/dist/esm/elements/TableRow.js +555 -0
  295. package/dist/esm/elements/TableRow.js.map +1 -0
  296. package/dist/esm/elements/TextBox.js +459 -0
  297. package/dist/esm/elements/TextBox.js.map +1 -0
  298. package/dist/esm/formatting/AbstractNumbering.js +325 -0
  299. package/dist/esm/formatting/AbstractNumbering.js.map +1 -0
  300. package/dist/esm/formatting/NumberingInstance.js +150 -0
  301. package/dist/esm/formatting/NumberingInstance.js.map +1 -0
  302. package/dist/esm/formatting/NumberingLevel.js +608 -0
  303. package/dist/esm/formatting/NumberingLevel.js.map +1 -0
  304. package/dist/esm/formatting/NumberingManager.js +423 -0
  305. package/dist/esm/formatting/NumberingManager.js.map +1 -0
  306. package/dist/esm/formatting/Style.js +1151 -0
  307. package/dist/esm/formatting/Style.js.map +1 -0
  308. package/dist/esm/formatting/StylesManager.js +557 -0
  309. package/dist/esm/formatting/StylesManager.js.map +1 -0
  310. package/dist/esm/helpers/CleanupHelper.js +350 -0
  311. package/dist/esm/helpers/CleanupHelper.js.map +1 -0
  312. package/dist/esm/images/ImageOptimizer.js +161 -0
  313. package/dist/esm/images/ImageOptimizer.js.map +1 -0
  314. package/dist/esm/index.js +75 -0
  315. package/dist/esm/index.js.map +1 -0
  316. package/dist/esm/internal.js +16 -0
  317. package/dist/esm/internal.js.map +1 -0
  318. package/dist/esm/managers/DrawingManager.js +163 -0
  319. package/dist/esm/managers/DrawingManager.js.map +1 -0
  320. package/dist/esm/package.json +3 -0
  321. package/dist/esm/processors/ChangelogGenerator.js +970 -0
  322. package/dist/esm/processors/ChangelogGenerator.js.map +1 -0
  323. package/dist/esm/processors/CompatibilityUpgrader.js +130 -0
  324. package/dist/esm/processors/CompatibilityUpgrader.js.map +1 -0
  325. package/dist/esm/processors/InMemoryRevisionAcceptor.js +530 -0
  326. package/dist/esm/processors/InMemoryRevisionAcceptor.js.map +1 -0
  327. package/dist/esm/processors/MoveOperationHelper.js +57 -0
  328. package/dist/esm/processors/MoveOperationHelper.js.map +1 -0
  329. package/dist/esm/processors/RevisionAwareProcessor.js +232 -0
  330. package/dist/esm/processors/RevisionAwareProcessor.js.map +1 -0
  331. package/dist/esm/processors/RevisionWalker.js +278 -0
  332. package/dist/esm/processors/RevisionWalker.js.map +1 -0
  333. package/dist/{utils → esm/processors}/SelectiveRevisionAcceptor.js +81 -42
  334. package/dist/esm/processors/SelectiveRevisionAcceptor.js.map +1 -0
  335. package/dist/esm/processors/ShadingResolver.js +66 -0
  336. package/dist/esm/processors/ShadingResolver.js.map +1 -0
  337. package/dist/esm/processors/acceptRevisions.js +416 -0
  338. package/dist/esm/processors/acceptRevisions.js.map +1 -0
  339. package/dist/esm/processors/cnfStyleDecoder.js +89 -0
  340. package/dist/esm/processors/cnfStyleDecoder.js.map +1 -0
  341. package/dist/esm/processors/stripTrackedChanges.js +201 -0
  342. package/dist/esm/processors/stripTrackedChanges.js.map +1 -0
  343. package/dist/esm/tracking/DocumentTrackingContext.js +531 -0
  344. package/dist/esm/tracking/DocumentTrackingContext.js.map +1 -0
  345. package/dist/esm/tracking/TrackingContext.js +2 -0
  346. package/dist/esm/tracking/TrackingContext.js.map +1 -0
  347. package/dist/esm/types/compatibility-types.js +8 -0
  348. package/dist/esm/types/compatibility-types.js.map +1 -0
  349. package/dist/esm/types/document-types.js +2 -0
  350. package/dist/esm/types/document-types.js.map +1 -0
  351. package/dist/esm/types/formatting.js +2 -0
  352. package/dist/esm/types/formatting.js.map +1 -0
  353. package/dist/esm/types/list-types.js +2 -0
  354. package/dist/esm/types/list-types.js.map +1 -0
  355. package/dist/esm/types/settings-types.js +2 -0
  356. package/dist/esm/types/settings-types.js.map +1 -0
  357. package/dist/esm/types/styleConfig.js +2 -0
  358. package/dist/esm/types/styleConfig.js.map +1 -0
  359. package/dist/esm/utils/KeyedRegistry.js +32 -0
  360. package/dist/esm/utils/KeyedRegistry.js.map +1 -0
  361. package/dist/esm/utils/corruptionDetection.js +155 -0
  362. package/dist/esm/utils/corruptionDetection.js.map +1 -0
  363. package/dist/esm/utils/dateFormatting.js +4 -0
  364. package/dist/esm/utils/dateFormatting.js.map +1 -0
  365. package/dist/esm/utils/deepClone.js +40 -0
  366. package/dist/esm/utils/deepClone.js.map +1 -0
  367. package/dist/esm/utils/deepEqual.js +47 -0
  368. package/dist/esm/utils/deepEqual.js.map +1 -0
  369. package/dist/esm/utils/diagnostics.js +69 -0
  370. package/dist/esm/utils/diagnostics.js.map +1 -0
  371. package/dist/esm/utils/errorHandling.js +36 -0
  372. package/dist/esm/utils/errorHandling.js.map +1 -0
  373. package/dist/esm/utils/formatting.js +93 -0
  374. package/dist/esm/utils/formatting.js.map +1 -0
  375. package/dist/esm/utils/list-detection.js +148 -0
  376. package/dist/esm/utils/list-detection.js.map +1 -0
  377. package/dist/esm/utils/logger.js +205 -0
  378. package/dist/esm/utils/logger.js.map +1 -0
  379. package/dist/esm/utils/parsingHelpers.js +56 -0
  380. package/dist/esm/utils/parsingHelpers.js.map +1 -0
  381. package/dist/esm/utils/textDiff.js +42 -0
  382. package/dist/esm/utils/textDiff.js.map +1 -0
  383. package/dist/esm/utils/units.js +152 -0
  384. package/dist/esm/utils/units.js.map +1 -0
  385. package/dist/esm/utils/validation.js +285 -0
  386. package/dist/esm/utils/validation.js.map +1 -0
  387. package/dist/esm/utils/xmlSanitization.js +54 -0
  388. package/dist/esm/utils/xmlSanitization.js.map +1 -0
  389. package/dist/esm/validation/RevisionAutoFixer.js +340 -0
  390. package/dist/esm/validation/RevisionAutoFixer.js.map +1 -0
  391. package/dist/esm/validation/RevisionValidator.js +240 -0
  392. package/dist/esm/validation/RevisionValidator.js.map +1 -0
  393. package/dist/esm/validation/ValidationRuleRegistry.js +40 -0
  394. package/dist/esm/validation/ValidationRuleRegistry.js.map +1 -0
  395. package/dist/esm/validation/ValidationRules.js +92 -0
  396. package/dist/esm/validation/ValidationRules.js.map +1 -0
  397. package/dist/esm/validation/index.js +4 -0
  398. package/dist/esm/validation/index.js.map +1 -0
  399. package/dist/esm/xml/XMLBuilder.js +434 -0
  400. package/dist/esm/xml/XMLBuilder.js.map +1 -0
  401. package/dist/esm/xml/XMLParser.js +486 -0
  402. package/dist/esm/xml/XMLParser.js.map +1 -0
  403. package/dist/esm/zip/ZipHandler.js +298 -0
  404. package/dist/esm/zip/ZipHandler.js.map +1 -0
  405. package/dist/esm/zip/ZipReader.js +147 -0
  406. package/dist/esm/zip/ZipReader.js.map +1 -0
  407. package/dist/esm/zip/ZipWriter.js +199 -0
  408. package/dist/esm/zip/ZipWriter.js.map +1 -0
  409. package/dist/esm/zip/errors.js +43 -0
  410. package/dist/esm/zip/errors.js.map +1 -0
  411. package/dist/esm/zip/types.js +31 -0
  412. package/dist/esm/zip/types.js.map +1 -0
  413. package/dist/formatting/AbstractNumbering.d.ts +2 -2
  414. package/dist/formatting/AbstractNumbering.d.ts.map +1 -1
  415. package/dist/formatting/AbstractNumbering.js +33 -33
  416. package/dist/formatting/AbstractNumbering.js.map +1 -1
  417. package/dist/formatting/NumberingInstance.d.ts +2 -2
  418. package/dist/formatting/NumberingInstance.d.ts.map +1 -1
  419. package/dist/formatting/NumberingInstance.js +7 -7
  420. package/dist/formatting/NumberingInstance.js.map +1 -1
  421. package/dist/formatting/NumberingLevel.d.ts +11 -2
  422. package/dist/formatting/NumberingLevel.d.ts.map +1 -1
  423. package/dist/formatting/NumberingLevel.js +111 -25
  424. package/dist/formatting/NumberingLevel.js.map +1 -1
  425. package/dist/formatting/NumberingManager.d.ts +4 -4
  426. package/dist/formatting/NumberingManager.d.ts.map +1 -1
  427. package/dist/formatting/NumberingManager.js +28 -28
  428. package/dist/formatting/NumberingManager.js.map +1 -1
  429. package/dist/formatting/Style.d.ts +14 -7
  430. package/dist/formatting/Style.d.ts.map +1 -1
  431. package/dist/formatting/Style.js +309 -112
  432. package/dist/formatting/Style.js.map +1 -1
  433. package/dist/formatting/StylesManager.d.ts +2 -2
  434. package/dist/formatting/StylesManager.d.ts.map +1 -1
  435. package/dist/formatting/StylesManager.js +52 -52
  436. package/dist/formatting/StylesManager.js.map +1 -1
  437. package/dist/helpers/CleanupHelper.d.ts +1 -1
  438. package/dist/helpers/CleanupHelper.d.ts.map +1 -1
  439. package/dist/helpers/CleanupHelper.js +15 -15
  440. package/dist/helpers/CleanupHelper.js.map +1 -1
  441. package/dist/index.d.ts +81 -90
  442. package/dist/index.d.ts.map +1 -1
  443. package/dist/index.js +286 -317
  444. package/dist/index.js.map +1 -1
  445. package/dist/internal.d.ts +16 -0
  446. package/dist/internal.d.ts.map +1 -0
  447. package/dist/internal.js +42 -0
  448. package/dist/internal.js.map +1 -0
  449. package/dist/managers/DrawingManager.d.ts +3 -3
  450. package/dist/managers/DrawingManager.d.ts.map +1 -1
  451. package/dist/managers/DrawingManager.js +12 -12
  452. package/dist/managers/DrawingManager.js.map +1 -1
  453. package/dist/{utils → processors}/ChangelogGenerator.d.ts +2 -2
  454. package/dist/processors/ChangelogGenerator.d.ts.map +1 -0
  455. package/dist/{utils → processors}/ChangelogGenerator.js +2 -2
  456. package/dist/processors/ChangelogGenerator.js.map +1 -0
  457. package/dist/processors/CompatibilityUpgrader.d.ts.map +1 -0
  458. package/dist/{utils → processors}/CompatibilityUpgrader.js +10 -10
  459. package/dist/processors/CompatibilityUpgrader.js.map +1 -0
  460. package/dist/{utils → processors}/InMemoryRevisionAcceptor.d.ts +3 -3
  461. package/dist/processors/InMemoryRevisionAcceptor.d.ts.map +1 -0
  462. package/dist/{utils → processors}/InMemoryRevisionAcceptor.js +84 -27
  463. package/dist/processors/InMemoryRevisionAcceptor.js.map +1 -0
  464. package/dist/{utils → processors}/MoveOperationHelper.d.ts +4 -4
  465. package/dist/processors/MoveOperationHelper.d.ts.map +1 -0
  466. package/dist/{utils → processors}/MoveOperationHelper.js +10 -10
  467. package/dist/processors/MoveOperationHelper.js.map +1 -0
  468. package/dist/{utils → processors}/RevisionAwareProcessor.d.ts +3 -3
  469. package/dist/processors/RevisionAwareProcessor.d.ts.map +1 -0
  470. package/dist/{utils → processors}/RevisionAwareProcessor.js +2 -2
  471. package/dist/processors/RevisionAwareProcessor.js.map +1 -0
  472. package/dist/{utils → processors}/RevisionWalker.d.ts +2 -1
  473. package/dist/processors/RevisionWalker.d.ts.map +1 -0
  474. package/dist/{utils → processors}/RevisionWalker.js +28 -0
  475. package/dist/processors/RevisionWalker.js.map +1 -0
  476. package/dist/{utils → processors}/SelectiveRevisionAcceptor.d.ts +4 -3
  477. package/dist/processors/SelectiveRevisionAcceptor.d.ts.map +1 -0
  478. package/dist/processors/SelectiveRevisionAcceptor.js +402 -0
  479. package/dist/processors/SelectiveRevisionAcceptor.js.map +1 -0
  480. package/dist/processors/ShadingResolver.d.ts +6 -0
  481. package/dist/processors/ShadingResolver.d.ts.map +1 -0
  482. package/dist/{utils → processors}/ShadingResolver.js +2 -2
  483. package/dist/processors/ShadingResolver.js.map +1 -0
  484. package/dist/{utils → processors}/acceptRevisions.d.ts +1 -1
  485. package/dist/processors/acceptRevisions.d.ts.map +1 -0
  486. package/dist/{utils → processors}/acceptRevisions.js +24 -4
  487. package/dist/processors/acceptRevisions.js.map +1 -0
  488. package/dist/{utils → processors}/cnfStyleDecoder.d.ts +1 -1
  489. package/dist/processors/cnfStyleDecoder.d.ts.map +1 -0
  490. package/dist/processors/cnfStyleDecoder.js.map +1 -0
  491. package/dist/processors/stripTrackedChanges.d.ts +3 -0
  492. package/dist/processors/stripTrackedChanges.d.ts.map +1 -0
  493. package/dist/{utils → processors}/stripTrackedChanges.js +16 -6
  494. package/dist/processors/stripTrackedChanges.js.map +1 -0
  495. package/dist/tracking/DocumentTrackingContext.d.ts +4 -4
  496. package/dist/tracking/DocumentTrackingContext.d.ts.map +1 -1
  497. package/dist/tracking/DocumentTrackingContext.js +38 -43
  498. package/dist/tracking/DocumentTrackingContext.js.map +1 -1
  499. package/dist/tracking/TrackingContext.d.ts +8 -8
  500. package/dist/tracking/TrackingContext.d.ts.map +1 -1
  501. package/dist/tracking/TrackingContext.js.map +1 -1
  502. package/dist/types/document-types.d.ts +28 -0
  503. package/dist/types/document-types.d.ts.map +1 -0
  504. package/dist/types/document-types.js +3 -0
  505. package/dist/types/document-types.js.map +1 -0
  506. package/dist/types/formatting.d.ts +4 -4
  507. package/dist/types/formatting.d.ts.map +1 -1
  508. package/dist/types/formatting.js.map +1 -1
  509. package/dist/types/settings-types.d.ts +6 -0
  510. package/dist/types/settings-types.d.ts.map +1 -1
  511. package/dist/types/settings-types.js.map +1 -1
  512. package/dist/utils/KeyedRegistry.d.ts +13 -0
  513. package/dist/utils/KeyedRegistry.d.ts.map +1 -0
  514. package/dist/utils/KeyedRegistry.js +36 -0
  515. package/dist/utils/KeyedRegistry.js.map +1 -0
  516. package/dist/utils/corruptionDetection.d.ts +1 -1
  517. package/dist/utils/corruptionDetection.d.ts.map +1 -1
  518. package/dist/utils/corruptionDetection.js +4 -4
  519. package/dist/utils/corruptionDetection.js.map +1 -1
  520. package/dist/utils/deepEqual.d.ts +2 -0
  521. package/dist/utils/deepEqual.d.ts.map +1 -0
  522. package/dist/utils/deepEqual.js +50 -0
  523. package/dist/utils/deepEqual.js.map +1 -0
  524. package/dist/utils/list-detection.d.ts +2 -2
  525. package/dist/utils/list-detection.d.ts.map +1 -1
  526. package/dist/utils/list-detection.js.map +1 -1
  527. package/dist/utils/parsingHelpers.d.ts +1 -1
  528. package/dist/utils/parsingHelpers.d.ts.map +1 -1
  529. package/dist/utils/parsingHelpers.js +2 -2
  530. package/dist/utils/parsingHelpers.js.map +1 -1
  531. package/dist/utils/validation.js +7 -7
  532. package/dist/utils/validation.js.map +1 -1
  533. package/dist/utils/xmlSanitization.js +2 -2
  534. package/dist/utils/xmlSanitization.js.map +1 -1
  535. package/dist/validation/RevisionAutoFixer.d.ts +4 -4
  536. package/dist/validation/RevisionAutoFixer.d.ts.map +1 -1
  537. package/dist/validation/RevisionAutoFixer.js +11 -11
  538. package/dist/validation/RevisionAutoFixer.js.map +1 -1
  539. package/dist/validation/RevisionValidator.d.ts +5 -4
  540. package/dist/validation/RevisionValidator.d.ts.map +1 -1
  541. package/dist/validation/RevisionValidator.js +29 -30
  542. package/dist/validation/RevisionValidator.js.map +1 -1
  543. package/dist/validation/ValidationRuleRegistry.d.ts +27 -0
  544. package/dist/validation/ValidationRuleRegistry.d.ts.map +1 -0
  545. package/dist/validation/ValidationRuleRegistry.js +43 -0
  546. package/dist/validation/ValidationRuleRegistry.js.map +1 -0
  547. package/dist/validation/index.d.ts +3 -3
  548. package/dist/validation/index.d.ts.map +1 -1
  549. package/dist/validation/index.js +10 -10
  550. package/dist/validation/index.js.map +1 -1
  551. package/dist/xml/XMLBuilder.d.ts +6 -1
  552. package/dist/xml/XMLBuilder.d.ts.map +1 -1
  553. package/dist/xml/XMLBuilder.js +11 -6
  554. package/dist/xml/XMLBuilder.js.map +1 -1
  555. package/dist/xml/XMLParser.js +6 -6
  556. package/dist/xml/XMLParser.js.map +1 -1
  557. package/dist/zip/ZipHandler.d.ts +1 -1
  558. package/dist/zip/ZipHandler.d.ts.map +1 -1
  559. package/dist/zip/ZipHandler.js +8 -8
  560. package/dist/zip/ZipHandler.js.map +1 -1
  561. package/dist/zip/ZipReader.d.ts +1 -1
  562. package/dist/zip/ZipReader.d.ts.map +1 -1
  563. package/dist/zip/ZipReader.js +14 -14
  564. package/dist/zip/ZipReader.js.map +1 -1
  565. package/dist/zip/ZipWriter.d.ts +1 -1
  566. package/dist/zip/ZipWriter.d.ts.map +1 -1
  567. package/dist/zip/ZipWriter.js +10 -10
  568. package/dist/zip/ZipWriter.js.map +1 -1
  569. package/package.json +20 -4
  570. package/src/constants/legacyCompatFlags.ts +1 -1
  571. package/src/core/Document.ts +478 -167
  572. package/src/core/DocumentContent.ts +14 -11
  573. package/src/core/DocumentEvents.ts +90 -0
  574. package/src/core/DocumentGenerator.ts +49 -22
  575. package/src/core/DocumentParser.ts +2235 -620
  576. package/src/core/DocumentValidator.ts +7 -7
  577. package/src/core/ElementRegistry.ts +69 -0
  578. package/src/core/Relationship.ts +1 -1
  579. package/src/core/RelationshipManager.ts +4 -4
  580. package/src/elements/AlternateContent.ts +1 -1
  581. package/src/elements/Bookmark.ts +52 -4
  582. package/src/elements/BookmarkManager.ts +2 -2
  583. package/src/elements/Comment.ts +3 -3
  584. package/src/elements/CommentManager.ts +4 -4
  585. package/src/elements/CommonTypes.ts +45 -7
  586. package/src/elements/CustomXml.ts +1 -1
  587. package/src/elements/Endnote.ts +2 -2
  588. package/src/elements/EndnoteManager.ts +3 -3
  589. package/src/elements/Field.ts +44 -10
  590. package/src/elements/FieldHelpers.ts +2 -2
  591. package/src/elements/Footer.ts +4 -4
  592. package/src/elements/Footnote.ts +2 -2
  593. package/src/elements/FootnoteManager.ts +3 -3
  594. package/src/elements/Header.ts +4 -4
  595. package/src/elements/HeaderFooterManager.ts +2 -2
  596. package/src/elements/Hyperlink.ts +16 -12
  597. package/src/elements/Image.ts +3 -3
  598. package/src/elements/ImageManager.ts +2 -2
  599. package/src/elements/ImageRun.ts +3 -3
  600. package/src/elements/MathElement.ts +1 -1
  601. package/src/elements/Paragraph.ts +221 -88
  602. package/src/elements/PreservedElement.ts +1 -1
  603. package/src/elements/PropertyChangeTypes.ts +2 -2
  604. package/src/elements/RangeMarker.ts +153 -12
  605. package/src/elements/RegisteredBodyElement.ts +52 -0
  606. package/src/elements/Revision.ts +14 -14
  607. package/src/elements/RevisionContent.ts +3 -3
  608. package/src/elements/RevisionManager.ts +3 -3
  609. package/src/elements/Run.ts +221 -94
  610. package/src/elements/Section.ts +136 -69
  611. package/src/elements/Shape.ts +4 -4
  612. package/src/elements/StructuredDocumentTag.ts +3 -3
  613. package/src/elements/Table.ts +91 -27
  614. package/src/elements/TableCell.ts +62 -34
  615. package/src/elements/TableGridChange.ts +1 -1
  616. package/src/elements/TableOfContents.ts +1 -1
  617. package/src/elements/TableOfContentsElement.ts +2 -2
  618. package/src/elements/TableRow.ts +192 -48
  619. package/src/elements/TextBox.ts +5 -5
  620. package/src/formatting/AbstractNumbering.ts +3 -3
  621. package/src/formatting/NumberingInstance.ts +2 -2
  622. package/src/formatting/NumberingLevel.ts +201 -10
  623. package/src/formatting/NumberingManager.ts +5 -5
  624. package/src/formatting/Style.ts +382 -86
  625. package/src/formatting/StylesManager.ts +4 -4
  626. package/src/helpers/CleanupHelper.ts +6 -6
  627. package/src/index.ts +118 -127
  628. package/src/internal.ts +79 -0
  629. package/src/managers/DrawingManager.ts +3 -3
  630. package/src/{utils → processors}/ChangelogGenerator.ts +3 -3
  631. package/src/{utils → processors}/CompatibilityUpgrader.ts +2 -2
  632. package/src/{utils → processors}/InMemoryRevisionAcceptor.ts +100 -12
  633. package/src/{utils → processors}/MoveOperationHelper.ts +5 -5
  634. package/src/{utils → processors}/RevisionAwareProcessor.ts +3 -3
  635. package/src/{utils → processors}/RevisionWalker.ts +42 -1
  636. package/src/{utils → processors}/SelectiveRevisionAcceptor.ts +98 -39
  637. package/src/{utils → processors}/ShadingResolver.ts +5 -5
  638. package/src/{utils → processors}/acceptRevisions.ts +77 -9
  639. package/src/{utils → processors}/cnfStyleDecoder.ts +1 -1
  640. package/src/{utils → processors}/stripTrackedChanges.ts +35 -10
  641. package/src/tracking/DocumentTrackingContext.ts +12 -14
  642. package/src/tracking/TrackingContext.ts +8 -8
  643. package/src/types/document-types.ts +53 -0
  644. package/src/types/formatting.ts +4 -4
  645. package/src/types/settings-types.ts +32 -0
  646. package/src/utils/KeyedRegistry.ts +41 -0
  647. package/src/utils/corruptionDetection.ts +2 -2
  648. package/src/utils/deepEqual.ts +58 -0
  649. package/src/utils/list-detection.ts +2 -2
  650. package/src/utils/parsingHelpers.ts +11 -3
  651. package/src/utils/validation.ts +3 -3
  652. package/src/utils/xmlSanitization.ts +1 -1
  653. package/src/validation/RevisionAutoFixer.ts +5 -5
  654. package/src/validation/RevisionValidator.ts +39 -28
  655. package/src/validation/ValidationRuleRegistry.ts +86 -0
  656. package/src/validation/index.ts +3 -3
  657. package/src/xml/XMLBuilder.ts +13 -3
  658. package/src/xml/XMLParser.ts +2 -2
  659. package/src/zip/ZipHandler.ts +4 -4
  660. package/src/zip/ZipReader.ts +3 -3
  661. package/src/zip/ZipWriter.ts +3 -3
  662. package/dist/utils/ChangelogGenerator.d.ts.map +0 -1
  663. package/dist/utils/ChangelogGenerator.js.map +0 -1
  664. package/dist/utils/CompatibilityUpgrader.d.ts.map +0 -1
  665. package/dist/utils/CompatibilityUpgrader.js.map +0 -1
  666. package/dist/utils/InMemoryRevisionAcceptor.d.ts.map +0 -1
  667. package/dist/utils/InMemoryRevisionAcceptor.js.map +0 -1
  668. package/dist/utils/MoveOperationHelper.d.ts.map +0 -1
  669. package/dist/utils/MoveOperationHelper.js.map +0 -1
  670. package/dist/utils/RevisionAwareProcessor.d.ts.map +0 -1
  671. package/dist/utils/RevisionAwareProcessor.js.map +0 -1
  672. package/dist/utils/RevisionWalker.d.ts.map +0 -1
  673. package/dist/utils/RevisionWalker.js.map +0 -1
  674. package/dist/utils/SelectiveRevisionAcceptor.d.ts.map +0 -1
  675. package/dist/utils/SelectiveRevisionAcceptor.js.map +0 -1
  676. package/dist/utils/ShadingResolver.d.ts +0 -6
  677. package/dist/utils/ShadingResolver.d.ts.map +0 -1
  678. package/dist/utils/ShadingResolver.js.map +0 -1
  679. package/dist/utils/acceptRevisions.d.ts.map +0 -1
  680. package/dist/utils/acceptRevisions.js.map +0 -1
  681. package/dist/utils/cnfStyleDecoder.d.ts.map +0 -1
  682. package/dist/utils/cnfStyleDecoder.js.map +0 -1
  683. package/dist/utils/stripTrackedChanges.d.ts +0 -3
  684. package/dist/utils/stripTrackedChanges.d.ts.map +0 -1
  685. package/dist/utils/stripTrackedChanges.js.map +0 -1
  686. package/src/__tests__/helper-methods.test.ts +0 -512
  687. package/src/constants/CLAUDE.md +0 -28
  688. package/src/core/CLAUDE.md +0 -113
  689. package/src/elements/CLAUDE.md +0 -142
  690. package/src/formatting/CLAUDE.md +0 -78
  691. package/src/managers/CLAUDE.md +0 -47
  692. package/src/tracking/CLAUDE.md +0 -30
  693. package/src/types/CLAUDE.md +0 -39
  694. package/src/utils/CLAUDE.md +0 -168
  695. package/src/validation/CLAUDE.md +0 -40
  696. package/src/xml/CLAUDE.md +0 -65
  697. package/src/zip/CLAUDE.md +0 -55
  698. /package/dist/{utils → processors}/CompatibilityUpgrader.d.ts +0 -0
  699. /package/dist/{utils → processors}/cnfStyleDecoder.js +0 -0
@@ -3,12 +3,12 @@
3
3
  * Supports paragraph, character, table, and numbering styles
4
4
  */
5
5
 
6
- import { XMLBuilder, XMLElement } from '../xml/XMLBuilder';
7
- import { ParagraphFormatting } from '../elements/Paragraph';
8
- import { Run, RunFormatting } from '../elements/Run';
9
- import { ShadingConfig, buildShadingAttributes } from '../elements/CommonTypes';
10
- import { Heading2TableOptions } from '../types/styleConfig';
11
- import { deepClone } from '../utils/deepClone';
6
+ import { XMLBuilder, XMLElement } from '../xml/XMLBuilder.js';
7
+ import { ParagraphFormatting } from '../elements/Paragraph.js';
8
+ import { Run, RunFormatting } from '../elements/Run.js';
9
+ import { ShadingConfig, buildShadingAttributes } from '../elements/CommonTypes.js';
10
+ import { Heading2TableOptions } from '../types/styleConfig.js';
11
+ import { deepClone } from '../utils/deepClone.js';
12
12
 
13
13
  /**
14
14
  * Style type
@@ -16,12 +16,15 @@ import { deepClone } from '../utils/deepClone';
16
16
  export type StyleType = 'paragraph' | 'character' | 'table' | 'numbering';
17
17
 
18
18
  /**
19
- * Table alignment
19
+ * Table alignment per ECMA-376 Part 1 §17.18.45 ST_JcTable.
20
+ * `start` / `end` are the bidi-aware alternatives to `left` / `right`.
20
21
  */
21
- export type TableAlignment = 'left' | 'center' | 'right';
22
+ export type TableAlignment = 'left' | 'center' | 'right' | 'start' | 'end';
22
23
 
23
24
  /**
24
- * Border properties
25
+ * Border properties (style-level). Mirrors `BorderDefinition` in
26
+ * `elements/CommonTypes.ts` — both represent CT_Border per ECMA-376
27
+ * §17.18.2.
25
28
  */
26
29
  export interface BorderProperties {
27
30
  /** Border style */
@@ -32,6 +35,16 @@ export interface BorderProperties {
32
35
  space?: number;
33
36
  /** Border color (hex without #) */
34
37
  color?: string;
38
+ /** Theme color reference (ST_ThemeColor per §17.18.97) */
39
+ themeColor?: string;
40
+ /** Theme tint (2-hex-digit string) */
41
+ themeTint?: string;
42
+ /** Theme shade (2-hex-digit string) */
43
+ themeShade?: string;
44
+ /** Border casts a shadow (CT_OnOff attribute on CT_Border) */
45
+ shadow?: boolean;
46
+ /** Border is part of a frame around the content (CT_OnOff) */
47
+ frame?: boolean;
35
48
  }
36
49
 
37
50
  /**
@@ -109,7 +122,11 @@ export interface TableCellStyleFormatting {
109
122
  /** Cell-specific margins */
110
123
  margins?: CellMargins;
111
124
  /** Vertical alignment in cell */
112
- verticalAlignment?: 'top' | 'center' | 'bottom';
125
+ /**
126
+ * Cell vertical alignment per ECMA-376 Part 1 §17.18.101 ST_VerticalJc.
127
+ * `both` distributes content with equal top/bottom gaps.
128
+ */
129
+ verticalAlignment?: 'top' | 'center' | 'both' | 'bottom';
113
130
  }
114
131
 
115
132
  /**
@@ -217,6 +234,13 @@ export interface StyleProperties {
217
234
  uiPriority?: number;
218
235
  /** Semi-hidden - hide from gallery unless in use */
219
236
  semiHidden?: boolean;
237
+ /**
238
+ * Hidden - completely hide the style (stronger than semiHidden).
239
+ * Per ECMA-376 Part 1 §17.7.4 CT_Style, `<w:hidden>` between
240
+ * `autoRedefine` and `uiPriority`. OnOffOnlyType — explicit false
241
+ * is `w:val="off"`.
242
+ */
243
+ hidden?: boolean;
220
244
  /** Unhide when used - auto-show when applied */
221
245
  unhideWhenUsed?: boolean;
222
246
  /** Locked - prevent modification */
@@ -227,6 +251,13 @@ export interface StyleProperties {
227
251
  personalCompose?: boolean;
228
252
  /** Personal reply - style for replying to messages */
229
253
  personalReply?: boolean;
254
+ /**
255
+ * Revision-save ID for the style definition (§17.7.4 CT_Style child
256
+ * `<w:rsid>`, CT_LongHexNumber §17.18.50). 8-character uppercase hex
257
+ * string matching the session-level `w:rsid` entries in settings.xml.
258
+ * Schema position: between `personalReply` and `pPr` in CT_Style.
259
+ */
260
+ rsid?: string;
230
261
  /** Link - linked character/paragraph style ID */
231
262
  link?: string;
232
263
  /** Auto-redefine - update style from manual formatting */
@@ -757,9 +788,29 @@ export class Style {
757
788
  styleChildren.push(XMLBuilder.wSelf('link', { 'w:val': this.properties.link }));
758
789
  }
759
790
 
760
- // Add autoRedefine
761
- if (this.properties.autoRedefine) {
762
- styleChildren.push(XMLBuilder.wSelf('autoRedefine'));
791
+ // Add autoRedefine — OnOffOnlyType per ECMA-376 §17.7.4.5; w:val is
792
+ // restricted to "on"/"off" by ST_OnOffOnly. Emit w:val="off" for explicit
793
+ // false so an override of a based-on style's autoRedefine=true survives
794
+ // round-trip. (w:val="0" would fail Open XML SDK schema validation.)
795
+ if (this.properties.autoRedefine !== undefined) {
796
+ if (this.properties.autoRedefine) {
797
+ styleChildren.push(XMLBuilder.wSelf('autoRedefine'));
798
+ } else {
799
+ styleChildren.push(XMLBuilder.wSelf('autoRedefine', { 'w:val': 'off' }));
800
+ }
801
+ }
802
+
803
+ // hidden — CT_OnOff (OnOffOnlyType) per ECMA-376 §17.7.4, positioned
804
+ // BETWEEN autoRedefine and uiPriority per CT_Style schema order.
805
+ // Completely hides the style (stronger than semiHidden). Emit
806
+ // w:val="off" for explicit false so an override of a based-on
807
+ // style's hidden=true survives round-trip.
808
+ if (this.properties.hidden !== undefined) {
809
+ if (this.properties.hidden) {
810
+ styleChildren.push(XMLBuilder.wSelf('hidden'));
811
+ } else {
812
+ styleChildren.push(XMLBuilder.wSelf('hidden', { 'w:val': 'off' }));
813
+ }
763
814
  }
764
815
 
765
816
  // Add metadata properties — ordered per ECMA-376 CT_Style
@@ -772,44 +823,79 @@ export class Style {
772
823
  );
773
824
  }
774
825
 
775
- // semiHidden - Hide from recommended list
776
- if (this.properties.semiHidden) {
777
- styleChildren.push(XMLBuilder.wSelf('semiHidden'));
826
+ // semiHidden CT_OnOff. Emit explicit false to preserve override intent.
827
+ if (this.properties.semiHidden !== undefined) {
828
+ if (this.properties.semiHidden) {
829
+ styleChildren.push(XMLBuilder.wSelf('semiHidden'));
830
+ } else {
831
+ styleChildren.push(XMLBuilder.wSelf('semiHidden', { 'w:val': 'off' }));
832
+ }
778
833
  }
779
834
 
780
- // unhideWhenUsed - Auto-show when applied
781
- if (this.properties.unhideWhenUsed) {
782
- styleChildren.push(XMLBuilder.wSelf('unhideWhenUsed'));
835
+ // unhideWhenUsed CT_OnOff.
836
+ if (this.properties.unhideWhenUsed !== undefined) {
837
+ if (this.properties.unhideWhenUsed) {
838
+ styleChildren.push(XMLBuilder.wSelf('unhideWhenUsed'));
839
+ } else {
840
+ styleChildren.push(XMLBuilder.wSelf('unhideWhenUsed', { 'w:val': 'off' }));
841
+ }
783
842
  }
784
843
 
785
- // qFormat - Quick style gallery appearance
844
+ // qFormat — CT_OnOff. Explicit false must round-trip (override a based-on
845
+ // style's qFormat=true). Built-in non-custom styles default to emitting
846
+ // qFormat when the field is absent entirely (legacy behaviour).
786
847
  if (this.properties.qFormat !== undefined) {
787
848
  if (this.properties.qFormat) {
788
849
  styleChildren.push(XMLBuilder.wSelf('qFormat'));
850
+ } else {
851
+ styleChildren.push(XMLBuilder.wSelf('qFormat', { 'w:val': 'off' }));
789
852
  }
790
853
  } else if (!this.properties.customStyle) {
791
- // Default: built-in styles have qFormat
792
854
  styleChildren.push(XMLBuilder.wSelf('qFormat'));
793
855
  }
794
856
 
795
- // locked - Prevent modification
796
- if (this.properties.locked) {
797
- styleChildren.push(XMLBuilder.wSelf('locked'));
857
+ // locked CT_OnOff.
858
+ if (this.properties.locked !== undefined) {
859
+ if (this.properties.locked) {
860
+ styleChildren.push(XMLBuilder.wSelf('locked'));
861
+ } else {
862
+ styleChildren.push(XMLBuilder.wSelf('locked', { 'w:val': 'off' }));
863
+ }
798
864
  }
799
865
 
800
- // personal - User-specific style
801
- if (this.properties.personal) {
802
- styleChildren.push(XMLBuilder.wSelf('personal'));
866
+ // personal CT_OnOff.
867
+ if (this.properties.personal !== undefined) {
868
+ if (this.properties.personal) {
869
+ styleChildren.push(XMLBuilder.wSelf('personal'));
870
+ } else {
871
+ styleChildren.push(XMLBuilder.wSelf('personal', { 'w:val': 'off' }));
872
+ }
803
873
  }
804
874
 
805
- // personalCompose - Style for composing new messages
806
- if (this.properties.personalCompose) {
807
- styleChildren.push(XMLBuilder.wSelf('personalCompose'));
875
+ // personalCompose CT_OnOff.
876
+ if (this.properties.personalCompose !== undefined) {
877
+ if (this.properties.personalCompose) {
878
+ styleChildren.push(XMLBuilder.wSelf('personalCompose'));
879
+ } else {
880
+ styleChildren.push(XMLBuilder.wSelf('personalCompose', { 'w:val': 'off' }));
881
+ }
882
+ }
883
+
884
+ // personalReply — CT_OnOff.
885
+ if (this.properties.personalReply !== undefined) {
886
+ if (this.properties.personalReply) {
887
+ styleChildren.push(XMLBuilder.wSelf('personalReply'));
888
+ } else {
889
+ styleChildren.push(XMLBuilder.wSelf('personalReply', { 'w:val': 'off' }));
890
+ }
808
891
  }
809
892
 
810
- // personalReply - Style for replying to messages
811
- if (this.properties.personalReply) {
812
- styleChildren.push(XMLBuilder.wSelf('personalReply'));
893
+ // rsid CT_LongHexNumber (§17.18.50) per CT_Style §17.7.4. Schema
894
+ // position: between personalReply (#15) and pPr (#17). Emit only when
895
+ // an rsid stamp was carried over from load (we never synthesize one
896
+ // for programmatically authored styles).
897
+ if (this.properties.rsid !== undefined && this.properties.rsid !== '') {
898
+ styleChildren.push(XMLBuilder.wSelf('rsid', { 'w:val': this.properties.rsid }));
813
899
  }
814
900
 
815
901
  // Add paragraph properties
@@ -829,23 +915,23 @@ export class Style {
829
915
  );
830
916
  }
831
917
  if (numPrChildren.length > 0) {
832
- // Per CT_PPrBase, numPr is at position #7: after keepNext, keepLines, pageBreakBefore,
833
- // framePr, widowControl insert after the last of these that's present.
918
+ // Per CT_PPrBase, numPr is at position #7: after keepNext (#2),
919
+ // keepLines (#3), pageBreakBefore (#4), framePr (#5), widowControl (#6).
920
+ // Insert after the last of these that's present in the serialized pPr.
834
921
  const numPrEl = XMLBuilder.w('numPr', undefined, numPrChildren);
835
922
  if (pPr.children && pPr.children.length > 0) {
836
- // Find insertion point: after keepNext/keepLines/pageBreakBefore (positions #2-#4)
837
- // These are the only elements generateParagraphProperties() emits before numPr
923
+ const preNumPr = new Set([
924
+ 'w:keepNext',
925
+ 'w:keepLines',
926
+ 'w:pageBreakBefore',
927
+ 'w:framePr',
928
+ 'w:widowControl',
929
+ ]);
838
930
  let insertIdx = 0;
839
931
  for (let i = 0; i < pPr.children.length; i++) {
840
932
  const child = pPr.children[i];
841
- if (child && typeof child !== 'string') {
842
- if (
843
- child.name === 'w:keepNext' ||
844
- child.name === 'w:keepLines' ||
845
- child.name === 'w:pageBreakBefore'
846
- ) {
847
- insertIdx = i + 1;
848
- }
933
+ if (child && typeof child !== 'string' && preNumPr.has(child.name)) {
934
+ insertIdx = i + 1;
849
935
  }
850
936
  }
851
937
  pPr.children.splice(insertIdx, 0, numPrEl);
@@ -916,23 +1002,169 @@ export class Style {
916
1002
  private generateParagraphProperties(formatting: ParagraphFormatting): XMLElement {
917
1003
  const pPrChildren: XMLElement[] = [];
918
1004
 
919
- // Ordered per ECMA-376 CT_PPrBase
920
- if (formatting.keepNext) {
921
- pPrChildren.push(XMLBuilder.wSelf('keepNext'));
1005
+ // CT_OnOff paragraph flags use ST_OnOff. Emit bare `<w:x/>` for explicit
1006
+ // true and `<w:x w:val="0"/>` for explicit false. Undefined means
1007
+ // "inherit from base style" — omit the element entirely. Omitting an
1008
+ // explicit-false value would silently revert to the inherited true,
1009
+ // losing the user's override. Mirrors the Paragraph-level generator.
1010
+ const emitCtOnOff = (tag: string, value: boolean | undefined): void => {
1011
+ if (value === undefined) return;
1012
+ pPrChildren.push(value ? XMLBuilder.wSelf(tag) : XMLBuilder.wSelf(tag, { 'w:val': '0' }));
1013
+ };
1014
+
1015
+ // Children ordered per ECMA-376 CT_PPrBase schema (§17.3.1.26).
1016
+ // Note: numPr (#7) is inserted post-hoc by the caller because it
1017
+ // depends on `this.properties.numPr`, not `formatting`. The insertion
1018
+ // logic searches for the last CT_PPrBase child that appears before
1019
+ // numPr in the schema.
1020
+
1021
+ emitCtOnOff('keepNext', formatting.keepNext); // #2
1022
+ emitCtOnOff('keepLines', formatting.keepLines); // #3
1023
+ emitCtOnOff('pageBreakBefore', formatting.pageBreakBefore); // #4
1024
+
1025
+ // framePr (#5) — text frame properties (drop cap, floating-frame
1026
+ // positioning) per ECMA-376 §17.3.1.11 CT_FramePr. Previously dropped on
1027
+ // the style serializer, so a custom drop-cap paragraph style lost its
1028
+ // frame configuration on any managed save. Mirrors the Paragraph-level
1029
+ // serializer emission order for attribute output.
1030
+ if (formatting.framePr) {
1031
+ const f = formatting.framePr;
1032
+ const attrs: Record<string, string> = {};
1033
+ if (f.w !== undefined) attrs['w:w'] = f.w.toString();
1034
+ if (f.h !== undefined) attrs['w:h'] = f.h.toString();
1035
+ if (f.hRule) attrs['w:hRule'] = f.hRule;
1036
+ if (f.x !== undefined) attrs['w:x'] = f.x.toString();
1037
+ if (f.y !== undefined) attrs['w:y'] = f.y.toString();
1038
+ if (f.xAlign) attrs['w:xAlign'] = f.xAlign;
1039
+ if (f.yAlign) attrs['w:yAlign'] = f.yAlign;
1040
+ if (f.hAnchor) attrs['w:hAnchor'] = f.hAnchor;
1041
+ if (f.vAnchor) attrs['w:vAnchor'] = f.vAnchor;
1042
+ if (f.hSpace !== undefined) attrs['w:hSpace'] = f.hSpace.toString();
1043
+ if (f.vSpace !== undefined) attrs['w:vSpace'] = f.vSpace.toString();
1044
+ if (f.wrap) attrs['w:wrap'] = f.wrap;
1045
+ if (f.dropCap) attrs['w:dropCap'] = f.dropCap;
1046
+ if (f.lines !== undefined) attrs['w:lines'] = f.lines.toString();
1047
+ if (f.anchorLock !== undefined) attrs['w:anchorLock'] = f.anchorLock ? '1' : '0';
1048
+ if (Object.keys(attrs).length > 0) {
1049
+ pPrChildren.push(XMLBuilder.wSelf('framePr', attrs));
1050
+ }
1051
+ }
1052
+
1053
+ emitCtOnOff('widowControl', formatting.widowControl); // #6
1054
+ // numPr (#7) inserted post-hoc by caller.
1055
+ emitCtOnOff('suppressLineNumbers', formatting.suppressLineNumbers); // #8
1056
+
1057
+ // pBdr (#9) — paragraph borders (six sides: top, left, bottom, right,
1058
+ // between, bar) per ECMA-376 §17.3.1.24. Mirrors the Paragraph-level
1059
+ // serializer's order. Previously dropped on the style serializer even
1060
+ // though the style parser reads borders into `formatting.borders`.
1061
+ if (formatting.borders) {
1062
+ const borderChildren: XMLElement[] = [];
1063
+ const b = formatting.borders;
1064
+ const createBorder = (
1065
+ tag: string,
1066
+ def:
1067
+ | {
1068
+ style?: string;
1069
+ size?: number;
1070
+ space?: number;
1071
+ color?: string;
1072
+ themeColor?: string;
1073
+ themeTint?: string;
1074
+ themeShade?: string;
1075
+ shadow?: boolean;
1076
+ frame?: boolean;
1077
+ }
1078
+ | undefined
1079
+ ): void => {
1080
+ if (!def) return;
1081
+ // CT_Border §17.18.2: `w:val` (ST_Border) is REQUIRED. Default to
1082
+ // "nil" when caller set only size/color/space so the style-level
1083
+ // pBdr survives strict OOXML validation even for the common
1084
+ // "turn off this inherited side" override pattern. Full attribute
1085
+ // set (themeColor/themeTint/themeShade/shadow/frame) emitted for
1086
+ // themed-border fidelity.
1087
+ const attrs: Record<string, string | number> = { 'w:val': def.style ?? 'nil' };
1088
+ if (def.size !== undefined) attrs['w:sz'] = def.size;
1089
+ if (def.space !== undefined) attrs['w:space'] = def.space;
1090
+ if (def.color) attrs['w:color'] = def.color;
1091
+ if (def.themeColor) attrs['w:themeColor'] = def.themeColor;
1092
+ if (def.themeTint) attrs['w:themeTint'] = def.themeTint;
1093
+ if (def.themeShade) attrs['w:themeShade'] = def.themeShade;
1094
+ if (def.shadow !== undefined) attrs['w:shadow'] = def.shadow ? '1' : '0';
1095
+ if (def.frame !== undefined) attrs['w:frame'] = def.frame ? '1' : '0';
1096
+ borderChildren.push(XMLBuilder.wSelf(tag, attrs));
1097
+ };
1098
+ // Ordered per CT_PBdr (top → left → bottom → right → between → bar).
1099
+ createBorder('top', b.top);
1100
+ createBorder('left', b.left);
1101
+ createBorder('bottom', b.bottom);
1102
+ createBorder('right', b.right);
1103
+ createBorder('between', b.between);
1104
+ createBorder('bar', b.bar);
1105
+ if (borderChildren.length > 0) {
1106
+ pPrChildren.push(XMLBuilder.w('pBdr', undefined, borderChildren));
1107
+ }
922
1108
  }
923
- if (formatting.keepLines) {
924
- pPrChildren.push(XMLBuilder.wSelf('keepLines'));
1109
+
1110
+ // shd (#10) — paragraph shading. Previously dropped on the style
1111
+ // serializer; the parser reads it into `formatting.shading` already.
1112
+ if (formatting.shading) {
1113
+ const shdAttrs = buildShadingAttributes(formatting.shading);
1114
+ if (Object.keys(shdAttrs).length > 0) {
1115
+ pPrChildren.push(XMLBuilder.wSelf('shd', shdAttrs));
1116
+ }
925
1117
  }
926
- if (formatting.pageBreakBefore) {
927
- pPrChildren.push(XMLBuilder.wSelf('pageBreakBefore'));
1118
+
1119
+ // tabs (#11) — paragraph tab stops per ECMA-376 §17.3.1.38 / CT_TabStop
1120
+ // §17.3.1.37. BOTH `w:val` (ST_TabJc) and `w:pos` (ST_SignedTwipsMeasure)
1121
+ // are REQUIRED. Default `w:val` to "left" so consumers setting only
1122
+ // position produce validator-clean output.
1123
+ if (formatting.tabs && formatting.tabs.length > 0) {
1124
+ const tabChildren: XMLElement[] = [];
1125
+ for (const tab of formatting.tabs) {
1126
+ const attrs: Record<string, string | number> = {
1127
+ 'w:val': tab.val ?? 'left',
1128
+ 'w:pos': tab.position,
1129
+ };
1130
+ if (tab.leader) attrs['w:leader'] = tab.leader;
1131
+ tabChildren.push(XMLBuilder.wSelf('tab', attrs));
1132
+ }
1133
+ if (tabChildren.length > 0) {
1134
+ pPrChildren.push(XMLBuilder.w('tabs', undefined, tabChildren));
1135
+ }
928
1136
  }
929
1137
 
930
- // Add spacing
1138
+ emitCtOnOff('suppressAutoHyphens', formatting.suppressAutoHyphens); // #12
1139
+ emitCtOnOff('kinsoku', formatting.kinsoku); // #13
1140
+ emitCtOnOff('wordWrap', formatting.wordWrap); // #14
1141
+ emitCtOnOff('overflowPunct', formatting.overflowPunct); // #15
1142
+ emitCtOnOff('topLinePunct', formatting.topLinePunct); // #16
1143
+ emitCtOnOff('autoSpaceDE', formatting.autoSpaceDE); // #17
1144
+ emitCtOnOff('autoSpaceDN', formatting.autoSpaceDN); // #18
1145
+ emitCtOnOff('bidi', formatting.bidi); // #19
1146
+ emitCtOnOff('adjustRightInd', formatting.adjustRightInd); // #20
1147
+ // snapToGrid (#21) is a run property, not paragraph.
1148
+
1149
+ // Add spacing — full CT_Spacing attribute coverage per ECMA-376 §17.3.1.33.
1150
+ // Previously emitted only w:before / w:after / w:line / w:lineRule; the
1151
+ // four line-unit / auto-spacing attributes (beforeLines, afterLines,
1152
+ // beforeAutospacing, afterAutospacing) were silently dropped on save
1153
+ // even though the parser already read them correctly, creating a
1154
+ // parser/generator asymmetry for CJK-authored styles.
931
1155
  if (formatting.spacing) {
932
1156
  const spc = formatting.spacing;
933
1157
  const attributes: Record<string, number | string> = {};
934
1158
  if (spc.before !== undefined) attributes['w:before'] = spc.before;
1159
+ if (spc.beforeLines !== undefined) attributes['w:beforeLines'] = spc.beforeLines;
1160
+ if (spc.beforeAutospacing !== undefined) {
1161
+ attributes['w:beforeAutospacing'] = spc.beforeAutospacing ? '1' : '0';
1162
+ }
935
1163
  if (spc.after !== undefined) attributes['w:after'] = spc.after;
1164
+ if (spc.afterLines !== undefined) attributes['w:afterLines'] = spc.afterLines;
1165
+ if (spc.afterAutospacing !== undefined) {
1166
+ attributes['w:afterAutospacing'] = spc.afterAutospacing ? '1' : '0';
1167
+ }
936
1168
  if (spc.line !== undefined) attributes['w:line'] = spc.line;
937
1169
  if (spc.lineRule) attributes['w:lineRule'] = spc.lineRule;
938
1170
  if (Object.keys(attributes).length > 0) {
@@ -940,32 +1172,65 @@ export class Style {
940
1172
  }
941
1173
  }
942
1174
 
943
- // Add indentation
1175
+ // Add indentation — twips + CJK character-unit variants per ECMA-376
1176
+ // §17.3.1.12. hanging / firstLine are mutually exclusive; same for
1177
+ // hangingChars / firstLineChars. When both are set we emit hanging
1178
+ // (matching the Paragraph-level generator's precedence).
944
1179
  if (formatting.indentation) {
945
1180
  const ind = formatting.indentation;
946
1181
  const attributes: Record<string, number> = {};
947
1182
  if (ind.left !== undefined) attributes['w:left'] = ind.left;
948
1183
  if (ind.right !== undefined) attributes['w:right'] = ind.right;
949
- if (ind.firstLine !== undefined) attributes['w:firstLine'] = ind.firstLine;
950
- if (ind.hanging !== undefined) attributes['w:hanging'] = ind.hanging;
1184
+ if (ind.hanging !== undefined) {
1185
+ attributes['w:hanging'] = ind.hanging;
1186
+ } else if (ind.firstLine !== undefined) {
1187
+ attributes['w:firstLine'] = ind.firstLine;
1188
+ }
1189
+ if (ind.leftChars !== undefined) attributes['w:leftChars'] = ind.leftChars;
1190
+ if (ind.rightChars !== undefined) attributes['w:rightChars'] = ind.rightChars;
1191
+ if (ind.hangingChars !== undefined) {
1192
+ attributes['w:hangingChars'] = ind.hangingChars;
1193
+ } else if (ind.firstLineChars !== undefined) {
1194
+ attributes['w:firstLineChars'] = ind.firstLineChars;
1195
+ }
951
1196
  if (Object.keys(attributes).length > 0) {
952
1197
  pPrChildren.push(XMLBuilder.wSelf('ind', attributes));
953
1198
  }
954
1199
  }
955
1200
 
956
1201
  // Contextual spacing per ECMA-376 Part 1 §17.3.1.8
957
- // Removes spacing between paragraphs of the same style
958
- if (formatting.contextualSpacing) {
959
- pPrChildren.push(XMLBuilder.wSelf('contextualSpacing', { 'w:val': '1' }));
960
- }
1202
+ // Removes spacing between paragraphs of the same style.
1203
+ // Position #24 in CT_PPrBase — after ind, before mirrorIndents.
1204
+ emitCtOnOff('contextualSpacing', formatting.contextualSpacing);
961
1205
 
962
- // Add alignment
1206
+ emitCtOnOff('mirrorIndents', formatting.mirrorIndents); // #25
1207
+ emitCtOnOff('suppressOverlap', formatting.suppressOverlap); // #26
1208
+
1209
+ // Add alignment (jc, CT_PPrBase #27)
963
1210
  if (formatting.alignment) {
964
1211
  // Map 'justify' to 'both' per ECMA-376 (Word uses 'both' for justified text)
965
1212
  const alignmentValue = formatting.alignment === 'justify' ? 'both' : formatting.alignment;
966
1213
  pPrChildren.push(XMLBuilder.wSelf('jc', { 'w:val': alignmentValue }));
967
1214
  }
968
1215
 
1216
+ // textDirection / textAlignment / textboxTightWrap per CT_PPrBase
1217
+ // positions #28-#30. Previously dropped on the style serializer even
1218
+ // though the Paragraph-level generator and the style parser handle
1219
+ // them — a paragraph style that set any of these (e.g. `textDirection:
1220
+ // "tbRl"` for vertical CJK flow) lost the override on any programmatic
1221
+ // save that bypassed raw XML passthrough.
1222
+ if (formatting.textDirection) {
1223
+ pPrChildren.push(XMLBuilder.wSelf('textDirection', { 'w:val': formatting.textDirection }));
1224
+ }
1225
+ if (formatting.textAlignment) {
1226
+ pPrChildren.push(XMLBuilder.wSelf('textAlignment', { 'w:val': formatting.textAlignment }));
1227
+ }
1228
+ if (formatting.textboxTightWrap) {
1229
+ pPrChildren.push(
1230
+ XMLBuilder.wSelf('textboxTightWrap', { 'w:val': formatting.textboxTightWrap })
1231
+ );
1232
+ }
1233
+
969
1234
  // Add outline level for TOC support (Heading 1 = 0, Heading 2 = 1, etc.)
970
1235
  if (formatting.outlineLevel !== undefined) {
971
1236
  pPrChildren.push(
@@ -973,6 +1238,18 @@ export class Style {
973
1238
  );
974
1239
  }
975
1240
 
1241
+ // CT_PPrBase #32 divId (§17.3.1.10) — HTML div association. Numeric.
1242
+ // Previously never emitted on styles; the parser also used to drop it.
1243
+ if (formatting.divId !== undefined) {
1244
+ pPrChildren.push(XMLBuilder.wSelf('divId', { 'w:val': formatting.divId.toString() }));
1245
+ }
1246
+
1247
+ // CT_PPrBase #33 cnfStyle (§17.3.1.8) — conditional formatting bitmask.
1248
+ // Positioned last per schema, after divId and outlineLvl.
1249
+ if (formatting.cnfStyle) {
1250
+ pPrChildren.push(XMLBuilder.wSelf('cnfStyle', { 'w:val': formatting.cnfStyle }));
1251
+ }
1252
+
976
1253
  return XMLBuilder.w('pPr', undefined, pPrChildren);
977
1254
  }
978
1255
 
@@ -1257,42 +1534,61 @@ export class Style {
1257
1534
  for (const prop of borderProps) {
1258
1535
  const border = borders[prop];
1259
1536
  if (border) {
1260
- const attrs: Record<string, string | number> = {};
1261
- if (border.style) attrs['w:val'] = border.style;
1537
+ // CT_Border §17.18.2: w:val required. Default to "nil" so size/color-
1538
+ // only borders in style-level tblBorders/tcBorders still validate.
1539
+ // Emit full CT_Border attribute set for themed-border fidelity.
1540
+ const attrs: Record<string, string | number> = { 'w:val': border.style ?? 'nil' };
1262
1541
  if (border.size !== undefined) attrs['w:sz'] = border.size;
1263
1542
  if (border.space !== undefined) attrs['w:space'] = border.space;
1264
1543
  if (border.color) attrs['w:color'] = border.color;
1265
-
1266
- if (Object.keys(attrs).length > 0) {
1267
- borderElements.push(XMLBuilder.wSelf(prop, attrs));
1268
- }
1544
+ const b = border as {
1545
+ themeColor?: string;
1546
+ themeTint?: string;
1547
+ themeShade?: string;
1548
+ shadow?: boolean;
1549
+ frame?: boolean;
1550
+ };
1551
+ if (b.themeColor) attrs['w:themeColor'] = b.themeColor;
1552
+ if (b.themeTint) attrs['w:themeTint'] = b.themeTint;
1553
+ if (b.themeShade) attrs['w:themeShade'] = b.themeShade;
1554
+ if (b.shadow !== undefined) attrs['w:shadow'] = b.shadow ? '1' : '0';
1555
+ if (b.frame !== undefined) attrs['w:frame'] = b.frame ? '1' : '0';
1556
+ borderElements.push(XMLBuilder.wSelf(prop, attrs));
1269
1557
  }
1270
1558
  }
1271
1559
 
1272
- // Add diagonal borders for cells
1560
+ // Add diagonal borders for cells. CT_Border §17.18.2 requires w:val;
1561
+ // default "nil" matches the other cell-border paths. Full CT_Border
1562
+ // attribute set emitted.
1563
+ const buildDiagonalAttrs = (b: {
1564
+ style?: string;
1565
+ size?: number;
1566
+ space?: number;
1567
+ color?: string;
1568
+ themeColor?: string;
1569
+ themeTint?: string;
1570
+ themeShade?: string;
1571
+ shadow?: boolean;
1572
+ frame?: boolean;
1573
+ }): Record<string, string | number> => {
1574
+ const attrs: Record<string, string | number> = { 'w:val': b.style ?? 'nil' };
1575
+ if (b.size !== undefined) attrs['w:sz'] = b.size;
1576
+ if (b.space !== undefined) attrs['w:space'] = b.space;
1577
+ if (b.color) attrs['w:color'] = b.color;
1578
+ if (b.themeColor) attrs['w:themeColor'] = b.themeColor;
1579
+ if (b.themeTint) attrs['w:themeTint'] = b.themeTint;
1580
+ if (b.themeShade) attrs['w:themeShade'] = b.themeShade;
1581
+ if (b.shadow !== undefined) attrs['w:shadow'] = b.shadow ? '1' : '0';
1582
+ if (b.frame !== undefined) attrs['w:frame'] = b.frame ? '1' : '0';
1583
+ return attrs;
1584
+ };
1273
1585
  if (includeDiagonals) {
1274
1586
  const cellBorders = borders as CellBorders;
1275
1587
  if (cellBorders.tl2br) {
1276
- const attrs: Record<string, string | number> = {};
1277
- if (cellBorders.tl2br.style) attrs['w:val'] = cellBorders.tl2br.style;
1278
- if (cellBorders.tl2br.size !== undefined) attrs['w:sz'] = cellBorders.tl2br.size;
1279
- if (cellBorders.tl2br.space !== undefined) attrs['w:space'] = cellBorders.tl2br.space;
1280
- if (cellBorders.tl2br.color) attrs['w:color'] = cellBorders.tl2br.color;
1281
-
1282
- if (Object.keys(attrs).length > 0) {
1283
- borderElements.push(XMLBuilder.wSelf('tl2br', attrs));
1284
- }
1588
+ borderElements.push(XMLBuilder.wSelf('tl2br', buildDiagonalAttrs(cellBorders.tl2br)));
1285
1589
  }
1286
1590
  if (cellBorders.tr2bl) {
1287
- const attrs: Record<string, string | number> = {};
1288
- if (cellBorders.tr2bl.style) attrs['w:val'] = cellBorders.tr2bl.style;
1289
- if (cellBorders.tr2bl.size !== undefined) attrs['w:sz'] = cellBorders.tr2bl.size;
1290
- if (cellBorders.tr2bl.space !== undefined) attrs['w:space'] = cellBorders.tr2bl.space;
1291
- if (cellBorders.tr2bl.color) attrs['w:color'] = cellBorders.tr2bl.color;
1292
-
1293
- if (Object.keys(attrs).length > 0) {
1294
- borderElements.push(XMLBuilder.wSelf('tr2bl', attrs));
1295
- }
1591
+ borderElements.push(XMLBuilder.wSelf('tr2bl', buildDiagonalAttrs(cellBorders.tr2bl)));
1296
1592
  }
1297
1593
  }
1298
1594
 
@@ -3,10 +3,10 @@
3
3
  * Handles style registration, retrieval, and styles.xml generation
4
4
  */
5
5
 
6
- import { Paragraph } from '../elements/Paragraph';
7
- import { XMLBuilder } from '../xml/XMLBuilder';
8
- import { XMLParser } from '../xml/XMLParser';
9
- import { Style, StyleType } from './Style';
6
+ import { Paragraph } from '../elements/Paragraph.js';
7
+ import { XMLBuilder } from '../xml/XMLBuilder.js';
8
+ import { XMLParser } from '../xml/XMLParser.js';
9
+ import { Style, StyleType } from './Style.js';
10
10
 
11
11
  /**
12
12
  * Configuration for latent styles (w:latentStyles per ECMA-376 §17.7.4.6)
@@ -15,12 +15,12 @@
15
15
  * cleanup.all(); // Run all cleanups
16
16
  */
17
17
 
18
- import type { Document } from '../core/Document';
19
- import { Field, ComplexField } from '../elements/Field';
20
- import { Hyperlink } from '../elements/Hyperlink';
21
- import { Paragraph } from '../elements/Paragraph';
22
- import { Table } from '../elements/Table';
23
- import { StructuredDocumentTag } from '../elements/StructuredDocumentTag';
18
+ import type { Document } from '../core/Document.js';
19
+ import { Field, ComplexField } from '../elements/Field.js';
20
+ import { Hyperlink } from '../elements/Hyperlink.js';
21
+ import { Paragraph } from '../elements/Paragraph.js';
22
+ import { Table } from '../elements/Table.js';
23
+ import { StructuredDocumentTag } from '../elements/StructuredDocumentTag.js';
24
24
 
25
25
  export interface CleanupOptions {
26
26
  /** Unlock all SDTs to enable editing */