@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,1972 @@
1
+ import { TABLE_CELL_TEXT_DIRECTION_VALUES, TABLE_WIDTH_TYPE_VALUES } from "../../../types/documentEnumValues.js";
2
+ import { resolveColor } from "../../../utils/colorResolver.js";
3
+ import { expectTableAttrs, expectTableCellAttrs, expectTableRowAttrs, mergeTableAttrs, mergeTableCellAttrs, mergeTableRowAttrs } from "../../attrs/index.js";
4
+ import { createExtension, createNodeExtension } from "../create.js";
5
+ import { panic } from "better-result";
6
+ import { Plugin, PluginKey, Selection, TextSelection } from "prosemirror-state";
7
+ import { Decoration, DecorationSet } from "prosemirror-view";
8
+ import { CellSelection, TableMap, columnResizing, mergeCells, removeRow, selectedRect, splitCell, tableEditing } from "prosemirror-tables";
9
+ //#region src/prosemirror/extensions/nodes/TableExtension.ts
10
+ /**
11
+ * Table Extension — 4 node specs + plugins + commands
12
+ *
13
+ * Uses separate NodeExtension instances for each table node type,
14
+ * plus an Extension for plugins and commands.
15
+ */
16
+ const isOneOf = (value, values) => value !== null && value !== void 0 && values.some((allowed) => allowed === value);
17
+ /** Map CSS border-style to OOXML border style. */
18
+ function cssBorderStyleToOoxml(cssStyle) {
19
+ switch (cssStyle.toLowerCase()) {
20
+ case "solid": return "single";
21
+ case "double": return "double";
22
+ case "dotted": return "dotted";
23
+ case "dashed": return "dashed";
24
+ case "groove": return "threeDEngrave";
25
+ case "ridge": return "threeDEmboss";
26
+ case "inset": return "inset";
27
+ case "outset": return "outset";
28
+ default: return "single";
29
+ }
30
+ }
31
+ /** Convert CSS border width to OOXML eighths-of-a-point. 1pt = 8 eighths. */
32
+ function cssBorderWidthToEighths(cssWidth) {
33
+ if (!cssWidth) return 8;
34
+ const trimmed = cssWidth.trim().toLowerCase();
35
+ if (trimmed === "thin") return 4;
36
+ if (trimmed === "medium") return 8;
37
+ if (trimmed === "thick") return 16;
38
+ const num = Number.parseFloat(trimmed);
39
+ if (Number.isNaN(num)) return 8;
40
+ if (trimmed.endsWith("pt")) return Math.round(num * 8);
41
+ if (trimmed.endsWith("px")) return Math.round(num * 6);
42
+ return Math.round(num * 6);
43
+ }
44
+ /** Parse CSS color (hex, rgb()) to ColorValue { rgb: 'RRGGBB' }. */
45
+ function parseCssColorToColorValue(cssColor) {
46
+ if (!cssColor || cssColor === "transparent" || cssColor === "inherit") return null;
47
+ const hexMatch = /#(?<hex>[0-9a-fA-F]{6})/u.exec(cssColor);
48
+ if (hexMatch) return { rgb: (hexMatch.groups?.["hex"] ?? "").toUpperCase() };
49
+ const shortHex = /#(?<hex>[0-9a-fA-F]{3})$/u.exec(cssColor);
50
+ if (shortHex) {
51
+ const hex3 = shortHex.groups?.["hex"] ?? "";
52
+ const r = hex3[0] ?? "";
53
+ const g = hex3[1] ?? "";
54
+ const b = hex3[2] ?? "";
55
+ return { rgb: (r + r + g + g + b + b).toUpperCase() };
56
+ }
57
+ const rgbMatch = /rgb\(\s*(?<r>\d+)\s*,\s*(?<g>\d+)\s*,\s*(?<b>\d+)\s*\)/u.exec(cssColor);
58
+ if (rgbMatch) return { rgb: [
59
+ rgbMatch.groups?.["r"] ?? "0",
60
+ rgbMatch.groups?.["g"] ?? "0",
61
+ rgbMatch.groups?.["b"] ?? "0"
62
+ ].map((v) => Number.parseInt(v, 10).toString(16).padStart(2, "0")).join("").toUpperCase() };
63
+ return null;
64
+ }
65
+ /** Extract cell borders from inline CSS (Google Docs: "border-left:solid #000000 1pt"). */
66
+ function extractCellBordersFromCSS(style) {
67
+ const parseSide = (cssStyle, cssColor, cssWidth) => {
68
+ if (!cssStyle || cssStyle === "none" || cssStyle === "hidden") return;
69
+ const color = parseCssColorToColorValue(cssColor);
70
+ return {
71
+ style: cssBorderStyleToOoxml(cssStyle),
72
+ ...color ? { color } : {},
73
+ size: cssBorderWidthToEighths(cssWidth)
74
+ };
75
+ };
76
+ const top = parseSide(style.borderTopStyle, style.borderTopColor, style.borderTopWidth);
77
+ const bottom = parseSide(style.borderBottomStyle, style.borderBottomColor, style.borderBottomWidth);
78
+ const left = parseSide(style.borderLeftStyle, style.borderLeftColor, style.borderLeftWidth);
79
+ const right = parseSide(style.borderRightStyle, style.borderRightColor, style.borderRightWidth);
80
+ if (!top && !bottom && !left && !right) return null;
81
+ return {
82
+ ...top !== void 0 ? { top } : {},
83
+ ...bottom !== void 0 ? { bottom } : {},
84
+ ...left !== void 0 ? { left } : {},
85
+ ...right !== void 0 ? { right } : {}
86
+ };
87
+ }
88
+ /** Extract cell padding from inline CSS and convert to twips. */
89
+ function extractCellMarginsFromCSS(style) {
90
+ const toTwips = (cssValue) => {
91
+ if (!cssValue || cssValue === "0px") return;
92
+ const num = Number.parseFloat(cssValue);
93
+ if (Number.isNaN(num) || num === 0) return;
94
+ if (cssValue.endsWith("pt")) return Math.round(num * 20);
95
+ return Math.round(num * 15);
96
+ };
97
+ const top = toTwips(style.paddingTop);
98
+ const right = toTwips(style.paddingRight);
99
+ const bottom = toTwips(style.paddingBottom);
100
+ const left = toTwips(style.paddingLeft);
101
+ if (top === void 0 && right === void 0 && bottom === void 0 && left === void 0) return null;
102
+ return {
103
+ ...top !== void 0 ? { top } : {},
104
+ ...right !== void 0 ? { right } : {},
105
+ ...bottom !== void 0 ? { bottom } : {},
106
+ ...left !== void 0 ? { left } : {}
107
+ };
108
+ }
109
+ /** Map CSS vertical-align to editor's verticalAlign attr. */
110
+ function mapCssVerticalAlign(cssValue) {
111
+ if (!cssValue) return;
112
+ switch (cssValue.toLowerCase()) {
113
+ case "top": return "top";
114
+ case "middle": return "center";
115
+ case "bottom": return "bottom";
116
+ default: return;
117
+ }
118
+ }
119
+ /** Parse CSS color to hex string (without '#' prefix) for backgroundColor attr. */
120
+ function parseCssColorToHex(cssColor) {
121
+ return parseCssColorToColorValue(cssColor)?.rgb;
122
+ }
123
+ /** Shared parseDOM getAttrs for td/th — extracts borders, padding, alignment from CSS. */
124
+ function parseCellAttrsFromDOM(element) {
125
+ const style = element.style;
126
+ const borders = extractCellBordersFromCSS(style);
127
+ const margins = extractCellMarginsFromCSS(style);
128
+ const rawValign = element.dataset["valign"];
129
+ const verticalAlign = (rawValign === "top" || rawValign === "center" || rawValign === "bottom" ? rawValign : void 0) ?? mapCssVerticalAlign(style.verticalAlign) ?? void 0;
130
+ const backgroundColor = element.dataset["bgcolor"] || parseCssColorToHex(style.backgroundColor) || void 0;
131
+ return {
132
+ colspan: Number(element.getAttribute("colspan") ?? "1") || 1,
133
+ rowspan: Number(element.getAttribute("rowspan") ?? "1") || 1,
134
+ ...verticalAlign !== void 0 ? { verticalAlign } : {},
135
+ ...backgroundColor !== void 0 ? { backgroundColor } : {},
136
+ ...borders ? { borders } : {},
137
+ ...margins ? { margins } : {}
138
+ };
139
+ }
140
+ const tableSpec = {
141
+ content: "tableRow+",
142
+ group: "block",
143
+ tableRole: "table",
144
+ isolating: true,
145
+ attrs: {
146
+ styleId: { default: null },
147
+ width: { default: null },
148
+ widthType: { default: null },
149
+ justification: { default: null },
150
+ columnWidths: { default: null },
151
+ floating: { default: null },
152
+ cellMargins: { default: null },
153
+ look: { default: null },
154
+ borders: { default: null },
155
+ _originalFormatting: { default: null }
156
+ },
157
+ parseDOM: [{
158
+ tag: "table",
159
+ getAttrs(dom) {
160
+ const styleId = dom.dataset["styleId"];
161
+ const rawJustification = dom.dataset["justification"];
162
+ const justification = rawJustification === "left" || rawJustification === "center" || rawJustification === "right" ? rawJustification : void 0;
163
+ return {
164
+ ...styleId ? { styleId } : {},
165
+ ...justification !== void 0 ? { justification } : {}
166
+ };
167
+ }
168
+ }],
169
+ toDOM(node) {
170
+ const attrs = expectTableAttrs(node);
171
+ const domAttrs = { class: "docx-table" };
172
+ if (attrs.styleId) domAttrs["data-style-id"] = attrs.styleId;
173
+ const styles = ["border-collapse: collapse"];
174
+ if (attrs.width !== void 0 && attrs.widthType === "pct") {
175
+ styles.push(`width: ${attrs.width / 50}%`);
176
+ styles.push("table-layout: fixed");
177
+ } else if (attrs.width !== void 0 && attrs.widthType === "dxa") {
178
+ const widthPx = Math.round(attrs.width / 20 * 1.333);
179
+ styles.push(`width: ${widthPx}px`);
180
+ styles.push("table-layout: fixed");
181
+ } else {
182
+ styles.push("width: 100%");
183
+ styles.push("table-layout: fixed");
184
+ }
185
+ if (attrs.justification === "center") styles.push("margin-left: auto", "margin-right: auto");
186
+ else if (attrs.justification === "right") styles.push("margin-left: auto");
187
+ domAttrs["style"] = styles.join("; ");
188
+ return [
189
+ "table",
190
+ domAttrs,
191
+ ["tbody", 0]
192
+ ];
193
+ }
194
+ };
195
+ const tableRowSpec = {
196
+ content: "(tableCell | tableHeader)+",
197
+ tableRole: "row",
198
+ attrs: {
199
+ height: { default: null },
200
+ heightRule: { default: null },
201
+ isHeader: { default: false },
202
+ _originalFormatting: { default: null }
203
+ },
204
+ parseDOM: [{ tag: "tr" }],
205
+ toDOM(node) {
206
+ const attrs = expectTableRowAttrs(node);
207
+ const domAttrs = {};
208
+ if (typeof attrs.height === "number") domAttrs["style"] = `height: ${Math.round(attrs.height / 20 * 1.333)}px`;
209
+ return [
210
+ "tr",
211
+ domAttrs,
212
+ 0
213
+ ];
214
+ }
215
+ };
216
+ const BORDER_STYLE_CSS = {
217
+ single: "solid",
218
+ double: "double",
219
+ dotted: "dotted",
220
+ dashed: "dashed",
221
+ thick: "solid",
222
+ dashSmallGap: "dashed",
223
+ dotDash: "dashed",
224
+ dotDotDash: "dotted",
225
+ triple: "double",
226
+ thinThickSmallGap: "double",
227
+ thickThinSmallGap: "double",
228
+ thinThickThinSmallGap: "double",
229
+ thinThickMediumGap: "double",
230
+ thickThinMediumGap: "double",
231
+ thinThickThinMediumGap: "double",
232
+ thinThickLargeGap: "double",
233
+ thickThinLargeGap: "double",
234
+ thinThickThinLargeGap: "double",
235
+ wave: "solid",
236
+ doubleWave: "double",
237
+ dashDotStroked: "dashed",
238
+ threeDEmboss: "ridge",
239
+ threeDEngrave: "groove",
240
+ outset: "outset",
241
+ inset: "inset"
242
+ };
243
+ function buildCellBorderStyles(attrs) {
244
+ const styles = [];
245
+ const borders = attrs.borders;
246
+ if (!borders) return styles;
247
+ const borderToCss = (border) => {
248
+ if (!border || !border.style || border.style === "none" || border.style === "nil") return "none";
249
+ return `${border.size !== void 0 && border.size > 0 ? Math.max(1, Math.round(border.size / 8 * 1.333)) : 1}px ${BORDER_STYLE_CSS[border.style] || "solid"} ${resolveColor(border.color, void 0)}`;
250
+ };
251
+ styles.push(`border-top: ${borderToCss(borders.top)}`);
252
+ styles.push(`border-bottom: ${borderToCss(borders.bottom)}`);
253
+ styles.push(`border-left: ${borderToCss(borders.left)}`);
254
+ styles.push(`border-right: ${borderToCss(borders.right)}`);
255
+ return styles;
256
+ }
257
+ function buildCellPaddingStyles(attrs) {
258
+ const margins = attrs.margins;
259
+ if (!margins) {
260
+ const px = Math.round(108 / 20 * 1.333);
261
+ return [`padding: ${px}px ${px}px`];
262
+ }
263
+ const toPixels = (twips) => twips !== void 0 && twips > 0 ? Math.round(twips / 20 * 1.333) : 0;
264
+ return [`padding: ${toPixels(margins.top)}px ${toPixels(margins.right)}px ${toPixels(margins.bottom)}px ${toPixels(margins.left)}px`];
265
+ }
266
+ function buildTextDirectionStyles(textDirection) {
267
+ if (!textDirection) return [];
268
+ const styles = [];
269
+ switch (textDirection) {
270
+ case "tbRl":
271
+ case "tbRlV":
272
+ styles.push("writing-mode: vertical-rl");
273
+ break;
274
+ case "btLr":
275
+ styles.push("writing-mode: vertical-lr", "transform: rotate(180deg)");
276
+ break;
277
+ case "rl":
278
+ case "rlV":
279
+ styles.push("direction: rtl");
280
+ break;
281
+ case "tb":
282
+ case "tbV":
283
+ styles.push("writing-mode: vertical-lr");
284
+ break;
285
+ default: break;
286
+ }
287
+ return styles;
288
+ }
289
+ function buildCellWidthStyles(attrs) {
290
+ const styles = [];
291
+ if (attrs.colwidth && attrs.colwidth.length > 0) {
292
+ const totalWidth = attrs.colwidth.reduce((sum, w) => sum + w, 0);
293
+ styles.push(`width: ${totalWidth}px`);
294
+ } else if (attrs.width !== void 0 && attrs.widthType === "pct") styles.push(`width: ${attrs.width}%`);
295
+ else if (attrs.width !== void 0) {
296
+ const widthPx = Math.round(attrs.width / 20 * 1.333);
297
+ styles.push(`width: ${widthPx}px`);
298
+ }
299
+ return styles;
300
+ }
301
+ const tableCellSpec = {
302
+ content: "(paragraph | table)+",
303
+ tableRole: "cell",
304
+ isolating: true,
305
+ attrs: {
306
+ colspan: { default: 1 },
307
+ rowspan: { default: 1 },
308
+ colwidth: { default: null },
309
+ width: { default: null },
310
+ widthType: { default: null },
311
+ verticalAlign: { default: null },
312
+ backgroundColor: { default: null },
313
+ borders: { default: null },
314
+ margins: { default: null },
315
+ textDirection: { default: null },
316
+ noWrap: { default: false },
317
+ _originalFormatting: { default: null },
318
+ _preserveVMergeRestart: { default: null },
319
+ _docxVMergeContinuationCells: { default: null }
320
+ },
321
+ parseDOM: [{
322
+ tag: "td",
323
+ getAttrs: (dom) => parseCellAttrsFromDOM(dom)
324
+ }],
325
+ toDOM(node) {
326
+ const attrs = expectTableCellAttrs(node);
327
+ const domAttrs = { class: "docx-table-cell" };
328
+ if (attrs.colspan > 1) domAttrs["colspan"] = String(attrs.colspan);
329
+ if (attrs.rowspan > 1) domAttrs["rowspan"] = String(attrs.rowspan);
330
+ const styles = [];
331
+ styles.push(...buildCellPaddingStyles(attrs));
332
+ if (attrs.noWrap) styles.push("white-space: nowrap");
333
+ else styles.push("word-wrap: break-word", "overflow-wrap: break-word", "overflow: hidden");
334
+ styles.push(...buildCellWidthStyles(attrs));
335
+ styles.push(...buildCellBorderStyles(attrs));
336
+ styles.push(...buildTextDirectionStyles(attrs.textDirection));
337
+ if (attrs.verticalAlign) {
338
+ domAttrs["data-valign"] = attrs.verticalAlign;
339
+ styles.push(`vertical-align: ${attrs.verticalAlign}`);
340
+ }
341
+ if (attrs.backgroundColor) {
342
+ domAttrs["data-bgcolor"] = attrs.backgroundColor;
343
+ styles.push(`background-color: #${attrs.backgroundColor}`);
344
+ }
345
+ domAttrs["style"] = styles.join("; ");
346
+ return [
347
+ "td",
348
+ domAttrs,
349
+ 0
350
+ ];
351
+ }
352
+ };
353
+ const tableHeaderSpec = {
354
+ content: "(paragraph | table)+",
355
+ tableRole: "header_cell",
356
+ isolating: true,
357
+ attrs: {
358
+ colspan: { default: 1 },
359
+ rowspan: { default: 1 },
360
+ colwidth: { default: null },
361
+ width: { default: null },
362
+ widthType: { default: null },
363
+ verticalAlign: { default: null },
364
+ backgroundColor: { default: null },
365
+ borders: { default: null },
366
+ margins: { default: null },
367
+ textDirection: { default: null },
368
+ noWrap: { default: false },
369
+ _originalFormatting: { default: null },
370
+ _preserveVMergeRestart: { default: null },
371
+ _docxVMergeContinuationCells: { default: null }
372
+ },
373
+ parseDOM: [{
374
+ tag: "th",
375
+ getAttrs: (dom) => parseCellAttrsFromDOM(dom)
376
+ }],
377
+ toDOM(node) {
378
+ const attrs = expectTableCellAttrs(node);
379
+ const domAttrs = { class: "docx-table-header" };
380
+ if (attrs.colspan > 1) domAttrs["colspan"] = String(attrs.colspan);
381
+ if (attrs.rowspan > 1) domAttrs["rowspan"] = String(attrs.rowspan);
382
+ const styles = ["font-weight: bold"];
383
+ styles.push(...buildCellPaddingStyles(attrs));
384
+ if (attrs.noWrap) styles.push("white-space: nowrap");
385
+ else styles.push("word-wrap: break-word", "overflow-wrap: break-word", "overflow: hidden");
386
+ styles.push(...buildCellWidthStyles(attrs));
387
+ styles.push(...buildCellBorderStyles(attrs));
388
+ styles.push(...buildTextDirectionStyles(attrs.textDirection));
389
+ if (attrs.verticalAlign) {
390
+ domAttrs["data-valign"] = attrs.verticalAlign;
391
+ styles.push(`vertical-align: ${attrs.verticalAlign}`);
392
+ }
393
+ if (attrs.backgroundColor) {
394
+ domAttrs["data-bgcolor"] = attrs.backgroundColor;
395
+ styles.push(`background-color: #${attrs.backgroundColor}`);
396
+ }
397
+ domAttrs["style"] = styles.join("; ");
398
+ return [
399
+ "th",
400
+ domAttrs,
401
+ 0
402
+ ];
403
+ }
404
+ };
405
+ function getTableContext(state) {
406
+ const { selection } = state;
407
+ const { $from } = selection;
408
+ const isCellSel = selection instanceof CellSelection;
409
+ let table;
410
+ let tablePos;
411
+ let rowIndex;
412
+ let columnIndex;
413
+ let cellNode;
414
+ for (let d = $from.depth; d > 0; d--) {
415
+ const node = $from.node(d);
416
+ if (node.type.name === "tableCell" || node.type.name === "tableHeader") {
417
+ cellNode = node;
418
+ const rowNode = $from.node(d - 1);
419
+ if (rowNode.type.name === "tableRow") columnIndex = getColumnIndex(rowNode, $from.index(d - 1));
420
+ } else if (node.type.name === "tableRow") {
421
+ if ($from.node(d - 1).type.name === "table") rowIndex = $from.index(d - 1);
422
+ } else if (node.type.name === "table") {
423
+ table = node;
424
+ tablePos = $from.before(d);
425
+ break;
426
+ }
427
+ }
428
+ if (!table) return { isInTable: false };
429
+ let rowCount = 0;
430
+ let columnCount = 0;
431
+ table.forEach((row) => {
432
+ if (row.type.name === "tableRow") {
433
+ rowCount++;
434
+ let cols = 0;
435
+ row.forEach((cell) => {
436
+ cols += Number(cell.attrs["colspan"]) || 1;
437
+ });
438
+ columnCount = Math.max(columnCount, cols);
439
+ }
440
+ });
441
+ const canSplitCell = cellNode !== void 0 && ((Number(cellNode.attrs["colspan"]) || 1) > 1 || (Number(cellNode.attrs["rowspan"]) || 1) > 1);
442
+ let cellBorderColor;
443
+ let cellBackgroundColor;
444
+ if (cellNode) {
445
+ const attrs = cellNode.attrs;
446
+ if (typeof attrs["backgroundColor"] === "string" && attrs["backgroundColor"]) cellBackgroundColor = attrs["backgroundColor"];
447
+ const borders = attrs["borders"];
448
+ if (borders) for (const side of [
449
+ "top",
450
+ "right",
451
+ "bottom",
452
+ "left"
453
+ ]) {
454
+ const border = borders[side];
455
+ if (border?.color && border.style && border.style !== "none" && border.style !== "nil") {
456
+ cellBorderColor = border.color;
457
+ break;
458
+ }
459
+ }
460
+ }
461
+ return {
462
+ isInTable: true,
463
+ table,
464
+ ...tablePos !== void 0 ? { tablePos } : {},
465
+ ...rowIndex !== void 0 ? { rowIndex } : {},
466
+ ...columnIndex !== void 0 ? { columnIndex } : {},
467
+ rowCount,
468
+ columnCount,
469
+ hasMultiCellSelection: isCellSel,
470
+ canSplitCell,
471
+ ...cellBorderColor !== void 0 ? { cellBorderColor } : {},
472
+ ...cellBackgroundColor !== void 0 ? { cellBackgroundColor } : {}
473
+ };
474
+ }
475
+ const getColumnIndex = (rowNode, targetIndex) => {
476
+ let columnIndex = 0;
477
+ let foundColumnIndex;
478
+ rowNode.forEach((child, _offset, index) => {
479
+ if (foundColumnIndex !== void 0) return;
480
+ if (index === targetIndex) {
481
+ foundColumnIndex = columnIndex;
482
+ return;
483
+ }
484
+ columnIndex += Number(child.attrs["colspan"]) || 1;
485
+ });
486
+ return foundColumnIndex;
487
+ };
488
+ function isInTableCell(state) {
489
+ const { $from } = state.selection;
490
+ for (let d = $from.depth; d > 0; d--) {
491
+ const node = $from.node(d);
492
+ if (node.type.name === "tableCell" || node.type.name === "tableHeader") return true;
493
+ }
494
+ return false;
495
+ }
496
+ function findCellInfo(state) {
497
+ const { $from } = state.selection;
498
+ let cellDepth = -1;
499
+ let rowDepth = -1;
500
+ let tableDepth = -1;
501
+ for (let d = $from.depth; d > 0; d--) {
502
+ const node = $from.node(d);
503
+ if (node.type.name === "tableCell" || node.type.name === "tableHeader") cellDepth = d;
504
+ else if (node.type.name === "tableRow") rowDepth = d;
505
+ else if (node.type.name === "table") {
506
+ tableDepth = d;
507
+ break;
508
+ }
509
+ }
510
+ if (cellDepth === -1 || rowDepth === -1 || tableDepth === -1) return null;
511
+ return {
512
+ cellDepth,
513
+ cellPos: $from.before(cellDepth),
514
+ rowDepth,
515
+ tableDepth
516
+ };
517
+ }
518
+ function goToNextCell() {
519
+ return (state, dispatch) => {
520
+ if (!isInTableCell(state)) return false;
521
+ const info = findCellInfo(state);
522
+ if (!info) return false;
523
+ const { $from } = state.selection;
524
+ const table = $from.node(info.tableDepth);
525
+ const row = $from.node(info.rowDepth);
526
+ const cellIndex = $from.index(info.rowDepth);
527
+ const rowIndex = $from.index(info.tableDepth);
528
+ if (cellIndex < row.childCount - 1) {
529
+ const nextCellPos = info.cellPos + $from.node(info.cellDepth).nodeSize;
530
+ if (dispatch) {
531
+ const textPos = nextCellPos + 1 + 1;
532
+ dispatch(state.tr.setSelection(Selection.near(state.doc.resolve(textPos))).scrollIntoView());
533
+ }
534
+ return true;
535
+ }
536
+ if (rowIndex < table.childCount - 1) {
537
+ const nextRowPos = $from.before(info.rowDepth) + row.nodeSize;
538
+ if (dispatch) {
539
+ const textPos = nextRowPos + 1 + 1 + 1;
540
+ dispatch(state.tr.setSelection(Selection.near(state.doc.resolve(textPos))).scrollIntoView());
541
+ }
542
+ return true;
543
+ }
544
+ return false;
545
+ };
546
+ }
547
+ function goToPrevCell() {
548
+ return (state, dispatch) => {
549
+ if (!isInTableCell(state)) return false;
550
+ const info = findCellInfo(state);
551
+ if (!info) return false;
552
+ const { $from } = state.selection;
553
+ const table = $from.node(info.tableDepth);
554
+ const cellIndex = $from.index(info.rowDepth);
555
+ const rowIndex = $from.index(info.tableDepth);
556
+ if (cellIndex > 0) {
557
+ const prevCell = $from.node(info.rowDepth).child(cellIndex - 1);
558
+ const cellStartPos = info.cellPos - prevCell.nodeSize;
559
+ if (dispatch) {
560
+ const textPos = cellStartPos + prevCell.nodeSize - 2;
561
+ dispatch(state.tr.setSelection(Selection.near(state.doc.resolve(textPos), -1)).scrollIntoView());
562
+ }
563
+ return true;
564
+ }
565
+ if (rowIndex > 0) {
566
+ const prevRow = table.child(rowIndex - 1);
567
+ const prevRowPos = $from.before(info.rowDepth) - prevRow.nodeSize;
568
+ if (dispatch) {
569
+ const textPos = prevRowPos + prevRow.nodeSize - 1 - 1;
570
+ dispatch(state.tr.setSelection(Selection.near(state.doc.resolve(textPos), -1)).scrollIntoView());
571
+ }
572
+ return true;
573
+ }
574
+ return false;
575
+ };
576
+ }
577
+ const TableNodeExtension = createNodeExtension({
578
+ name: "table",
579
+ schemaNodeName: "table",
580
+ nodeSpec: tableSpec
581
+ });
582
+ const TableRowExtension = createNodeExtension({
583
+ name: "tableRow",
584
+ schemaNodeName: "tableRow",
585
+ nodeSpec: tableRowSpec
586
+ });
587
+ const TableCellExtension = createNodeExtension({
588
+ name: "tableCell",
589
+ schemaNodeName: "tableCell",
590
+ nodeSpec: tableCellSpec
591
+ });
592
+ const TableHeaderExtension = createNodeExtension({
593
+ name: "tableHeader",
594
+ schemaNodeName: "tableHeader",
595
+ nodeSpec: tableHeaderSpec
596
+ });
597
+ const TablePluginExtension = createExtension({
598
+ name: "tablePlugin",
599
+ onSchemaReady(ctx) {
600
+ const { schema } = ctx;
601
+ if (!schema.nodes["paragraph"]) panic("Missing node type: paragraph");
602
+ if (!schema.nodes["tableCell"]) panic("Missing node type: tableCell");
603
+ if (!schema.nodes["tableRow"]) panic("Missing node type: tableRow");
604
+ if (!schema.nodes["table"]) panic("Missing node type: table");
605
+ const nodeTypeParagraph = schema.nodes["paragraph"];
606
+ const nodeTypeTableCell = schema.nodes["tableCell"];
607
+ const nodeTypeTableRow = schema.nodes["tableRow"];
608
+ const nodeTypeTable = schema.nodes["table"];
609
+ function chainCommands(...commands) {
610
+ return (state, dispatch, view) => {
611
+ for (const cmd of commands) if (cmd(state, dispatch, view)) return true;
612
+ return false;
613
+ };
614
+ }
615
+ function buildCellAttrsFromTemplate(templateCell, overrides = {}) {
616
+ const baseAttrs = templateCell?.attrs ?? {};
617
+ return {
618
+ colspan: Number(baseAttrs["colspan"]) || 1,
619
+ rowspan: 1,
620
+ colwidth: baseAttrs["colwidth"],
621
+ width: baseAttrs["width"],
622
+ widthType: baseAttrs["widthType"],
623
+ verticalAlign: baseAttrs["verticalAlign"],
624
+ backgroundColor: baseAttrs["backgroundColor"],
625
+ borders: baseAttrs["borders"],
626
+ margins: baseAttrs["margins"],
627
+ textDirection: baseAttrs["textDirection"],
628
+ noWrap: baseAttrs["noWrap"],
629
+ ...overrides
630
+ };
631
+ }
632
+ function createTable(rows, cols, borderColor = "000000", contentWidthTwips = 9360) {
633
+ const tableRows = [];
634
+ const colWidthTwips = Math.floor(contentWidthTwips / cols);
635
+ const defaultRowHeightTwips = 360;
636
+ const defaultRowHeightRule = "atLeast";
637
+ const defaultBorder = {
638
+ style: "single",
639
+ size: 4,
640
+ color: { rgb: borderColor }
641
+ };
642
+ const defaultBorders = {
643
+ top: defaultBorder,
644
+ bottom: defaultBorder,
645
+ left: defaultBorder,
646
+ right: defaultBorder
647
+ };
648
+ for (let r = 0; r < rows; r++) {
649
+ const cells = [];
650
+ for (let c = 0; c < cols; c++) {
651
+ const paragraph = nodeTypeParagraph.create();
652
+ const cellAttrs = {
653
+ colspan: 1,
654
+ rowspan: 1,
655
+ borders: defaultBorders,
656
+ width: colWidthTwips,
657
+ widthType: "dxa"
658
+ };
659
+ cells.push(nodeTypeTableCell.create(cellAttrs, paragraph));
660
+ }
661
+ tableRows.push(nodeTypeTableRow.create({
662
+ height: defaultRowHeightTwips,
663
+ heightRule: defaultRowHeightRule
664
+ }, cells));
665
+ }
666
+ const columnWidths = Array.from({ length: cols }, () => colWidthTwips);
667
+ return nodeTypeTable.create({
668
+ columnWidths,
669
+ width: contentWidthTwips,
670
+ widthType: "dxa"
671
+ }, tableRows);
672
+ }
673
+ function insertTable(rows, cols) {
674
+ return (state, dispatch) => {
675
+ const { $from } = state.selection;
676
+ let borderColor = "000000";
677
+ const marks = state.storedMarks ?? $from.marks();
678
+ for (const mark of marks) if (mark.type.name === "textColor" && typeof mark.attrs["rgb"] === "string") {
679
+ borderColor = mark.attrs["rgb"];
680
+ break;
681
+ }
682
+ let insertPos = $from.pos;
683
+ for (let d = $from.depth; d > 0; d--) {
684
+ const node = $from.node(d);
685
+ if (node.type.name === "paragraph" || node.type.name === "table") {
686
+ insertPos = $from.after(d);
687
+ break;
688
+ }
689
+ }
690
+ if (dispatch) {
691
+ let contentWidthTwips = 9360;
692
+ for (let d = $from.depth; d > 0; d--) {
693
+ const node = $from.node(d);
694
+ if (node.type.name === "tableCell" || node.type.name === "tableHeader") {
695
+ const cellWidth = Number(node.attrs["width"]);
696
+ if (cellWidth > 0) contentWidthTwips = Math.max(cellWidth - 216, 360);
697
+ break;
698
+ }
699
+ }
700
+ const table = createTable(rows, cols, borderColor, contentWidthTwips);
701
+ const emptyParagraph = nodeTypeParagraph.create();
702
+ const needsLeadingParagraph = state.doc.resolve(insertPos).nodeBefore?.type.name === "table";
703
+ const insertContent = needsLeadingParagraph ? [
704
+ emptyParagraph,
705
+ table,
706
+ emptyParagraph
707
+ ] : [table, emptyParagraph];
708
+ const tr = state.tr.insert(insertPos, insertContent);
709
+ let tableStartPos = insertPos + 1;
710
+ if (needsLeadingParagraph) tableStartPos += emptyParagraph.nodeSize;
711
+ const firstCellContentPos = tableStartPos + 1 + 1;
712
+ tr.setSelection(TextSelection.create(tr.doc, firstCellContentPos));
713
+ dispatch(tr.scrollIntoView());
714
+ }
715
+ return true;
716
+ };
717
+ }
718
+ function addRowAbove(state, dispatch) {
719
+ const context = getTableContext(state);
720
+ if (!context.isInTable || context.rowIndex === void 0 || !context.table || context.tablePos === void 0) return false;
721
+ if (dispatch) {
722
+ const tr = state.tr;
723
+ const rowNode = context.table.child(context.rowIndex);
724
+ const cells = [];
725
+ rowNode.forEach((cell) => {
726
+ const paragraph = nodeTypeParagraph.create();
727
+ const cellAttrs = buildCellAttrsFromTemplate(cell);
728
+ cells.push(nodeTypeTableCell.create(cellAttrs, paragraph));
729
+ });
730
+ const newRow = nodeTypeTableRow.create({
731
+ height: rowNode.attrs["height"] ?? 360,
732
+ heightRule: rowNode.attrs["heightRule"] ?? "atLeast"
733
+ }, cells);
734
+ let rowPos = context.tablePos + 1;
735
+ for (let i = 0; i < context.rowIndex; i++) rowPos += context.table.child(i).nodeSize;
736
+ tr.insert(rowPos, newRow);
737
+ dispatch(tr.scrollIntoView());
738
+ }
739
+ return true;
740
+ }
741
+ function addRowBelow(state, dispatch) {
742
+ const context = getTableContext(state);
743
+ if (!context.isInTable || context.rowIndex === void 0 || !context.table || context.tablePos === void 0) return false;
744
+ if (dispatch) {
745
+ const tr = state.tr;
746
+ const rowNode = context.table.child(context.rowIndex);
747
+ const cells = [];
748
+ rowNode.forEach((cell) => {
749
+ const paragraph = nodeTypeParagraph.create();
750
+ const cellAttrs = buildCellAttrsFromTemplate(cell);
751
+ cells.push(nodeTypeTableCell.create(cellAttrs, paragraph));
752
+ });
753
+ const newRow = nodeTypeTableRow.create({
754
+ height: rowNode.attrs["height"] ?? 360,
755
+ heightRule: rowNode.attrs["heightRule"] ?? "atLeast"
756
+ }, cells);
757
+ let rowPos = context.tablePos + 1;
758
+ for (let i = 0; i <= context.rowIndex; i++) rowPos += context.table.child(i).nodeSize;
759
+ tr.insert(rowPos, newRow);
760
+ dispatch(tr.scrollIntoView());
761
+ }
762
+ return true;
763
+ }
764
+ function deleteRow(state, dispatch) {
765
+ const context = getTableContext(state);
766
+ if (!context.isInTable || context.rowIndex === void 0 || !context.table || context.tablePos === void 0) return false;
767
+ const tablePos = context.tablePos;
768
+ const table = context.table;
769
+ const rowCount = context.rowCount ?? 0;
770
+ if (rowCount <= 0) return false;
771
+ let firstRow;
772
+ let lastRow;
773
+ if (state.selection instanceof CellSelection) {
774
+ const rect = selectedRect(state);
775
+ firstRow = Math.max(0, Math.min(rect.top, rowCount - 1));
776
+ lastRow = Math.min(Math.max(rect.bottom - 1, firstRow), rowCount - 1);
777
+ } else {
778
+ firstRow = context.rowIndex;
779
+ lastRow = context.rowIndex;
780
+ }
781
+ const coversAllRows = firstRow === 0 && lastRow >= rowCount - 1;
782
+ if (dispatch) {
783
+ const tr = state.tr;
784
+ if (coversAllRows) {
785
+ const tableEnd = tablePos + table.nodeSize;
786
+ const emptyParagraph = state.doc.resolve(tablePos).parent.childCount === 1 ? state.schema.nodes["paragraph"]?.createAndFill() : null;
787
+ if (emptyParagraph) {
788
+ tr.replaceWith(tablePos, tableEnd, emptyParagraph);
789
+ tr.setSelection(TextSelection.near(tr.doc.resolve(tablePos + 1)));
790
+ } else tr.delete(tablePos, tableEnd);
791
+ dispatch(tr.scrollIntoView());
792
+ return true;
793
+ }
794
+ const rect = selectedRect(state);
795
+ for (let row = lastRow; row >= firstRow; row--) {
796
+ removeRow(tr, rect, row);
797
+ if (row > firstRow) {
798
+ const updated = tr.doc.nodeAt(rect.tableStart - 1);
799
+ if (updated) {
800
+ rect.table = updated;
801
+ rect.map = TableMap.get(updated);
802
+ }
803
+ }
804
+ }
805
+ dispatch(tr.scrollIntoView());
806
+ }
807
+ return true;
808
+ }
809
+ function addColumnLeft(state, dispatch) {
810
+ const context = getTableContext(state);
811
+ if (!context.isInTable || context.columnIndex === void 0 || !context.table || context.tablePos === void 0) return false;
812
+ if (dispatch) {
813
+ let tr = state.tr;
814
+ const newColumnCount = (context.columnCount ?? 1) + 1;
815
+ const newColWidthPercent = Math.floor(100 / newColumnCount);
816
+ let rowPos = context.tablePos + 1;
817
+ context.table.forEach((row) => {
818
+ if (row.type.name === "tableRow") {
819
+ let cellPos = rowPos + 1;
820
+ let colIdx = 0;
821
+ row.forEach((cell) => {
822
+ if (colIdx === context.columnIndex) {
823
+ const paragraph = nodeTypeParagraph.create();
824
+ const cellAttrs = buildCellAttrsFromTemplate(cell, {
825
+ colspan: 1,
826
+ rowspan: 1
827
+ });
828
+ cellAttrs["width"] = newColWidthPercent;
829
+ cellAttrs["widthType"] = "pct";
830
+ const newCell = nodeTypeTableCell.create(cellAttrs, paragraph);
831
+ tr = tr.insert(tr.mapping.map(cellPos), newCell);
832
+ }
833
+ cellPos += cell.nodeSize;
834
+ colIdx += Number(cell.attrs["colspan"]) || 1;
835
+ });
836
+ if (context.columnIndex !== void 0 && colIdx <= context.columnIndex) {
837
+ const paragraph = nodeTypeParagraph.create();
838
+ const cellAttrs = buildCellAttrsFromTemplate(row.child(row.childCount - 1), {
839
+ colspan: 1,
840
+ rowspan: 1
841
+ });
842
+ cellAttrs["width"] = newColWidthPercent;
843
+ cellAttrs["widthType"] = "pct";
844
+ const newCell = nodeTypeTableCell.create(cellAttrs, paragraph);
845
+ tr = tr.insert(tr.mapping.map(cellPos), newCell);
846
+ }
847
+ }
848
+ rowPos += row.nodeSize;
849
+ });
850
+ const updatedTable = tr.doc.nodeAt(context.tablePos);
851
+ if (updatedTable && updatedTable.type.name === "table") {
852
+ const firstRow = updatedTable.child(0);
853
+ if (firstRow.type.name === "tableRow") {
854
+ let cellPos = context.tablePos + 2;
855
+ firstRow.forEach((cell) => {
856
+ if (cell.type.name === "tableCell" || cell.type.name === "tableHeader") tr = tr.setNodeMarkup(cellPos, void 0, mergeTableCellAttrs(cell, {
857
+ width: newColWidthPercent,
858
+ widthType: "pct"
859
+ }));
860
+ cellPos += cell.nodeSize;
861
+ });
862
+ }
863
+ const colCount = firstRow.childCount;
864
+ const tableWidthTwips = expectTableAttrs(updatedTable).width ?? 9360;
865
+ const colWidthTwips = Math.floor(tableWidthTwips / Math.max(1, colCount));
866
+ tr = tr.setNodeMarkup(context.tablePos, void 0, mergeTableAttrs(updatedTable, { columnWidths: Array.from({ length: colCount }, () => colWidthTwips) }));
867
+ }
868
+ dispatch(tr.scrollIntoView());
869
+ }
870
+ return true;
871
+ }
872
+ function addColumnRight(state, dispatch) {
873
+ const context = getTableContext(state);
874
+ if (!context.isInTable || context.columnIndex === void 0 || !context.table || context.tablePos === void 0) return false;
875
+ if (dispatch) {
876
+ let tr = state.tr;
877
+ const newColumnCount = (context.columnCount ?? 1) + 1;
878
+ const newColWidthPercent = Math.floor(100 / newColumnCount);
879
+ let rowPos = context.tablePos + 1;
880
+ context.table.forEach((row) => {
881
+ if (row.type.name === "tableRow") {
882
+ let cellPos = rowPos + 1;
883
+ let colIdx = 0;
884
+ let insertedCount = 0;
885
+ row.forEach((cell) => {
886
+ cellPos += cell.nodeSize;
887
+ colIdx += Number(cell.attrs["colspan"]) || 1;
888
+ if (insertedCount === 0 && context.columnIndex !== void 0 && colIdx > context.columnIndex) {
889
+ const paragraph = nodeTypeParagraph.create();
890
+ const cellAttrs = buildCellAttrsFromTemplate(cell, {
891
+ colspan: 1,
892
+ rowspan: 1
893
+ });
894
+ cellAttrs["width"] = newColWidthPercent;
895
+ cellAttrs["widthType"] = "pct";
896
+ const newCell = nodeTypeTableCell.create(cellAttrs, paragraph);
897
+ tr = tr.insert(tr.mapping.map(cellPos), newCell);
898
+ insertedCount += 1;
899
+ }
900
+ });
901
+ if (insertedCount === 0) {
902
+ const paragraph = nodeTypeParagraph.create();
903
+ const cellAttrs = buildCellAttrsFromTemplate(row.child(row.childCount - 1), {
904
+ colspan: 1,
905
+ rowspan: 1
906
+ });
907
+ cellAttrs["width"] = newColWidthPercent;
908
+ cellAttrs["widthType"] = "pct";
909
+ const newCell = nodeTypeTableCell.create(cellAttrs, paragraph);
910
+ tr = tr.insert(tr.mapping.map(cellPos), newCell);
911
+ }
912
+ }
913
+ rowPos += row.nodeSize;
914
+ });
915
+ const updatedTable = tr.doc.nodeAt(context.tablePos);
916
+ if (updatedTable && updatedTable.type.name === "table") {
917
+ const firstRow = updatedTable.child(0);
918
+ if (firstRow.type.name === "tableRow") {
919
+ let cellPos = context.tablePos + 2;
920
+ firstRow.forEach((cell) => {
921
+ if (cell.type.name === "tableCell" || cell.type.name === "tableHeader") tr = tr.setNodeMarkup(cellPos, void 0, mergeTableCellAttrs(cell, {
922
+ width: newColWidthPercent,
923
+ widthType: "pct"
924
+ }));
925
+ cellPos += cell.nodeSize;
926
+ });
927
+ }
928
+ const colCount = firstRow.childCount;
929
+ const tableWidthTwips = expectTableAttrs(updatedTable).width ?? 9360;
930
+ const colWidthTwips = Math.floor(tableWidthTwips / Math.max(1, colCount));
931
+ tr = tr.setNodeMarkup(context.tablePos, void 0, mergeTableAttrs(updatedTable, { columnWidths: Array.from({ length: colCount }, () => colWidthTwips) }));
932
+ }
933
+ dispatch(tr.scrollIntoView());
934
+ }
935
+ return true;
936
+ }
937
+ function deleteColumn(state, dispatch) {
938
+ const context = getTableContext(state);
939
+ if (!context.isInTable || context.columnIndex === void 0 || !context.table || context.tablePos === void 0 || (context.columnCount ?? 0) <= 1) return false;
940
+ if (dispatch) {
941
+ let tr = state.tr;
942
+ const newColumnCount = (context.columnCount ?? 2) - 1;
943
+ const newColWidthPercent = Math.floor(100 / newColumnCount);
944
+ const deleteOps = [];
945
+ let rowPos = context.tablePos + 1;
946
+ context.table.forEach((row) => {
947
+ if (row.type.name === "tableRow") {
948
+ let cellPos = rowPos + 1;
949
+ let colIdx = 0;
950
+ row.forEach((cell) => {
951
+ const cellStart = cellPos;
952
+ const cellEnd = cellPos + cell.nodeSize;
953
+ const cellColspan = Number(cell.attrs["colspan"]) || 1;
954
+ if (context.columnIndex !== void 0 && colIdx <= context.columnIndex && context.columnIndex < colIdx + cellColspan) deleteOps.push({
955
+ start: cellStart,
956
+ end: cellEnd
957
+ });
958
+ cellPos = cellEnd;
959
+ colIdx += cellColspan;
960
+ });
961
+ }
962
+ rowPos += row.nodeSize;
963
+ });
964
+ for (const { start, end } of deleteOps.toReversed()) tr = tr.delete(start, end);
965
+ const updatedTable = tr.doc.nodeAt(context.tablePos);
966
+ if (updatedTable && updatedTable.type.name === "table") {
967
+ const firstRow = updatedTable.child(0);
968
+ if (firstRow.type.name === "tableRow") {
969
+ let cellPos = context.tablePos + 2;
970
+ firstRow.forEach((cell) => {
971
+ if (cell.type.name === "tableCell" || cell.type.name === "tableHeader") tr = tr.setNodeMarkup(cellPos, void 0, mergeTableCellAttrs(cell, {
972
+ width: newColWidthPercent,
973
+ widthType: "pct"
974
+ }));
975
+ cellPos += cell.nodeSize;
976
+ });
977
+ }
978
+ const colCount = firstRow.childCount;
979
+ const tableWidthTwips = expectTableAttrs(updatedTable).width ?? 9360;
980
+ const colWidthTwips = Math.floor(tableWidthTwips / Math.max(1, colCount));
981
+ tr = tr.setNodeMarkup(context.tablePos, void 0, mergeTableAttrs(updatedTable, { columnWidths: Array.from({ length: colCount }, () => colWidthTwips) }));
982
+ }
983
+ dispatch(tr.scrollIntoView());
984
+ }
985
+ return true;
986
+ }
987
+ function deleteTable(state, dispatch) {
988
+ const context = getTableContext(state);
989
+ if (!context.isInTable || context.tablePos === void 0 || !context.table) return false;
990
+ if (dispatch) {
991
+ const tr = state.tr;
992
+ tr.delete(context.tablePos, context.tablePos + context.table.nodeSize);
993
+ dispatch(tr.scrollIntoView());
994
+ }
995
+ return true;
996
+ }
997
+ function selectTable(state, dispatch) {
998
+ const context = getTableContext(state);
999
+ if (!context.isInTable || context.tablePos === void 0 || !context.table) return false;
1000
+ if (dispatch) {
1001
+ const tableStart = context.tablePos + 1;
1002
+ const $first = state.doc.resolve(tableStart);
1003
+ const $last = state.doc.resolve(context.tablePos + context.table.nodeSize - 2);
1004
+ const cellSel = CellSelection.create(state.doc, $first.pos, $last.pos);
1005
+ dispatch(state.tr.setSelection(cellSel));
1006
+ }
1007
+ return true;
1008
+ }
1009
+ function selectRow(state, dispatch) {
1010
+ const context = getTableContext(state);
1011
+ if (!context.isInTable || context.tablePos === void 0 || !context.table || context.rowIndex === void 0) return false;
1012
+ if (dispatch) {
1013
+ let rowPos = context.tablePos + 1;
1014
+ for (let r = 0; r < context.rowIndex; r++) {
1015
+ const row = context.table.child(r);
1016
+ rowPos += row.nodeSize;
1017
+ }
1018
+ const row = context.table.child(context.rowIndex);
1019
+ const firstCellPos = rowPos + 1;
1020
+ const lastCellPos = rowPos + row.nodeSize - 2;
1021
+ const cellSel = CellSelection.create(state.doc, firstCellPos, lastCellPos);
1022
+ dispatch(state.tr.setSelection(cellSel));
1023
+ }
1024
+ return true;
1025
+ }
1026
+ function selectColumn(state, dispatch) {
1027
+ const context = getTableContext(state);
1028
+ if (!context.isInTable || context.tablePos === void 0 || !context.table || context.columnIndex === void 0) return false;
1029
+ if (dispatch) {
1030
+ const tableStart = context.tablePos + 1;
1031
+ const firstRow = context.table.child(0);
1032
+ const lastRow = context.table.child(context.table.childCount - 1);
1033
+ let firstCellPos = tableStart + 1;
1034
+ for (let c = 0; c < context.columnIndex && c < firstRow.childCount; c++) firstCellPos += firstRow.child(c).nodeSize;
1035
+ let lastRowPos = tableStart;
1036
+ for (let r = 0; r < context.table.childCount - 1; r++) lastRowPos += context.table.child(r).nodeSize;
1037
+ let lastCellPos = lastRowPos + 1;
1038
+ for (let c = 0; c < context.columnIndex && c < lastRow.childCount; c++) lastCellPos += lastRow.child(c).nodeSize;
1039
+ const cellSel = CellSelection.create(state.doc, firstCellPos, lastCellPos);
1040
+ dispatch(state.tr.setSelection(cellSel));
1041
+ }
1042
+ return true;
1043
+ }
1044
+ /**
1045
+ * Get cell positions to operate on: all cells from CellSelection, or
1046
+ * all cells in the table if a single cursor is inside a cell.
1047
+ */
1048
+ function getTargetCellPositions(state) {
1049
+ const sel = state.selection;
1050
+ const cells = [];
1051
+ if (sel instanceof CellSelection) {
1052
+ sel.forEachCell((node, pos) => {
1053
+ cells.push({
1054
+ pos,
1055
+ node
1056
+ });
1057
+ });
1058
+ return cells;
1059
+ }
1060
+ const { $from } = sel;
1061
+ for (let d = $from.depth; d > 0; d--) {
1062
+ const node = $from.node(d);
1063
+ if (node.type.name === "tableCell" || node.type.name === "tableHeader") {
1064
+ cells.push({
1065
+ pos: $from.before(d),
1066
+ node
1067
+ });
1068
+ break;
1069
+ }
1070
+ }
1071
+ return cells;
1072
+ }
1073
+ /**
1074
+ * Build a full grid map of all cells in the table: pos → grid info.
1075
+ * Also builds a reverse lookup by (rowIdx, colIdx).
1076
+ */
1077
+ function buildTableGrid(table, tableStart) {
1078
+ const cellByPos = /* @__PURE__ */ new Map();
1079
+ const cellByRC = /* @__PURE__ */ new Map();
1080
+ const totalRows = table.childCount;
1081
+ let totalCols = 0;
1082
+ table.forEach((row, rowOffset, rowIdx) => {
1083
+ if (row.type.name !== "tableRow") return;
1084
+ let colIdx = 0;
1085
+ row.forEach((cell, cellOffset) => {
1086
+ const pos = tableStart + rowOffset + cellOffset + 2;
1087
+ const colspan = expectTableCellAttrs(cell).colspan || 1;
1088
+ cellByPos.set(pos, {
1089
+ rowIdx,
1090
+ colIdx,
1091
+ colspan,
1092
+ pos,
1093
+ node: cell
1094
+ });
1095
+ cellByRC.set(`${rowIdx},${colIdx}`, pos);
1096
+ colIdx += colspan;
1097
+ });
1098
+ totalCols = Math.max(totalCols, colIdx);
1099
+ });
1100
+ return {
1101
+ cellByPos,
1102
+ cellByRC,
1103
+ totalRows,
1104
+ totalCols
1105
+ };
1106
+ }
1107
+ function setTableBorders(preset, borderSpec) {
1108
+ return (state, dispatch) => {
1109
+ const context = getTableContext(state);
1110
+ if (!context.isInTable || context.tablePos === void 0 || !context.table) return false;
1111
+ if (dispatch) {
1112
+ const tr = state.tr;
1113
+ const table = context.table;
1114
+ const tableStart = context.tablePos;
1115
+ const solidBorder = borderSpec ?? {
1116
+ style: "single",
1117
+ size: 4,
1118
+ color: { rgb: "000000" }
1119
+ };
1120
+ const noBorder = { style: "none" };
1121
+ const { cellByPos, cellByRC } = buildTableGrid(table, tableStart);
1122
+ const targetCells = getTargetCellPositions(state);
1123
+ let maxCol = -1, maxRow = -1, minCol = Infinity, minRow = Infinity;
1124
+ for (const { pos } of targetCells) {
1125
+ const info = cellByPos.get(pos);
1126
+ if (info) {
1127
+ minRow = Math.min(minRow, info.rowIdx);
1128
+ maxRow = Math.max(maxRow, info.rowIdx);
1129
+ minCol = Math.min(minCol, info.colIdx);
1130
+ maxCol = Math.max(maxCol, info.colIdx + info.colspan - 1);
1131
+ }
1132
+ }
1133
+ const modified = /* @__PURE__ */ new Map();
1134
+ const getAttrs = (pos, node) => modified.get(pos) ?? expectTableCellAttrs(node);
1135
+ const setAttrs = (pos, attrs) => {
1136
+ modified.set(pos, attrs);
1137
+ };
1138
+ for (const { pos } of targetCells) {
1139
+ const info = cellByPos.get(pos);
1140
+ if (!info) continue;
1141
+ const isTopEdge = info.rowIdx === minRow;
1142
+ const isBottomEdge = info.rowIdx === maxRow;
1143
+ const isLeftEdge = info.colIdx === minCol;
1144
+ const isRightEdge = info.colIdx + info.colspan - 1 === maxCol;
1145
+ let cellBorders = {};
1146
+ switch (preset) {
1147
+ case "all":
1148
+ cellBorders = {
1149
+ top: solidBorder,
1150
+ bottom: solidBorder,
1151
+ left: solidBorder,
1152
+ right: solidBorder
1153
+ };
1154
+ break;
1155
+ case "outside":
1156
+ cellBorders = {
1157
+ top: isTopEdge ? solidBorder : noBorder,
1158
+ bottom: isBottomEdge ? solidBorder : noBorder,
1159
+ left: isLeftEdge ? solidBorder : noBorder,
1160
+ right: isRightEdge ? solidBorder : noBorder
1161
+ };
1162
+ break;
1163
+ case "inside":
1164
+ cellBorders = {
1165
+ top: isTopEdge ? noBorder : solidBorder,
1166
+ bottom: isBottomEdge ? noBorder : solidBorder,
1167
+ left: isLeftEdge ? noBorder : solidBorder,
1168
+ right: isRightEdge ? noBorder : solidBorder
1169
+ };
1170
+ break;
1171
+ case "none":
1172
+ cellBorders = {
1173
+ top: noBorder,
1174
+ bottom: noBorder,
1175
+ left: noBorder,
1176
+ right: noBorder
1177
+ };
1178
+ break;
1179
+ default: break;
1180
+ }
1181
+ const attrs = getAttrs(pos, info.node);
1182
+ const existingBorders = attrs.borders ?? {};
1183
+ setAttrs(pos, {
1184
+ ...attrs,
1185
+ borders: {
1186
+ ...existingBorders,
1187
+ ...cellBorders
1188
+ }
1189
+ });
1190
+ if (cellBorders.top) {
1191
+ const adjPos = cellByRC.get(`${info.rowIdx - 1},${info.colIdx}`);
1192
+ if (adjPos !== void 0) {
1193
+ const adj = cellByPos.get(adjPos);
1194
+ if (!adj) continue;
1195
+ const adjAttrs = getAttrs(adjPos, adj.node);
1196
+ const adjBorders = adjAttrs.borders ?? {};
1197
+ setAttrs(adjPos, {
1198
+ ...adjAttrs,
1199
+ borders: {
1200
+ ...adjBorders,
1201
+ bottom: cellBorders.top
1202
+ }
1203
+ });
1204
+ }
1205
+ }
1206
+ if (cellBorders.bottom) {
1207
+ const adjPos = cellByRC.get(`${info.rowIdx + 1},${info.colIdx}`);
1208
+ if (adjPos !== void 0) {
1209
+ const adj = cellByPos.get(adjPos);
1210
+ if (!adj) continue;
1211
+ const adjAttrs = getAttrs(adjPos, adj.node);
1212
+ const adjBorders = adjAttrs.borders ?? {};
1213
+ setAttrs(adjPos, {
1214
+ ...adjAttrs,
1215
+ borders: {
1216
+ ...adjBorders,
1217
+ top: cellBorders.bottom
1218
+ }
1219
+ });
1220
+ }
1221
+ }
1222
+ if (cellBorders.left) {
1223
+ const adjPos = cellByRC.get(`${info.rowIdx},${info.colIdx - 1}`);
1224
+ if (adjPos !== void 0) {
1225
+ const adj = cellByPos.get(adjPos);
1226
+ if (!adj) continue;
1227
+ const adjAttrs = getAttrs(adjPos, adj.node);
1228
+ const adjBorders = adjAttrs.borders ?? {};
1229
+ setAttrs(adjPos, {
1230
+ ...adjAttrs,
1231
+ borders: {
1232
+ ...adjBorders,
1233
+ right: cellBorders.left
1234
+ }
1235
+ });
1236
+ }
1237
+ }
1238
+ if (cellBorders.right) {
1239
+ const adjPos = cellByRC.get(`${info.rowIdx},${info.colIdx + info.colspan}`);
1240
+ if (adjPos !== void 0) {
1241
+ const adj = cellByPos.get(adjPos);
1242
+ if (!adj) continue;
1243
+ const adjAttrs = getAttrs(adjPos, adj.node);
1244
+ const adjBorders = adjAttrs.borders ?? {};
1245
+ setAttrs(adjPos, {
1246
+ ...adjAttrs,
1247
+ borders: {
1248
+ ...adjBorders,
1249
+ left: cellBorders.right
1250
+ }
1251
+ });
1252
+ }
1253
+ }
1254
+ }
1255
+ for (const [pos, attrs] of modified) tr.setNodeMarkup(tr.mapping.map(pos), void 0, attrs);
1256
+ dispatch(tr.scrollIntoView());
1257
+ }
1258
+ return true;
1259
+ };
1260
+ }
1261
+ /**
1262
+ * Apply a whole-table border preset (Word's "All Borders" / "No Border")
1263
+ * to the table containing the caret. Updates the table node's `borders`
1264
+ * attr (serialized as w:tblBorders) and bakes the same spec into every
1265
+ * cell's `borders` attr so the paged painter reflects the change live.
1266
+ */
1267
+ function setTableBorderPreset(preset) {
1268
+ return (state, dispatch) => {
1269
+ const context = getTableContext(state);
1270
+ if (!context.isInTable || context.tablePos === void 0 || !context.table) return false;
1271
+ if (dispatch) {
1272
+ const tr = state.tr;
1273
+ const table = context.table;
1274
+ const tableStart = context.tablePos;
1275
+ const spec = preset === "all" ? {
1276
+ style: "single",
1277
+ size: 4,
1278
+ space: 0,
1279
+ color: { auto: true }
1280
+ } : { style: "none" };
1281
+ const tableBorders = {
1282
+ top: spec,
1283
+ bottom: spec,
1284
+ left: spec,
1285
+ right: spec,
1286
+ insideH: spec,
1287
+ insideV: spec
1288
+ };
1289
+ tr.setNodeMarkup(tableStart, void 0, {
1290
+ ...expectTableAttrs(table),
1291
+ borders: tableBorders
1292
+ });
1293
+ table.forEach((row, rowOffset) => {
1294
+ if (row.type.name !== "tableRow") return;
1295
+ row.forEach((cell, cellOffset) => {
1296
+ const pos = tableStart + rowOffset + cellOffset + 2;
1297
+ tr.setNodeMarkup(pos, void 0, {
1298
+ ...expectTableCellAttrs(cell),
1299
+ borders: {
1300
+ top: spec,
1301
+ bottom: spec,
1302
+ left: spec,
1303
+ right: spec
1304
+ }
1305
+ });
1306
+ });
1307
+ });
1308
+ dispatch(tr.scrollIntoView());
1309
+ }
1310
+ return true;
1311
+ };
1312
+ }
1313
+ function setCellFillColor(color) {
1314
+ return (state, dispatch) => {
1315
+ const context = getTableContext(state);
1316
+ if (!context.isInTable || context.tablePos === void 0 || !context.table) return false;
1317
+ if (dispatch) {
1318
+ const tr = state.tr;
1319
+ const cells = getTargetCellPositions(state);
1320
+ const bgColor = color ? color.replace(/^#/u, "") : void 0;
1321
+ for (const { pos, node } of cells) tr.setNodeMarkup(tr.mapping.map(pos), void 0, mergeTableCellAttrs(node, { backgroundColor: bgColor }));
1322
+ dispatch(tr.scrollIntoView());
1323
+ }
1324
+ return true;
1325
+ };
1326
+ }
1327
+ function setCellBorder(side, spec, clearOthers) {
1328
+ return (state, dispatch) => {
1329
+ const context = getTableContext(state);
1330
+ if (!context.isInTable || context.tablePos === void 0 || !context.table) return false;
1331
+ if (dispatch) {
1332
+ const tr = state.tr;
1333
+ const cells = getTargetCellPositions(state);
1334
+ const borderValue = spec ?? { style: "none" };
1335
+ const noBorder = { style: "none" };
1336
+ const allSides = [
1337
+ "top",
1338
+ "bottom",
1339
+ "left",
1340
+ "right"
1341
+ ];
1342
+ const { cellByPos, cellByRC } = buildTableGrid(context.table, context.tablePos);
1343
+ const modified = /* @__PURE__ */ new Map();
1344
+ const getAttrs = (p, n) => modified.get(p) ?? expectTableCellAttrs(n);
1345
+ const setAttrs = (p, a) => modified.set(p, a);
1346
+ const adjacentMap = {
1347
+ top: {
1348
+ adjSide: "bottom",
1349
+ dRow: -1,
1350
+ dCol: 0
1351
+ },
1352
+ bottom: {
1353
+ adjSide: "top",
1354
+ dRow: 1,
1355
+ dCol: 0
1356
+ },
1357
+ left: {
1358
+ adjSide: "right",
1359
+ dRow: 0,
1360
+ dCol: -1
1361
+ },
1362
+ right: {
1363
+ adjSide: "left",
1364
+ dRow: 0,
1365
+ dCol: 1
1366
+ }
1367
+ };
1368
+ for (const { pos, node } of cells) {
1369
+ const info = cellByPos.get(pos);
1370
+ const attrs = getAttrs(pos, node);
1371
+ const currentBorders = attrs.borders ?? {};
1372
+ const sides = side === "all" ? allSides : [side];
1373
+ const newBorders = clearOthers ? {
1374
+ top: noBorder,
1375
+ bottom: noBorder,
1376
+ left: noBorder,
1377
+ right: noBorder
1378
+ } : { ...currentBorders };
1379
+ for (const s of sides) newBorders[s] = borderValue;
1380
+ if (info) {
1381
+ const sidesToSync = clearOthers ? allSides : sides;
1382
+ for (const s of sidesToSync) {
1383
+ const syncValue = newBorders[s];
1384
+ const adj = adjacentMap[s];
1385
+ const adjColIdx = s === "right" ? info.colIdx + info.colspan : info.colIdx + adj.dCol;
1386
+ const adjPos = cellByRC.get(`${info.rowIdx + adj.dRow},${adjColIdx}`);
1387
+ if (adjPos !== void 0) {
1388
+ const adjInfo = cellByPos.get(adjPos);
1389
+ if (!adjInfo) continue;
1390
+ const adjAttrs = getAttrs(adjPos, adjInfo.node);
1391
+ const adjBorders = adjAttrs.borders ?? {};
1392
+ setAttrs(adjPos, {
1393
+ ...adjAttrs,
1394
+ borders: {
1395
+ ...adjBorders,
1396
+ [adj.adjSide]: syncValue
1397
+ }
1398
+ });
1399
+ }
1400
+ }
1401
+ }
1402
+ setAttrs(pos, {
1403
+ ...attrs,
1404
+ borders: newBorders
1405
+ });
1406
+ }
1407
+ for (const [p, a] of modified) tr.setNodeMarkup(tr.mapping.map(p), void 0, a);
1408
+ dispatch(tr.scrollIntoView());
1409
+ }
1410
+ return true;
1411
+ };
1412
+ }
1413
+ function setCellVerticalAlign(align) {
1414
+ return (state, dispatch) => {
1415
+ const context = getTableContext(state);
1416
+ if (!context.isInTable || context.tablePos === void 0 || !context.table) return false;
1417
+ if (dispatch) {
1418
+ const tr = state.tr;
1419
+ const cells = getTargetCellPositions(state);
1420
+ for (const { pos, node } of cells) tr.setNodeMarkup(tr.mapping.map(pos), void 0, mergeTableCellAttrs(node, { verticalAlign: align }));
1421
+ dispatch(tr.scrollIntoView());
1422
+ }
1423
+ return true;
1424
+ };
1425
+ }
1426
+ function setCellMargins(margins) {
1427
+ return (state, dispatch) => {
1428
+ const context = getTableContext(state);
1429
+ if (!context.isInTable || context.tablePos === void 0 || !context.table) return false;
1430
+ if (dispatch) {
1431
+ const tr = state.tr;
1432
+ const cells = getTargetCellPositions(state);
1433
+ for (const { pos, node } of cells) {
1434
+ const newMargins = {
1435
+ ...expectTableCellAttrs(node).margins ?? {},
1436
+ ...margins
1437
+ };
1438
+ tr.setNodeMarkup(tr.mapping.map(pos), void 0, mergeTableCellAttrs(node, { margins: newMargins }));
1439
+ }
1440
+ dispatch(tr.scrollIntoView());
1441
+ }
1442
+ return true;
1443
+ };
1444
+ }
1445
+ function setCellTextDirection(direction) {
1446
+ return (state, dispatch) => {
1447
+ const context = getTableContext(state);
1448
+ if (!context.isInTable || context.tablePos === void 0 || !context.table) return false;
1449
+ if (dispatch) {
1450
+ if (direction !== null && !isOneOf(direction, TABLE_CELL_TEXT_DIRECTION_VALUES)) return false;
1451
+ const tr = state.tr;
1452
+ const cells = getTargetCellPositions(state);
1453
+ for (const { pos, node } of cells) tr.setNodeMarkup(tr.mapping.map(pos), void 0, mergeTableCellAttrs(node, { textDirection: direction ?? void 0 }));
1454
+ dispatch(tr.scrollIntoView());
1455
+ }
1456
+ return true;
1457
+ };
1458
+ }
1459
+ function toggleNoWrap() {
1460
+ return (state, dispatch) => {
1461
+ const context = getTableContext(state);
1462
+ if (!context.isInTable || context.tablePos === void 0 || !context.table) return false;
1463
+ if (dispatch) {
1464
+ const tr = state.tr;
1465
+ const cells = getTargetCellPositions(state);
1466
+ for (const { pos, node } of cells) {
1467
+ const attrs = expectTableCellAttrs(node);
1468
+ tr.setNodeMarkup(tr.mapping.map(pos), void 0, mergeTableCellAttrs(node, { noWrap: attrs.noWrap !== true }));
1469
+ }
1470
+ dispatch(tr.scrollIntoView());
1471
+ }
1472
+ return true;
1473
+ };
1474
+ }
1475
+ function setRowHeight(height, rule) {
1476
+ return (state, dispatch) => {
1477
+ const context = getTableContext(state);
1478
+ if (!context.isInTable || context.tablePos === void 0 || !context.table) return false;
1479
+ if (dispatch) {
1480
+ const tr = state.tr;
1481
+ const { $from } = state.selection;
1482
+ for (let d = $from.depth; d > 0; d--) {
1483
+ const node = $from.node(d);
1484
+ if (node.type.name === "tableRow") {
1485
+ const pos = $from.before(d);
1486
+ tr.setNodeMarkup(pos, void 0, mergeTableRowAttrs(node, {
1487
+ height: height ?? void 0,
1488
+ heightRule: height !== null ? rule ?? "atLeast" : void 0
1489
+ }));
1490
+ dispatch(tr.scrollIntoView());
1491
+ return true;
1492
+ }
1493
+ }
1494
+ }
1495
+ return true;
1496
+ };
1497
+ }
1498
+ function distributeColumns() {
1499
+ return (state, dispatch) => {
1500
+ const context = getTableContext(state);
1501
+ if (!context.isInTable || context.tablePos === void 0 || !context.table || context.columnCount === void 0 || context.columnCount === 0) return false;
1502
+ if (dispatch) {
1503
+ let tr = state.tr;
1504
+ const table = context.table;
1505
+ const colCount = context.columnCount;
1506
+ const existingWidths = expectTableAttrs(table).columnWidths;
1507
+ const totalWidthTwips = existingWidths ? existingWidths.reduce((sum, w) => sum + w, 0) : 9360;
1508
+ const equalWidth = Math.floor(totalWidthTwips / colCount);
1509
+ let rowPos = context.tablePos + 1;
1510
+ table.forEach((row) => {
1511
+ if (row.type.name === "tableRow") {
1512
+ let cellPos = rowPos + 1;
1513
+ row.forEach((cell) => {
1514
+ if (cell.type.name === "tableCell" || cell.type.name === "tableHeader") tr = tr.setNodeMarkup(cellPos, void 0, mergeTableCellAttrs(cell, {
1515
+ width: equalWidth,
1516
+ widthType: "dxa",
1517
+ colwidth: null
1518
+ }));
1519
+ cellPos += cell.nodeSize;
1520
+ });
1521
+ }
1522
+ rowPos += row.nodeSize;
1523
+ });
1524
+ const newColumnWidths = Array.from({ length: colCount }, () => equalWidth);
1525
+ tr = tr.setNodeMarkup(context.tablePos, void 0, mergeTableAttrs(table, { columnWidths: newColumnWidths }));
1526
+ dispatch(tr.scrollIntoView());
1527
+ }
1528
+ return true;
1529
+ };
1530
+ }
1531
+ function autoFitContents() {
1532
+ return (state, dispatch) => {
1533
+ const context = getTableContext(state);
1534
+ if (!context.isInTable || context.tablePos === void 0 || !context.table) return false;
1535
+ if (dispatch) {
1536
+ let tr = state.tr;
1537
+ const table = context.table;
1538
+ let rowPos = context.tablePos + 1;
1539
+ table.forEach((row) => {
1540
+ if (row.type.name === "tableRow") {
1541
+ let cellPos = rowPos + 1;
1542
+ row.forEach((cell) => {
1543
+ if (cell.type.name === "tableCell" || cell.type.name === "tableHeader") tr = tr.setNodeMarkup(cellPos, void 0, mergeTableCellAttrs(cell, {
1544
+ width: void 0,
1545
+ widthType: void 0,
1546
+ colwidth: null
1547
+ }));
1548
+ cellPos += cell.nodeSize;
1549
+ });
1550
+ }
1551
+ rowPos += row.nodeSize;
1552
+ });
1553
+ tr = tr.setNodeMarkup(context.tablePos, void 0, mergeTableAttrs(table, {
1554
+ columnWidths: void 0,
1555
+ width: void 0,
1556
+ widthType: "auto"
1557
+ }));
1558
+ dispatch(tr.scrollIntoView());
1559
+ }
1560
+ return true;
1561
+ };
1562
+ }
1563
+ /**
1564
+ * Apply a table style to the current table.
1565
+ * Accepts pre-resolved style data (borders, shading per conditional type).
1566
+ */
1567
+ function applyTableStyle(styleData) {
1568
+ return (state, dispatch) => {
1569
+ const context = getTableContext(state);
1570
+ if (!context.isInTable || context.tablePos === void 0 || !context.table) return false;
1571
+ if (dispatch) {
1572
+ let tr = state.tr;
1573
+ const table = context.table;
1574
+ const tablePos = context.tablePos;
1575
+ const totalRows = table.childCount;
1576
+ const look = styleData.look ?? {
1577
+ firstRow: true,
1578
+ lastRow: false,
1579
+ noHBand: false,
1580
+ noVBand: true
1581
+ };
1582
+ const conditionals = styleData.conditionals ?? {};
1583
+ const tableBorders = styleData.tableBorders;
1584
+ tr = tr.setNodeMarkup(tablePos, void 0, mergeTableAttrs(table, { styleId: styleData.styleId }));
1585
+ let dataRowIndex = 0;
1586
+ let rowOffset = tablePos + 1;
1587
+ for (let rowIdx = 0; rowIdx < totalRows; rowIdx++) {
1588
+ const row = table.child(rowIdx);
1589
+ const isFirstRow = rowIdx === 0 && !!look.firstRow;
1590
+ const isLastRow = rowIdx === totalRows - 1 && !!look.lastRow;
1591
+ const bandingEnabled = look.noHBand !== true;
1592
+ const totalCols = row.childCount;
1593
+ let condType;
1594
+ if (isFirstRow) condType = "firstRow";
1595
+ else if (isLastRow) condType = "lastRow";
1596
+ else if (bandingEnabled) {
1597
+ condType = dataRowIndex % 2 === 0 ? "band1Horz" : "band2Horz";
1598
+ dataRowIndex++;
1599
+ } else dataRowIndex++;
1600
+ let cellOffset = rowOffset + 1;
1601
+ for (let colIdx = 0; colIdx < totalCols; colIdx++) {
1602
+ const cell = row.child(colIdx);
1603
+ const cellPos = tr.mapping.map(cellOffset);
1604
+ let cellCondType = condType;
1605
+ const isFirstCol = colIdx === 0 && !!look.firstCol;
1606
+ const isLastCol = colIdx === totalCols - 1 && !!look.lastCol;
1607
+ if (isFirstRow && isFirstCol && conditionals["nwCell"]) cellCondType = "nwCell";
1608
+ else if (isFirstRow && isLastCol && conditionals["neCell"]) cellCondType = "neCell";
1609
+ else if (isLastRow && isFirstCol && conditionals["swCell"]) cellCondType = "swCell";
1610
+ else if (isLastRow && isLastCol && conditionals["seCell"]) cellCondType = "seCell";
1611
+ else if (isFirstCol) cellCondType = "firstCol";
1612
+ else if (isLastCol) cellCondType = "lastCol";
1613
+ const cond = cellCondType ? conditionals[cellCondType] : void 0;
1614
+ const cellBorders = {};
1615
+ for (const side of [
1616
+ "top",
1617
+ "bottom",
1618
+ "left",
1619
+ "right"
1620
+ ]) if (cond?.borders && cond.borders[side] !== void 0) {
1621
+ const border = cond.borders[side];
1622
+ if (border) cellBorders[side] = border;
1623
+ } else if (tableBorders) {
1624
+ let border;
1625
+ if (side === "top" && rowIdx > 0 || side === "bottom" && rowIdx < totalRows - 1) border = tableBorders.insideH ?? tableBorders[side];
1626
+ else if (side === "left" && colIdx > 0 || side === "right" && colIdx < totalCols - 1) border = tableBorders.insideV ?? tableBorders[side];
1627
+ else border = tableBorders[side];
1628
+ if (border) cellBorders[side] = border;
1629
+ }
1630
+ tr = tr.setNodeMarkup(cellPos, void 0, mergeTableCellAttrs(cell, {
1631
+ backgroundColor: cond?.backgroundColor,
1632
+ borders: Object.keys(cellBorders).length > 0 ? cellBorders : void 0
1633
+ }));
1634
+ cellOffset += cell.nodeSize;
1635
+ }
1636
+ rowOffset += row.nodeSize;
1637
+ }
1638
+ dispatch(tr.scrollIntoView());
1639
+ }
1640
+ return true;
1641
+ };
1642
+ }
1643
+ function setTableProperties(props) {
1644
+ return (state, dispatch) => {
1645
+ if (props.widthType !== void 0 && props.widthType !== null && !isOneOf(props.widthType, TABLE_WIDTH_TYPE_VALUES)) return false;
1646
+ const context = getTableContext(state);
1647
+ if (!context.isInTable || context.tablePos === void 0 || !context.table) return false;
1648
+ if (dispatch) {
1649
+ const tr = state.tr;
1650
+ tr.setNodeMarkup(context.tablePos, void 0, mergeTableAttrs(context.table, {
1651
+ ..."width" in props ? { width: props.width ?? void 0 } : {},
1652
+ ..."widthType" in props ? { widthType: props.widthType ?? void 0 } : {},
1653
+ ..."justification" in props ? { justification: props.justification ?? void 0 } : {}
1654
+ }));
1655
+ dispatch(tr.scrollIntoView());
1656
+ }
1657
+ return true;
1658
+ };
1659
+ }
1660
+ function toggleHeaderRow() {
1661
+ return (state, dispatch) => {
1662
+ const context = getTableContext(state);
1663
+ if (!context.isInTable || context.tablePos === void 0 || !context.table) return false;
1664
+ if (dispatch) {
1665
+ const tr = state.tr;
1666
+ const { $from } = state.selection;
1667
+ for (let d = $from.depth; d > 0; d--) {
1668
+ const node = $from.node(d);
1669
+ if (node.type.name === "tableRow") {
1670
+ const pos = $from.before(d);
1671
+ const attrs = expectTableRowAttrs(node);
1672
+ tr.setNodeMarkup(pos, void 0, mergeTableRowAttrs(node, { isHeader: attrs.isHeader !== true }));
1673
+ dispatch(tr.scrollIntoView());
1674
+ return true;
1675
+ }
1676
+ }
1677
+ }
1678
+ return true;
1679
+ };
1680
+ }
1681
+ function setTableBorderColor(color) {
1682
+ return (state, dispatch) => {
1683
+ const context = getTableContext(state);
1684
+ if (!context.isInTable || context.tablePos === void 0 || !context.table) return false;
1685
+ if (dispatch) {
1686
+ const tr = state.tr;
1687
+ const cells = getTargetCellPositions(state);
1688
+ const rgb = color.replace(/^#/u, "");
1689
+ const defaultBorder = {
1690
+ style: "single",
1691
+ size: 4
1692
+ };
1693
+ const { cellByPos, cellByRC } = buildTableGrid(context.table, context.tablePos);
1694
+ const modified = /* @__PURE__ */ new Map();
1695
+ const getAttrs = (p, n) => modified.get(p) ?? expectTableCellAttrs(n);
1696
+ const setAttrs = (p, a) => modified.set(p, a);
1697
+ const adjacentMap = {
1698
+ top: {
1699
+ adjSide: "bottom",
1700
+ dRow: -1,
1701
+ dCol: 0
1702
+ },
1703
+ bottom: {
1704
+ adjSide: "top",
1705
+ dRow: 1,
1706
+ dCol: 0
1707
+ },
1708
+ left: {
1709
+ adjSide: "right",
1710
+ dRow: 0,
1711
+ dCol: -1
1712
+ },
1713
+ right: {
1714
+ adjSide: "left",
1715
+ dRow: 0,
1716
+ dCol: 1
1717
+ }
1718
+ };
1719
+ for (const { pos, node } of cells) {
1720
+ const info = cellByPos.get(pos);
1721
+ const attrs = getAttrs(pos, node);
1722
+ const currentBorders = attrs.borders ?? {};
1723
+ const newBorders = {};
1724
+ for (const side of [
1725
+ "top",
1726
+ "bottom",
1727
+ "left",
1728
+ "right"
1729
+ ]) {
1730
+ const borderVal = {
1731
+ ...defaultBorder,
1732
+ ...currentBorders[side],
1733
+ color: { rgb }
1734
+ };
1735
+ newBorders[side] = borderVal;
1736
+ if (info) {
1737
+ const adj = adjacentMap[side];
1738
+ const adjColIdx = side === "right" ? info.colIdx + info.colspan : info.colIdx + adj.dCol;
1739
+ const adjPos = cellByRC.get(`${info.rowIdx + adj.dRow},${adjColIdx}`);
1740
+ if (adjPos !== void 0) {
1741
+ const adjInfo = cellByPos.get(adjPos);
1742
+ if (!adjInfo) continue;
1743
+ const adjAttrs = getAttrs(adjPos, adjInfo.node);
1744
+ const adjBorders = adjAttrs.borders ?? {};
1745
+ setAttrs(adjPos, {
1746
+ ...adjAttrs,
1747
+ borders: {
1748
+ ...adjBorders,
1749
+ [adj.adjSide]: borderVal
1750
+ }
1751
+ });
1752
+ }
1753
+ }
1754
+ }
1755
+ setAttrs(pos, {
1756
+ ...attrs,
1757
+ borders: {
1758
+ ...currentBorders,
1759
+ ...newBorders
1760
+ }
1761
+ });
1762
+ }
1763
+ for (const [p, a] of modified) tr.setNodeMarkup(tr.mapping.map(p), void 0, a);
1764
+ dispatch(tr.scrollIntoView());
1765
+ }
1766
+ return true;
1767
+ };
1768
+ }
1769
+ function setTableBorderWidth(size) {
1770
+ return (state, dispatch) => {
1771
+ const context = getTableContext(state);
1772
+ if (!context.isInTable || context.tablePos === void 0 || !context.table) return false;
1773
+ if (dispatch) {
1774
+ const tr = state.tr;
1775
+ const cells = getTargetCellPositions(state);
1776
+ const defaultBorder = {
1777
+ style: "single",
1778
+ color: { rgb: "000000" }
1779
+ };
1780
+ const { cellByPos, cellByRC } = buildTableGrid(context.table, context.tablePos);
1781
+ const modified = /* @__PURE__ */ new Map();
1782
+ const getAttrs = (p, n) => modified.get(p) ?? expectTableCellAttrs(n);
1783
+ const setAttrs = (p, a) => modified.set(p, a);
1784
+ const adjacentMap = {
1785
+ top: {
1786
+ adjSide: "bottom",
1787
+ dRow: -1,
1788
+ dCol: 0
1789
+ },
1790
+ bottom: {
1791
+ adjSide: "top",
1792
+ dRow: 1,
1793
+ dCol: 0
1794
+ },
1795
+ left: {
1796
+ adjSide: "right",
1797
+ dRow: 0,
1798
+ dCol: -1
1799
+ },
1800
+ right: {
1801
+ adjSide: "left",
1802
+ dRow: 0,
1803
+ dCol: 1
1804
+ }
1805
+ };
1806
+ for (const { pos, node } of cells) {
1807
+ const info = cellByPos.get(pos);
1808
+ const attrs = getAttrs(pos, node);
1809
+ const currentBorders = attrs.borders ?? {};
1810
+ const newBorders = {};
1811
+ for (const side of [
1812
+ "top",
1813
+ "bottom",
1814
+ "left",
1815
+ "right"
1816
+ ]) {
1817
+ const borderVal = {
1818
+ ...defaultBorder,
1819
+ ...currentBorders[side],
1820
+ size
1821
+ };
1822
+ newBorders[side] = borderVal;
1823
+ if (info) {
1824
+ const adj = adjacentMap[side];
1825
+ const adjColIdx = side === "right" ? info.colIdx + info.colspan : info.colIdx + adj.dCol;
1826
+ const adjPos = cellByRC.get(`${info.rowIdx + adj.dRow},${adjColIdx}`);
1827
+ if (adjPos !== void 0) {
1828
+ const adjInfo = cellByPos.get(adjPos);
1829
+ if (!adjInfo) continue;
1830
+ const adjAttrs = getAttrs(adjPos, adjInfo.node);
1831
+ const adjBorders = adjAttrs.borders ?? {};
1832
+ setAttrs(adjPos, {
1833
+ ...adjAttrs,
1834
+ borders: {
1835
+ ...adjBorders,
1836
+ [adj.adjSide]: borderVal
1837
+ }
1838
+ });
1839
+ }
1840
+ }
1841
+ }
1842
+ setAttrs(pos, {
1843
+ ...attrs,
1844
+ borders: {
1845
+ ...currentBorders,
1846
+ ...newBorders
1847
+ }
1848
+ });
1849
+ }
1850
+ for (const [p, a] of modified) tr.setNodeMarkup(tr.mapping.map(p), void 0, a);
1851
+ dispatch(tr.scrollIntoView());
1852
+ }
1853
+ return true;
1854
+ };
1855
+ }
1856
+ function deleteTableIfSelected() {
1857
+ return (state, dispatch) => {
1858
+ const selection = state.selection;
1859
+ if (!("$anchorCell" in selection && typeof selection.forEachCell === "function")) return false;
1860
+ const context = getTableContext(state);
1861
+ if (!context.isInTable || context.tablePos === void 0 || !context.table) return false;
1862
+ let totalCells = 0;
1863
+ context.table.descendants((node) => {
1864
+ if (node.type.name === "tableCell" || node.type.name === "tableHeader") totalCells += 1;
1865
+ });
1866
+ let selectedCells = 0;
1867
+ selection.forEachCell(() => {
1868
+ selectedCells += 1;
1869
+ });
1870
+ if (!(totalCells > 0 && selectedCells >= totalCells)) return false;
1871
+ if (dispatch) dispatch(state.tr.delete(context.tablePos, context.tablePos + context.table.nodeSize).scrollIntoView());
1872
+ return true;
1873
+ };
1874
+ }
1875
+ function preventTableMergeAtGap() {
1876
+ return (state) => {
1877
+ const { $from, empty } = state.selection;
1878
+ if (!empty) return false;
1879
+ const parent = $from.parent;
1880
+ if (parent.type.name !== "paragraph") return false;
1881
+ if (parent.textContent.length > 0) return false;
1882
+ const depth = $from.depth;
1883
+ if (depth < 1) return false;
1884
+ const container = $from.node(depth - 1);
1885
+ const index = $from.index(depth - 1);
1886
+ const before = index > 0 ? container.child(index - 1) : null;
1887
+ const after = index + 1 < container.childCount ? container.child(index + 1) : null;
1888
+ const beforeIsTable = before?.type.name === "table";
1889
+ const afterIsTable = after?.type.name === "table";
1890
+ if (beforeIsTable || afterIsTable) return true;
1891
+ return false;
1892
+ };
1893
+ }
1894
+ const activeCellPlugin = new Plugin({
1895
+ key: new PluginKey("activeCell"),
1896
+ props: { decorations(state) {
1897
+ const { selection } = state;
1898
+ if (selection instanceof CellSelection) return DecorationSet.empty;
1899
+ const { $from } = selection;
1900
+ for (let d = $from.depth; d > 0; d--) {
1901
+ const node = $from.node(d);
1902
+ if (node.type.name === "tableCell" || node.type.name === "tableHeader") {
1903
+ const pos = $from.before(d);
1904
+ return DecorationSet.create(state.doc, [Decoration.node(pos, pos + node.nodeSize, { class: "activeCell" })]);
1905
+ }
1906
+ }
1907
+ return DecorationSet.empty;
1908
+ } }
1909
+ });
1910
+ return {
1911
+ plugins: [
1912
+ columnResizing({
1913
+ handleWidth: 5,
1914
+ cellMinWidth: 25,
1915
+ lastColumnResizable: true
1916
+ }),
1917
+ tableEditing(),
1918
+ activeCellPlugin
1919
+ ],
1920
+ keyboardShortcuts: {
1921
+ Backspace: chainCommands(deleteTableIfSelected(), preventTableMergeAtGap()),
1922
+ Delete: chainCommands(deleteTableIfSelected(), preventTableMergeAtGap())
1923
+ },
1924
+ commands: {
1925
+ insertTable: (rows, cols) => insertTable(rows, cols),
1926
+ addRowAbove: () => addRowAbove,
1927
+ addRowBelow: () => addRowBelow,
1928
+ deleteRow: () => deleteRow,
1929
+ addColumnLeft: () => addColumnLeft,
1930
+ addColumnRight: () => addColumnRight,
1931
+ deleteColumn: () => deleteColumn,
1932
+ deleteTable: () => deleteTable,
1933
+ selectTable: () => selectTable,
1934
+ selectRow: () => selectRow,
1935
+ selectColumn: () => selectColumn,
1936
+ mergeCells: () => mergeCells,
1937
+ splitCell: () => splitCell,
1938
+ setCellBorder: (side, spec, clearOthers) => setCellBorder(side, spec, clearOthers),
1939
+ setTableBorders: (preset, borderSpec) => setTableBorders(preset, borderSpec),
1940
+ setTableBorderPreset: (preset) => setTableBorderPreset(preset),
1941
+ setCellVerticalAlign: (align) => setCellVerticalAlign(align),
1942
+ setCellMargins: (margins) => setCellMargins(margins),
1943
+ setCellTextDirection: (direction) => setCellTextDirection(direction),
1944
+ toggleNoWrap: () => toggleNoWrap(),
1945
+ setRowHeight: (height, rule) => setRowHeight(height, rule),
1946
+ toggleHeaderRow: () => toggleHeaderRow(),
1947
+ distributeColumns: () => distributeColumns(),
1948
+ autoFitContents: () => autoFitContents(),
1949
+ setTableProperties: (props) => setTableProperties(props),
1950
+ applyTableStyle: (styleData) => applyTableStyle(styleData),
1951
+ setCellFillColor: (color) => setCellFillColor(color),
1952
+ setTableBorderColor: (color) => setTableBorderColor(color),
1953
+ setTableBorderWidth: (size) => setTableBorderWidth(size),
1954
+ removeTableBorders: () => setTableBorders("none"),
1955
+ setAllTableBorders: (borderSpec) => setTableBorders("all", borderSpec),
1956
+ setOutsideTableBorders: (borderSpec) => setTableBorders("outside", borderSpec),
1957
+ setInsideTableBorders: (borderSpec) => setTableBorders("inside", borderSpec)
1958
+ }
1959
+ };
1960
+ }
1961
+ });
1962
+ function createTableExtensions() {
1963
+ return [
1964
+ TableNodeExtension(),
1965
+ TableRowExtension(),
1966
+ TableCellExtension(),
1967
+ TableHeaderExtension(),
1968
+ TablePluginExtension()
1969
+ ];
1970
+ }
1971
+ //#endregion
1972
+ export { TableCellExtension, TableHeaderExtension, TableNodeExtension, TablePluginExtension, TableRowExtension, createTableExtensions, getTableContext, goToNextCell, goToPrevCell, isInTableCell as isInTable };