@stll/folio-core 0.0.1-placeholder.0 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (683) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE.md +29 -0
  3. package/README.md +41 -0
  4. package/dist/_virtual/_rolldown/runtime.js +13 -0
  5. package/dist/ai-edits/apply.d.ts +35 -0
  6. package/dist/ai-edits/apply.js +683 -0
  7. package/dist/ai-edits/clean-text.d.ts +28 -0
  8. package/dist/ai-edits/clean-text.js +23 -0
  9. package/dist/ai-edits/headless.d.ts +225 -0
  10. package/dist/ai-edits/headless.js +513 -0
  11. package/dist/ai-edits/index.d.ts +6 -0
  12. package/dist/ai-edits/index.js +5 -0
  13. package/dist/ai-edits/inline-emphasis.d.ts +38 -0
  14. package/dist/ai-edits/inline-emphasis.js +78 -0
  15. package/dist/ai-edits/snapshot.d.ts +9 -0
  16. package/dist/ai-edits/snapshot.js +195 -0
  17. package/dist/ai-edits/types.d.ts +156 -0
  18. package/dist/ai-edits/types.js +0 -0
  19. package/dist/ai-edits/word-diff.d.ts +20 -0
  20. package/dist/ai-edits/word-diff.js +77 -0
  21. package/dist/ai-suggestions/apply.d.ts +17 -0
  22. package/dist/ai-suggestions/apply.js +64 -0
  23. package/dist/ai-suggestions/conflict.d.ts +22 -0
  24. package/dist/ai-suggestions/conflict.js +67 -0
  25. package/dist/ai-suggestions/text-positions.d.ts +21 -0
  26. package/dist/ai-suggestions/text-positions.js +48 -0
  27. package/dist/ai-suggestions/types.d.ts +199 -0
  28. package/dist/ai-suggestions/types.js +59 -0
  29. package/dist/content-controls/errors.d.ts +52 -0
  30. package/dist/content-controls/errors.js +36 -0
  31. package/dist/content-controls/findContentControls.d.ts +55 -0
  32. package/dist/content-controls/findContentControls.js +75 -0
  33. package/dist/content-controls/index.d.ts +4 -0
  34. package/dist/content-controls/index.js +4 -0
  35. package/dist/content-controls/mutateContentControls.d.ts +51 -0
  36. package/dist/content-controls/mutateContentControls.js +377 -0
  37. package/dist/controller/folioEditor.d.ts +21 -0
  38. package/dist/controller/folioEditor.js +29 -0
  39. package/dist/controller/folioEditorEvents.d.ts +23 -0
  40. package/dist/controller/folioEditorEvents.js +24 -0
  41. package/dist/controller/hiddenEditorApi.d.ts +35 -0
  42. package/dist/controller/hiddenEditorApi.js +112 -0
  43. package/dist/controller/hiddenEditorManager.d.ts +93 -0
  44. package/dist/controller/hiddenEditorManager.js +308 -0
  45. package/dist/controller/layoutPipeline.d.ts +63 -0
  46. package/dist/controller/layoutPipeline.js +406 -0
  47. package/dist/controller/layoutScheduler.d.ts +41 -0
  48. package/dist/controller/layoutScheduler.js +59 -0
  49. package/dist/controller/layoutSession.d.ts +24 -0
  50. package/dist/controller/layoutSession.js +13 -0
  51. package/dist/docx/blockContentParser.d.ts +13 -0
  52. package/dist/docx/blockContentParser.js +289 -0
  53. package/dist/docx/bookmarkParser.d.ts +178 -0
  54. package/dist/docx/bookmarkParser.js +246 -0
  55. package/dist/docx/bookmarkPlacement.d.ts +10 -0
  56. package/dist/docx/bookmarkPlacement.js +50 -0
  57. package/dist/docx/bulletMarkers.d.ts +4 -0
  58. package/dist/docx/bulletMarkers.js +42 -0
  59. package/dist/docx/commentParser.d.ts +34 -0
  60. package/dist/docx/commentParser.js +127 -0
  61. package/dist/docx/commentReferenceNormalization.d.ts +25 -0
  62. package/dist/docx/commentReferenceNormalization.js +97 -0
  63. package/dist/docx/commentReplyMarkers.d.ts +20 -0
  64. package/dist/docx/commentReplyMarkers.js +123 -0
  65. package/dist/docx/compatibility.d.ts +12 -0
  66. package/dist/docx/compatibility.js +77 -0
  67. package/dist/docx/documentParser.d.ts +65 -0
  68. package/dist/docx/documentParser.js +209 -0
  69. package/dist/docx/drawingUtils.d.ts +56 -0
  70. package/dist/docx/drawingUtils.js +305 -0
  71. package/dist/docx/fieldParser.d.ts +228 -0
  72. package/dist/docx/fieldParser.js +559 -0
  73. package/dist/docx/footnoteParser.d.ts +109 -0
  74. package/dist/docx/footnoteParser.js +270 -0
  75. package/dist/docx/headerFooterParser.d.ts +119 -0
  76. package/dist/docx/headerFooterParser.js +266 -0
  77. package/dist/docx/headerFooterRefParser.d.ts +22 -0
  78. package/dist/docx/headerFooterRefParser.js +52 -0
  79. package/dist/docx/headerFooterReferenceNormalization.d.ts +19 -0
  80. package/dist/docx/headerFooterReferenceNormalization.js +64 -0
  81. package/dist/docx/hyperlinkParser.d.ts +108 -0
  82. package/dist/docx/hyperlinkParser.js +230 -0
  83. package/dist/docx/imageParser.d.ts +93 -0
  84. package/dist/docx/imageParser.js +522 -0
  85. package/dist/docx/mathToMathml.d.ts +15 -0
  86. package/dist/docx/mathToMathml.js +357 -0
  87. package/dist/docx/modelValidation.d.ts +13 -0
  88. package/dist/docx/modelValidation.js +21 -0
  89. package/dist/docx/normalizeBaseDirection.d.ts +12 -0
  90. package/dist/docx/normalizeBaseDirection.js +81 -0
  91. package/dist/docx/notePropertiesParser.d.ts +16 -0
  92. package/dist/docx/notePropertiesParser.js +99 -0
  93. package/dist/docx/numberingParser.d.ts +86 -0
  94. package/dist/docx/numberingParser.js +735 -0
  95. package/dist/docx/numberingReferenceNormalization.d.ts +25 -0
  96. package/dist/docx/numberingReferenceNormalization.js +22 -0
  97. package/dist/docx/paragraphParser.d.ts +86 -0
  98. package/dist/docx/paragraphParser.js +1132 -0
  99. package/dist/docx/paragraphTraversal.d.ts +19 -0
  100. package/dist/docx/paragraphTraversal.js +76 -0
  101. package/dist/docx/parser.d.ts +67 -0
  102. package/dist/docx/parser.js +391 -0
  103. package/dist/docx/parserEnums.d.ts +45 -0
  104. package/dist/docx/parserEnums.js +70 -0
  105. package/dist/docx/relsParser.d.ts +160 -0
  106. package/dist/docx/relsParser.js +235 -0
  107. package/dist/docx/replyToComment.d.ts +29 -0
  108. package/dist/docx/replyToComment.js +73 -0
  109. package/dist/docx/rezip.d.ts +166 -0
  110. package/dist/docx/rezip.js +1194 -0
  111. package/dist/docx/runConsolidator.d.ts +57 -0
  112. package/dist/docx/runConsolidator.js +224 -0
  113. package/dist/docx/runParser.d.ts +78 -0
  114. package/dist/docx/runParser.js +661 -0
  115. package/dist/docx/sdtProperties.d.ts +15 -0
  116. package/dist/docx/sdtProperties.js +290 -0
  117. package/dist/docx/sdtPropertiesPatch.d.ts +16 -0
  118. package/dist/docx/sdtPropertiesPatch.js +144 -0
  119. package/dist/docx/sectionParser.d.ts +95 -0
  120. package/dist/docx/sectionParser.js +534 -0
  121. package/dist/docx/selectiveSave.d.ts +25 -0
  122. package/dist/docx/selectiveSave.js +247 -0
  123. package/dist/docx/selectiveSaveFlags.d.ts +33 -0
  124. package/dist/docx/selectiveSaveFlags.js +11 -0
  125. package/dist/docx/selectiveSaveTripwire.d.ts +33 -0
  126. package/dist/docx/selectiveSaveTripwire.js +79 -0
  127. package/dist/docx/selectiveXmlPatch.d.ts +103 -0
  128. package/dist/docx/selectiveXmlPatch.js +493 -0
  129. package/dist/docx/serializer/blockSdtSerializer.d.ts +6 -0
  130. package/dist/docx/serializer/blockSdtSerializer.js +88 -0
  131. package/dist/docx/serializer/borderSerializer.d.ts +25 -0
  132. package/dist/docx/serializer/borderSerializer.js +44 -0
  133. package/dist/docx/serializer/commentSerializer.d.ts +31 -0
  134. package/dist/docx/serializer/commentSerializer.js +184 -0
  135. package/dist/docx/serializer/documentSerializer.d.ts +65 -0
  136. package/dist/docx/serializer/documentSerializer.js +199 -0
  137. package/dist/docx/serializer/headerFooterSerializer.d.ts +12 -0
  138. package/dist/docx/serializer/headerFooterSerializer.js +84 -0
  139. package/dist/docx/serializer/noteSerializer.d.ts +19 -0
  140. package/dist/docx/serializer/noteSerializer.js +70 -0
  141. package/dist/docx/serializer/numberingSerializer.d.ts +12 -0
  142. package/dist/docx/serializer/numberingSerializer.js +93 -0
  143. package/dist/docx/serializer/paragraphSerializer.d.ts +48 -0
  144. package/dist/docx/serializer/paragraphSerializer.js +559 -0
  145. package/dist/docx/serializer/runSerializer.d.ts +56 -0
  146. package/dist/docx/serializer/runSerializer.js +621 -0
  147. package/dist/docx/serializer/sectionPropertiesSerializer.d.ts +6 -0
  148. package/dist/docx/serializer/sectionPropertiesSerializer.js +187 -0
  149. package/dist/docx/serializer/tableSerializer.d.ts +79 -0
  150. package/dist/docx/serializer/tableSerializer.js +422 -0
  151. package/dist/docx/serializer/xmlUtils.d.ts +20 -0
  152. package/dist/docx/serializer/xmlUtils.js +25 -0
  153. package/dist/docx/settingsParser.d.ts +8 -0
  154. package/dist/docx/settingsParser.js +36 -0
  155. package/dist/docx/shapeParser.d.ts +20 -0
  156. package/dist/docx/shapeParser.js +272 -0
  157. package/dist/docx/styleParser.d.ts +50 -0
  158. package/dist/docx/styleParser.js +905 -0
  159. package/dist/docx/tableParser.d.ts +202 -0
  160. package/dist/docx/tableParser.js +811 -0
  161. package/dist/docx/textBoxParser.d.ts +117 -0
  162. package/dist/docx/textBoxParser.js +262 -0
  163. package/dist/docx/themeParser.d.ts +77 -0
  164. package/dist/docx/themeParser.js +330 -0
  165. package/dist/docx/trackedMoveRangeNormalization.d.ts +22 -0
  166. package/dist/docx/trackedMoveRangeNormalization.js +100 -0
  167. package/dist/docx/unzip.d.ts +118 -0
  168. package/dist/docx/unzip.js +383 -0
  169. package/dist/docx/vmlImageParser.d.ts +16 -0
  170. package/dist/docx/vmlImageParser.js +100 -0
  171. package/dist/docx/watermarkParser.d.ts +45 -0
  172. package/dist/docx/watermarkParser.js +348 -0
  173. package/dist/docx/wrapTypes.d.ts +29 -0
  174. package/dist/docx/wrapTypes.js +48 -0
  175. package/dist/docx/xmlParser.d.ts +297 -0
  176. package/dist/docx/xmlParser.js +527 -0
  177. package/dist/fields/bookmarkPages.d.ts +13 -0
  178. package/dist/fields/bookmarkPages.js +66 -0
  179. package/dist/fields/bookmarkText.d.ts +16 -0
  180. package/dist/fields/bookmarkText.js +61 -0
  181. package/dist/fields/evaluateField.d.ts +23 -0
  182. package/dist/fields/evaluateField.js +77 -0
  183. package/dist/fields/fieldContext.d.ts +21 -0
  184. package/dist/fields/fieldContext.js +0 -0
  185. package/dist/fields/resolveFieldValues.d.ts +44 -0
  186. package/dist/fields/resolveFieldValues.js +204 -0
  187. package/dist/fields/sectionPageCounts.d.ts +11 -0
  188. package/dist/fields/sectionPageCounts.js +16 -0
  189. package/dist/fields/seqValues.d.ts +14 -0
  190. package/dist/fields/seqValues.js +36 -0
  191. package/dist/fonts/embeddedFontTable.d.ts +42 -0
  192. package/dist/fonts/embeddedFontTable.js +80 -0
  193. package/dist/fonts/embeddedFonts.d.ts +46 -0
  194. package/dist/fonts/embeddedFonts.js +112 -0
  195. package/dist/fonts/fontDeobfuscation.d.ts +30 -0
  196. package/dist/fonts/fontDeobfuscation.js +57 -0
  197. package/dist/index.d.ts +28 -0
  198. package/dist/index.js +23 -0
  199. package/dist/layout-bridge/convert/footnoteLayout.d.ts +57 -0
  200. package/dist/layout-bridge/convert/footnoteLayout.js +316 -0
  201. package/dist/layout-bridge/convert/headerFooterLayout.d.ts +74 -0
  202. package/dist/layout-bridge/convert/headerFooterLayout.js +432 -0
  203. package/dist/layout-bridge/convert/templatePreviewFlow.d.ts +36 -0
  204. package/dist/layout-bridge/convert/templatePreviewFlow.js +176 -0
  205. package/dist/layout-bridge/convert/toFlowBlocks.d.ts +65 -0
  206. package/dist/layout-bridge/convert/toFlowBlocks.js +1309 -0
  207. package/dist/layout-bridge/convert/wrapEditorViewAsSurface.d.ts +17 -0
  208. package/dist/layout-bridge/convert/wrapEditorViewAsSurface.js +36 -0
  209. package/dist/layout-bridge/dom/clickToPositionDom.d.ts +66 -0
  210. package/dist/layout-bridge/dom/clickToPositionDom.js +304 -0
  211. package/dist/layout-bridge/dom/findBodyPmSpans.d.ts +7 -0
  212. package/dist/layout-bridge/dom/findBodyPmSpans.js +17 -0
  213. package/dist/layout-bridge/dom/findHfPmSpans.d.ts +62 -0
  214. package/dist/layout-bridge/dom/findHfPmSpans.js +197 -0
  215. package/dist/layout-bridge/engine/clickToPosition.d.ts +66 -0
  216. package/dist/layout-bridge/engine/clickToPosition.js +403 -0
  217. package/dist/layout-bridge/engine/hitTest.d.ts +135 -0
  218. package/dist/layout-bridge/engine/hitTest.js +375 -0
  219. package/dist/layout-bridge/engine/measuring/index.d.ts +10 -0
  220. package/dist/layout-bridge/engine/measuring/index.js +9 -0
  221. package/dist/layout-bridge/engine/selectionRects.d.ts +59 -0
  222. package/dist/layout-bridge/engine/selectionRects.js +485 -0
  223. package/dist/layout-bridge/engine/tableWidthUtils.d.ts +7 -0
  224. package/dist/layout-bridge/engine/tableWidthUtils.js +25 -0
  225. package/dist/layout-engine/index.d.ts +44 -0
  226. package/dist/layout-engine/index.js +691 -0
  227. package/dist/layout-engine/keep-together.d.ts +43 -0
  228. package/dist/layout-engine/keep-together.js +98 -0
  229. package/dist/layout-engine/layoutInstrumentation.d.ts +50 -0
  230. package/dist/layout-engine/layoutInstrumentation.js +43 -0
  231. package/dist/layout-engine/lineFlow.d.ts +8 -0
  232. package/dist/layout-engine/lineFlow.js +17 -0
  233. package/dist/layout-engine/measure/cache.d.ts +93 -0
  234. package/dist/layout-engine/measure/cache.js +245 -0
  235. package/dist/layout-engine/measure/clampFloatingWrapMargins.d.ts +20 -0
  236. package/dist/layout-engine/measure/clampFloatingWrapMargins.js +29 -0
  237. package/dist/layout-engine/measure/featureFlags.d.ts +44 -0
  238. package/dist/layout-engine/measure/featureFlags.js +19 -0
  239. package/dist/layout-engine/measure/floatingZones.d.ts +89 -0
  240. package/dist/layout-engine/measure/floatingZones.js +152 -0
  241. package/dist/layout-engine/measure/font-metrics.worker.d.ts +17 -0
  242. package/dist/layout-engine/measure/font-metrics.worker.js +104 -0
  243. package/dist/layout-engine/measure/index.d.ts +9 -0
  244. package/dist/layout-engine/measure/index.js +8 -0
  245. package/dist/layout-engine/measure/listMarkerWidth.d.ts +40 -0
  246. package/dist/layout-engine/measure/listMarkerWidth.js +76 -0
  247. package/dist/layout-engine/measure/measureBlocks.d.ts +25 -0
  248. package/dist/layout-engine/measure/measureBlocks.js +450 -0
  249. package/dist/layout-engine/measure/measureContainer.d.ts +24 -0
  250. package/dist/layout-engine/measure/measureContainer.js +280 -0
  251. package/dist/layout-engine/measure/measureHelpers.d.ts +82 -0
  252. package/dist/layout-engine/measure/measureHelpers.js +156 -0
  253. package/dist/layout-engine/measure/measureParagraph.d.ts +61 -0
  254. package/dist/layout-engine/measure/measureParagraph.js +724 -0
  255. package/dist/layout-engine/measure/measureProvider.d.ts +23 -0
  256. package/dist/layout-engine/measure/measureProvider.js +35 -0
  257. package/dist/layout-engine/measure/measureTypes.d.ts +61 -0
  258. package/dist/layout-engine/measure/measureTypes.js +0 -0
  259. package/dist/layout-engine/measure/measureWorker.d.ts +54 -0
  260. package/dist/layout-engine/measure/measureWorker.js +249 -0
  261. package/dist/layout-engine/measure/measureWorkerProtocol.d.ts +88 -0
  262. package/dist/layout-engine/measure/measureWorkerProtocol.js +20 -0
  263. package/dist/layout-engine/measure/tableCellFloating.d.ts +26 -0
  264. package/dist/layout-engine/measure/tableCellFloating.js +99 -0
  265. package/dist/layout-engine/paginator.d.ts +84 -0
  266. package/dist/layout-engine/paginator.js +348 -0
  267. package/dist/layout-engine/paragraphFragmentRange.d.ts +9 -0
  268. package/dist/layout-engine/paragraphFragmentRange.js +40 -0
  269. package/dist/layout-engine/section-breaks.d.ts +78 -0
  270. package/dist/layout-engine/section-breaks.js +182 -0
  271. package/dist/layout-engine/tableRowBreak.d.ts +23 -0
  272. package/dist/layout-engine/tableRowBreak.js +147 -0
  273. package/dist/layout-engine/textBoxFlow.d.ts +50 -0
  274. package/dist/layout-engine/textBoxFlow.js +160 -0
  275. package/dist/layout-engine/types.d.ts +1031 -0
  276. package/dist/layout-engine/types.js +100 -0
  277. package/dist/layout-painter/documentColors.d.ts +4 -0
  278. package/dist/layout-painter/documentColors.js +40 -0
  279. package/dist/layout-painter/index.d.ts +110 -0
  280. package/dist/layout-painter/index.js +182 -0
  281. package/dist/layout-painter/registry/modules/image.d.ts +6 -0
  282. package/dist/layout-painter/registry/modules/image.js +17 -0
  283. package/dist/layout-painter/registry/modules/paragraph.d.ts +6 -0
  284. package/dist/layout-painter/registry/modules/paragraph.js +18 -0
  285. package/dist/layout-painter/registry/modules/table.d.ts +6 -0
  286. package/dist/layout-painter/registry/modules/table.js +16 -0
  287. package/dist/layout-painter/registry/modules/textBox.d.ts +6 -0
  288. package/dist/layout-painter/registry/modules/textBox.js +13 -0
  289. package/dist/layout-painter/registry/modules.d.ts +6 -0
  290. package/dist/layout-painter/registry/modules.js +26 -0
  291. package/dist/layout-painter/registry/registry.d.ts +24 -0
  292. package/dist/layout-painter/registry/registry.js +53 -0
  293. package/dist/layout-painter/registry/types.d.ts +61 -0
  294. package/dist/layout-painter/registry/types.js +0 -0
  295. package/dist/layout-painter/renderFragment.d.ts +32 -0
  296. package/dist/layout-painter/renderFragment.js +114 -0
  297. package/dist/layout-painter/renderImage.d.ts +88 -0
  298. package/dist/layout-painter/renderImage.js +130 -0
  299. package/dist/layout-painter/renderPage.d.ts +264 -0
  300. package/dist/layout-painter/renderPage.js +1795 -0
  301. package/dist/layout-painter/renderParagraph.d.ts +93 -0
  302. package/dist/layout-painter/renderParagraph.js +1300 -0
  303. package/dist/layout-painter/renderTable.d.ts +36 -0
  304. package/dist/layout-painter/renderTable.js +432 -0
  305. package/dist/layout-painter/renderTextBox.d.ts +22 -0
  306. package/dist/layout-painter/renderTextBox.js +67 -0
  307. package/dist/layout-painter/renderUtils.d.ts +42 -0
  308. package/dist/layout-painter/renderUtils.js +30 -0
  309. package/dist/layout-painter/renderWatermark.d.ts +16 -0
  310. package/dist/layout-painter/renderWatermark.js +61 -0
  311. package/dist/layout-painter/sdtBoundary.d.ts +6 -0
  312. package/dist/layout-painter/sdtBoundary.js +28 -0
  313. package/dist/managers/ContextMenuManager.d.ts +28 -0
  314. package/dist/managers/ContextMenuManager.js +48 -0
  315. package/dist/managers/DocumentLoaderManager.d.ts +47 -0
  316. package/dist/managers/DocumentLoaderManager.js +69 -0
  317. package/dist/managers/EditorModeManager.d.ts +28 -0
  318. package/dist/managers/EditorModeManager.js +50 -0
  319. package/dist/managers/ErrorManager.d.ts +26 -0
  320. package/dist/managers/ErrorManager.js +85 -0
  321. package/dist/managers/FindReplaceManager.d.ts +54 -0
  322. package/dist/managers/FindReplaceManager.js +104 -0
  323. package/dist/managers/HistoryManager.d.ts +92 -0
  324. package/dist/managers/HistoryManager.js +193 -0
  325. package/dist/managers/Subscribable.d.ts +34 -0
  326. package/dist/managers/Subscribable.js +46 -0
  327. package/dist/managers/TableSelectionManager.d.ts +74 -0
  328. package/dist/managers/TableSelectionManager.js +225 -0
  329. package/dist/managers/editorShortcuts.d.ts +42 -0
  330. package/dist/managers/editorShortcuts.js +60 -0
  331. package/dist/managers/types.d.ts +41 -0
  332. package/dist/managers/types.js +0 -0
  333. package/dist/markdown/annotations.d.ts +14 -0
  334. package/dist/markdown/annotations.js +42 -0
  335. package/dist/markdown/escape.d.ts +36 -0
  336. package/dist/markdown/escape.js +59 -0
  337. package/dist/markdown/fromMarkdown.d.ts +11 -0
  338. package/dist/markdown/fromMarkdown.js +223 -0
  339. package/dist/markdown/headings.d.ts +13 -0
  340. package/dist/markdown/headings.js +20 -0
  341. package/dist/markdown/images.d.ts +13 -0
  342. package/dist/markdown/images.js +63 -0
  343. package/dist/markdown/index.d.ts +18 -0
  344. package/dist/markdown/index.js +33 -0
  345. package/dist/markdown/internals.d.ts +15 -0
  346. package/dist/markdown/internals.js +35 -0
  347. package/dist/markdown/renderBlock.d.ts +7 -0
  348. package/dist/markdown/renderBlock.js +68 -0
  349. package/dist/markdown/renderParagraph.d.ts +11 -0
  350. package/dist/markdown/renderParagraph.js +64 -0
  351. package/dist/markdown/renderRuns.d.ts +11 -0
  352. package/dist/markdown/renderRuns.js +265 -0
  353. package/dist/markdown/renderTable.d.ts +8 -0
  354. package/dist/markdown/renderTable.js +229 -0
  355. package/dist/markdown/trailers.d.ts +13 -0
  356. package/dist/markdown/trailers.js +54 -0
  357. package/dist/markdown/types.d.ts +118 -0
  358. package/dist/markdown/types.js +0 -0
  359. package/dist/model.d.ts +13 -0
  360. package/dist/model.js +4 -0
  361. package/dist/paged-layout/LayoutSelectionGate.d.ts +80 -0
  362. package/dist/paged-layout/LayoutSelectionGate.js +131 -0
  363. package/dist/paged-layout/headerFooterMargins.d.ts +73 -0
  364. package/dist/paged-layout/headerFooterMargins.js +120 -0
  365. package/dist/paged-layout/hiddenEditorScroll.d.ts +4 -0
  366. package/dist/paged-layout/hiddenEditorScroll.js +4 -0
  367. package/dist/paged-layout/incrementalMeasure.d.ts +33 -0
  368. package/dist/paged-layout/incrementalMeasure.js +56 -0
  369. package/dist/paged-layout/rangeProjection.d.ts +51 -0
  370. package/dist/paged-layout/rangeProjection.js +153 -0
  371. package/dist/paged-layout/readOnlyEditAttempt.d.ts +5 -0
  372. package/dist/paged-layout/readOnlyEditAttempt.js +22 -0
  373. package/dist/paged-layout/scrollNavigation.d.ts +23 -0
  374. package/dist/paged-layout/scrollNavigation.js +31 -0
  375. package/dist/paged-layout/scrollPageInfo.d.ts +41 -0
  376. package/dist/paged-layout/scrollPageInfo.js +34 -0
  377. package/dist/paged-layout/scrollToPmPosition.d.ts +17 -0
  378. package/dist/paged-layout/scrollToPmPosition.js +95 -0
  379. package/dist/paged-layout/sectionBlockWidths.d.ts +35 -0
  380. package/dist/paged-layout/sectionBlockWidths.js +52 -0
  381. package/dist/paged-layout/sectionGeometry.d.ts +21 -0
  382. package/dist/paged-layout/sectionGeometry.js +36 -0
  383. package/dist/paged-layout/selectionViewportRect.d.ts +29 -0
  384. package/dist/paged-layout/selectionViewportRect.js +55 -0
  385. package/dist/paged-layout/tableColumnResize.d.ts +19 -0
  386. package/dist/paged-layout/tableColumnResize.js +28 -0
  387. package/dist/paged-layout/tableInsertButtonGeometry.d.ts +15 -0
  388. package/dist/paged-layout/tableInsertButtonGeometry.js +15 -0
  389. package/dist/paged-layout/transactionDirtyRange.d.ts +7 -0
  390. package/dist/paged-layout/transactionDirtyRange.js +27 -0
  391. package/dist/paged-layout/zoomScrollAnchor.d.ts +40 -0
  392. package/dist/paged-layout/zoomScrollAnchor.js +25 -0
  393. package/dist/prosemirror/attrs/index.d.ts +80 -0
  394. package/dist/prosemirror/attrs/index.js +1218 -0
  395. package/dist/prosemirror/autospacingBase.d.ts +11 -0
  396. package/dist/prosemirror/autospacingBase.js +16 -0
  397. package/dist/prosemirror/commands/comments.d.ts +93 -0
  398. package/dist/prosemirror/commands/comments.js +435 -0
  399. package/dist/prosemirror/commands/contentControls.d.ts +45 -0
  400. package/dist/prosemirror/commands/contentControls.js +294 -0
  401. package/dist/prosemirror/commands/contentControlsBlockFill.d.ts +15 -0
  402. package/dist/prosemirror/commands/contentControlsBlockFill.js +19 -0
  403. package/dist/prosemirror/commands/formatPainter.d.ts +31 -0
  404. package/dist/prosemirror/commands/formatPainter.js +130 -0
  405. package/dist/prosemirror/commands/formatting.d.ts +32 -0
  406. package/dist/prosemirror/commands/formatting.js +45 -0
  407. package/dist/prosemirror/commands/hyperlink.d.ts +31 -0
  408. package/dist/prosemirror/commands/hyperlink.js +79 -0
  409. package/dist/prosemirror/commands/image.d.ts +59 -0
  410. package/dist/prosemirror/commands/image.js +219 -0
  411. package/dist/prosemirror/commands/index.d.ts +13 -0
  412. package/dist/prosemirror/commands/index.js +13 -0
  413. package/dist/prosemirror/commands/pageBreak.d.ts +10 -0
  414. package/dist/prosemirror/commands/pageBreak.js +47 -0
  415. package/dist/prosemirror/commands/paragraph.d.ts +39 -0
  416. package/dist/prosemirror/commands/paragraph.js +64 -0
  417. package/dist/prosemirror/commands/pastePlainText.d.ts +39 -0
  418. package/dist/prosemirror/commands/pastePlainText.js +67 -0
  419. package/dist/prosemirror/commands/table.d.ts +83 -0
  420. package/dist/prosemirror/commands/table.js +105 -0
  421. package/dist/prosemirror/conversion/fromProseDoc.d.ts +27 -0
  422. package/dist/prosemirror/conversion/fromProseDoc.js +1550 -0
  423. package/dist/prosemirror/conversion/index.d.ts +4 -0
  424. package/dist/prosemirror/conversion/index.js +4 -0
  425. package/dist/prosemirror/conversion/runShadingMark.d.ts +16 -0
  426. package/dist/prosemirror/conversion/runShadingMark.js +39 -0
  427. package/dist/prosemirror/conversion/toProseDoc.d.ts +39 -0
  428. package/dist/prosemirror/conversion/toProseDoc.js +1404 -0
  429. package/dist/prosemirror/extensions/ExtensionManager.d.ts +43 -0
  430. package/dist/prosemirror/extensions/ExtensionManager.js +86 -0
  431. package/dist/prosemirror/extensions/StarterKit.d.ts +16 -0
  432. package/dist/prosemirror/extensions/StarterKit.js +132 -0
  433. package/dist/prosemirror/extensions/core/DocExtension.d.ts +9 -0
  434. package/dist/prosemirror/extensions/core/DocExtension.js +12 -0
  435. package/dist/prosemirror/extensions/core/HistoryExtension.d.ts +13 -0
  436. package/dist/prosemirror/extensions/core/HistoryExtension.js +28 -0
  437. package/dist/prosemirror/extensions/core/ParagraphExtension.d.ts +25 -0
  438. package/dist/prosemirror/extensions/core/ParagraphExtension.js +619 -0
  439. package/dist/prosemirror/extensions/core/TextExtension.d.ts +9 -0
  440. package/dist/prosemirror/extensions/core/TextExtension.js +12 -0
  441. package/dist/prosemirror/extensions/create.d.ts +17 -0
  442. package/dist/prosemirror/extensions/create.js +129 -0
  443. package/dist/prosemirror/extensions/features/AutoBidiDetectionExtension.d.ts +23 -0
  444. package/dist/prosemirror/extensions/features/AutoBidiDetectionExtension.js +106 -0
  445. package/dist/prosemirror/extensions/features/BaseKeymapExtension.d.ts +8 -0
  446. package/dist/prosemirror/extensions/features/BaseKeymapExtension.js +172 -0
  447. package/dist/prosemirror/extensions/features/BidiShortcutExtension.d.ts +16 -0
  448. package/dist/prosemirror/extensions/features/BidiShortcutExtension.js +38 -0
  449. package/dist/prosemirror/extensions/features/ContentControlWidgetsExtension.d.ts +16 -0
  450. package/dist/prosemirror/extensions/features/ContentControlWidgetsExtension.js +21 -0
  451. package/dist/prosemirror/extensions/features/DropCursorExtension.d.ts +12 -0
  452. package/dist/prosemirror/extensions/features/DropCursorExtension.js +20 -0
  453. package/dist/prosemirror/extensions/features/EmptyParagraphFormatExtension.d.ts +8 -0
  454. package/dist/prosemirror/extensions/features/EmptyParagraphFormatExtension.js +44 -0
  455. package/dist/prosemirror/extensions/features/GapCursorExtension.d.ts +19 -0
  456. package/dist/prosemirror/extensions/features/GapCursorExtension.js +24 -0
  457. package/dist/prosemirror/extensions/features/ImageDragExtension.d.ts +15 -0
  458. package/dist/prosemirror/extensions/features/ImageDragExtension.js +66 -0
  459. package/dist/prosemirror/extensions/features/ImagePasteExtension.d.ts +12 -0
  460. package/dist/prosemirror/extensions/features/ImagePasteExtension.js +91 -0
  461. package/dist/prosemirror/extensions/features/ListExtension.d.ts +14 -0
  462. package/dist/prosemirror/extensions/features/ListExtension.js +340 -0
  463. package/dist/prosemirror/extensions/features/ParaIdAllocatorExtension.d.ts +9 -0
  464. package/dist/prosemirror/extensions/features/ParaIdAllocatorExtension.js +60 -0
  465. package/dist/prosemirror/extensions/features/ParagraphChangeTrackerExtension.d.ts +35 -0
  466. package/dist/prosemirror/extensions/features/ParagraphChangeTrackerExtension.js +188 -0
  467. package/dist/prosemirror/extensions/features/PasteCleanupExtension.d.ts +20 -0
  468. package/dist/prosemirror/extensions/features/PasteCleanupExtension.js +34 -0
  469. package/dist/prosemirror/extensions/features/PasteStyleInlinerExtension.d.ts +20 -0
  470. package/dist/prosemirror/extensions/features/PasteStyleInlinerExtension.js +145 -0
  471. package/dist/prosemirror/extensions/features/SelectionTrackerExtension.d.ts +10 -0
  472. package/dist/prosemirror/extensions/features/SelectionTrackerExtension.js +17 -0
  473. package/dist/prosemirror/extensions/features/bidiShortcutController.d.ts +31 -0
  474. package/dist/prosemirror/extensions/features/bidiShortcutController.js +27 -0
  475. package/dist/prosemirror/extensions/features/pasteCleanup.d.ts +31 -0
  476. package/dist/prosemirror/extensions/features/pasteCleanup.js +159 -0
  477. package/dist/prosemirror/extensions/marks/AllCapsExtension.d.ts +9 -0
  478. package/dist/prosemirror/extensions/marks/AllCapsExtension.js +24 -0
  479. package/dist/prosemirror/extensions/marks/BoldExtension.d.ts +9 -0
  480. package/dist/prosemirror/extensions/marks/BoldExtension.js +41 -0
  481. package/dist/prosemirror/extensions/marks/CharacterSpacingExtension.d.ts +14 -0
  482. package/dist/prosemirror/extensions/marks/CharacterSpacingExtension.js +64 -0
  483. package/dist/prosemirror/extensions/marks/CharacterStyleExtension.d.ts +23 -0
  484. package/dist/prosemirror/extensions/marks/CharacterStyleExtension.js +47 -0
  485. package/dist/prosemirror/extensions/marks/CommentExtension.d.ts +12 -0
  486. package/dist/prosemirror/extensions/marks/CommentExtension.js +38 -0
  487. package/dist/prosemirror/extensions/marks/FontFamilyExtension.d.ts +9 -0
  488. package/dist/prosemirror/extensions/marks/FontFamilyExtension.js +55 -0
  489. package/dist/prosemirror/extensions/marks/FontSizeExtension.d.ts +9 -0
  490. package/dist/prosemirror/extensions/marks/FontSizeExtension.js +47 -0
  491. package/dist/prosemirror/extensions/marks/FootnoteRefExtension.d.ts +11 -0
  492. package/dist/prosemirror/extensions/marks/FootnoteRefExtension.js +92 -0
  493. package/dist/prosemirror/extensions/marks/HiddenTextExtension.d.ts +23 -0
  494. package/dist/prosemirror/extensions/marks/HiddenTextExtension.js +35 -0
  495. package/dist/prosemirror/extensions/marks/HighlightExtension.d.ts +10 -0
  496. package/dist/prosemirror/extensions/marks/HighlightExtension.js +115 -0
  497. package/dist/prosemirror/extensions/marks/HyperlinkExtension.d.ts +13 -0
  498. package/dist/prosemirror/extensions/marks/HyperlinkExtension.js +146 -0
  499. package/dist/prosemirror/extensions/marks/ItalicExtension.d.ts +9 -0
  500. package/dist/prosemirror/extensions/marks/ItalicExtension.js +34 -0
  501. package/dist/prosemirror/extensions/marks/RtlExtension.d.ts +6 -0
  502. package/dist/prosemirror/extensions/marks/RtlExtension.js +21 -0
  503. package/dist/prosemirror/extensions/marks/RunFormattingOverrideExtension.d.ts +11 -0
  504. package/dist/prosemirror/extensions/marks/RunFormattingOverrideExtension.js +75 -0
  505. package/dist/prosemirror/extensions/marks/RunShadingExtension.d.ts +6 -0
  506. package/dist/prosemirror/extensions/marks/RunShadingExtension.js +38 -0
  507. package/dist/prosemirror/extensions/marks/SmallCapsExtension.d.ts +9 -0
  508. package/dist/prosemirror/extensions/marks/SmallCapsExtension.js +24 -0
  509. package/dist/prosemirror/extensions/marks/StrikeExtension.d.ts +9 -0
  510. package/dist/prosemirror/extensions/marks/StrikeExtension.js +33 -0
  511. package/dist/prosemirror/extensions/marks/SubscriptExtension.d.ts +9 -0
  512. package/dist/prosemirror/extensions/marks/SubscriptExtension.js +25 -0
  513. package/dist/prosemirror/extensions/marks/SuperscriptExtension.d.ts +9 -0
  514. package/dist/prosemirror/extensions/marks/SuperscriptExtension.js +25 -0
  515. package/dist/prosemirror/extensions/marks/TextColorExtension.d.ts +9 -0
  516. package/dist/prosemirror/extensions/marks/TextColorExtension.js +50 -0
  517. package/dist/prosemirror/extensions/marks/TextEffectExtension.d.ts +6 -0
  518. package/dist/prosemirror/extensions/marks/TextEffectExtension.js +35 -0
  519. package/dist/prosemirror/extensions/marks/TextEffectsExtensions.d.ts +31 -0
  520. package/dist/prosemirror/extensions/marks/TextEffectsExtensions.js +134 -0
  521. package/dist/prosemirror/extensions/marks/TrackedChangeExtensions.d.ts +22 -0
  522. package/dist/prosemirror/extensions/marks/TrackedChangeExtensions.js +113 -0
  523. package/dist/prosemirror/extensions/marks/UnderlineExtension.d.ts +9 -0
  524. package/dist/prosemirror/extensions/marks/UnderlineExtension.js +60 -0
  525. package/dist/prosemirror/extensions/marks/markUtils.d.ts +34 -0
  526. package/dist/prosemirror/extensions/marks/markUtils.js +233 -0
  527. package/dist/prosemirror/extensions/nodes/BlockSdtExtension.d.ts +22 -0
  528. package/dist/prosemirror/extensions/nodes/BlockSdtExtension.js +122 -0
  529. package/dist/prosemirror/extensions/nodes/FieldExtension.d.ts +12 -0
  530. package/dist/prosemirror/extensions/nodes/FieldExtension.js +87 -0
  531. package/dist/prosemirror/extensions/nodes/HardBreakExtension.d.ts +9 -0
  532. package/dist/prosemirror/extensions/nodes/HardBreakExtension.js +38 -0
  533. package/dist/prosemirror/extensions/nodes/HorizontalRuleExtension.d.ts +9 -0
  534. package/dist/prosemirror/extensions/nodes/HorizontalRuleExtension.js +18 -0
  535. package/dist/prosemirror/extensions/nodes/ImageExtension.d.ts +9 -0
  536. package/dist/prosemirror/extensions/nodes/ImageExtension.js +132 -0
  537. package/dist/prosemirror/extensions/nodes/MathExtension.d.ts +13 -0
  538. package/dist/prosemirror/extensions/nodes/MathExtension.js +56 -0
  539. package/dist/prosemirror/extensions/nodes/PageBreakExtension.d.ts +9 -0
  540. package/dist/prosemirror/extensions/nodes/PageBreakExtension.js +20 -0
  541. package/dist/prosemirror/extensions/nodes/SdtExtension.d.ts +12 -0
  542. package/dist/prosemirror/extensions/nodes/SdtExtension.js +107 -0
  543. package/dist/prosemirror/extensions/nodes/ShapeExtension.d.ts +30 -0
  544. package/dist/prosemirror/extensions/nodes/ShapeExtension.js +502 -0
  545. package/dist/prosemirror/extensions/nodes/TabExtension.d.ts +9 -0
  546. package/dist/prosemirror/extensions/nodes/TabExtension.js +27 -0
  547. package/dist/prosemirror/extensions/nodes/TableExtension.d.ts +34 -0
  548. package/dist/prosemirror/extensions/nodes/TableExtension.js +1972 -0
  549. package/dist/prosemirror/extensions/nodes/TextBoxExtension.d.ts +34 -0
  550. package/dist/prosemirror/extensions/nodes/TextBoxExtension.js +150 -0
  551. package/dist/prosemirror/extensions/types.d.ts +101 -0
  552. package/dist/prosemirror/extensions/types.js +10 -0
  553. package/dist/prosemirror/findReplaceSelection.d.ts +23 -0
  554. package/dist/prosemirror/findReplaceSelection.js +86 -0
  555. package/dist/prosemirror/index.d.ts +25 -0
  556. package/dist/prosemirror/index.js +23 -0
  557. package/dist/prosemirror/insertOperations.d.ts +12 -0
  558. package/dist/prosemirror/insertOperations.js +19 -0
  559. package/dist/prosemirror/paragraphDirection.d.ts +42 -0
  560. package/dist/prosemirror/paragraphDirection.js +33 -0
  561. package/dist/prosemirror/plugins/aiCitationDecorations.d.ts +40 -0
  562. package/dist/prosemirror/plugins/aiCitationDecorations.js +90 -0
  563. package/dist/prosemirror/plugins/aiSuggestionDecorations.d.ts +42 -0
  564. package/dist/prosemirror/plugins/aiSuggestionDecorations.js +135 -0
  565. package/dist/prosemirror/plugins/anonymizationDecorations.d.ts +60 -0
  566. package/dist/prosemirror/plugins/anonymizationDecorations.js +120 -0
  567. package/dist/prosemirror/plugins/autocompleteSuggestion.d.ts +123 -0
  568. package/dist/prosemirror/plugins/autocompleteSuggestion.js +283 -0
  569. package/dist/prosemirror/plugins/contentControlWidgets.d.ts +56 -0
  570. package/dist/prosemirror/plugins/contentControlWidgets.js +192 -0
  571. package/dist/prosemirror/plugins/createDocScanPlugin.d.ts +37 -0
  572. package/dist/prosemirror/plugins/createDocScanPlugin.js +55 -0
  573. package/dist/prosemirror/plugins/documentStyles.d.ts +18 -0
  574. package/dist/prosemirror/plugins/documentStyles.js +46 -0
  575. package/dist/prosemirror/plugins/index.d.ts +3 -0
  576. package/dist/prosemirror/plugins/index.js +3 -0
  577. package/dist/prosemirror/plugins/pmTextScan.d.ts +19 -0
  578. package/dist/prosemirror/plugins/pmTextScan.js +39 -0
  579. package/dist/prosemirror/plugins/selectionTracker.d.ts +43 -0
  580. package/dist/prosemirror/plugins/selectionTracker.js +179 -0
  581. package/dist/prosemirror/plugins/suggestionMode.d.ts +70 -0
  582. package/dist/prosemirror/plugins/suggestionMode.js +489 -0
  583. package/dist/prosemirror/plugins/templateDirectives.d.ts +25 -0
  584. package/dist/prosemirror/plugins/templateDirectives.js +67 -0
  585. package/dist/prosemirror/plugins/templatePreviewValues.d.ts +49 -0
  586. package/dist/prosemirror/plugins/templatePreviewValues.js +117 -0
  587. package/dist/prosemirror/plugins/templateSlashMenu.d.ts +57 -0
  588. package/dist/prosemirror/plugins/templateSlashMenu.js +184 -0
  589. package/dist/prosemirror/schema/index.d.ts +15 -0
  590. package/dist/prosemirror/schema/index.js +20 -0
  591. package/dist/prosemirror/schema/marks.d.ts +118 -0
  592. package/dist/prosemirror/schema/marks.js +0 -0
  593. package/dist/prosemirror/schema/nodes.d.ts +389 -0
  594. package/dist/prosemirror/schema/nodes.js +0 -0
  595. package/dist/prosemirror/selectionState.d.ts +23 -0
  596. package/dist/prosemirror/selectionState.js +111 -0
  597. package/dist/prosemirror/styles/index.d.ts +2 -0
  598. package/dist/prosemirror/styles/index.js +2 -0
  599. package/dist/prosemirror/styles/resolvedStyleAttrs.d.ts +32 -0
  600. package/dist/prosemirror/styles/resolvedStyleAttrs.js +108 -0
  601. package/dist/prosemirror/styles/styleResolver.d.ts +94 -0
  602. package/dist/prosemirror/styles/styleResolver.js +200 -0
  603. package/dist/prosemirror/utils/findParagraphByParaId.d.ts +26 -0
  604. package/dist/prosemirror/utils/findParagraphByParaId.js +37 -0
  605. package/dist/prosemirror/utils/tabCalculator.d.ts +110 -0
  606. package/dist/prosemirror/utils/tabCalculator.js +137 -0
  607. package/dist/prosemirror/validation.d.ts +20 -0
  608. package/dist/prosemirror/validation.js +177 -0
  609. package/dist/server.d.ts +7 -0
  610. package/dist/server.js +6 -0
  611. package/dist/style-engine/index.d.ts +3 -0
  612. package/dist/style-engine/index.js +2 -0
  613. package/dist/style-engine/styleEngine.d.ts +67 -0
  614. package/dist/style-engine/styleEngine.js +70 -0
  615. package/dist/types/block-id.d.ts +58 -0
  616. package/dist/types/block-id.js +61 -0
  617. package/dist/types/colors.d.ts +2 -0
  618. package/dist/types/colors.js +0 -0
  619. package/dist/types/content.d.ts +2 -0
  620. package/dist/types/content.js +0 -0
  621. package/dist/types/document.d.ts +7 -0
  622. package/dist/types/document.js +0 -0
  623. package/dist/types/documentEnumValues.d.ts +89 -0
  624. package/dist/types/documentEnumValues.js +693 -0
  625. package/dist/types/formatting.d.ts +2 -0
  626. package/dist/types/formatting.js +0 -0
  627. package/dist/types/index.d.ts +107 -0
  628. package/dist/types/index.js +0 -0
  629. package/dist/utils/authorColors.d.ts +16 -0
  630. package/dist/utils/authorColors.js +30 -0
  631. package/dist/utils/baseDirection.d.ts +23 -0
  632. package/dist/utils/baseDirection.js +34 -0
  633. package/dist/utils/clipboard.d.ts +126 -0
  634. package/dist/utils/clipboard.js +622 -0
  635. package/dist/utils/colorResolver.d.ts +158 -0
  636. package/dist/utils/colorResolver.js +557 -0
  637. package/dist/utils/createDocument.d.ts +50 -0
  638. package/dist/utils/createDocument.js +262 -0
  639. package/dist/utils/documentLoaderBehavior.d.ts +22 -0
  640. package/dist/utils/documentLoaderBehavior.js +14 -0
  641. package/dist/utils/docxInput.d.ts +22 -0
  642. package/dist/utils/docxInput.js +16 -0
  643. package/dist/utils/domGuards.d.ts +59 -0
  644. package/dist/utils/domGuards.js +82 -0
  645. package/dist/utils/fontFamilyMerge.d.ts +7 -0
  646. package/dist/utils/fontFamilyMerge.js +31 -0
  647. package/dist/utils/fontLoader.d.ts +50 -0
  648. package/dist/utils/fontLoader.js +177 -0
  649. package/dist/utils/fontResolver.d.ts +61 -0
  650. package/dist/utils/fontResolver.js +651 -0
  651. package/dist/utils/fontWeights.d.ts +4 -0
  652. package/dist/utils/fontWeights.js +4 -0
  653. package/dist/utils/formatToStyle.d.ts +103 -0
  654. package/dist/utils/formatToStyle.js +289 -0
  655. package/dist/utils/headerFooter.d.ts +74 -0
  656. package/dist/utils/headerFooter.js +257 -0
  657. package/dist/utils/headingCollector.d.ts +22 -0
  658. package/dist/utils/headingCollector.js +36 -0
  659. package/dist/utils/hexId.d.ts +33 -0
  660. package/dist/utils/hexId.js +37 -0
  661. package/dist/utils/imageValidation.d.ts +5 -0
  662. package/dist/utils/imageValidation.js +31 -0
  663. package/dist/utils/paragraphFormattingMerge.d.ts +14 -0
  664. package/dist/utils/paragraphFormattingMerge.js +68 -0
  665. package/dist/utils/replaceText.d.ts +17 -0
  666. package/dist/utils/replaceText.js +161 -0
  667. package/dist/utils/rotationBoundingBox.d.ts +12 -0
  668. package/dist/utils/rotationBoundingBox.js +36 -0
  669. package/dist/utils/scriptSegments.d.ts +36 -0
  670. package/dist/utils/scriptSegments.js +52 -0
  671. package/dist/utils/tableOperations.d.ts +87 -0
  672. package/dist/utils/tableOperations.js +259 -0
  673. package/dist/utils/textFormattingMerge.d.ts +6 -0
  674. package/dist/utils/textFormattingMerge.js +31 -0
  675. package/dist/utils/tiffConverter.d.ts +18 -0
  676. package/dist/utils/tiffConverter.js +83 -0
  677. package/dist/utils/units.d.ts +99 -0
  678. package/dist/utils/units.js +139 -0
  679. package/dist/utils/urlSecurity.d.ts +7 -0
  680. package/dist/utils/urlSecurity.js +65 -0
  681. package/dist/watermark/index.d.ts +39 -0
  682. package/dist/watermark/index.js +149 -0
  683. package/package.json +122 -2
@@ -0,0 +1,1300 @@
1
+ import { parseXmlDocument } from "../docx/xmlParser.js";
2
+ import { resolveFontFamily } from "../utils/fontResolver.js";
3
+ import "../utils/fontWeights.js";
4
+ import { calculateTabWidth } from "../prosemirror/utils/tabCalculator.js";
5
+ import { inlineImageBoundingBox, parseRotationDegrees, rotatedBoundingBox } from "../utils/rotationBoundingBox.js";
6
+ import { isFloatingImageRun } from "../layout-engine/types.js";
7
+ import { getListMarkerInlineWidth } from "../layout-engine/measure/listMarkerWidth.js";
8
+ import { applySdtDataAttrs } from "./sdtBoundary.js";
9
+ import { applyImageVisualAttrs, hasImageVisualAttrs, wrapImageWithCrop } from "./renderImage.js";
10
+ import { ommlToMathml } from "../docx/mathToMathml.js";
11
+ import { evaluateFieldInstruction } from "../fields/evaluateField.js";
12
+ import { AUTHOR_COLORS, getAuthorColorIdx } from "../utils/authorColors.js";
13
+ import { detectBaseDirection } from "../utils/baseDirection.js";
14
+ import { hasCjk, segmentByScript } from "../utils/scriptSegments.js";
15
+ import { getAutomaticTextColorForBackground } from "./documentColors.js";
16
+ import { resolveImageLineAlign } from "./renderUtils.js";
17
+ //#region src/layout-painter/renderParagraph.ts
18
+ /**
19
+ * Paragraph Fragment Renderer
20
+ *
21
+ * Renders paragraph fragments with lines and text runs to DOM.
22
+ * Handles text formatting, alignment, and positioning.
23
+ */
24
+ /**
25
+ * CSS class names for paragraph rendering
26
+ */
27
+ const PARAGRAPH_CLASS_NAMES = {
28
+ fragment: "layout-paragraph",
29
+ line: "layout-line",
30
+ run: "layout-run",
31
+ text: "layout-run-text",
32
+ tab: "layout-run-tab",
33
+ image: "layout-run-image",
34
+ lineBreak: "layout-run-linebreak"
35
+ };
36
+ /**
37
+ * Check if run is a text run
38
+ */
39
+ function isTextRun(run) {
40
+ return run.kind === "text";
41
+ }
42
+ /**
43
+ * Check if run is a tab run
44
+ */
45
+ function isTabRun(run) {
46
+ return run.kind === "tab";
47
+ }
48
+ /**
49
+ * Check if run is an image run
50
+ */
51
+ function isImageRun(run) {
52
+ return run.kind === "image";
53
+ }
54
+ /**
55
+ * Check if run is a line break run
56
+ */
57
+ function isLineBreakRun(run) {
58
+ return run.kind === "lineBreak";
59
+ }
60
+ /**
61
+ * Check if run is a field run
62
+ */
63
+ function isFieldRun(run) {
64
+ return run.kind === "field";
65
+ }
66
+ /**
67
+ * Check if run is a math equation run
68
+ */
69
+ function isMathRun(run) {
70
+ return run.kind === "math";
71
+ }
72
+ const AUTOMATIC_TEXT_COLOR_VALUES = /* @__PURE__ */ new Set(["auto", "windowtext"]);
73
+ const DEFAULT_BLACK_TEXT_COLOR_VALUES = /* @__PURE__ */ new Set(["000000", "000"]);
74
+ const DOCX_SUPERSCRIPT_SCALE = .75;
75
+ function normalizeTextColorValue(color) {
76
+ return color.trim().toLowerCase().replace(/^#/u, "");
77
+ }
78
+ function isAutomaticTextColor(color) {
79
+ return AUTOMATIC_TEXT_COLOR_VALUES.has(normalizeTextColorValue(color));
80
+ }
81
+ function isDefaultBlackTextColor(color) {
82
+ return DEFAULT_BLACK_TEXT_COLOR_VALUES.has(normalizeTextColorValue(color));
83
+ }
84
+ function shouldRenderTextColor(color, highlight, textColorSource) {
85
+ if (isAutomaticTextColor(color)) return false;
86
+ if (highlight) return textColorSource !== "paragraphDefault" || !isDefaultBlackTextColor(color);
87
+ return !isDefaultBlackTextColor(color);
88
+ }
89
+ function getRenderableTextColor(run) {
90
+ const textColor = run.color;
91
+ if (!textColor) return;
92
+ if (!shouldRenderTextColor(textColor, run.highlight, run.textColorSource)) return;
93
+ return textColor.trim();
94
+ }
95
+ function getHyperlinkTextColor(run, inheritedColor) {
96
+ const textColor = run.color?.trim();
97
+ if (textColor && !isAutomaticTextColor(textColor) && run.textColorSource === "direct") return textColor;
98
+ return getRenderableTextColor(run) || inheritedColor || "#0563c1";
99
+ }
100
+ function fontSizePtToPx(fontSizePt) {
101
+ return fontSizePt * 96 / 72;
102
+ }
103
+ function getRaisedRunFontSize(run) {
104
+ if (run.fontSize) return `${fontSizePtToPx(run.fontSize) * DOCX_SUPERSCRIPT_SCALE}px`;
105
+ return `${DOCX_SUPERSCRIPT_SCALE}em`;
106
+ }
107
+ /**
108
+ * Apply text run styles to an element
109
+ */
110
+ function applyRunStyles(element, run) {
111
+ if (run.fontFamily) element.style.fontFamily = resolveFontFamily(run.fontFamily).cssFallback;
112
+ if (run.fontSize) element.style.fontSize = `${fontSizePtToPx(run.fontSize)}px`;
113
+ if (run.bold) element.style.fontWeight = "800";
114
+ if (run.italic) element.style.fontStyle = "italic";
115
+ let hasExplicitTextColor = false;
116
+ const textColor = getRenderableTextColor(run);
117
+ if (textColor) {
118
+ element.style.color = textColor;
119
+ element.style.setProperty("--doc-run-color", textColor);
120
+ hasExplicitTextColor = true;
121
+ }
122
+ if (run.letterSpacing) element.style.letterSpacing = `${run.letterSpacing}px`;
123
+ if (run.allCaps) element.style.textTransform = "uppercase";
124
+ if (run.smallCaps) element.style.fontVariant = "small-caps";
125
+ if (run.positionPx) element.style.verticalAlign = `${run.positionPx}px`;
126
+ if (run.horizontalScale && run.horizontalScale !== 100) {
127
+ element.style.display = "inline-block";
128
+ element.style.transform = `scaleX(${run.horizontalScale / 100})`;
129
+ element.style.transformOrigin = "left center";
130
+ }
131
+ if (run.kerningMinPt && run.kerningMinPt > 0) {
132
+ if ((run.fontSize ?? 11) >= run.kerningMinPt) element.style.fontKerning = "normal";
133
+ }
134
+ if (run.emboss) element.style.textShadow = "1px 1px 1px rgba(255,255,255,0.5), -1px -1px 1px rgba(0,0,0,0.3)";
135
+ if (run.imprint) element.style.textShadow = "-1px -1px 1px rgba(255,255,255,0.5), 1px 1px 1px rgba(0,0,0,0.3)";
136
+ if (run.textShadow && !run.emboss && !run.imprint) element.style.textShadow = "1px 1px 2px rgba(0,0,0,0.3)";
137
+ if (run.textOutline) {
138
+ element.style.webkitTextStroke = "1px currentColor";
139
+ element.style.webkitTextFillColor = "transparent";
140
+ }
141
+ if (run.rtl === true) element.dir = "rtl";
142
+ else if (run.rtl === false) element.dir = "ltr";
143
+ if (run.textEffect) {
144
+ element.classList.add("docx-text-effect", `docx-text-effect-${run.textEffect}`);
145
+ element.dataset["effect"] = run.textEffect;
146
+ }
147
+ if (run.emphasisMark) {
148
+ let variant = "filled dot";
149
+ if (run.emphasisMark === "comma") variant = "filled sesame";
150
+ else if (run.emphasisMark === "circle") variant = "filled circle";
151
+ const position = run.emphasisMark === "underDot" ? "under right" : "over right";
152
+ element.style.textEmphasis = variant;
153
+ element.style.textEmphasisPosition = position;
154
+ element.style.webkitTextEmphasis = variant;
155
+ element.style.webkitTextEmphasisPosition = position;
156
+ }
157
+ if (run.hidden) {
158
+ element.classList.add("docx-hidden");
159
+ element.style.opacity = "0.4";
160
+ }
161
+ const runBackground = run.highlight ?? run.shading;
162
+ if (runBackground) {
163
+ element.style.backgroundColor = runBackground;
164
+ const hasTrackedChangeColor = run.isInsertion || run.isDeletion;
165
+ const hasCommentHighlight = run.commentIds !== void 0 && run.commentIds.length > 0;
166
+ const automaticTextColor = hasExplicitTextColor || hasTrackedChangeColor || hasCommentHighlight ? void 0 : getAutomaticTextColorForBackground(runBackground);
167
+ if (automaticTextColor) element.style.color = automaticTextColor;
168
+ }
169
+ const decorations = [];
170
+ let explicitDecorationStyle = false;
171
+ if (run.underline) {
172
+ if (!isNoteReferenceRun(run)) decorations.push("underline");
173
+ if (typeof run.underline === "object") {
174
+ if (run.underline.style) {
175
+ element.style.textDecorationStyle = run.underline.style;
176
+ explicitDecorationStyle = true;
177
+ }
178
+ if (run.underline.color) element.style.textDecorationColor = run.underline.color;
179
+ }
180
+ }
181
+ if (run.strike) decorations.push("line-through");
182
+ if (run.hidden) {
183
+ if (!decorations.includes("underline")) decorations.push("underline");
184
+ if (!explicitDecorationStyle) element.style.textDecorationStyle = "dotted";
185
+ }
186
+ if (run.commentIds && run.commentIds.length > 0) {
187
+ element.style.backgroundColor = "rgba(255, 212, 0, 0.08)";
188
+ element.style.borderBottom = "1px solid rgba(180, 130, 0, 0.24)";
189
+ element.dataset["commentId"] = String(run.commentIds[0]);
190
+ }
191
+ if (run.isInsertion) {
192
+ const authorIdx = getAuthorColorIdx(run.changeAuthor ?? "");
193
+ const authorColor = AUTHOR_COLORS[authorIdx];
194
+ element.style.color = authorColor;
195
+ if (!decorations.includes("underline")) decorations.push("underline");
196
+ element.style.textDecorationColor = authorColor;
197
+ element.classList.add("docx-insertion");
198
+ element.dataset["tcAuthorIdx"] = String(authorIdx);
199
+ const insertionParts = [run.changeAuthor, run.changeDate ? new Date(run.changeDate).toLocaleDateString() : ""].filter(Boolean);
200
+ if (insertionParts.length > 0) element.title = `Inserted: ${insertionParts.join(", ")}`;
201
+ if (run.changeAuthor) element.dataset["changeAuthor"] = run.changeAuthor;
202
+ if (run.changeDate) element.dataset["changeDate"] = run.changeDate;
203
+ if (run.changeRevisionId !== void 0) element.dataset["revisionId"] = String(run.changeRevisionId);
204
+ }
205
+ if (run.isDeletion) {
206
+ const authorIdx = getAuthorColorIdx(run.changeAuthor ?? "");
207
+ const authorColor = AUTHOR_COLORS[authorIdx];
208
+ element.style.color = authorColor;
209
+ if (!decorations.includes("line-through")) decorations.push("line-through");
210
+ element.style.textDecorationColor = authorColor;
211
+ element.classList.add("docx-deletion");
212
+ element.dataset["tcAuthorIdx"] = String(authorIdx);
213
+ const deletionParts = [run.changeAuthor, run.changeDate ? new Date(run.changeDate).toLocaleDateString() : ""].filter(Boolean);
214
+ if (deletionParts.length > 0) element.title = `Deleted: ${deletionParts.join(", ")}`;
215
+ if (run.changeAuthor) element.dataset["changeAuthor"] = run.changeAuthor;
216
+ if (run.changeDate) element.dataset["changeDate"] = run.changeDate;
217
+ if (run.changeRevisionId !== void 0) element.dataset["revisionId"] = String(run.changeRevisionId);
218
+ }
219
+ if (decorations.length > 0) element.style.textDecorationLine = decorations.join(" ");
220
+ if (run.superscript) {
221
+ element.style.position = "relative";
222
+ element.style.top = "-0.4em";
223
+ element.style.fontSize = getRaisedRunFontSize(run);
224
+ }
225
+ if (run.subscript) {
226
+ element.style.position = "relative";
227
+ element.style.top = "0.2em";
228
+ element.style.fontSize = getRaisedRunFontSize(run);
229
+ }
230
+ }
231
+ function reserveScaledAdvance(element, unscaledWidth, horizontalScale) {
232
+ if (horizontalScale === void 0 || horizontalScale === 100) return;
233
+ element.style.width = `${unscaledWidth * (horizontalScale / 100)}px`;
234
+ }
235
+ /**
236
+ * Apply PM position data attributes
237
+ */
238
+ function applyPmPositions(element, pmStart, pmEnd) {
239
+ if (pmStart !== void 0) element.dataset["pmStart"] = String(pmStart);
240
+ if (pmEnd !== void 0) element.dataset["pmEnd"] = String(pmEnd);
241
+ }
242
+ /**
243
+ * Render a text run
244
+ */
245
+ function renderTextRun(run, doc) {
246
+ const span = doc.createElement("span");
247
+ span.className = `${PARAGRAPH_CLASS_NAMES.run} ${PARAGRAPH_CLASS_NAMES.text}`;
248
+ if (run.templatePreview) {
249
+ span.classList.add("folio-template-preview-run");
250
+ if (run.templatePreview === "highlighted") span.classList.add("folio-template-preview-run--highlighted");
251
+ }
252
+ applyRunStyles(span, run);
253
+ applyPmPositions(span, run.pmStart, run.pmEnd);
254
+ if (run.hyperlink) {
255
+ const anchor = doc.createElement("a");
256
+ anchor.href = run.hyperlink.href;
257
+ if (!run.hyperlink.href.startsWith("#")) {
258
+ anchor.target = "_blank";
259
+ anchor.rel = "noopener noreferrer";
260
+ }
261
+ if (run.hyperlink.tooltip) anchor.title = run.hyperlink.tooltip;
262
+ anchor.textContent = run.text;
263
+ if (!run.hyperlink.noDefaultStyle) {
264
+ const hyperlinkColor = getHyperlinkTextColor(run, span.style.color);
265
+ anchor.style.color = hyperlinkColor;
266
+ anchor.style.textDecoration = "underline";
267
+ span.style.color = hyperlinkColor;
268
+ anchor.style.setProperty("--doc-run-color", hyperlinkColor);
269
+ span.style.setProperty("--doc-run-color", hyperlinkColor);
270
+ }
271
+ span.append(anchor);
272
+ } else span.textContent = run.text;
273
+ applyWhitespaceUnderline(span, run);
274
+ return span;
275
+ }
276
+ function isNoteReferenceRun(run) {
277
+ return run.footnoteRefId !== void 0 || run.endnoteRefId !== void 0;
278
+ }
279
+ function removeUnderlineTextDecoration(element) {
280
+ const textDecorationLines = (element.style.textDecorationLine || "").split(/\s+/u).filter((line) => line && line !== "underline");
281
+ element.style.textDecorationLine = textDecorationLines.join(" ");
282
+ }
283
+ function applyWhitespaceUnderline(element, run) {
284
+ if (!run.underline || run.text.trim().length > 0) return;
285
+ removeUnderlineTextDecoration(element);
286
+ element.style.borderBottom = "1px solid currentColor";
287
+ if (typeof run.underline === "object" && run.underline.color) element.style.borderBottomColor = run.underline.color;
288
+ }
289
+ /**
290
+ * Number of leader characters to fill the tab's inner span. The inner span
291
+ * uses `overflow: hidden` so excess characters are clipped invisibly; we just
292
+ * need enough to span the widest realistic tab stop at the thinnest leader
293
+ * (a dot at small font sizes). 1000 covers wide-landscape pages with ~2px dots.
294
+ */
295
+ const LEADER_FILL_COUNT = 1e3;
296
+ /**
297
+ * Render a tab run with calculated width.
298
+ *
299
+ * Leader characters (dot/hyphen/underscore for TOC entries) render in an
300
+ * absolute-positioned inner span over a baseline-aligned zero-width-space.
301
+ * The earlier SVG background-image approach sat at the line's bottom edge,
302
+ * misaligned with the surrounding text baseline and broken under flex layout
303
+ * (where the outer's height collapses to the inner content). The
304
+ * outer-with-ZWSP + inner-absolute pattern keeps the tab's baseline anchored
305
+ * to the surrounding text and lets the right-tab flex anchor compute a stable
306
+ * height for the line.
307
+ */
308
+ function renderTabRun(run, doc, width, leader) {
309
+ const span = doc.createElement("span");
310
+ span.className = `${PARAGRAPH_CLASS_NAMES.run} ${PARAGRAPH_CLASS_NAMES.tab}`;
311
+ span.style.display = "inline-block";
312
+ span.style.width = `${width}px`;
313
+ applyRunStyles(span, run);
314
+ applyTabUnderline(span, run);
315
+ applyPmPositions(span, run.pmStart, run.pmEnd);
316
+ const leaderChar = leader && leader !== "none" ? getLeaderChar(leader) : null;
317
+ if (leaderChar) {
318
+ span.style.position = "relative";
319
+ span.textContent = "​";
320
+ const inner = doc.createElement("span");
321
+ inner.style.position = "absolute";
322
+ inner.style.left = "0";
323
+ inner.style.right = "0";
324
+ inner.style.top = "0";
325
+ inner.style.bottom = "0";
326
+ inner.style.overflow = "hidden";
327
+ inner.style.whiteSpace = "nowrap";
328
+ inner.textContent = leaderChar.repeat(LEADER_FILL_COUNT);
329
+ span.append(inner);
330
+ } else span.textContent = "\xA0";
331
+ return span;
332
+ }
333
+ function applyTabUnderline(element, run) {
334
+ if (!run.underline) return;
335
+ removeUnderlineTextDecoration(element);
336
+ element.style.borderBottom = "1px solid currentColor";
337
+ if (typeof run.underline === "object" && run.underline.color) element.style.borderBottomColor = run.underline.color;
338
+ }
339
+ /**
340
+ * Get leader character for tab
341
+ */
342
+ function getLeaderChar(leader) {
343
+ switch (leader) {
344
+ case "dot": return ".";
345
+ case "hyphen": return "-";
346
+ case "underscore": return "_";
347
+ case "middleDot": return "·";
348
+ case "heavy": return "_";
349
+ default: return null;
350
+ }
351
+ }
352
+ /**
353
+ * Render an inline image run (flows with text)
354
+ */
355
+ function renderInlineImageRun(run, doc) {
356
+ const img = doc.createElement("img");
357
+ img.className = `${PARAGRAPH_CLASS_NAMES.run} ${PARAGRAPH_CLASS_NAMES.image}`;
358
+ img.src = run.src;
359
+ img.width = run.width;
360
+ img.height = run.height;
361
+ img.style.width = `${run.width}px`;
362
+ img.style.height = `${run.height}px`;
363
+ if (run.alt) img.alt = run.alt;
364
+ if (run.transform) {
365
+ img.style.transform = run.transform;
366
+ img.style.transformOrigin = "center center";
367
+ }
368
+ const rotation = parseRotationDegrees(run.transform);
369
+ if (rotation !== 0) {
370
+ const bbox = rotatedBoundingBox(run.width, run.height, rotation);
371
+ const wrapper = doc.createElement("span");
372
+ wrapper.className = PARAGRAPH_CLASS_NAMES.run;
373
+ wrapper.style.display = "inline-block";
374
+ wrapper.style.position = "relative";
375
+ wrapper.style.width = `${bbox.width}px`;
376
+ wrapper.style.height = `${bbox.height}px`;
377
+ wrapper.style.verticalAlign = "middle";
378
+ if (run.distTop) wrapper.style.marginTop = `${run.distTop}px`;
379
+ if (run.distBottom) wrapper.style.marginBottom = `${run.distBottom}px`;
380
+ img.style.position = "absolute";
381
+ img.style.left = `${(bbox.width - run.width) / 2}px`;
382
+ img.style.top = `${(bbox.height - run.height) / 2}px`;
383
+ applyPmPositions(wrapper, run.pmStart, run.pmEnd);
384
+ wrapper.append(img);
385
+ return wrapper;
386
+ }
387
+ if (hasImageVisualAttrs(run)) {
388
+ const wrapper = wrapImageWithCrop(img, run, doc, {
389
+ display: "inline-block",
390
+ widthPx: run.width,
391
+ heightPx: run.height
392
+ });
393
+ wrapper.className = `${PARAGRAPH_CLASS_NAMES.run} ${PARAGRAPH_CLASS_NAMES.image}`;
394
+ wrapper.style.verticalAlign = "middle";
395
+ if (run.distTop) wrapper.style.marginTop = `${run.distTop}px`;
396
+ if (run.distBottom) wrapper.style.marginBottom = `${run.distBottom}px`;
397
+ applyPmPositions(wrapper, run.pmStart, run.pmEnd);
398
+ return wrapper;
399
+ }
400
+ if (hasImageVisualAttrs(run)) applyImageVisualAttrs(img, run);
401
+ img.style.display = "inline";
402
+ img.style.verticalAlign = "middle";
403
+ if (run.width > 0 && run.height > 0) {
404
+ img.style.height = "auto";
405
+ img.style.aspectRatio = `${run.width} / ${run.height}`;
406
+ img.style.maxWidth = "100%";
407
+ }
408
+ if (run.distTop) img.style.marginTop = `${run.distTop}px`;
409
+ if (run.distBottom) img.style.marginBottom = `${run.distBottom}px`;
410
+ applyPmPositions(img, run.pmStart, run.pmEnd);
411
+ return img;
412
+ }
413
+ /**
414
+ * Render a block image (on its own line, like topAndBottom)
415
+ */
416
+ function renderBlockImage(run, doc) {
417
+ const container = doc.createElement("div");
418
+ container.className = "layout-block-image";
419
+ container.style.display = "block";
420
+ container.style.textAlign = "center";
421
+ container.style.marginTop = `${run.distTop ?? 6}px`;
422
+ container.style.marginBottom = `${run.distBottom ?? 6}px`;
423
+ const img = doc.createElement("img");
424
+ img.src = run.src;
425
+ img.width = run.width;
426
+ img.height = run.height;
427
+ if (run.alt) img.alt = run.alt;
428
+ if (run.transform) {
429
+ img.style.transform = run.transform;
430
+ img.style.transformOrigin = "center center";
431
+ }
432
+ const rotation = parseRotationDegrees(run.transform);
433
+ if (rotation !== 0) {
434
+ const bbox = rotatedBoundingBox(run.width, run.height, rotation);
435
+ container.style.width = `${bbox.width}px`;
436
+ container.style.height = `${bbox.height}px`;
437
+ container.style.position = "relative";
438
+ img.style.position = "absolute";
439
+ img.style.left = `${(bbox.width - run.width) / 2}px`;
440
+ img.style.top = `${(bbox.height - run.height) / 2}px`;
441
+ img.style.width = `${run.width}px`;
442
+ img.style.height = `${run.height}px`;
443
+ img.style.marginLeft = "0";
444
+ img.style.marginRight = "0";
445
+ img.style.marginTop = "0";
446
+ }
447
+ if (hasImageVisualAttrs(run)) {
448
+ const wrapper = wrapImageWithCrop(img, run, doc, {
449
+ display: "inline-block",
450
+ widthPx: run.width,
451
+ heightPx: run.height
452
+ });
453
+ applyPmPositions(container, run.pmStart, run.pmEnd);
454
+ container.append(wrapper);
455
+ return container;
456
+ }
457
+ if (rotation === 0) {
458
+ img.style.marginLeft = "auto";
459
+ img.style.marginRight = "auto";
460
+ }
461
+ if (hasImageVisualAttrs(run)) applyImageVisualAttrs(img, run);
462
+ applyPmPositions(container, run.pmStart, run.pmEnd);
463
+ container.append(img);
464
+ return container;
465
+ }
466
+ /**
467
+ * Render an image run based on its display mode
468
+ * Note: Floating images (square/tight/through) are handled separately at paragraph level,
469
+ * not through this function. If they reach here, render as block.
470
+ */
471
+ function renderImageRun(run, doc) {
472
+ let el;
473
+ if (isFloatingImageRun(run) || run.displayMode === "block" || run.wrapType === "topAndBottom") el = renderBlockImage(run, doc);
474
+ else el = renderInlineImageRun(run, doc);
475
+ applyImageRevisionStyle(getImageRevisionStyleTarget(el), run);
476
+ return el;
477
+ }
478
+ function isStyleableHTMLElement(value) {
479
+ return typeof value === "object" && "style" in value;
480
+ }
481
+ function getImageRevisionStyleTarget(el) {
482
+ if (!el.className.split(/\s+/u).includes("layout-block-image")) return el;
483
+ const firstChild = el.children[0];
484
+ if (isStyleableHTMLElement(firstChild)) return firstChild;
485
+ return el;
486
+ }
487
+ /**
488
+ * A picture that is itself a tracked change gets a coloured outline (green for
489
+ * an insertion, red + faded for a deletion), mirroring the text-run treatment.
490
+ * `outline` is used over `border` so the image's box size is unchanged and
491
+ * line metrics stay stable. eigenpal #641.
492
+ */
493
+ function applyImageRevisionStyle(el, run) {
494
+ if (run.isInsertion) {
495
+ el.style.outline = "2px solid #2e7d32";
496
+ el.style.outlineOffset = "1px";
497
+ el.classList.add("docx-insertion");
498
+ } else if (run.isDeletion) {
499
+ el.style.outline = "2px solid #c62828";
500
+ el.style.outlineOffset = "1px";
501
+ el.style.opacity = "0.6";
502
+ el.classList.add("docx-deletion");
503
+ } else return;
504
+ if (run.changeAuthor !== void 0) el.dataset["changeAuthor"] = run.changeAuthor;
505
+ if (run.changeDate !== void 0) el.dataset["changeDate"] = run.changeDate;
506
+ if (run.changeRevisionId !== void 0) el.dataset["revisionId"] = String(run.changeRevisionId);
507
+ }
508
+ /**
509
+ * Render a line break run
510
+ */
511
+ function renderLineBreakRun(run, doc) {
512
+ const br = doc.createElement("br");
513
+ br.className = `${PARAGRAPH_CLASS_NAMES.run} ${PARAGRAPH_CLASS_NAMES.lineBreak}`;
514
+ applyPmPositions(br, run.pmStart, run.pmEnd);
515
+ return br;
516
+ }
517
+ /**
518
+ * Render a field run (PAGE, NUMPAGES, etc.)
519
+ * Substitutes the field with actual values from context.
520
+ */
521
+ const EMPTY_BOOKMARK_PAGES = /* @__PURE__ */ new Map();
522
+ const EMPTY_BOOKMARK_TEXT = /* @__PURE__ */ new Map();
523
+ const EMPTY_SEQ_VALUES = /* @__PURE__ */ new Map();
524
+ /**
525
+ * Resolve a field run to its display text against the painted page. Used by the
526
+ * painter and by the tab-anchor width/text helpers so the width reserved for a
527
+ * field after a tab and the text actually painted always agree. The instruction
528
+ * drives evaluation; `fieldType` is the fallback when a node carries none.
529
+ * Returns the cached fallback when no render context is available.
530
+ */
531
+ function resolveFieldText(run, context) {
532
+ if (!context) return run.fallback ?? "";
533
+ const fieldContext = {
534
+ pageNumber: context.pageNumber,
535
+ totalPages: context.totalPages,
536
+ bookmarkPages: context.bookmarkPages ?? EMPTY_BOOKMARK_PAGES,
537
+ bookmarkText: context.bookmarkText ?? EMPTY_BOOKMARK_TEXT,
538
+ seqValues: context.seqValues ?? EMPTY_SEQ_VALUES,
539
+ now: /* @__PURE__ */ new Date(),
540
+ ...context.sectionPages === void 0 ? {} : { sectionPages: context.sectionPages }
541
+ };
542
+ return evaluateFieldInstruction(run.instruction || run.fieldType, fieldContext, {
543
+ fallback: run.fallback ?? "",
544
+ ...run.pmStart === void 0 ? {} : { instanceId: run.pmStart },
545
+ ...run.fldLock ? { locked: true } : {}
546
+ });
547
+ }
548
+ function renderFieldRun(run, doc, context) {
549
+ const text = resolveFieldText(run, context);
550
+ const resolvedRun = {
551
+ ...run,
552
+ kind: "text",
553
+ text
554
+ };
555
+ if (resolvedRun.eastAsiaFontFamily !== void 0 && !resolvedRun.letterSpacing && hasCjk(text)) {
556
+ const wrapper = doc.createElement("span");
557
+ applyPmPositions(wrapper, resolvedRun.pmStart, resolvedRun.pmEnd);
558
+ if (resolvedRun.horizontalScale && resolvedRun.horizontalScale !== 100) {
559
+ wrapper.style.display = "inline-block";
560
+ wrapper.style.transform = `scaleX(${resolvedRun.horizontalScale / 100})`;
561
+ wrapper.style.transformOrigin = "left center";
562
+ }
563
+ const { pmStart: _pmStart, pmEnd: _pmEnd, horizontalScale: _horizontalScale, ...segmentBase } = resolvedRun;
564
+ for (const segment of segmentByScript(text)) {
565
+ const segmentRun = {
566
+ ...segmentBase,
567
+ text: segment.text,
568
+ ...segment.isCjk ? { fontFamily: resolvedRun.eastAsiaFontFamily } : {}
569
+ };
570
+ wrapper.append(renderTextRun(segmentRun, doc));
571
+ }
572
+ return wrapper;
573
+ }
574
+ return renderTextRun(resolvedRun, doc);
575
+ }
576
+ /**
577
+ * Render an OMML math run by converting it to MathML and injecting a
578
+ * native `<math>` element. Browsers (Firefox, Safari, Chromium ≥ 109)
579
+ * render MathML Core natively, so no JS typesetting engine is required.
580
+ *
581
+ * The raw OMML XML stays on the model — only the rendered DOM is derived
582
+ * from it. If conversion fails we fall back to the existing italic
583
+ * plain-text span so the user always sees something and the underlying
584
+ * OMML is preserved for save.
585
+ */
586
+ function renderMathRun(run, doc) {
587
+ const fallbackText = run.plainText || "[equation]";
588
+ let mathml = null;
589
+ try {
590
+ const ommlEl = parseXmlDocument(run.ommlXml);
591
+ if (ommlEl) mathml = ommlToMathml(ommlEl);
592
+ } catch {}
593
+ if (!mathml) return renderMathFallback(run, doc, fallbackText, "1");
594
+ const host = doc.createElement("span");
595
+ host.className = `${PARAGRAPH_CLASS_NAMES.run} docx-math docx-math-${run.display}`;
596
+ host.dataset["display"] = run.display;
597
+ host.dataset["ommlRender"] = "mathml";
598
+ if (run.display === "block") {
599
+ host.style.display = "inline-block";
600
+ host.style.verticalAlign = "middle";
601
+ }
602
+ host.style.fontFamily = "\"Cambria Math\", \"Latin Modern Math\", \"STIX Two Math\", serif";
603
+ try {
604
+ host.innerHTML = mathml;
605
+ } catch {
606
+ return renderMathFallback(run, doc, fallbackText, "1");
607
+ }
608
+ const mathRoot = host.firstElementChild;
609
+ if (mathRoot && mathRoot.tagName.toLowerCase() === "math") mathRoot.setAttribute("alttext", fallbackText);
610
+ applyPmPositions(host, run.pmStart, run.pmEnd);
611
+ return host;
612
+ }
613
+ function renderMathFallback(run, doc, fallbackText, errorFlag) {
614
+ const span = doc.createElement("span");
615
+ span.className = `${PARAGRAPH_CLASS_NAMES.run} docx-math docx-math-${run.display} docx-math-fallback`;
616
+ span.dataset["display"] = run.display;
617
+ span.dataset["ommlRender"] = "fallback";
618
+ if (errorFlag === "1") {
619
+ span.dataset["ommlRenderError"] = "1";
620
+ span.title = "[equation render failed]";
621
+ }
622
+ span.style.fontStyle = "italic";
623
+ span.style.fontFamily = "\"Cambria Math\", \"Latin Modern Math\", \"STIX Two Math\", serif";
624
+ span.textContent = fallbackText;
625
+ applyPmPositions(span, run.pmStart, run.pmEnd);
626
+ return span;
627
+ }
628
+ /**
629
+ * Render a single run (for non-tab runs)
630
+ */
631
+ function renderRun(run, doc, context) {
632
+ if (isTextRun(run)) return renderTextRun(run, doc);
633
+ if (isTabRun(run)) return renderTabRun(run, doc, 48);
634
+ if (isImageRun(run)) return renderImageRun(run, doc);
635
+ if (isLineBreakRun(run)) return renderLineBreakRun(run, doc);
636
+ if (isFieldRun(run) && context) return renderFieldRun(run, doc, context);
637
+ if (isMathRun(run)) return renderMathRun(run, doc);
638
+ const span = doc.createElement("span");
639
+ span.className = PARAGRAPH_CLASS_NAMES.run;
640
+ return span;
641
+ }
642
+ /**
643
+ * Slice runs for a specific line
644
+ *
645
+ * @param block - The paragraph block
646
+ * @param line - The line measurement
647
+ * @returns Array of runs for this line
648
+ */
649
+ function sliceRunsForLine(block, line) {
650
+ const result = [];
651
+ const runs = block.runs;
652
+ for (let runIndex = line.fromRun; runIndex <= line.toRun; runIndex++) {
653
+ const run = runs[runIndex];
654
+ if (!run) continue;
655
+ if (isTextRun(run)) {
656
+ const startChar = runIndex === line.fromRun ? line.fromChar : 0;
657
+ const endChar = runIndex === line.toRun ? line.toChar : run.text.length;
658
+ if (startChar > 0 || endChar < run.text.length) {
659
+ const slicedText = run.text.slice(startChar, endChar);
660
+ const clampPm = (position) => run.pmEnd === void 0 ? position : Math.min(position, run.pmEnd);
661
+ result.push({
662
+ ...run,
663
+ text: slicedText,
664
+ ...run.pmStart !== void 0 ? {
665
+ pmStart: clampPm(run.pmStart + startChar),
666
+ pmEnd: clampPm(run.pmStart + endChar)
667
+ } : {}
668
+ });
669
+ } else result.push(run);
670
+ } else result.push(run);
671
+ }
672
+ return result;
673
+ }
674
+ /**
675
+ * Split each text run carrying an East-Asian font into per-script sub-runs, so
676
+ * CJK code points render with `eastAsiaFontFamily` and the rest with
677
+ * `fontFamily`. Each sub-run gets a contiguous, exact `pmStart`/`pmEnd` (the
678
+ * same offset math as `sliceRunsForLine`), keeping PM position mapping,
679
+ * selection rects, and click-to-caret correct. The measurer segments the same
680
+ * way, so the per-run advances sum to the measured run width. Non-text runs and
681
+ * runs without CJK pass through unchanged (the common path).
682
+ */
683
+ function splitTextRunsByEastAsia(runs) {
684
+ const result = [];
685
+ for (const run of runs) {
686
+ if (!isTextRun(run) || run.eastAsiaFontFamily === void 0 || run.letterSpacing || !hasCjk(run.text)) {
687
+ result.push(run);
688
+ continue;
689
+ }
690
+ let offset = 0;
691
+ for (const segment of segmentByScript(run.text)) {
692
+ result.push({
693
+ ...run,
694
+ text: segment.text,
695
+ ...segment.isCjk ? { fontFamily: run.eastAsiaFontFamily } : {},
696
+ ...run.pmStart !== void 0 ? {
697
+ pmStart: run.pmStart + offset,
698
+ pmEnd: run.pmStart + offset + segment.text.length
699
+ } : {}
700
+ });
701
+ offset += segment.text.length;
702
+ }
703
+ }
704
+ return result;
705
+ }
706
+ /**
707
+ * Sub-pixel tolerance when comparing canvas-measured widths against the DOM's
708
+ * actual right edge. Accumulated rounding from canvas measureText vs. browser
709
+ * layout can leave a right-anchored tab one pixel short, so the flex anchor
710
+ * must trigger within this slack.
711
+ */
712
+ const RIGHT_EDGE_EPSILON_PX = .5;
713
+ /**
714
+ * Build a TextMeasureStyle from a TextRun or FieldRun's relevant fields.
715
+ */
716
+ function runMeasureStyle(run) {
717
+ return {
718
+ ...run.bold !== void 0 ? { bold: run.bold } : {},
719
+ ...run.italic !== void 0 ? { italic: run.italic } : {},
720
+ ...run.letterSpacing !== void 0 ? { letterSpacing: run.letterSpacing } : {},
721
+ ...run.smallCaps !== void 0 ? { smallCaps: run.smallCaps } : {},
722
+ ...run.eastAsiaFontFamily !== void 0 ? { eastAsiaFontFamily: run.eastAsiaFontFamily } : {}
723
+ };
724
+ }
725
+ /**
726
+ * Sum the pixel widths of runs that follow a tab on the same line, up to the
727
+ * next tab or line break. Measures per-run so the right-tab anchor reserves
728
+ * the exact space the trailing content will take when it uses a different
729
+ * font/size from the default (e.g. TOC page numbers). Floating images
730
+ * contribute 0 inline width — they render at the page level.
731
+ */
732
+ function measureFollowingContentWidth(runs, tabRunIndex, measureText, context) {
733
+ let width = 0;
734
+ for (let i = tabRunIndex + 1; i < runs.length; i++) {
735
+ const run = runs[i];
736
+ if (isTabRun(run) || isLineBreakRun(run)) break;
737
+ const scale = run.horizontalScale ?? 100;
738
+ if (isTextRun(run)) {
739
+ const text = run.allCaps ? run.text.toLocaleUpperCase() : run.text;
740
+ width += measureText(text, run.fontSize ?? 11, run.fontFamily ?? "Calibri", runMeasureStyle(run)) * (scale / 100);
741
+ } else if (isFieldRun(run)) {
742
+ const fieldText = resolveFieldText(run, context);
743
+ width += measureText(run.allCaps ? fieldText.toLocaleUpperCase() : fieldText, run.fontSize ?? 11, run.fontFamily ?? "Calibri", runMeasureStyle(run)) * (scale / 100);
744
+ } else if (isImageRun(run) && !isFloatingImageRun(run)) width += inlineImageBoundingBox(run).width || 0;
745
+ else if (isMathRun(run)) width += measureText(run.plainText, run.fontSize ?? 11, run.fontFamily ?? "Cambria Math", runMeasureStyle(run)) * (scale / 100);
746
+ }
747
+ return width;
748
+ }
749
+ /**
750
+ * Width of the decimal prefix (text before the first ".") that follows a tab,
751
+ * accumulated per run so a prefix spanning multiple fonts measures each part in
752
+ * its own font. After the EA split a prefix like `合計12` is a CJK sub-run (EA
753
+ * font) followed by a Latin sub-run, so measuring the whole prefix in the first
754
+ * sub-run's font would force the digits into the EA face and drift the decimal
755
+ * point from the measured tab stop.
756
+ */
757
+ function measureDecimalPrefixWidth(runs, tabRunIndex, decimalIndex, measureText, context) {
758
+ let width = 0;
759
+ let consumed = 0;
760
+ for (let i = tabRunIndex + 1; i < runs.length && consumed < decimalIndex; i++) {
761
+ const run = runs[i];
762
+ if (isTabRun(run) || isLineBreakRun(run)) break;
763
+ if (!isTextRun(run) && !isFieldRun(run) && !isMathRun(run)) continue;
764
+ let runText;
765
+ if (isFieldRun(run)) {
766
+ const resolved = resolveFieldText(run, context);
767
+ runText = run.allCaps ? resolved.toLocaleUpperCase() : resolved;
768
+ } else if (isMathRun(run)) runText = run.plainText;
769
+ else runText = run.allCaps ? run.text.toLocaleUpperCase() : run.text;
770
+ const take = Math.min(runText.length, decimalIndex - consumed);
771
+ if (take > 0) {
772
+ const scale = run.horizontalScale ?? 100;
773
+ width += measureText(runText.slice(0, take), run.fontSize ?? 11, run.fontFamily ?? "Calibri", runMeasureStyle(run)) * (scale / 100);
774
+ }
775
+ consumed += runText.length;
776
+ }
777
+ return width;
778
+ }
779
+ /**
780
+ * Build a stable key for an inline image run.
781
+ * PM positions are preferred because they uniquely identify the source node.
782
+ */
783
+ function getInlineImageRunKey(run) {
784
+ return [
785
+ run.pmStart ?? "no-start",
786
+ run.pmEnd ?? "no-end",
787
+ run.src,
788
+ run.width,
789
+ run.height,
790
+ run.displayMode ?? "inline",
791
+ run.wrapType ?? "none"
792
+ ].join("|");
793
+ }
794
+ /**
795
+ * Convert layout engine TabStop to tab calculator TabStop format
796
+ */
797
+ function convertTabStopToCalc(stop) {
798
+ return {
799
+ val: stop.val,
800
+ pos: stop.pos,
801
+ ...stop.leader !== void 0 ? { leader: stop.leader } : {}
802
+ };
803
+ }
804
+ /**
805
+ * Get the text content immediately following a tab run in the runs array
806
+ * Used for center/end/decimal tab alignment calculations
807
+ */
808
+ function getTextAfterTab(runs, tabRunIndex, context) {
809
+ let text = "";
810
+ for (let i = tabRunIndex + 1; i < runs.length; i++) {
811
+ const run = runs[i];
812
+ if (isTextRun(run)) text += run.text;
813
+ else if (isFieldRun(run)) text += resolveFieldText(run, context);
814
+ else if (isTabRun(run) || isLineBreakRun(run)) break;
815
+ else if (isMathRun(run)) text += run.plainText;
816
+ }
817
+ return text;
818
+ }
819
+ function applyLetterSpacingToMeasuredWidth(width, text, letterSpacing) {
820
+ if (!letterSpacing || text.length <= 1) return width;
821
+ return width + letterSpacing * (text.length - 1);
822
+ }
823
+ function createTextMeasurer(doc) {
824
+ const ctx = doc.createElement("canvas").getContext("2d");
825
+ return (text, fontSize = 11, fontFamily = "Calibri", style = {}) => {
826
+ if (!ctx) return applyLetterSpacingToMeasuredWidth(text.length * 7, text, style.letterSpacing);
827
+ const cssFallback = resolveFontFamily(fontFamily).cssFallback;
828
+ const fontSizePx = fontSize * 96 / 72;
829
+ const fontPrefixParts = [];
830
+ if (style.italic) fontPrefixParts.push("italic");
831
+ if (style.smallCaps) fontPrefixParts.push("small-caps");
832
+ if (style.bold) fontPrefixParts.push("800");
833
+ fontPrefixParts.push(`${fontSizePx}px`);
834
+ const fontPrefix = fontPrefixParts.join(" ");
835
+ if (style.eastAsiaFontFamily && !style.letterSpacing && hasCjk(text)) {
836
+ const eaFallback = resolveFontFamily(style.eastAsiaFontFamily).cssFallback;
837
+ let segmentedWidth = 0;
838
+ for (const segment of segmentByScript(text)) {
839
+ ctx.font = `${fontPrefix} ${segment.isCjk ? eaFallback : cssFallback}`;
840
+ segmentedWidth += ctx.measureText(segment.text).width;
841
+ }
842
+ return segmentedWidth;
843
+ }
844
+ ctx.font = `${fontPrefix} ${cssFallback}`;
845
+ return applyLetterSpacingToMeasuredWidth(ctx.measureText(text).width, text, style.letterSpacing);
846
+ };
847
+ }
848
+ /**
849
+ * Render a single line
850
+ *
851
+ * @param block - The paragraph block
852
+ * @param line - The line measurement
853
+ * @param alignment - Text alignment
854
+ * @param doc - Document to create elements in
855
+ * @param options - Additional options for justify calculation
856
+ * @returns The line DOM element
857
+ */
858
+ function renderLine(block, line, alignment, doc, options) {
859
+ const lineEl = doc.createElement("div");
860
+ lineEl.className = PARAGRAPH_CLASS_NAMES.line;
861
+ lineEl.style.boxSizing = "content-box";
862
+ lineEl.style.height = `${line.lineHeight}px`;
863
+ lineEl.style.lineHeight = `${line.lineHeight}px`;
864
+ const runsForLine = splitTextRunsByEastAsia(sliceRunsForLine(block, line));
865
+ const onlyRun = runsForLine.length === 1 ? runsForLine[0] : void 0;
866
+ if (onlyRun && isMathRun(onlyRun) && onlyRun.display === "block" && block.attrs?.alignment !== "right") lineEl.style.textAlign = "center";
867
+ if (runsForLine.length === 1 && isImageRun(runsForLine[0])) {
868
+ lineEl.style.display = "flex";
869
+ lineEl.style.alignItems = "center";
870
+ const imageAlign = resolveImageLineAlign(runsForLine[0], alignment);
871
+ if (imageAlign === "center") lineEl.style.justifyContent = "center";
872
+ else if (imageAlign === "right") lineEl.style.justifyContent = "flex-end";
873
+ } else if (runsForLine.some((r) => isImageRun(r) && !isFloatingImageRun(r))) {
874
+ lineEl.style.display = "flex";
875
+ lineEl.style.alignItems = "baseline";
876
+ if (alignment === "center") lineEl.style.justifyContent = "center";
877
+ else if (alignment === "right") lineEl.style.justifyContent = "flex-end";
878
+ lineEl.style.lineHeight = "normal";
879
+ }
880
+ if (runsForLine.length === 0) {
881
+ const emptySpan = doc.createElement("span");
882
+ emptySpan.className = `${PARAGRAPH_CLASS_NAMES.run} layout-empty-run`;
883
+ const trailingRun = block.runs.at(-1);
884
+ const trailingBreakEnd = line.fromRun > block.runs.length - 1 && trailingRun !== void 0 && isLineBreakRun(trailingRun) ? trailingRun.pmEnd : void 0;
885
+ const contentStart = trailingBreakEnd ?? (block.pmStart === void 0 ? void 0 : block.pmStart + 1);
886
+ applyPmPositions(emptySpan, contentStart, trailingBreakEnd !== void 0 ? contentStart : block.pmEnd ?? contentStart);
887
+ emptySpan.innerHTML = "&nbsp;";
888
+ lineEl.append(emptySpan);
889
+ return lineEl;
890
+ }
891
+ if (alignment === "justify" && options) {
892
+ if (!options.isLastLine || options.paragraphEndsWithLineBreak) {
893
+ lineEl.style.textAlign = "justify";
894
+ lineEl.style.textAlignLast = "justify";
895
+ lineEl.style.width = `${options.availableWidth}px`;
896
+ }
897
+ }
898
+ lineEl.style.whiteSpace = "pre";
899
+ lineEl.style.overflow = "visible";
900
+ const hasTabRuns = runsForLine.some(isTabRun);
901
+ let tabContext;
902
+ const measureText = createTextMeasurer(doc);
903
+ if (hasTabRuns) {
904
+ const explicitStops = options?.tabStops?.map(convertTabStopToCalc);
905
+ const leftIndentTwips = options?.leftIndentPx ? Math.round(options.leftIndentPx * 15) : 0;
906
+ tabContext = {
907
+ ...explicitStops !== void 0 ? { explicitStops } : {},
908
+ leftIndent: leftIndentTwips
909
+ };
910
+ }
911
+ let currentX;
912
+ const leftIndentPx = options?.leftIndentPx ?? 0;
913
+ if (options?.isFirstLine) {
914
+ const firstLineIndentPx = options.firstLineIndentPx ?? 0;
915
+ const markerInlineWidth = getListMarkerInlineWidth(block);
916
+ currentX = leftIndentPx + firstLineIndentPx + markerInlineWidth;
917
+ } else currentX = leftIndentPx;
918
+ for (let i = 0; i < runsForLine.length; i++) {
919
+ const run = runsForLine[i];
920
+ if (isTabRun(run) && tabContext) {
921
+ const followingWidth = measureFollowingContentWidth(runsForLine, i, measureText, options?.context);
922
+ const decimalIndex = getTextAfterTab(runsForLine, i, options?.context).indexOf(".");
923
+ const decimalPrefixWidth = decimalIndex !== -1 ? measureDecimalPrefixWidth(runsForLine, i, decimalIndex, measureText, options?.context) : 0;
924
+ const tabResult = calculateTabWidth(currentX, tabContext, {
925
+ followingWidth,
926
+ decimalPrefixWidth
927
+ });
928
+ const lineRightEdgeX = options?.lineRightEdgePx;
929
+ const followingWidthForCheck = followingWidth;
930
+ let hasFollowingTab = false;
931
+ for (let j = i + 1; j < runsForLine.length; j++) {
932
+ const next = runsForLine[j];
933
+ if (isLineBreakRun(next)) break;
934
+ if (isTabRun(next)) {
935
+ hasFollowingTab = true;
936
+ break;
937
+ }
938
+ }
939
+ if (lineRightEdgeX !== void 0 && tabResult.alignment === "end" && !hasFollowingTab && currentX + tabResult.width + followingWidthForCheck >= lineRightEdgeX - RIGHT_EDGE_EPSILON_PX) {
940
+ lineEl.style.display = "flex";
941
+ lineEl.style.alignItems = "baseline";
942
+ lineEl.style.whiteSpace = "pre";
943
+ lineEl.style.textIndent = "0";
944
+ if (alignment === "center") lineEl.style.justifyContent = "center";
945
+ else if (alignment === "right") lineEl.style.justifyContent = "flex-end";
946
+ lineEl.dataset["flexLine"] = "true";
947
+ const tabEl = renderTabRun(run, doc, 0, tabResult.leader);
948
+ tabEl.style.flex = "1 1 0";
949
+ tabEl.style.minWidth = "0";
950
+ tabEl.style.width = "auto";
951
+ lineEl.append(tabEl);
952
+ if (options?.isFirstLine && options.firstLineIndentPx !== void 0 && options.firstLineIndentPx !== 0 && lineEl.firstElementChild instanceof HTMLElement) lineEl.firstElementChild.style.marginLeft = `${options.firstLineIndentPx}px`;
953
+ for (let j = i + 1; j < runsForLine.length; j++) {
954
+ const next = runsForLine[j];
955
+ if (isTabRun(next) || isLineBreakRun(next)) break;
956
+ if (isTextRun(next)) lineEl.append(renderTextRun(next, doc));
957
+ else if (isFieldRun(next) && options?.context) lineEl.append(renderFieldRun(next, doc, options.context));
958
+ else if (isImageRun(next)) {
959
+ if (isFloatingImageRun(next)) continue;
960
+ const imageKey = getInlineImageRunKey(next);
961
+ if (!options?.renderedInlineImageKeys?.has(imageKey)) {
962
+ options?.renderedInlineImageKeys?.add(imageKey);
963
+ lineEl.append(renderImageRun(next, doc));
964
+ }
965
+ } else lineEl.append(renderRun(next, doc, options?.context));
966
+ }
967
+ break;
968
+ }
969
+ let tabWidth = tabResult.width;
970
+ if (lineRightEdgeX !== void 0 && currentX + tabWidth + followingWidthForCheck > lineRightEdgeX) tabWidth = Math.max(1, lineRightEdgeX - currentX - followingWidthForCheck);
971
+ const tabEl = renderTabRun(run, doc, tabWidth, tabResult.leader);
972
+ lineEl.append(tabEl);
973
+ currentX += tabWidth;
974
+ } else if (isTextRun(run)) {
975
+ const runEl = renderTextRun(run, doc);
976
+ lineEl.append(runEl);
977
+ const fontSize = run.fontSize || 11;
978
+ const fontFamily = run.fontFamily || "Calibri";
979
+ const measuredWidth = measureText(run.allCaps ? run.text.toLocaleUpperCase() : run.text, fontSize, fontFamily, {
980
+ ...run.bold !== void 0 ? { bold: run.bold } : {},
981
+ ...run.italic !== void 0 ? { italic: run.italic } : {},
982
+ ...run.letterSpacing !== void 0 ? { letterSpacing: run.letterSpacing } : {},
983
+ ...run.smallCaps !== void 0 ? { smallCaps: run.smallCaps } : {}
984
+ });
985
+ reserveScaledAdvance(runEl, measuredWidth, run.horizontalScale);
986
+ currentX += measuredWidth * ((run.horizontalScale ?? 100) / 100);
987
+ } else if (isImageRun(run)) {
988
+ if (isFloatingImageRun(run)) continue;
989
+ const imageKey = getInlineImageRunKey(run);
990
+ if (options?.renderedInlineImageKeys?.has(imageKey)) continue;
991
+ options?.renderedInlineImageKeys?.add(imageKey);
992
+ const runEl = renderImageRun(run, doc);
993
+ lineEl.append(runEl);
994
+ if (run.displayMode !== "block" && run.wrapType !== "topAndBottom") currentX += inlineImageBoundingBox(run).width;
995
+ } else if (isLineBreakRun(run)) {
996
+ const runEl = renderLineBreakRun(run, doc);
997
+ lineEl.append(runEl);
998
+ } else if (isFieldRun(run) && options?.context) {
999
+ const runEl = renderFieldRun(run, doc, options.context);
1000
+ lineEl.append(runEl);
1001
+ const fieldText = resolveFieldText(run, options.context);
1002
+ const fontSize = run.fontSize || 11;
1003
+ const fontFamily = run.fontFamily || "Calibri";
1004
+ const measuredWidth = measureText(run.allCaps ? fieldText.toLocaleUpperCase() : fieldText, fontSize, fontFamily, runMeasureStyle(run));
1005
+ reserveScaledAdvance(runEl, measuredWidth, run.horizontalScale);
1006
+ currentX += measuredWidth * ((run.horizontalScale ?? 100) / 100);
1007
+ } else if (isMathRun(run)) {
1008
+ const runEl = renderMathRun(run, doc);
1009
+ lineEl.append(runEl);
1010
+ const measuredWidth = measureText(run.plainText, run.fontSize ?? 11, run.fontFamily ?? "Cambria Math", runMeasureStyle(run));
1011
+ reserveScaledAdvance(runEl, measuredWidth, run.horizontalScale);
1012
+ currentX += measuredWidth * ((run.horizontalScale ?? 100) / 100);
1013
+ } else {
1014
+ const runEl = renderRun(run, doc, options?.context);
1015
+ lineEl.append(runEl);
1016
+ }
1017
+ }
1018
+ const inFlowRuns = runsForLine.filter((run) => !(isImageRun(run) && isFloatingImageRun(run)));
1019
+ const blankBreakRun = inFlowRuns.length > 0 && inFlowRuns.every(isLineBreakRun) ? inFlowRuns.find(isLineBreakRun) : void 0;
1020
+ if (blankBreakRun?.pmStart !== void 0) {
1021
+ const marker = doc.createElement("span");
1022
+ marker.className = PARAGRAPH_CLASS_NAMES.run;
1023
+ applyPmPositions(marker, blankBreakRun.pmStart, blankBreakRun.pmStart);
1024
+ marker.textContent = "​";
1025
+ lineEl.prepend(marker);
1026
+ }
1027
+ return lineEl;
1028
+ }
1029
+ /**
1030
+ * Check if two individual border definitions are equal (same style, width, color).
1031
+ */
1032
+ function bordersEqual(a, b) {
1033
+ if (!a && !b) return true;
1034
+ if (!a || !b) return false;
1035
+ return a.style === b.style && a.width === b.width && a.color === b.color;
1036
+ }
1037
+ /**
1038
+ * Check if two ParagraphBorders form a group (ECMA-376 §17.3.1.24).
1039
+ * Adjacent paragraphs with identical border definitions belong to the same group.
1040
+ */
1041
+ function bordersFormGroup(a, b) {
1042
+ if (!a && !b) return false;
1043
+ if (!a || !b) return false;
1044
+ return bordersEqual(a.top, b.top) && bordersEqual(a.bottom, b.bottom) && bordersEqual(a.left, b.left) && bordersEqual(a.right, b.right) && bordersEqual(a.between, b.between);
1045
+ }
1046
+ /**
1047
+ * Decide whether a paragraph without an explicit `w:bidi` flag should still be
1048
+ * laid out right-to-left. Only paragraphs that carry at least one `w:rtl` run
1049
+ * are candidates; among those the base direction follows the first strong
1050
+ * directional character (the `dir="auto"` rule), so Hebrew/Arabic-led lines
1051
+ * order RTL while an English- (or CJK-/Devanagari-/…) led line stays LTR.
1052
+ * eigenpal #723 (#719).
1053
+ */
1054
+ function paragraphBaseIsRtl(block) {
1055
+ const runs = block.runs.filter((r) => isTextRun(r) || isFieldRun(r));
1056
+ if (!runs.some((r) => r.rtl)) return false;
1057
+ return detectBaseDirection(runs.map((r) => {
1058
+ if (isTextRun(r)) return r.text;
1059
+ return isFieldRun(r) ? r.fallback ?? "" : "";
1060
+ }).join("")) !== "ltr";
1061
+ }
1062
+ /**
1063
+ * Render a paragraph fragment
1064
+ *
1065
+ * @param fragment - The fragment to render
1066
+ * @param block - The paragraph block
1067
+ * @param measure - The paragraph measurement
1068
+ * @param context - Rendering context
1069
+ * @param options - Rendering options
1070
+ * @returns The fragment DOM element
1071
+ */
1072
+ function renderParagraphFragment(fragment, block, measure, context, options = {}) {
1073
+ const doc = options.document ?? document;
1074
+ const fragmentEl = doc.createElement("div");
1075
+ fragmentEl.className = PARAGRAPH_CLASS_NAMES.fragment;
1076
+ fragmentEl.style.position = "relative";
1077
+ fragmentEl.dataset["blockId"] = String(fragment.blockId);
1078
+ fragmentEl.dataset["fromLine"] = String(fragment.fromLine);
1079
+ fragmentEl.dataset["toLine"] = String(fragment.toLine);
1080
+ applyPmPositions(fragmentEl, fragment.pmStart, fragment.pmEnd);
1081
+ applySdtDataAttrs(fragmentEl, fragment.sdtGroups);
1082
+ if (fragment.continuesFromPrev) fragmentEl.dataset["continuesFromPrev"] = "true";
1083
+ if (fragment.continuesOnNext) fragmentEl.dataset["continuesOnNext"] = "true";
1084
+ const lines = measure.lines.slice(fragment.fromLine, fragment.toLine);
1085
+ const alignment = block.attrs?.alignment;
1086
+ if (block.attrs?.styleId) fragmentEl.dataset["styleId"] = block.attrs.styleId;
1087
+ const isRtl = block.attrs?.bidi ?? paragraphBaseIsRtl(block);
1088
+ if (isRtl) fragmentEl.dir = "rtl";
1089
+ if (alignment) if (alignment === "center") fragmentEl.style.textAlign = "center";
1090
+ else if (alignment === "right") fragmentEl.style.textAlign = "right";
1091
+ else if (alignment === "left") fragmentEl.style.textAlign = "left";
1092
+ else fragmentEl.style.textAlign = isRtl ? "right" : "left";
1093
+ else if (isRtl) fragmentEl.style.textAlign = "right";
1094
+ const effectiveAlignment = alignment ?? (isRtl ? "right" : void 0);
1095
+ const indent = block.attrs?.indent;
1096
+ let indentLeft = 0;
1097
+ let indentRight = 0;
1098
+ if (indent) if (isRtl) {
1099
+ if (indent.left !== void 0) indentRight = indent.left;
1100
+ if (indent.right !== void 0) indentLeft = indent.right;
1101
+ } else {
1102
+ if (indent.left !== void 0) indentLeft = indent.left;
1103
+ if (indent.right !== void 0) indentRight = indent.right;
1104
+ }
1105
+ const borders = block.attrs?.borders;
1106
+ if (borders) {
1107
+ const borderStyleToCss = (style) => {
1108
+ switch (style) {
1109
+ case "single": return "solid";
1110
+ case "double": return "double";
1111
+ case "dotted": return "dotted";
1112
+ case "dashed": return "dashed";
1113
+ case "thick": return "solid";
1114
+ case "wave": return "wavy";
1115
+ case "dashSmallGap": return "dashed";
1116
+ case "nil":
1117
+ case "none": return "none";
1118
+ default: return "solid";
1119
+ }
1120
+ };
1121
+ fragmentEl.style.boxSizing = "border-box";
1122
+ const borderToCss = (b) => `${b.width}px ${borderStyleToCss(b.style)} ${b.color}`;
1123
+ const groupedWithPrev = bordersFormGroup(options.prevBorders, borders);
1124
+ const groupedWithNext = bordersFormGroup(borders, options.nextBorders);
1125
+ const renderedTopBorder = groupedWithPrev ? borders.between : borders.top;
1126
+ const renderedBottomBorder = !groupedWithNext ? borders.bottom : void 0;
1127
+ const borderBox = doc.createElement("div");
1128
+ borderBox.className = "layout-paragraph-border";
1129
+ borderBox.style.position = "absolute";
1130
+ borderBox.style.pointerEvents = "none";
1131
+ borderBox.style.boxSizing = "border-box";
1132
+ borderBox.style.left = `${indentLeft - (borders.left?.space ?? 0) - (borders.left?.width ?? 0)}px`;
1133
+ borderBox.style.right = `${indentRight - (borders.right?.space ?? 0) - (borders.right?.width ?? 0)}px`;
1134
+ borderBox.style.top = `${-(renderedTopBorder?.space ?? 0) - (renderedTopBorder?.width ?? 0)}px`;
1135
+ borderBox.style.bottom = `${-(renderedBottomBorder?.space ?? 0) - (renderedBottomBorder?.width ?? 0)}px`;
1136
+ if (renderedTopBorder) borderBox.style.borderTop = borderToCss(renderedTopBorder);
1137
+ if (renderedBottomBorder) borderBox.style.borderBottom = borderToCss(renderedBottomBorder);
1138
+ if (borders.left) borderBox.style.borderLeft = borderToCss(borders.left);
1139
+ if (borders.right) borderBox.style.borderRight = borderToCss(borders.right);
1140
+ if (renderedTopBorder || renderedBottomBorder || borders.left || borders.right) {
1141
+ fragmentEl.style.position = "relative";
1142
+ fragmentEl.append(borderBox);
1143
+ }
1144
+ if (borders.bar) {
1145
+ const barEl = doc.createElement("div");
1146
+ barEl.style.position = "absolute";
1147
+ barEl.style.left = "-8px";
1148
+ barEl.style.top = "0";
1149
+ barEl.style.bottom = "0";
1150
+ barEl.style.borderLeft = borderToCss(borders.bar);
1151
+ fragmentEl.style.position = "relative";
1152
+ fragmentEl.append(barEl);
1153
+ }
1154
+ }
1155
+ if (block.attrs?.shading) {
1156
+ fragmentEl.style.backgroundColor = block.attrs.shading;
1157
+ const automaticTextColor = getAutomaticTextColorForBackground(block.attrs.shading);
1158
+ if (automaticTextColor) fragmentEl.style.color = automaticTextColor;
1159
+ }
1160
+ const availableWidth = fragment.width - indentLeft - indentRight;
1161
+ const paragraphEndsWithLineBreak = block.runs.at(-1)?.kind === "lineBreak";
1162
+ const totalLines = measure.lines.length;
1163
+ let firstLineIndentPx = 0;
1164
+ if (indent?.hanging && indent.hanging > 0) firstLineIndentPx = -indent.hanging;
1165
+ else if (indent?.firstLine && indent.firstLine > 0) firstLineIndentPx = indent.firstLine;
1166
+ let _cumulativeLineY = 0;
1167
+ const renderedInlineImageKeys = options.renderedInlineImageKeys ?? /* @__PURE__ */ new Set();
1168
+ for (let i = 0; i < lines.length; i++) {
1169
+ const line = lines[i];
1170
+ const lineIndex = fragment.fromLine + i;
1171
+ const isLastLine = lineIndex === totalLines - 1;
1172
+ const isFirstLine = lineIndex === 0 && !fragment.continuesFromPrev;
1173
+ const lineLeftOffset = line.leftOffset ?? 0;
1174
+ const lineRightOffset = line.rightOffset ?? 0;
1175
+ const lineAvailableWidth = availableWidth;
1176
+ const lineEl = renderLine(block, line, effectiveAlignment, doc, {
1177
+ availableWidth: lineAvailableWidth - lineLeftOffset - lineRightOffset,
1178
+ isLastLine,
1179
+ isFirstLine,
1180
+ paragraphEndsWithLineBreak,
1181
+ ...block.attrs?.tabs !== void 0 ? { tabStops: block.attrs.tabs } : {},
1182
+ leftIndentPx: indentLeft,
1183
+ firstLineIndentPx: isFirstLine ? firstLineIndentPx : 0,
1184
+ context,
1185
+ floatingMargins: {
1186
+ leftMargin: lineLeftOffset,
1187
+ rightMargin: lineRightOffset
1188
+ },
1189
+ renderedInlineImageKeys,
1190
+ lineRightEdgePx: fragment.width - indentRight - lineRightOffset
1191
+ });
1192
+ const isFlexLine = lineEl.dataset["flexLine"] === "true";
1193
+ const lineMarginLeft = Math.min(indentLeft, 0) + lineLeftOffset;
1194
+ if (lineMarginLeft !== 0 || lineRightOffset > 0 || indentLeft < 0 || indentRight < 0) {
1195
+ lineEl.style.marginLeft = `${lineMarginLeft}px`;
1196
+ if (lineRightOffset > 0) lineEl.style.marginRight = `${lineRightOffset}px`;
1197
+ const constrainedWidth = lineAvailableWidth - lineLeftOffset - lineRightOffset;
1198
+ if (constrainedWidth > 0) lineEl.style.width = `${constrainedWidth}px`;
1199
+ }
1200
+ _cumulativeLineY += line.lineHeight;
1201
+ if (line.floatSkipBefore !== void 0 && line.floatSkipBefore > 0) {
1202
+ lineEl.style.marginTop = `${line.floatSkipBefore}px`;
1203
+ _cumulativeLineY += line.floatSkipBefore;
1204
+ }
1205
+ const hasHanging = indent?.hanging && indent.hanging > 0;
1206
+ const hasFirstLine = indent?.firstLine && indent.firstLine > 0;
1207
+ if (isFirstLine) {
1208
+ if (indentLeft !== 0 && hasHanging) {
1209
+ lineEl.style.paddingLeft = `${Math.max(indentLeft, 0)}px`;
1210
+ if (!isFlexLine) lineEl.style.textIndent = `-${indent.hanging ?? 0}px`;
1211
+ } else if (indentLeft !== 0 && hasFirstLine) {
1212
+ lineEl.style.paddingLeft = `${Math.max(indentLeft, 0)}px`;
1213
+ if (!isFlexLine) lineEl.style.textIndent = `${indent.firstLine ?? 0}px`;
1214
+ } else if (indentLeft > 0) lineEl.style.paddingLeft = `${indentLeft}px`;
1215
+ else if (hasFirstLine && !isFlexLine) lineEl.style.textIndent = `${indent.firstLine ?? 0}px`;
1216
+ } else if (indentLeft > 0) lineEl.style.paddingLeft = `${indentLeft}px`;
1217
+ else if (hasHanging) lineEl.style.paddingLeft = `${indent.hanging ?? 0}px`;
1218
+ if (indentRight > 0) lineEl.style.paddingRight = `${indentRight}px`;
1219
+ if (isFirstLine && block.attrs?.listMarker && !block.attrs.listMarkerHidden) {
1220
+ const hanging = indent?.hanging ?? 0;
1221
+ const firstLine = indent?.firstLine ?? 0;
1222
+ const markerStart = hanging > 0 ? indentLeft - hanging : indentLeft + firstLine;
1223
+ lineEl.style.paddingLeft = `${Math.max(0, markerStart)}px`;
1224
+ lineEl.style.textIndent = "0";
1225
+ let firstTextRun;
1226
+ if (!block.attrs.listMarkerFontFamily || !block.attrs.listMarkerFontSize) for (let ri = line.fromRun; ri <= line.toRun; ri++) {
1227
+ const r = block.runs[ri];
1228
+ if (r && r.kind === "text") {
1229
+ firstTextRun = r;
1230
+ break;
1231
+ }
1232
+ }
1233
+ const markerFontFamily = block.attrs.listMarkerFontFamily ?? firstTextRun?.fontFamily ?? block.attrs.defaultFontFamily;
1234
+ const markerFontSize = block.attrs.listMarkerFontSize ?? firstTextRun?.fontSize ?? block.attrs.defaultFontSize;
1235
+ const marker = renderListMarker(block.attrs.listMarker, getListMarkerInlineWidth(block), doc, markerFontFamily, markerFontSize, block.attrs.listMarkerRevision, block.attrs.listMarkerSecondSlotOffsetTwips);
1236
+ if (markerStart < 0 && indentLeft > 0) marker.style.marginLeft = `${markerStart}px`;
1237
+ lineEl.prepend(marker);
1238
+ }
1239
+ fragmentEl.append(lineEl);
1240
+ }
1241
+ return fragmentEl;
1242
+ }
1243
+ /**
1244
+ * Render a list marker element as an inline-block at the start of the first
1245
+ * body line. `minWidth` (from `getListMarkerInlineWidth`) sizes the marker
1246
+ * so the body text aligns at the next tab stop per ECMA-376 §17.9.25 —
1247
+ * this honours `w:suff` (`tab` / `space` / `nothing`) and the document's
1248
+ * tab grid. Long markers like "1.1.1." therefore grow to the next stop
1249
+ * instead of butting against the body text.
1250
+ */
1251
+ function renderListMarker(marker, minWidth, doc, fontFamily, fontSize, revision, secondSlotOffsetTwips) {
1252
+ const span = doc.createElement("span");
1253
+ span.className = "layout-list-marker";
1254
+ span.style.display = "inline-block";
1255
+ if (fontFamily) span.style.fontFamily = resolveFontFamily(fontFamily).cssFallback;
1256
+ if (fontSize) span.style.fontSize = `${fontSize * 96 / 72}px`;
1257
+ span.style.textAlign = "left";
1258
+ span.style.textAlignLast = "left";
1259
+ span.style.boxSizing = "border-box";
1260
+ if (minWidth > 0) span.style.minWidth = `${minWidth}px`;
1261
+ if (revision) {
1262
+ const authorIdx = getAuthorColorIdx(revision.author ?? "");
1263
+ const authorColor = AUTHOR_COLORS[authorIdx];
1264
+ span.style.color = authorColor;
1265
+ span.style.textDecorationColor = authorColor;
1266
+ span.dataset["tcAuthorIdx"] = String(authorIdx);
1267
+ if (revision.author) span.dataset["changeAuthor"] = revision.author;
1268
+ if (revision.date) span.dataset["changeDate"] = revision.date;
1269
+ if (revision.revisionId !== void 0) span.dataset["revisionId"] = String(revision.revisionId);
1270
+ const titleParts = [revision.author, revision.date ? new Date(revision.date).toLocaleDateString() : ""].filter(Boolean);
1271
+ if (revision.kind === "ins") {
1272
+ span.classList.add("docx-insertion");
1273
+ span.style.textDecorationLine = "underline";
1274
+ if (titleParts.length > 0) span.title = `Inserted: ${titleParts.join(", ")}`;
1275
+ } else {
1276
+ span.classList.add("docx-deletion");
1277
+ span.style.textDecorationLine = "line-through";
1278
+ if (titleParts.length > 0) span.title = `Deleted: ${titleParts.join(", ")}`;
1279
+ }
1280
+ }
1281
+ const tabIdx = marker.indexOf(" ");
1282
+ if (tabIdx !== -1 && secondSlotOffsetTwips !== void 0) {
1283
+ const firstSlot = doc.createElement("span");
1284
+ firstSlot.textContent = marker.slice(0, tabIdx);
1285
+ firstSlot.style.display = "inline-block";
1286
+ const secondSlot = doc.createElement("span");
1287
+ secondSlot.textContent = marker.slice(tabIdx + 1);
1288
+ secondSlot.style.display = "inline-block";
1289
+ span.style.position = "relative";
1290
+ secondSlot.style.position = "absolute";
1291
+ secondSlot.style.left = `${secondSlotOffsetTwips / 15}px`;
1292
+ secondSlot.style.top = "0";
1293
+ span.append(firstSlot, secondSlot);
1294
+ return span;
1295
+ }
1296
+ span.textContent = marker;
1297
+ return span;
1298
+ }
1299
+ //#endregion
1300
+ export { PARAGRAPH_CLASS_NAMES, renderLine, renderParagraphFragment, sliceRunsForLine, splitTextRunsByEastAsia };