@beyondwork/docx-react-component 1.0.29 → 1.0.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (383) hide show
  1. package/package.json +65 -96
  2. package/src/README.md +85 -0
  3. package/src/api/README.md +26 -0
  4. package/src/api/public-types.ts +1952 -0
  5. package/src/api/session-state.ts +62 -0
  6. package/src/compare/diff-engine.ts +623 -0
  7. package/src/compare/export-redlines.ts +280 -0
  8. package/src/compare/index.ts +25 -0
  9. package/src/compare/snapshot.ts +97 -0
  10. package/src/component-inventory.md +99 -0
  11. package/src/core/README.md +10 -0
  12. package/src/core/commands/README.md +3 -0
  13. package/{dist/chunk-TJBP2K4T.js → src/core/commands/formatting-commands.ts} +536 -196
  14. package/src/core/commands/image-commands.ts +373 -0
  15. package/src/core/commands/index.ts +1879 -0
  16. package/src/core/commands/list-commands.ts +565 -0
  17. package/src/core/commands/paragraph-layout-commands.ts +339 -0
  18. package/src/core/commands/review-commands.ts +108 -0
  19. package/{dist/core/commands/section-layout-commands.cjs → src/core/commands/section-layout-commands.ts} +340 -137
  20. package/src/core/commands/structural-helpers.ts +309 -0
  21. package/{dist/core/commands/style-commands.cjs → src/core/commands/style-commands.ts} +113 -65
  22. package/src/core/commands/table-structure-commands.ts +854 -0
  23. package/{dist/chunk-UZXBISGO.js → src/core/commands/text-commands.ts} +142 -86
  24. package/src/core/schema/README.md +3 -0
  25. package/src/core/schema/text-schema.ts +516 -0
  26. package/src/core/search/search-text.ts +357 -0
  27. package/src/core/selection/README.md +3 -0
  28. package/src/core/selection/mapping.ts +289 -0
  29. package/src/core/selection/review-anchors.ts +183 -0
  30. package/src/core/state/README.md +3 -0
  31. package/src/core/state/editor-state.ts +892 -0
  32. package/src/core/state/text-transaction.ts +869 -0
  33. package/src/formats/xlsx/io/parse-shared-strings.ts +41 -0
  34. package/src/formats/xlsx/io/parse-sheet.ts +459 -0
  35. package/src/formats/xlsx/io/parse-styles.ts +59 -0
  36. package/src/formats/xlsx/io/parse-workbook.ts +75 -0
  37. package/src/formats/xlsx/io/serialize-shared-strings.ts +72 -0
  38. package/src/formats/xlsx/io/serialize-sheet.ts +333 -0
  39. package/src/formats/xlsx/io/serialize-styles.ts +98 -0
  40. package/src/formats/xlsx/io/serialize-workbook.ts +429 -0
  41. package/src/formats/xlsx/io/xlsx-session.ts +314 -0
  42. package/src/formats/xlsx/model/cell.ts +189 -0
  43. package/src/formats/xlsx/model/sheet.ts +326 -0
  44. package/src/formats/xlsx/model/styles.ts +118 -0
  45. package/src/formats/xlsx/model/workbook.ts +453 -0
  46. package/src/formats/xlsx/runtime/cell-commands.ts +567 -0
  47. package/src/formats/xlsx/runtime/sheet-commands.ts +206 -0
  48. package/src/formats/xlsx/runtime/workbook-runtime.ts +177 -0
  49. package/src/formats/xlsx/runtime/workbook-transaction.ts +822 -0
  50. package/src/index.ts +142 -0
  51. package/src/io/README.md +10 -0
  52. package/src/io/docx-session.ts +3175 -0
  53. package/src/io/export/README.md +3 -0
  54. package/src/io/export/export-session.ts +220 -0
  55. package/src/io/export/minimal-docx.ts +115 -0
  56. package/src/io/export/reattach-preserved-parts.ts +54 -0
  57. package/src/io/export/serialize-comments.ts +947 -0
  58. package/src/io/export/serialize-footnotes.ts +394 -0
  59. package/src/io/export/serialize-headers-footers.ts +368 -0
  60. package/src/io/export/serialize-main-document.ts +1342 -0
  61. package/src/io/export/serialize-numbering.ts +218 -0
  62. package/src/io/export/serialize-revisions.ts +389 -0
  63. package/src/io/export/serialize-runtime-revisions.ts +463 -0
  64. package/src/io/export/serialize-tables.ts +174 -0
  65. package/src/io/export/split-review-boundaries.ts +356 -0
  66. package/src/io/export/split-story-blocks-for-runtime-revisions.ts +252 -0
  67. package/src/io/export/table-properties-xml.ts +318 -0
  68. package/src/io/normalize/README.md +3 -0
  69. package/src/io/normalize/normalize-text.ts +670 -0
  70. package/src/io/ooxml/README.md +3 -0
  71. package/src/io/ooxml/highlight-colors.ts +39 -0
  72. package/src/io/ooxml/numbering-sentinels.ts +44 -0
  73. package/src/io/ooxml/parse-comments.ts +852 -0
  74. package/src/io/ooxml/parse-complex-content.ts +287 -0
  75. package/src/io/ooxml/parse-fields.ts +834 -0
  76. package/src/io/ooxml/parse-footnotes.ts +952 -0
  77. package/src/io/ooxml/parse-headers-footers.ts +1212 -0
  78. package/src/io/ooxml/parse-inline-media.ts +461 -0
  79. package/src/io/ooxml/parse-main-document.ts +2947 -0
  80. package/src/io/ooxml/parse-numbering.ts +747 -0
  81. package/src/io/ooxml/parse-revisions.ts +1045 -0
  82. package/src/io/ooxml/parse-settings.ts +184 -0
  83. package/src/io/ooxml/parse-shapes.ts +296 -0
  84. package/src/io/ooxml/parse-styles.ts +639 -0
  85. package/src/io/ooxml/parse-tables.ts +627 -0
  86. package/src/io/ooxml/parse-theme.ts +346 -0
  87. package/src/io/ooxml/part-manifest.ts +136 -0
  88. package/src/io/ooxml/revision-boundaries.ts +475 -0
  89. package/src/io/ooxml/workflow-payload.ts +544 -0
  90. package/src/io/opc/README.md +3 -0
  91. package/src/io/opc/corrupt-package.ts +166 -0
  92. package/src/io/opc/docx-package.ts +74 -0
  93. package/src/io/opc/package-reader.ts +325 -0
  94. package/src/io/opc/package-writer.ts +273 -0
  95. package/src/io/source-package-provenance.ts +241 -0
  96. package/{dist/chunk-RMH72RZI.js → src/legal/bookmarks.ts} +130 -44
  97. package/src/legal/cross-references.ts +414 -0
  98. package/src/legal/defined-terms.ts +203 -0
  99. package/src/legal/index.ts +32 -0
  100. package/src/legal/signature-blocks.ts +259 -0
  101. package/src/model/README.md +3 -0
  102. package/src/model/canonical-document.ts +2722 -0
  103. package/src/model/cds-1.0.0.ts +212 -0
  104. package/src/model/snapshot.ts +760 -0
  105. package/src/preservation/README.md +3 -0
  106. package/src/preservation/markup-compatibility.ts +48 -0
  107. package/src/preservation/opaque-fragment-store.ts +89 -0
  108. package/src/preservation/opaque-region.ts +233 -0
  109. package/src/preservation/package-preservation.ts +113 -0
  110. package/src/preservation/preserved-part-manifest.ts +56 -0
  111. package/src/preservation/relationship-retention.ts +57 -0
  112. package/src/preservation/store.ts +255 -0
  113. package/src/review/README.md +16 -0
  114. package/src/review/store/README.md +3 -0
  115. package/src/review/store/comment-anchors.ts +70 -0
  116. package/src/review/store/comment-remapping.ts +154 -0
  117. package/src/review/store/comment-store.ts +349 -0
  118. package/src/review/store/comment-thread.ts +109 -0
  119. package/src/review/store/revision-actions.ts +423 -0
  120. package/src/review/store/revision-store.ts +323 -0
  121. package/src/review/store/revision-types.ts +182 -0
  122. package/src/review/store/runtime-comment-store.ts +43 -0
  123. package/src/runtime/README.md +3 -0
  124. package/src/runtime/ai-action-policy.ts +764 -0
  125. package/src/runtime/context-analytics.ts +824 -0
  126. package/src/runtime/document-layout.ts +332 -0
  127. package/src/runtime/document-locations.ts +521 -0
  128. package/src/runtime/document-navigation.ts +616 -0
  129. package/src/runtime/document-outline.ts +440 -0
  130. package/src/runtime/document-runtime.ts +4055 -0
  131. package/src/runtime/document-search.ts +145 -0
  132. package/src/runtime/event-refresh-hints.ts +137 -0
  133. package/src/runtime/numbering-prefix.ts +244 -0
  134. package/src/runtime/page-layout-estimation.ts +305 -0
  135. package/src/runtime/read-only-diagnostics-runtime.ts +241 -0
  136. package/src/runtime/resolved-numbering-geometry.ts +293 -0
  137. package/src/runtime/review-runtime.ts +44 -0
  138. package/src/runtime/revision-runtime.ts +107 -0
  139. package/src/runtime/session-capabilities.ts +192 -0
  140. package/src/runtime/story-context.ts +164 -0
  141. package/src/runtime/story-targeting.ts +162 -0
  142. package/src/runtime/suggestions-snapshot.ts +137 -0
  143. package/src/runtime/surface-projection.ts +1553 -0
  144. package/src/runtime/table-commands.ts +173 -0
  145. package/src/runtime/table-schema.ts +309 -0
  146. package/src/runtime/table-style-resolver.ts +409 -0
  147. package/src/runtime/view-state.ts +493 -0
  148. package/src/runtime/virtualized-rendering.ts +258 -0
  149. package/src/runtime/workflow-markup.ts +393 -0
  150. package/src/ui/README.md +30 -0
  151. package/src/ui/WordReviewEditor.tsx +5268 -0
  152. package/src/ui/browser-export.ts +52 -0
  153. package/src/ui/comments/README.md +3 -0
  154. package/src/ui/compatibility/README.md +3 -0
  155. package/src/ui/editor-command-bag.ts +127 -0
  156. package/src/ui/editor-runtime-boundary.ts +1558 -0
  157. package/src/ui/editor-shell-view.tsx +144 -0
  158. package/src/ui/editor-surface/README.md +3 -0
  159. package/src/ui/editor-surface-controller.tsx +66 -0
  160. package/src/ui/headless/comment-decoration-model.ts +124 -0
  161. package/src/ui/headless/preserve-editor-selection.ts +5 -0
  162. package/src/ui/headless/revision-decoration-model.ts +128 -0
  163. package/src/ui/headless/selection-helpers.ts +54 -0
  164. package/src/ui/headless/selection-tool-context.ts +19 -0
  165. package/src/ui/headless/selection-tool-resolver.ts +752 -0
  166. package/src/ui/headless/selection-tool-types.ts +129 -0
  167. package/src/ui/headless/selection-toolbar-model.ts +11 -0
  168. package/src/ui/headless/use-editor-keyboard.ts +103 -0
  169. package/src/ui/review/README.md +3 -0
  170. package/src/ui/runtime-shortcut-dispatch.ts +365 -0
  171. package/src/ui/runtime-snapshot-selectors.ts +197 -0
  172. package/src/ui/shared/revision-filters.ts +31 -0
  173. package/src/ui/status/README.md +3 -0
  174. package/src/ui/theme/README.md +3 -0
  175. package/src/ui/toolbar/README.md +3 -0
  176. package/src/ui/workflow-surface-blocked-rails.ts +94 -0
  177. package/src/ui-tailwind/chrome/chrome-preset-model.ts +107 -0
  178. package/src/ui-tailwind/chrome/chrome-preset-toolbar.tsx +15 -0
  179. package/src/ui-tailwind/chrome/responsive-chrome.ts +46 -0
  180. package/src/ui-tailwind/chrome/review-queue-bar.tsx +97 -0
  181. package/src/ui-tailwind/chrome/tw-alert-banner.tsx +64 -0
  182. package/src/ui-tailwind/chrome/tw-context-analytics-summary.tsx +122 -0
  183. package/src/ui-tailwind/chrome/tw-image-context-toolbar.tsx +121 -0
  184. package/src/ui-tailwind/chrome/tw-layout-panel.tsx +114 -0
  185. package/src/ui-tailwind/chrome/tw-object-context-toolbar.tsx +30 -0
  186. package/src/ui-tailwind/chrome/tw-page-ruler.tsx +365 -0
  187. package/src/ui-tailwind/chrome/tw-selection-tool-blocked.tsx +23 -0
  188. package/src/ui-tailwind/chrome/tw-selection-tool-comment.tsx +35 -0
  189. package/src/ui-tailwind/chrome/tw-selection-tool-formatting.tsx +37 -0
  190. package/src/ui-tailwind/chrome/tw-selection-tool-host.tsx +303 -0
  191. package/src/ui-tailwind/chrome/tw-selection-tool-structure.tsx +116 -0
  192. package/src/ui-tailwind/chrome/tw-selection-tool-suggestion.tsx +29 -0
  193. package/src/ui-tailwind/chrome/tw-selection-tool-workflow.tsx +27 -0
  194. package/src/ui-tailwind/chrome/tw-selection-toolbar.tsx +186 -0
  195. package/src/ui-tailwind/chrome/tw-suggestion-card.tsx +139 -0
  196. package/src/ui-tailwind/chrome/tw-table-context-toolbar.tsx +250 -0
  197. package/src/ui-tailwind/chrome/tw-unsaved-modal.tsx +58 -0
  198. package/src/ui-tailwind/chrome/use-before-unload.ts +20 -0
  199. package/src/ui-tailwind/editor-surface/perf-probe.ts +179 -0
  200. package/src/ui-tailwind/editor-surface/pm-command-bridge.ts +189 -0
  201. package/src/ui-tailwind/editor-surface/pm-contextual-ui.ts +31 -0
  202. package/src/ui-tailwind/editor-surface/pm-decorations.ts +411 -0
  203. package/src/ui-tailwind/editor-surface/pm-position-map.ts +123 -0
  204. package/src/ui-tailwind/editor-surface/pm-schema.ts +927 -0
  205. package/src/ui-tailwind/editor-surface/pm-state-from-snapshot.ts +567 -0
  206. package/src/ui-tailwind/editor-surface/search-plugin.ts +168 -0
  207. package/src/ui-tailwind/editor-surface/surface-build-keys.ts +63 -0
  208. package/src/ui-tailwind/editor-surface/tw-caret.tsx +12 -0
  209. package/src/ui-tailwind/editor-surface/tw-editor-surface.tsx +150 -0
  210. package/src/ui-tailwind/editor-surface/tw-inline-token.tsx +129 -0
  211. package/src/ui-tailwind/editor-surface/tw-opaque-block.tsx +58 -0
  212. package/src/ui-tailwind/editor-surface/tw-paragraph-block.tsx +151 -0
  213. package/src/ui-tailwind/editor-surface/tw-prosemirror-surface.tsx +1047 -0
  214. package/src/ui-tailwind/editor-surface/tw-segment-view.tsx +111 -0
  215. package/src/ui-tailwind/editor-surface/tw-table-node-view.tsx +503 -0
  216. package/src/ui-tailwind/index.ts +62 -0
  217. package/src/ui-tailwind/page-chrome-model.ts +27 -0
  218. package/src/ui-tailwind/review/tw-comment-sidebar.tsx +406 -0
  219. package/src/ui-tailwind/review/tw-health-panel.tsx +149 -0
  220. package/src/ui-tailwind/review/tw-review-rail.tsx +130 -0
  221. package/src/ui-tailwind/review/tw-revision-sidebar.tsx +164 -0
  222. package/src/ui-tailwind/status/tw-status-bar.tsx +65 -0
  223. package/{dist → src}/ui-tailwind/theme/editor-theme.css +58 -40
  224. package/src/ui-tailwind/toolbar/toolbar-layout.ts +47 -0
  225. package/src/ui-tailwind/toolbar/tw-toolbar-icon-button.tsx +52 -0
  226. package/src/ui-tailwind/toolbar/tw-toolbar.tsx +1478 -0
  227. package/src/ui-tailwind/tw-review-workspace.tsx +1587 -0
  228. package/src/validation/README.md +3 -0
  229. package/src/validation/compatibility-engine.ts +878 -0
  230. package/src/validation/compatibility-report.ts +161 -0
  231. package/src/validation/diagnostics.ts +204 -0
  232. package/src/validation/docx-comment-proof.ts +720 -0
  233. package/src/validation/import-diagnostics.ts +128 -0
  234. package/src/validation/low-priority-word-surfaces.ts +373 -0
  235. package/dist/canonical-document-BLEbzL2J.d.cts +0 -844
  236. package/dist/canonical-document-BLEbzL2J.d.ts +0 -844
  237. package/dist/chunk-2FJS5GZM.js +0 -763
  238. package/dist/chunk-2FJS5GZM.js.map +0 -1
  239. package/dist/chunk-2OQBZS3F.js +0 -446
  240. package/dist/chunk-2OQBZS3F.js.map +0 -1
  241. package/dist/chunk-2S7W4KFO.js +0 -127
  242. package/dist/chunk-2S7W4KFO.js.map +0 -1
  243. package/dist/chunk-2TG72QSW.js +0 -3874
  244. package/dist/chunk-2TG72QSW.js.map +0 -1
  245. package/dist/chunk-36QNIZBO.js +0 -532
  246. package/dist/chunk-36QNIZBO.js.map +0 -1
  247. package/dist/chunk-4AQOYAW4.js +0 -3069
  248. package/dist/chunk-4AQOYAW4.js.map +0 -1
  249. package/dist/chunk-4D5EWJ3P.js +0 -77
  250. package/dist/chunk-4D5EWJ3P.js.map +0 -1
  251. package/dist/chunk-5FN54NDH.js +0 -2257
  252. package/dist/chunk-5FN54NDH.js.map +0 -1
  253. package/dist/chunk-BOYGQYRQ.js +0 -7306
  254. package/dist/chunk-BOYGQYRQ.js.map +0 -1
  255. package/dist/chunk-CN3XMECL.js +0 -212
  256. package/dist/chunk-CN3XMECL.js.map +0 -1
  257. package/dist/chunk-EBI3BX6U.js +0 -164
  258. package/dist/chunk-EBI3BX6U.js.map +0 -1
  259. package/dist/chunk-EILUG3VB.js +0 -1275
  260. package/dist/chunk-EILUG3VB.js.map +0 -1
  261. package/dist/chunk-FUDY333O.js +0 -70
  262. package/dist/chunk-FUDY333O.js.map +0 -1
  263. package/dist/chunk-GBVOWFIK.js +0 -1237
  264. package/dist/chunk-GBVOWFIK.js.map +0 -1
  265. package/dist/chunk-H4TQ3H3Y.js +0 -262
  266. package/dist/chunk-H4TQ3H3Y.js.map +0 -1
  267. package/dist/chunk-JGB3IXZO.js +0 -189
  268. package/dist/chunk-JGB3IXZO.js.map +0 -1
  269. package/dist/chunk-KD2QRQPY.js +0 -4342
  270. package/dist/chunk-KD2QRQPY.js.map +0 -1
  271. package/dist/chunk-KLMXQVYK.js +0 -369
  272. package/dist/chunk-KLMXQVYK.js.map +0 -1
  273. package/dist/chunk-KZUG5KFQ.js +0 -214
  274. package/dist/chunk-KZUG5KFQ.js.map +0 -1
  275. package/dist/chunk-QDAQ4CJU.js +0 -345
  276. package/dist/chunk-QDAQ4CJU.js.map +0 -1
  277. package/dist/chunk-RMH72RZI.js.map +0 -1
  278. package/dist/chunk-SWKWQZXM.js +0 -117
  279. package/dist/chunk-SWKWQZXM.js.map +0 -1
  280. package/dist/chunk-TJBP2K4T.js.map +0 -1
  281. package/dist/chunk-TLCEAQDQ.js +0 -542
  282. package/dist/chunk-TLCEAQDQ.js.map +0 -1
  283. package/dist/chunk-UZXBISGO.js.map +0 -1
  284. package/dist/chunk-WGBAKP3Q.js +0 -3220
  285. package/dist/chunk-WGBAKP3Q.js.map +0 -1
  286. package/dist/compare/index.cjs +0 -5475
  287. package/dist/compare/index.cjs.map +0 -1
  288. package/dist/compare/index.d.cts +0 -114
  289. package/dist/compare/index.d.ts +0 -114
  290. package/dist/compare/index.js +0 -731
  291. package/dist/compare/index.js.map +0 -1
  292. package/dist/core/commands/formatting-commands.cjs +0 -828
  293. package/dist/core/commands/formatting-commands.cjs.map +0 -1
  294. package/dist/core/commands/formatting-commands.d.cts +0 -63
  295. package/dist/core/commands/formatting-commands.d.ts +0 -63
  296. package/dist/core/commands/formatting-commands.js +0 -37
  297. package/dist/core/commands/formatting-commands.js.map +0 -1
  298. package/dist/core/commands/image-commands.cjs +0 -2023
  299. package/dist/core/commands/image-commands.cjs.map +0 -1
  300. package/dist/core/commands/image-commands.d.cts +0 -58
  301. package/dist/core/commands/image-commands.d.ts +0 -58
  302. package/dist/core/commands/image-commands.js +0 -18
  303. package/dist/core/commands/image-commands.js.map +0 -1
  304. package/dist/core/commands/section-layout-commands.cjs.map +0 -1
  305. package/dist/core/commands/section-layout-commands.d.cts +0 -62
  306. package/dist/core/commands/section-layout-commands.d.ts +0 -62
  307. package/dist/core/commands/section-layout-commands.js +0 -21
  308. package/dist/core/commands/section-layout-commands.js.map +0 -1
  309. package/dist/core/commands/style-commands.cjs.map +0 -1
  310. package/dist/core/commands/style-commands.d.cts +0 -13
  311. package/dist/core/commands/style-commands.d.ts +0 -13
  312. package/dist/core/commands/style-commands.js +0 -9
  313. package/dist/core/commands/style-commands.js.map +0 -1
  314. package/dist/core/commands/table-structure-commands.cjs +0 -1883
  315. package/dist/core/commands/table-structure-commands.cjs.map +0 -1
  316. package/dist/core/commands/table-structure-commands.d.cts +0 -59
  317. package/dist/core/commands/table-structure-commands.d.ts +0 -59
  318. package/dist/core/commands/table-structure-commands.js +0 -12
  319. package/dist/core/commands/table-structure-commands.js.map +0 -1
  320. package/dist/core/commands/text-commands.cjs +0 -2391
  321. package/dist/core/commands/text-commands.cjs.map +0 -1
  322. package/dist/core/commands/text-commands.d.cts +0 -24
  323. package/dist/core/commands/text-commands.d.ts +0 -24
  324. package/dist/core/commands/text-commands.js +0 -28
  325. package/dist/core/commands/text-commands.js.map +0 -1
  326. package/dist/core/selection/mapping.cjs +0 -200
  327. package/dist/core/selection/mapping.cjs.map +0 -1
  328. package/dist/core/selection/mapping.d.cts +0 -2
  329. package/dist/core/selection/mapping.d.ts +0 -2
  330. package/dist/core/selection/mapping.js +0 -31
  331. package/dist/core/selection/mapping.js.map +0 -1
  332. package/dist/core/state/editor-state.cjs +0 -2278
  333. package/dist/core/state/editor-state.cjs.map +0 -1
  334. package/dist/core/state/editor-state.d.cts +0 -2
  335. package/dist/core/state/editor-state.d.ts +0 -2
  336. package/dist/core/state/editor-state.js +0 -26
  337. package/dist/core/state/editor-state.js.map +0 -1
  338. package/dist/index.cjs +0 -38553
  339. package/dist/index.cjs.map +0 -1
  340. package/dist/index.d.cts +0 -15
  341. package/dist/index.d.ts +0 -15
  342. package/dist/index.js +0 -7856
  343. package/dist/index.js.map +0 -1
  344. package/dist/io/docx-session.cjs +0 -16236
  345. package/dist/io/docx-session.cjs.map +0 -1
  346. package/dist/io/docx-session.d.cts +0 -21
  347. package/dist/io/docx-session.d.ts +0 -21
  348. package/dist/io/docx-session.js +0 -18
  349. package/dist/io/docx-session.js.map +0 -1
  350. package/dist/legal/index.cjs +0 -3900
  351. package/dist/legal/index.cjs.map +0 -1
  352. package/dist/legal/index.d.cts +0 -86
  353. package/dist/legal/index.d.ts +0 -86
  354. package/dist/legal/index.js +0 -616
  355. package/dist/legal/index.js.map +0 -1
  356. package/dist/public-types-7ZL_94cz.d.ts +0 -1573
  357. package/dist/public-types-CeMaDueh.d.cts +0 -1573
  358. package/dist/public-types.cjs +0 -19
  359. package/dist/public-types.cjs.map +0 -1
  360. package/dist/public-types.d.cts +0 -2
  361. package/dist/public-types.d.ts +0 -2
  362. package/dist/public-types.js +0 -1
  363. package/dist/public-types.js.map +0 -1
  364. package/dist/runtime/document-runtime.cjs +0 -11140
  365. package/dist/runtime/document-runtime.cjs.map +0 -1
  366. package/dist/runtime/document-runtime.d.cts +0 -231
  367. package/dist/runtime/document-runtime.d.ts +0 -231
  368. package/dist/runtime/document-runtime.js +0 -21
  369. package/dist/runtime/document-runtime.js.map +0 -1
  370. package/dist/structural-helpers-CilgOVhh.d.cts +0 -10
  371. package/dist/structural-helpers-q0Gd-eBN.d.ts +0 -10
  372. package/dist/ui-tailwind/editor-surface/search-plugin.cjs +0 -313
  373. package/dist/ui-tailwind/editor-surface/search-plugin.cjs.map +0 -1
  374. package/dist/ui-tailwind/editor-surface/search-plugin.d.cts +0 -67
  375. package/dist/ui-tailwind/editor-surface/search-plugin.d.ts +0 -67
  376. package/dist/ui-tailwind/editor-surface/search-plugin.js +0 -23
  377. package/dist/ui-tailwind/editor-surface/search-plugin.js.map +0 -1
  378. package/dist/ui-tailwind/index.cjs +0 -4833
  379. package/dist/ui-tailwind/index.cjs.map +0 -1
  380. package/dist/ui-tailwind/index.d.cts +0 -617
  381. package/dist/ui-tailwind/index.d.ts +0 -617
  382. package/dist/ui-tailwind/index.js +0 -575
  383. package/dist/ui-tailwind/index.js.map +0 -1
@@ -0,0 +1,111 @@
1
+ import React from "react";
2
+
3
+ import type { SelectionSnapshot, SurfaceInlineSegment } from "../../api/public-types";
4
+ import type { CommentDecorationModel } from "../../ui/headless/comment-decoration-model";
5
+ import { getCommentHighlightClass, getCommentRangeState, type MarkupDisplay } from "../../ui/headless/comment-decoration-model";
6
+ import type { RevisionDecorationModel } from "../../ui/headless/revision-decoration-model";
7
+ import { getRevisionHighlightClass, shouldHideInCleanMode } from "../../ui/headless/revision-decoration-model";
8
+ import { createSelectionSnapshot, selectionTouchesRange } from "../../ui/headless/selection-helpers";
9
+ import { TwInlineToken } from "./tw-inline-token";
10
+
11
+ export interface TwSegmentViewProps {
12
+ segment: SurfaceInlineSegment;
13
+ selection: SelectionSnapshot;
14
+ markupDisplay: MarkupDisplay;
15
+ commentDecorations?: CommentDecorationModel;
16
+ revisionDecorations?: RevisionDecorationModel;
17
+ onSelectionChange?: (selection: SelectionSnapshot) => void;
18
+ onCommentActivated?: (commentId: string) => void;
19
+ onRevisionActivated?: (revisionId: string) => void;
20
+ }
21
+
22
+ export function TwSegmentView(props: TwSegmentViewProps) {
23
+ const { segment, selection, markupDisplay } = props;
24
+
25
+ // Non-text segments delegate to TwInlineToken
26
+ if (segment.kind === "tab" || segment.kind === "hard_break" || segment.kind === "image" || segment.kind === "opaque_inline") {
27
+ return (
28
+ <TwInlineToken
29
+ segment={segment}
30
+ selection={selection}
31
+ markupDisplay={markupDisplay}
32
+ commentDecorations={props.commentDecorations}
33
+ onSelectionChange={props.onSelectionChange}
34
+ />
35
+ );
36
+ }
37
+
38
+ if (segment.kind !== "text") {
39
+ return null;
40
+ }
41
+
42
+ // Text segment: render character-by-character for click-to-position editing
43
+ const characters = Array.from(segment.text);
44
+
45
+ return (
46
+ <>
47
+ {characters.map((character, index) => {
48
+ const from = segment.from + index;
49
+ const to = from + 1;
50
+ const isSelected = selectionTouchesRange(selection, from, to);
51
+
52
+ // Hide deletions in clean mode
53
+ if (shouldHideInCleanMode(props.revisionDecorations, from, to) && markupDisplay === "clean") {
54
+ return null;
55
+ }
56
+
57
+ const commentClass = getCommentHighlightClass(props.commentDecorations, from, to, markupDisplay);
58
+ const revisionClass = getRevisionHighlightClass(props.revisionDecorations, from, to, markupDisplay);
59
+
60
+ // Check if clicking this char should activate a comment or revision
61
+ const commentState = getCommentRangeState(props.commentDecorations, from, to);
62
+ const overlappingComment = commentState.overlapping[0];
63
+
64
+ // Build mark classes
65
+ let markClasses = "";
66
+ if (segment.marks) {
67
+ if (segment.marks.includes("bold")) markClasses += "font-bold ";
68
+ if (segment.marks.includes("italic")) markClasses += "italic ";
69
+ if (segment.marks.includes("underline")) markClasses += "underline ";
70
+ if (segment.marks.includes("strikethrough")) markClasses += "line-through ";
71
+ }
72
+
73
+ const hyperlinkClass = segment.hyperlinkHref
74
+ ? "text-accent underline decoration-1 underline-offset-2 "
75
+ : "";
76
+
77
+ return (
78
+ <button
79
+ key={`${segment.segmentId}-${from}`}
80
+ type="button"
81
+ tabIndex={-1}
82
+ onMouseDown={(event) => {
83
+ event.preventDefault();
84
+ props.onSelectionChange?.(createSelectionSnapshot(to));
85
+
86
+ // Activate comment/revision on click if decorated
87
+ if (overlappingComment) {
88
+ props.onCommentActivated?.(overlappingComment.commentId);
89
+ }
90
+ }}
91
+ data-comment-id={overlappingComment?.commentId}
92
+ className={[
93
+ "relative inline border-none bg-transparent cursor-text whitespace-pre p-0 m-0",
94
+ "text-[15px] text-primary leading-normal",
95
+ commentClass,
96
+ revisionClass,
97
+ markClasses,
98
+ hyperlinkClass,
99
+ isSelected ? "bg-surface-hover rounded-[3px]" : "",
100
+ ].filter(Boolean).join(" ")}
101
+ >
102
+ {character}
103
+ {selection.isCollapsed && selection.anchor === from ? (
104
+ <span aria-hidden="true" className="absolute left-0 top-[0.1em] w-0.5 h-[1em] bg-accent rounded-full animate-wre-blink pointer-events-none" />
105
+ ) : null}
106
+ </button>
107
+ );
108
+ })}
109
+ </>
110
+ );
111
+ }
@@ -0,0 +1,503 @@
1
+ /**
2
+ * ProseMirror NodeView implementations for table nodes.
3
+ *
4
+ * These NodeViews render table structure as proper HTML tables with
5
+ * colspan/rowspan support for merged cells. Horizontal merges come
6
+ * directly from `colspan`/`gridSpan`. Vertical merges can be rendered
7
+ * from either explicit `rowspan` attrs or OOXML `verticalMerge`
8
+ * chains when upstream projection has not yet materialized row spans.
9
+ */
10
+
11
+ import type { Node as PMNode } from "prosemirror-model";
12
+ import type { NodeViewConstructor, ViewMutationRecord } from "prosemirror-view";
13
+
14
+ const TABLE_LAYOUT_SYNC_EVENT = "pm-table-layout-sync";
15
+
16
+ interface TableCellLayout {
17
+ cellIndex: number;
18
+ colSpan: number;
19
+ hidden: boolean;
20
+ rowSpan: number;
21
+ }
22
+
23
+ interface OpenVerticalMerge {
24
+ col: number;
25
+ colSpan: number;
26
+ continuedThisRow: boolean;
27
+ layout: TableCellLayout;
28
+ }
29
+
30
+ interface OpenExplicitRowSpan {
31
+ col: number;
32
+ colSpan: number;
33
+ remainingRows: number;
34
+ }
35
+
36
+ function readRowPadding(node: PMNode, side: "gridBefore" | "gridAfter"): number {
37
+ const value = node.attrs[side];
38
+ return typeof value === "number" && value > 0 ? value : 0;
39
+ }
40
+
41
+ function sumGridColumns(
42
+ gridColumns: readonly number[],
43
+ start: number,
44
+ count: number,
45
+ ): number {
46
+ let total = 0;
47
+ for (let index = start; index < start + count; index += 1) {
48
+ total += gridColumns[index] ?? 0;
49
+ }
50
+ return total;
51
+ }
52
+
53
+ function removePaddingCells(rowElement: HTMLTableRowElement): void {
54
+ for (const cell of Array.from(rowElement.cells)) {
55
+ if (cell.hasAttribute("data-row-padding")) {
56
+ cell.remove();
57
+ }
58
+ }
59
+ }
60
+
61
+ function createPaddingCell(colSpan: number, widthTwips: number): HTMLTableCellElement {
62
+ const cell = document.createElement("td");
63
+ cell.setAttribute("data-row-padding", "true");
64
+ cell.setAttribute("aria-hidden", "true");
65
+ cell.colSpan = Math.max(1, colSpan);
66
+ cell.style.border = "none";
67
+ cell.style.padding = "0";
68
+ cell.style.background = "transparent";
69
+ if (widthTwips > 0) {
70
+ cell.style.width = `${widthTwips / 20}pt`;
71
+ }
72
+ return cell;
73
+ }
74
+
75
+ function nodesAreOnlyRowPadding(nodes: ArrayLike<Node> & { item?(index: number): Node | null }): boolean {
76
+ for (let index = 0; index < nodes.length; index += 1) {
77
+ const node = nodes.item ? nodes.item(index) : nodes[index];
78
+ if (!node) {
79
+ continue;
80
+ }
81
+ if (!(node instanceof HTMLElement) || !node.hasAttribute("data-row-padding")) {
82
+ return false;
83
+ }
84
+ }
85
+ return true;
86
+ }
87
+
88
+ function resolveRenderedColspan(node: PMNode): number {
89
+ const colspan = node.attrs.colspan as number | undefined;
90
+ if (typeof colspan === "number" && colspan > 1) {
91
+ return colspan;
92
+ }
93
+
94
+ const gridSpan = node.attrs.gridSpan as number | undefined;
95
+ if (typeof gridSpan === "number" && gridSpan > 1) {
96
+ return gridSpan;
97
+ }
98
+
99
+ return 1;
100
+ }
101
+
102
+ function resolveRenderedRowspan(node: PMNode): number {
103
+ const rowspan = node.attrs.rowspan as number | undefined;
104
+ return typeof rowspan === "number" && rowspan > 1 ? rowspan : 1;
105
+ }
106
+
107
+ function readVerticalMerge(node: PMNode): "restart" | "continue" | null {
108
+ const value = node.attrs.verticalMerge;
109
+ return value === "restart" || value === "continue" ? value : null;
110
+ }
111
+
112
+ function isColumnCoveredBySpan(spans: readonly OpenExplicitRowSpan[], column: number): boolean {
113
+ return spans.some(
114
+ (span) => column >= span.col && column < span.col + span.colSpan,
115
+ );
116
+ }
117
+
118
+ function findVerticalMergeOwner(
119
+ openVerticalMerges: readonly OpenVerticalMerge[],
120
+ column: number,
121
+ colSpan: number,
122
+ ): OpenVerticalMerge | null {
123
+ const matchingByWidth = openVerticalMerges.find(
124
+ (merge) => merge.col >= column && merge.colSpan === colSpan,
125
+ );
126
+ if (matchingByWidth) {
127
+ return matchingByWidth;
128
+ }
129
+
130
+ return openVerticalMerges.find((merge) => merge.col >= column) ?? null;
131
+ }
132
+
133
+ function computeTableLayout(tableNode: PMNode): TableCellLayout[][] {
134
+ const rowLayouts: TableCellLayout[][] = [];
135
+ const openVerticalMerges: OpenVerticalMerge[] = [];
136
+ const openExplicitRowSpans: OpenExplicitRowSpan[] = [];
137
+
138
+ for (let rowIndex = 0; rowIndex < tableNode.childCount; rowIndex += 1) {
139
+ for (const merge of openVerticalMerges) {
140
+ merge.continuedThisRow = false;
141
+ }
142
+
143
+ const rowNode = tableNode.child(rowIndex);
144
+ const layoutRow: TableCellLayout[] = [];
145
+ let column = 0;
146
+
147
+ for (let cellIndex = 0; cellIndex < rowNode.childCount; cellIndex += 1) {
148
+ const cellNode = rowNode.child(cellIndex);
149
+ const colSpan = resolveRenderedColspan(cellNode);
150
+ const explicitRowSpan = resolveRenderedRowspan(cellNode);
151
+ const verticalMerge = readVerticalMerge(cellNode);
152
+
153
+ if (verticalMerge === "continue") {
154
+ const owner = findVerticalMergeOwner(openVerticalMerges, column, colSpan);
155
+ if (owner) {
156
+ owner.layout.rowSpan += 1;
157
+ owner.continuedThisRow = true;
158
+ layoutRow.push({
159
+ cellIndex,
160
+ colSpan,
161
+ hidden: true,
162
+ rowSpan: 1,
163
+ });
164
+ column = owner.col + owner.colSpan;
165
+ continue;
166
+ }
167
+ }
168
+
169
+ while (isColumnCoveredBySpan(openExplicitRowSpans, column)) {
170
+ column += 1;
171
+ }
172
+
173
+ const layout: TableCellLayout = {
174
+ cellIndex,
175
+ colSpan,
176
+ hidden: false,
177
+ rowSpan: explicitRowSpan,
178
+ };
179
+ layoutRow.push(layout);
180
+
181
+ if (verticalMerge === "restart") {
182
+ openVerticalMerges.push({
183
+ col: column,
184
+ colSpan,
185
+ continuedThisRow: true,
186
+ layout,
187
+ });
188
+ }
189
+
190
+ if (explicitRowSpan > 1) {
191
+ openExplicitRowSpans.push({
192
+ col: column,
193
+ colSpan,
194
+ remainingRows: explicitRowSpan - 1,
195
+ });
196
+ }
197
+
198
+ column += colSpan;
199
+ }
200
+
201
+ for (let index = openVerticalMerges.length - 1; index >= 0; index -= 1) {
202
+ if (!openVerticalMerges[index]?.continuedThisRow) {
203
+ openVerticalMerges.splice(index, 1);
204
+ }
205
+ }
206
+
207
+ for (let index = openExplicitRowSpans.length - 1; index >= 0; index -= 1) {
208
+ const span = openExplicitRowSpans[index];
209
+ if (!span) {
210
+ continue;
211
+ }
212
+ span.remainingRows -= 1;
213
+ if (span.remainingRows <= 0) {
214
+ openExplicitRowSpans.splice(index, 1);
215
+ }
216
+ }
217
+
218
+ rowLayouts.push(layoutRow);
219
+ }
220
+
221
+ return rowLayouts;
222
+ }
223
+
224
+ function syncRenderedTableLayout(tableBody: HTMLTableSectionElement, tableNode: PMNode): void {
225
+ const rowLayouts = computeTableLayout(tableNode);
226
+ const rowElements = Array.from(tableBody.rows);
227
+ const gridColumns = Array.isArray(tableNode.attrs.gridColumns) ? tableNode.attrs.gridColumns as number[] : [];
228
+
229
+ for (let rowIndex = 0; rowIndex < rowLayouts.length; rowIndex += 1) {
230
+ const rowLayout = rowLayouts[rowIndex];
231
+ const rowElement = rowElements[rowIndex];
232
+ if (!rowLayout || !rowElement) {
233
+ continue;
234
+ }
235
+
236
+ removePaddingCells(rowElement);
237
+ const cellElements = Array.from(rowElement.cells);
238
+ for (const cellLayout of rowLayout) {
239
+ const element = cellElements[cellLayout.cellIndex];
240
+ if (!element) {
241
+ continue;
242
+ }
243
+
244
+ element.colSpan = cellLayout.colSpan > 1 ? cellLayout.colSpan : 1;
245
+ element.rowSpan = cellLayout.hidden ? 1 : cellLayout.rowSpan > 1 ? cellLayout.rowSpan : 1;
246
+ element.style.display = cellLayout.hidden ? "none" : "";
247
+
248
+ if (cellLayout.hidden) {
249
+ element.setAttribute("aria-hidden", "true");
250
+ element.setAttribute("data-vertical-merge-hidden", "true");
251
+ } else {
252
+ element.removeAttribute("aria-hidden");
253
+ element.removeAttribute("data-vertical-merge-hidden");
254
+ }
255
+ }
256
+
257
+ const rowNode = tableNode.child(rowIndex);
258
+ const gridBefore = readRowPadding(rowNode, "gridBefore");
259
+ const gridAfter = readRowPadding(rowNode, "gridAfter");
260
+ if (gridBefore > 0) {
261
+ rowElement.insertBefore(
262
+ createPaddingCell(gridBefore, sumGridColumns(gridColumns, 0, gridBefore)),
263
+ rowElement.firstChild,
264
+ );
265
+ }
266
+ if (gridAfter > 0) {
267
+ const start = Math.max(0, gridColumns.length - gridAfter);
268
+ rowElement.appendChild(
269
+ createPaddingCell(gridAfter, sumGridColumns(gridColumns, start, gridAfter)),
270
+ );
271
+ }
272
+ }
273
+ }
274
+
275
+ function requestTableLayoutSync(start: HTMLElement): void {
276
+ const table = start.closest("[data-pm-table-root='true']");
277
+ table?.dispatchEvent(new Event(TABLE_LAYOUT_SYNC_EVENT));
278
+ }
279
+
280
+ function applyTableAttrs(table: HTMLTableElement, node: PMNode): void {
281
+ table.className = "border-collapse w-full my-2 text-sm";
282
+ table.setAttribute("data-pm-table-root", "true");
283
+ table.style.marginLeft = "";
284
+ table.style.marginRight = "";
285
+ const alignment = node.attrs.alignment as string | null | undefined;
286
+ if (alignment === "center") {
287
+ table.style.marginLeft = "auto";
288
+ table.style.marginRight = "auto";
289
+ } else if (alignment === "right") {
290
+ table.style.marginLeft = "auto";
291
+ }
292
+ }
293
+
294
+ function applyRowAttrs(row: HTMLTableRowElement, node: PMNode): void {
295
+ row.style.height = "";
296
+ row.style.minHeight = "";
297
+ const height = node.attrs.height as number | null | undefined;
298
+ const heightRule = node.attrs.heightRule as string | null | undefined;
299
+ if (typeof height !== "number" || height <= 0) {
300
+ return;
301
+ }
302
+ const points = `${height / 20}pt`;
303
+ if (heightRule === "exact") {
304
+ row.style.height = points;
305
+ } else if (heightRule === "atLeast") {
306
+ row.style.minHeight = points;
307
+ }
308
+ }
309
+
310
+ function applyCellAttrs(cell: HTMLTableCellElement, node: PMNode, isHeader: boolean): void {
311
+ cell.className = isHeader
312
+ ? "border border-primary/20 p-2 align-top font-semibold bg-surface-raised"
313
+ : "border border-primary/20 p-2 align-top";
314
+
315
+ const backgroundColor = node.attrs.backgroundColor as string | null | undefined;
316
+ const verticalAlign = node.attrs.verticalAlign as "top" | "center" | "bottom" | null | undefined;
317
+ const borderTop = node.attrs.borderTop as string | null | undefined;
318
+ const borderRight = node.attrs.borderRight as string | null | undefined;
319
+ const borderBottom = node.attrs.borderBottom as string | null | undefined;
320
+ const borderLeft = node.attrs.borderLeft as string | null | undefined;
321
+
322
+ if (backgroundColor) cell.setAttribute("data-cell-background", backgroundColor);
323
+ else cell.removeAttribute("data-cell-background");
324
+ if (verticalAlign && verticalAlign !== "top") cell.setAttribute("data-vertical-align", verticalAlign);
325
+ else cell.removeAttribute("data-vertical-align");
326
+ if (borderTop) cell.setAttribute("data-border-top", borderTop);
327
+ else cell.removeAttribute("data-border-top");
328
+ if (borderRight) cell.setAttribute("data-border-right", borderRight);
329
+ else cell.removeAttribute("data-border-right");
330
+ if (borderBottom) cell.setAttribute("data-border-bottom", borderBottom);
331
+ else cell.removeAttribute("data-border-bottom");
332
+ if (borderLeft) cell.setAttribute("data-border-left", borderLeft);
333
+ else cell.removeAttribute("data-border-left");
334
+
335
+ cell.style.backgroundColor = backgroundColor ?? "";
336
+ cell.style.verticalAlign = verticalAlign === "center" ? "middle" : (verticalAlign ?? "");
337
+ cell.style.borderTop = borderTop ?? "";
338
+ cell.style.borderRight = borderRight ?? "";
339
+ cell.style.borderBottom = borderBottom ?? "";
340
+ cell.style.borderLeft = borderLeft ?? "";
341
+ }
342
+
343
+ /**
344
+ * NodeView for the table node.
345
+ * Renders as <table><tbody>...</tbody></table>.
346
+ * ProseMirror places row content into the tbody via contentDOM.
347
+ */
348
+ export class TableNodeView {
349
+ dom: HTMLElement;
350
+ contentDOM: HTMLTableSectionElement;
351
+ private node: PMNode;
352
+ private syncQueued = false;
353
+ private readonly onSyncRequest: EventListener;
354
+
355
+ constructor(node: PMNode) {
356
+ this.node = node;
357
+
358
+ const table = document.createElement("table");
359
+ applyTableAttrs(table, node);
360
+
361
+ const tbody = document.createElement("tbody");
362
+ table.appendChild(tbody);
363
+
364
+ this.dom = table;
365
+ this.contentDOM = tbody;
366
+ this.onSyncRequest = () => {
367
+ this.scheduleLayoutSync();
368
+ };
369
+ this.dom.addEventListener(TABLE_LAYOUT_SYNC_EVENT, this.onSyncRequest);
370
+ this.scheduleLayoutSync();
371
+ }
372
+
373
+ update(node: PMNode): boolean {
374
+ if (node.type !== this.node.type) {
375
+ return false;
376
+ }
377
+
378
+ this.node = node;
379
+ applyTableAttrs(this.dom as HTMLTableElement, node);
380
+ this.scheduleLayoutSync();
381
+ return true;
382
+ }
383
+
384
+ destroy(): void {
385
+ this.dom.removeEventListener(TABLE_LAYOUT_SYNC_EVENT, this.onSyncRequest);
386
+ }
387
+
388
+ ignoreMutation(record: ViewMutationRecord): boolean {
389
+ if (record.type === "attributes") {
390
+ return record.target === this.dom
391
+ || (record.target instanceof HTMLElement && record.target.hasAttribute("data-row-padding"));
392
+ }
393
+ if (record.type === "childList" && this.dom.contains(record.target)) {
394
+ const addedNodes = record.addedNodes as ArrayLike<Node> & { item?(index: number): Node | null };
395
+ const removedNodes = record.removedNodes as ArrayLike<Node> & { item?(index: number): Node | null };
396
+ const addedOkay = (addedNodes?.length ?? 0) === 0 || nodesAreOnlyRowPadding(addedNodes);
397
+ const removedOkay = (removedNodes?.length ?? 0) === 0 || nodesAreOnlyRowPadding(removedNodes);
398
+ return addedOkay && removedOkay;
399
+ }
400
+ return false;
401
+ }
402
+
403
+ private scheduleLayoutSync(): void {
404
+ if (this.syncQueued) {
405
+ return;
406
+ }
407
+ this.syncQueued = true;
408
+ queueMicrotask(() => {
409
+ this.syncQueued = false;
410
+ syncRenderedTableLayout(this.contentDOM, this.node);
411
+ });
412
+ }
413
+ }
414
+
415
+ /**
416
+ * NodeView for table_row nodes.
417
+ * Renders as <tr>...</tr>.
418
+ */
419
+ export class TableRowNodeView {
420
+ dom: HTMLElement;
421
+ contentDOM: HTMLElement;
422
+
423
+ constructor(node: PMNode) {
424
+ const tr = document.createElement("tr");
425
+ applyRowAttrs(tr, node);
426
+ this.dom = tr;
427
+ this.contentDOM = tr;
428
+ }
429
+
430
+ update(node: PMNode): boolean {
431
+ applyRowAttrs(this.dom as HTMLTableRowElement, node);
432
+ return true;
433
+ }
434
+ }
435
+
436
+ /**
437
+ * NodeView for table_cell and table_header_cell nodes.
438
+ *
439
+ * Applies colspan immediately and defers final rowspan/vertical-merge
440
+ * layout to the owning table node view.
441
+ */
442
+ export class TableCellNodeView {
443
+ dom: HTMLElement;
444
+ contentDOM: HTMLElement;
445
+
446
+ constructor(node: PMNode) {
447
+ const isHeader = (node.type.spec as { tableRole?: string }).tableRole === "header_cell";
448
+ const cell = document.createElement(isHeader ? "th" : "td");
449
+ applyCellAttrs(cell, node, isHeader);
450
+
451
+ const colspan = resolveRenderedColspan(node);
452
+ const rowspan = resolveRenderedRowspan(node);
453
+ if (colspan > 1) {
454
+ (cell as HTMLTableCellElement).colSpan = colspan;
455
+ }
456
+ if (rowspan > 1) {
457
+ (cell as HTMLTableCellElement).rowSpan = rowspan;
458
+ }
459
+
460
+ this.dom = cell;
461
+ this.contentDOM = cell;
462
+ }
463
+
464
+ /**
465
+ * Update the DOM when the node's attrs change (e.g., after a merge/split operation).
466
+ * Return false to let ProseMirror rebuild the node view from scratch.
467
+ */
468
+ update(node: PMNode): boolean {
469
+ const isHeader = (node.type.spec as { tableRole?: string }).tableRole === "header_cell";
470
+ const expectedTag = isHeader ? "TH" : "TD";
471
+ if (this.dom.tagName !== expectedTag) {
472
+ return false;
473
+ }
474
+
475
+ const colspan = resolveRenderedColspan(node);
476
+ const rowspan = resolveRenderedRowspan(node);
477
+ const cell = this.dom as HTMLTableCellElement;
478
+ applyCellAttrs(cell, node, isHeader);
479
+ cell.colSpan = colspan > 1 ? colspan : 1;
480
+ cell.rowSpan = rowspan > 1 ? rowspan : 1;
481
+ cell.style.display = "";
482
+ cell.removeAttribute("aria-hidden");
483
+ cell.removeAttribute("data-vertical-merge-hidden");
484
+ requestTableLayoutSync(this.dom);
485
+ return true;
486
+ }
487
+
488
+ ignoreMutation(record: ViewMutationRecord): boolean {
489
+ return record.type === "attributes" && record.target === this.dom;
490
+ }
491
+ }
492
+
493
+ /**
494
+ * NodeView factory map for use with EditorView.nodeViews.
495
+ *
496
+ * Pass this object directly to the EditorView constructor options:
497
+ * new EditorView(mount, { nodeViews: tableNodeViews, ... })
498
+ */
499
+ export const tableNodeViews: { [node: string]: NodeViewConstructor } = {
500
+ table: (node: PMNode) => new TableNodeView(node),
501
+ table_cell: (node: PMNode) => new TableCellNodeView(node),
502
+ table_header_cell: (node: PMNode) => new TableCellNodeView(node),
503
+ };
@@ -0,0 +1,62 @@
1
+ // Workspace shell
2
+ export { TwReviewWorkspace, type TwReviewWorkspaceProps } from "./tw-review-workspace";
3
+
4
+ // Editor surface
5
+ export { TwEditorSurface, type TwEditorSurfaceProps } from "./editor-surface/tw-editor-surface";
6
+ export { TwParagraphBlock } from "./editor-surface/tw-paragraph-block";
7
+ export { TwOpaqueBlock } from "./editor-surface/tw-opaque-block";
8
+ export { TwSegmentView } from "./editor-surface/tw-segment-view";
9
+ export { TwInlineToken } from "./editor-surface/tw-inline-token";
10
+ export { renderTwCaret } from "./editor-surface/tw-caret";
11
+
12
+ // Review rail
13
+ export { TwReviewRail, type TwReviewRailProps, type ReviewRailTab } from "./review/tw-review-rail";
14
+ export { TwCommentSidebar } from "./review/tw-comment-sidebar";
15
+ export { TwRevisionSidebar } from "./review/tw-revision-sidebar";
16
+ export { TwHealthPanel } from "./review/tw-health-panel";
17
+
18
+ // Toolbar
19
+ export { TwToolbar, type TwToolbarProps } from "./toolbar/tw-toolbar";
20
+ export { TwToolbarIconButton } from "./toolbar/tw-toolbar-icon-button";
21
+ export type { WorkspaceMode, ZoomLevel } from "../api/public-types";
22
+
23
+ // Status
24
+ export { TwStatusBar } from "./status/tw-status-bar";
25
+
26
+ // Chrome
27
+ export { TwAlertBanner } from "./chrome/tw-alert-banner";
28
+ export { TwSelectionToolbar } from "./chrome/tw-selection-toolbar";
29
+
30
+ // Session capabilities
31
+ export {
32
+ deriveCapabilities,
33
+ type SessionCapabilities,
34
+ } from "../runtime/session-capabilities";
35
+
36
+ // Headless (re-export for convenience)
37
+ export {
38
+ createCommentDecorationModel,
39
+ getCommentHighlightClass,
40
+ getCommentRangeState,
41
+ type CommentDecorationModel,
42
+ type MarkupDisplay,
43
+ } from "../ui/headless/comment-decoration-model";
44
+
45
+ export {
46
+ createRevisionDecorationModel,
47
+ getRevisionHighlightClass,
48
+ getRevisionRangeState,
49
+ shouldHideInCleanMode,
50
+ type RevisionDecorationModel,
51
+ } from "../ui/headless/revision-decoration-model";
52
+
53
+ export {
54
+ createEditorKeyboardHandler,
55
+ type EditorKeyboardCallbacks,
56
+ type EditorKeyboardContext,
57
+ } from "../ui/headless/use-editor-keyboard";
58
+
59
+ export {
60
+ createSelectionSnapshot,
61
+ selectionTouchesRange,
62
+ } from "../ui/headless/selection-helpers";
@@ -0,0 +1,27 @@
1
+ import type {
2
+ DocumentNavigationSnapshot,
3
+ PageLayoutSnapshot,
4
+ SurfaceBlockSnapshot,
5
+ } from "../api/public-types.ts";
6
+
7
+ export interface LineMarker {
8
+ id: string;
9
+ label: string;
10
+ topPx: number;
11
+ }
12
+
13
+ export function computeLineMarkersIfEnabled(input: {
14
+ pageLayout: PageLayoutSnapshot | undefined;
15
+ surfaceBlocks: readonly SurfaceBlockSnapshot[];
16
+ pages: ReadonlyArray<DocumentNavigationSnapshot["pages"][number]>;
17
+ buildLineNumberMarkers: (
18
+ blocks: readonly SurfaceBlockSnapshot[],
19
+ pages: ReadonlyArray<DocumentNavigationSnapshot["pages"][number]>,
20
+ ) => LineMarker[];
21
+ }): LineMarker[] {
22
+ if (!input.pageLayout?.lineNumbering) {
23
+ return [];
24
+ }
25
+
26
+ return input.buildLineNumberMarkers(input.surfaceBlocks, input.pages);
27
+ }