@beyondwork/docx-react-component 1.0.29 → 1.0.30

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 (381) 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/review-queue-bar.tsx +97 -0
  180. package/src/ui-tailwind/chrome/tw-alert-banner.tsx +64 -0
  181. package/src/ui-tailwind/chrome/tw-context-analytics-summary.tsx +122 -0
  182. package/src/ui-tailwind/chrome/tw-image-context-toolbar.tsx +121 -0
  183. package/src/ui-tailwind/chrome/tw-layout-panel.tsx +114 -0
  184. package/src/ui-tailwind/chrome/tw-object-context-toolbar.tsx +30 -0
  185. package/src/ui-tailwind/chrome/tw-page-ruler.tsx +365 -0
  186. package/src/ui-tailwind/chrome/tw-selection-tool-blocked.tsx +23 -0
  187. package/src/ui-tailwind/chrome/tw-selection-tool-comment.tsx +35 -0
  188. package/src/ui-tailwind/chrome/tw-selection-tool-formatting.tsx +37 -0
  189. package/src/ui-tailwind/chrome/tw-selection-tool-host.tsx +298 -0
  190. package/src/ui-tailwind/chrome/tw-selection-tool-structure.tsx +116 -0
  191. package/src/ui-tailwind/chrome/tw-selection-tool-suggestion.tsx +29 -0
  192. package/src/ui-tailwind/chrome/tw-selection-tool-workflow.tsx +27 -0
  193. package/src/ui-tailwind/chrome/tw-selection-toolbar.tsx +186 -0
  194. package/src/ui-tailwind/chrome/tw-suggestion-card.tsx +139 -0
  195. package/src/ui-tailwind/chrome/tw-table-context-toolbar.tsx +200 -0
  196. package/src/ui-tailwind/chrome/tw-unsaved-modal.tsx +58 -0
  197. package/src/ui-tailwind/chrome/use-before-unload.ts +20 -0
  198. package/src/ui-tailwind/editor-surface/perf-probe.ts +179 -0
  199. package/src/ui-tailwind/editor-surface/pm-command-bridge.ts +189 -0
  200. package/src/ui-tailwind/editor-surface/pm-contextual-ui.ts +31 -0
  201. package/src/ui-tailwind/editor-surface/pm-decorations.ts +411 -0
  202. package/src/ui-tailwind/editor-surface/pm-position-map.ts +123 -0
  203. package/src/ui-tailwind/editor-surface/pm-schema.ts +927 -0
  204. package/src/ui-tailwind/editor-surface/pm-state-from-snapshot.ts +567 -0
  205. package/src/ui-tailwind/editor-surface/search-plugin.ts +168 -0
  206. package/src/ui-tailwind/editor-surface/surface-build-keys.ts +65 -0
  207. package/src/ui-tailwind/editor-surface/tw-caret.tsx +12 -0
  208. package/src/ui-tailwind/editor-surface/tw-editor-surface.tsx +150 -0
  209. package/src/ui-tailwind/editor-surface/tw-inline-token.tsx +129 -0
  210. package/src/ui-tailwind/editor-surface/tw-opaque-block.tsx +58 -0
  211. package/src/ui-tailwind/editor-surface/tw-paragraph-block.tsx +151 -0
  212. package/src/ui-tailwind/editor-surface/tw-prosemirror-surface.tsx +1047 -0
  213. package/src/ui-tailwind/editor-surface/tw-segment-view.tsx +111 -0
  214. package/src/ui-tailwind/editor-surface/tw-table-node-view.tsx +503 -0
  215. package/src/ui-tailwind/index.ts +62 -0
  216. package/src/ui-tailwind/page-chrome-model.ts +27 -0
  217. package/src/ui-tailwind/review/tw-comment-sidebar.tsx +406 -0
  218. package/src/ui-tailwind/review/tw-health-panel.tsx +149 -0
  219. package/src/ui-tailwind/review/tw-review-rail.tsx +122 -0
  220. package/src/ui-tailwind/review/tw-revision-sidebar.tsx +164 -0
  221. package/src/ui-tailwind/status/tw-status-bar.tsx +65 -0
  222. package/{dist → src}/ui-tailwind/theme/editor-theme.css +58 -40
  223. package/src/ui-tailwind/toolbar/tw-toolbar-icon-button.tsx +52 -0
  224. package/src/ui-tailwind/toolbar/tw-toolbar.tsx +1133 -0
  225. package/src/ui-tailwind/tw-review-workspace.tsx +1460 -0
  226. package/src/validation/README.md +3 -0
  227. package/src/validation/compatibility-engine.ts +878 -0
  228. package/src/validation/compatibility-report.ts +161 -0
  229. package/src/validation/diagnostics.ts +204 -0
  230. package/src/validation/docx-comment-proof.ts +720 -0
  231. package/src/validation/import-diagnostics.ts +128 -0
  232. package/src/validation/low-priority-word-surfaces.ts +373 -0
  233. package/dist/canonical-document-BLEbzL2J.d.cts +0 -844
  234. package/dist/canonical-document-BLEbzL2J.d.ts +0 -844
  235. package/dist/chunk-2FJS5GZM.js +0 -763
  236. package/dist/chunk-2FJS5GZM.js.map +0 -1
  237. package/dist/chunk-2OQBZS3F.js +0 -446
  238. package/dist/chunk-2OQBZS3F.js.map +0 -1
  239. package/dist/chunk-2S7W4KFO.js +0 -127
  240. package/dist/chunk-2S7W4KFO.js.map +0 -1
  241. package/dist/chunk-2TG72QSW.js +0 -3874
  242. package/dist/chunk-2TG72QSW.js.map +0 -1
  243. package/dist/chunk-36QNIZBO.js +0 -532
  244. package/dist/chunk-36QNIZBO.js.map +0 -1
  245. package/dist/chunk-4AQOYAW4.js +0 -3069
  246. package/dist/chunk-4AQOYAW4.js.map +0 -1
  247. package/dist/chunk-4D5EWJ3P.js +0 -77
  248. package/dist/chunk-4D5EWJ3P.js.map +0 -1
  249. package/dist/chunk-5FN54NDH.js +0 -2257
  250. package/dist/chunk-5FN54NDH.js.map +0 -1
  251. package/dist/chunk-BOYGQYRQ.js +0 -7306
  252. package/dist/chunk-BOYGQYRQ.js.map +0 -1
  253. package/dist/chunk-CN3XMECL.js +0 -212
  254. package/dist/chunk-CN3XMECL.js.map +0 -1
  255. package/dist/chunk-EBI3BX6U.js +0 -164
  256. package/dist/chunk-EBI3BX6U.js.map +0 -1
  257. package/dist/chunk-EILUG3VB.js +0 -1275
  258. package/dist/chunk-EILUG3VB.js.map +0 -1
  259. package/dist/chunk-FUDY333O.js +0 -70
  260. package/dist/chunk-FUDY333O.js.map +0 -1
  261. package/dist/chunk-GBVOWFIK.js +0 -1237
  262. package/dist/chunk-GBVOWFIK.js.map +0 -1
  263. package/dist/chunk-H4TQ3H3Y.js +0 -262
  264. package/dist/chunk-H4TQ3H3Y.js.map +0 -1
  265. package/dist/chunk-JGB3IXZO.js +0 -189
  266. package/dist/chunk-JGB3IXZO.js.map +0 -1
  267. package/dist/chunk-KD2QRQPY.js +0 -4342
  268. package/dist/chunk-KD2QRQPY.js.map +0 -1
  269. package/dist/chunk-KLMXQVYK.js +0 -369
  270. package/dist/chunk-KLMXQVYK.js.map +0 -1
  271. package/dist/chunk-KZUG5KFQ.js +0 -214
  272. package/dist/chunk-KZUG5KFQ.js.map +0 -1
  273. package/dist/chunk-QDAQ4CJU.js +0 -345
  274. package/dist/chunk-QDAQ4CJU.js.map +0 -1
  275. package/dist/chunk-RMH72RZI.js.map +0 -1
  276. package/dist/chunk-SWKWQZXM.js +0 -117
  277. package/dist/chunk-SWKWQZXM.js.map +0 -1
  278. package/dist/chunk-TJBP2K4T.js.map +0 -1
  279. package/dist/chunk-TLCEAQDQ.js +0 -542
  280. package/dist/chunk-TLCEAQDQ.js.map +0 -1
  281. package/dist/chunk-UZXBISGO.js.map +0 -1
  282. package/dist/chunk-WGBAKP3Q.js +0 -3220
  283. package/dist/chunk-WGBAKP3Q.js.map +0 -1
  284. package/dist/compare/index.cjs +0 -5475
  285. package/dist/compare/index.cjs.map +0 -1
  286. package/dist/compare/index.d.cts +0 -114
  287. package/dist/compare/index.d.ts +0 -114
  288. package/dist/compare/index.js +0 -731
  289. package/dist/compare/index.js.map +0 -1
  290. package/dist/core/commands/formatting-commands.cjs +0 -828
  291. package/dist/core/commands/formatting-commands.cjs.map +0 -1
  292. package/dist/core/commands/formatting-commands.d.cts +0 -63
  293. package/dist/core/commands/formatting-commands.d.ts +0 -63
  294. package/dist/core/commands/formatting-commands.js +0 -37
  295. package/dist/core/commands/formatting-commands.js.map +0 -1
  296. package/dist/core/commands/image-commands.cjs +0 -2023
  297. package/dist/core/commands/image-commands.cjs.map +0 -1
  298. package/dist/core/commands/image-commands.d.cts +0 -58
  299. package/dist/core/commands/image-commands.d.ts +0 -58
  300. package/dist/core/commands/image-commands.js +0 -18
  301. package/dist/core/commands/image-commands.js.map +0 -1
  302. package/dist/core/commands/section-layout-commands.cjs.map +0 -1
  303. package/dist/core/commands/section-layout-commands.d.cts +0 -62
  304. package/dist/core/commands/section-layout-commands.d.ts +0 -62
  305. package/dist/core/commands/section-layout-commands.js +0 -21
  306. package/dist/core/commands/section-layout-commands.js.map +0 -1
  307. package/dist/core/commands/style-commands.cjs.map +0 -1
  308. package/dist/core/commands/style-commands.d.cts +0 -13
  309. package/dist/core/commands/style-commands.d.ts +0 -13
  310. package/dist/core/commands/style-commands.js +0 -9
  311. package/dist/core/commands/style-commands.js.map +0 -1
  312. package/dist/core/commands/table-structure-commands.cjs +0 -1883
  313. package/dist/core/commands/table-structure-commands.cjs.map +0 -1
  314. package/dist/core/commands/table-structure-commands.d.cts +0 -59
  315. package/dist/core/commands/table-structure-commands.d.ts +0 -59
  316. package/dist/core/commands/table-structure-commands.js +0 -12
  317. package/dist/core/commands/table-structure-commands.js.map +0 -1
  318. package/dist/core/commands/text-commands.cjs +0 -2391
  319. package/dist/core/commands/text-commands.cjs.map +0 -1
  320. package/dist/core/commands/text-commands.d.cts +0 -24
  321. package/dist/core/commands/text-commands.d.ts +0 -24
  322. package/dist/core/commands/text-commands.js +0 -28
  323. package/dist/core/commands/text-commands.js.map +0 -1
  324. package/dist/core/selection/mapping.cjs +0 -200
  325. package/dist/core/selection/mapping.cjs.map +0 -1
  326. package/dist/core/selection/mapping.d.cts +0 -2
  327. package/dist/core/selection/mapping.d.ts +0 -2
  328. package/dist/core/selection/mapping.js +0 -31
  329. package/dist/core/selection/mapping.js.map +0 -1
  330. package/dist/core/state/editor-state.cjs +0 -2278
  331. package/dist/core/state/editor-state.cjs.map +0 -1
  332. package/dist/core/state/editor-state.d.cts +0 -2
  333. package/dist/core/state/editor-state.d.ts +0 -2
  334. package/dist/core/state/editor-state.js +0 -26
  335. package/dist/core/state/editor-state.js.map +0 -1
  336. package/dist/index.cjs +0 -38553
  337. package/dist/index.cjs.map +0 -1
  338. package/dist/index.d.cts +0 -15
  339. package/dist/index.d.ts +0 -15
  340. package/dist/index.js +0 -7856
  341. package/dist/index.js.map +0 -1
  342. package/dist/io/docx-session.cjs +0 -16236
  343. package/dist/io/docx-session.cjs.map +0 -1
  344. package/dist/io/docx-session.d.cts +0 -21
  345. package/dist/io/docx-session.d.ts +0 -21
  346. package/dist/io/docx-session.js +0 -18
  347. package/dist/io/docx-session.js.map +0 -1
  348. package/dist/legal/index.cjs +0 -3900
  349. package/dist/legal/index.cjs.map +0 -1
  350. package/dist/legal/index.d.cts +0 -86
  351. package/dist/legal/index.d.ts +0 -86
  352. package/dist/legal/index.js +0 -616
  353. package/dist/legal/index.js.map +0 -1
  354. package/dist/public-types-7ZL_94cz.d.ts +0 -1573
  355. package/dist/public-types-CeMaDueh.d.cts +0 -1573
  356. package/dist/public-types.cjs +0 -19
  357. package/dist/public-types.cjs.map +0 -1
  358. package/dist/public-types.d.cts +0 -2
  359. package/dist/public-types.d.ts +0 -2
  360. package/dist/public-types.js +0 -1
  361. package/dist/public-types.js.map +0 -1
  362. package/dist/runtime/document-runtime.cjs +0 -11140
  363. package/dist/runtime/document-runtime.cjs.map +0 -1
  364. package/dist/runtime/document-runtime.d.cts +0 -231
  365. package/dist/runtime/document-runtime.d.ts +0 -231
  366. package/dist/runtime/document-runtime.js +0 -21
  367. package/dist/runtime/document-runtime.js.map +0 -1
  368. package/dist/structural-helpers-CilgOVhh.d.cts +0 -10
  369. package/dist/structural-helpers-q0Gd-eBN.d.ts +0 -10
  370. package/dist/ui-tailwind/editor-surface/search-plugin.cjs +0 -313
  371. package/dist/ui-tailwind/editor-surface/search-plugin.cjs.map +0 -1
  372. package/dist/ui-tailwind/editor-surface/search-plugin.d.cts +0 -67
  373. package/dist/ui-tailwind/editor-surface/search-plugin.d.ts +0 -67
  374. package/dist/ui-tailwind/editor-surface/search-plugin.js +0 -23
  375. package/dist/ui-tailwind/editor-surface/search-plugin.js.map +0 -1
  376. package/dist/ui-tailwind/index.cjs +0 -4833
  377. package/dist/ui-tailwind/index.cjs.map +0 -1
  378. package/dist/ui-tailwind/index.d.cts +0 -617
  379. package/dist/ui-tailwind/index.d.ts +0 -617
  380. package/dist/ui-tailwind/index.js +0 -575
  381. 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
+ }