@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
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/ui/WordReviewEditor.tsx","../src/core/commands/list-commands.ts","../src/core/commands/paragraph-layout-commands.ts","../src/runtime/document-search.ts","../src/ui/runtime-snapshot-selectors.ts","../src/ui/editor-command-bag.ts","../src/ui/workflow-surface-blocked-rails.ts","../src/ui/editor-runtime-boundary.ts","../src/ui/browser-export.ts","../src/ui/editor-shell-view.tsx","../src/ui/editor-surface-controller.tsx","../src/ui-tailwind/editor-surface/tw-prosemirror-surface.tsx","../src/runtime/table-commands.ts","../src/ui-tailwind/editor-surface/pm-state-from-snapshot.ts","../src/ui-tailwind/editor-surface/pm-schema.ts","../src/runtime/table-schema.ts","../src/ui-tailwind/editor-surface/pm-position-map.ts","../src/ui-tailwind/editor-surface/pm-command-bridge.ts","../src/ui-tailwind/editor-surface/pm-decorations.ts","../src/ui-tailwind/editor-surface/pm-contextual-ui.ts","../src/ui-tailwind/editor-surface/surface-build-keys.ts","../src/ui-tailwind/editor-surface/tw-table-node-view.tsx"],"sourcesContent":["import React, {\n forwardRef,\n type FocusEvent,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport type {\n AutosaveState,\n CompatibilityReport,\n DocumentNavigationSnapshot,\n EditorAnchorProjection,\n EditorDatastoreAdapter,\n EditorHostAdapter,\n EditorSessionState,\n ExportResult,\n EditorError,\n EditorStoryTarget,\n EditorViewStateSnapshot,\n EditorWarning,\n ExportDocxOptions,\n FieldSnapshot,\n FormattingAlignment,\n FormattingStateSnapshot,\n HeaderFooterLinkPatch,\n InteractionGuardSnapshot,\n InsertImageOptions,\n InsertTableOptions,\n PageLayoutSnapshot,\n PersistedEditorSnapshot,\n RuntimeRenderSnapshot,\n SectionBreakType,\n SectionLayoutPatch,\n SectionPageNumberingPatch,\n SearchOptions,\n SearchResultSnapshot,\n SelectionSnapshot as PublicSelectionSnapshot,\n StyleCatalogSnapshot,\n SurfaceBlockSnapshot,\n TrackedChangeEntrySnapshot,\n TocRefreshResult,\n UpdateFieldsResult,\n ViewMode as EditorViewMode,\n WorkflowBlockedCommandReason,\n WorkflowMarkupSnapshot,\n WorkflowScopeSnapshot,\n WordReviewEditorChromeVisibility,\n WordReviewEditorEvent,\n WordReviewEditorProps,\n WordReviewEditorRef,\n WorkspaceMode,\n ZoomLevel,\n} from \"../api/public-types\";\nimport {\n editorSessionStateFromPersistedSnapshot,\n persistedSnapshotFromEditorSessionState,\n} from \"../api/session-state.ts\";\nimport {\n createDetachedAnchor,\n createNodeAnchor,\n createRangeAnchor,\n storyTargetsEqual,\n type TransactionMapping,\n} from \"../core/selection/mapping.ts\";\nimport {\n applyFormattingOperationToDocument,\n getFormattingStateFromRenderSnapshot,\n} from \"../core/commands/formatting-commands.ts\";\nimport {\n applyParagraphStyleToDocument,\n applyTableStyleToDocument,\n} from \"../core/commands/style-commands.ts\";\nimport {\n continueNumbering as continueListNumbering,\n backspaceAtListStart,\n indentListItems,\n outdentListItems,\n restartNumbering as restartListNumbering,\n splitListParagraph,\n} from \"../core/commands/list-commands.ts\";\nimport {\n resolveActiveParagraphIndex,\n setActiveParagraphIndentation,\n setActiveParagraphTabStops,\n} from \"../core/commands/paragraph-layout-commands.ts\";\nimport {\n deleteSectionBreakAtSectionIndex,\n insertSectionBreakAfterSectionIndex,\n setHeaderFooterLinkAtSectionIndex,\n setSectionPageNumberingAtSectionIndex,\n updateSectionLayoutAtSectionIndex,\n} from \"../core/commands/section-layout-commands.ts\";\nimport {\n insertImage as insertImageInDocument,\n resizeImage as resizeImageInCatalog,\n repositionFloatingImage as repositionFloatingImageInDocument,\n} from \"../core/commands/image-commands.ts\";\nimport {\n applyTableStructureOperation,\n} from \"../core/commands/table-structure-commands.ts\";\nimport {\n deleteSelectionOrBackward,\n deleteSelectionOrForward,\n insertHardBreak as insertHardBreakInDocument,\n insertPageBreak as insertPageBreakInDocument,\n insertTab as insertTabInDocument,\n insertText as insertTextInDocument,\n insertTable as insertTableInDocument,\n splitParagraph as splitParagraphInDocument,\n} from \"../core/commands/text-commands.ts\";\nimport { type SelectionSnapshot as InternalSelectionSnapshot } from \"../core/state/editor-state.ts\";\nimport {\n getStoryBlocks,\n replaceStoryBlocks,\n} from \"../runtime/story-targeting.ts\";\nimport {\n decodePersistedSourcePackageBytes,\n hasValidPersistedSourcePackageDigest,\n} from \"../io/source-package-provenance.ts\";\nimport { readOpcPackage } from \"../io/opc/package-reader.ts\";\nimport { deriveCapabilities } from \"../runtime/session-capabilities\";\nimport { searchDocument } from \"../runtime/document-search.ts\";\nimport {\n createEditorViewStateSnapshot,\n createViewState,\n} from \"../runtime/view-state.ts\";\nimport {\n type TwProseMirrorSurfaceRef,\n} from \"../ui-tailwind/editor-surface/tw-prosemirror-surface\";\nimport type { MediaPreviewDescriptor } from \"../ui-tailwind/editor-surface/pm-state-from-snapshot\";\nimport {\n incrementInvalidationCounter,\n recordPerfSample,\n} from \"../ui-tailwind/editor-surface/perf-probe.ts\";\nimport type { ReviewRailTab } from \"../ui-tailwind/review/tw-review-rail\";\nimport {\n selectMetaSlice,\n selectReviewSlice,\n selectStatusSlice,\n selectSurfaceSlice,\n selectToolbarSlice,\n selectViewSlice,\n shallowEqualRecord,\n useRuntimeSnapshotSlice,\n useRuntimeValue,\n} from \"./runtime-snapshot-selectors.ts\";\nimport type { MarkupDisplay } from \"./headless/comment-decoration-model\";\nimport type {\n SelectionToolbarAnchor,\n SelectionToolbarModel,\n SuggestionCardModel,\n} from \"./headless/selection-toolbar-model\";\nimport { type EditorCommandBag, useCommandBag } from \"./editor-command-bag.ts\";\nimport { deriveVisibleWorkflowBlockedRails } from \"./workflow-surface-blocked-rails.ts\";\nimport {\n type WordReviewEditorRuntime,\n persistAndExport as persistAndExportFromBoundary,\n persistSession as persistSessionFromBoundary,\n rejectExportWhileLoading as rejectExportWhileLoadingFromBoundary,\n useEditorRuntimeBoundary,\n} from \"./editor-runtime-boundary.ts\";\nimport {\n downloadExportResult,\n withExportDelivery,\n} from \"./browser-export\";\nimport { EditorShellView } from \"./editor-shell-view.tsx\";\nimport { EditorSurfaceController } from \"./editor-surface-controller.tsx\";\n\nexport {\n __createFallbackRuntime,\n __resolveWordReviewEditorSource,\n} from \"./editor-runtime-boundary.ts\";\n\nconst VISUALLY_HIDDEN_STYLES: React.CSSProperties = {\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n padding: 0,\n margin: \"-1px\",\n overflow: \"hidden\",\n clip: \"rect(0 0 0 0)\",\n whiteSpace: \"nowrap\",\n border: 0,\n};\n\nconst BROWSER_SAFE_PREVIEW_TYPES = new Set([\n \"image/png\",\n \"image/jpeg\",\n \"image/jpg\",\n \"image/gif\",\n \"image/webp\",\n \"image/bmp\",\n]);\n\nconst ACCESSIBLE_REGION_ORDER = [\n \"toolbar\",\n \"document\",\n \"review-rail\",\n \"status\",\n] as const;\n\ntype AccessibleRegionId = (typeof ACCESSIBLE_REGION_ORDER)[number];\n\ntype SelectionToolbarDismissReason =\n | \"blur\"\n | \"chrome-action\"\n | \"comment-action\"\n | \"escape\";\n\nexport function __createWordReviewEditorRefBridge(\n runtime: WordReviewEditorRuntime,\n mountedSurface?: TwProseMirrorSurfaceRef | null,\n): WordReviewEditorRef {\n return {\n focus: () => runtime.focus(),\n blur: () => runtime.blur(),\n undo: () => runtime.undo(),\n redo: () => runtime.redo(),\n replaceText: (text, target) => runtime.replaceText(text, target),\n addComment: (params) => runtime.addComment(params),\n openComment: (commentId) => runtime.openComment(commentId),\n resolveComment: (commentId) => runtime.resolveComment(commentId),\n reopenComment: (commentId) => runtime.reopenComment(commentId),\n addCommentReply: (commentId, body) => runtime.addCommentReply(commentId, body),\n editCommentBody: (commentId, body) => runtime.editCommentBody(commentId, body),\n deleteComment: (commentId) => {\n applyRuntimeDeleteComment(runtime, commentId);\n },\n acceptChange: (changeId) => runtime.acceptChange(changeId),\n rejectChange: (changeId) => runtime.rejectChange(changeId),\n acceptAllChanges: () => runtime.acceptAllChanges(),\n rejectAllChanges: () => runtime.rejectAllChanges(),\n exportDocx: (options) => runtime.exportDocx(options),\n getSessionState: () => runtime.getSessionState(),\n getSnapshot: () => runtime.getPersistedSnapshot(),\n getRenderSnapshot: () => clonePublicValue(runtime.getRenderSnapshot()),\n getCompatibilityReport: () => runtime.getCompatibilityReport(),\n getWarnings: () => runtime.getWarnings(),\n getCommentSidebarSnapshot: () =>\n clonePublicValue(runtime.getRenderSnapshot().comments),\n getTrackedChangesSnapshot: () =>\n clonePublicValue(runtime.getRenderSnapshot().trackedChanges),\n getComments: () => clonePublicValue(runtime.getRenderSnapshot().comments),\n getTrackedChanges: () =>\n clonePublicValue(runtime.getRenderSnapshot().trackedChanges),\n isDirty: () => runtime.getRenderSnapshot().isDirty,\n getFormattingState: () => getFormattingStateFromRenderSnapshot(runtime.getRenderSnapshot()),\n getStyleCatalog: () => getRuntimeStyleCatalog(runtime),\n toggleBold: () => {\n applyRuntimeFormattingOperation(runtime, { type: \"toggle\", mark: \"bold\" });\n },\n toggleItalic: () => {\n applyRuntimeFormattingOperation(runtime, { type: \"toggle\", mark: \"italic\" });\n },\n toggleUnderline: () => {\n applyRuntimeFormattingOperation(runtime, { type: \"toggle\", mark: \"underline\" });\n },\n toggleStrikethrough: () => {\n applyRuntimeFormattingOperation(runtime, {\n type: \"toggle\",\n mark: \"strikethrough\",\n });\n },\n toggleSuperscript: () => {\n applyRuntimeFormattingOperation(runtime, {\n type: \"toggle\",\n mark: \"superscript\",\n });\n },\n toggleSubscript: () => {\n applyRuntimeFormattingOperation(runtime, { type: \"toggle\", mark: \"subscript\" });\n },\n setFontFamily: (fontFamily) => {\n applyRuntimeFormattingOperation(runtime, {\n type: \"set-font-family\",\n fontFamily,\n });\n },\n setFontSize: (size) => {\n applyRuntimeFormattingOperation(runtime, { type: \"set-font-size\", size });\n },\n setTextColor: (color) => {\n applyRuntimeFormattingOperation(runtime, { type: \"set-text-color\", color });\n },\n setHighlightColor: (color) => {\n applyRuntimeFormattingOperation(runtime, {\n type: \"set-highlight-color\",\n color,\n });\n },\n setAlignment: (alignment) => {\n applyRuntimeFormattingOperation(runtime, {\n type: \"set-alignment\",\n alignment,\n });\n },\n setParagraphStyle: (styleId) => {\n applyRuntimeParagraphStyle(runtime, styleId);\n },\n setTableStyle: (styleId) => {\n applyRuntimeTableStyle(runtime, styleId);\n },\n indent: () => {\n applyRuntimeFormattingOperation(runtime, { type: \"indent\" });\n },\n outdent: () => {\n applyRuntimeFormattingOperation(runtime, { type: \"outdent\" });\n },\n insertPageBreak: () => {\n applyRuntimeInsertPageBreak(runtime);\n },\n insertTable: (options) => {\n applyRuntimeInsertTable(runtime, options);\n },\n insertImage: (options) => {\n applyRuntimeInsertImage(runtime, options);\n },\n addRowBefore: () => {\n applyRuntimeTableStructureOperation(runtime, mountedSurface ?? null, {\n type: \"add-row-before\",\n });\n },\n addRowAfter: () => {\n applyRuntimeTableStructureOperation(runtime, mountedSurface ?? null, {\n type: \"add-row-after\",\n });\n },\n addColumnBefore: () => {\n applyRuntimeTableStructureOperation(runtime, mountedSurface ?? null, {\n type: \"add-column-before\",\n });\n },\n addColumnAfter: () => {\n applyRuntimeTableStructureOperation(runtime, mountedSurface ?? null, {\n type: \"add-column-after\",\n });\n },\n deleteRow: () => {\n applyRuntimeTableStructureOperation(runtime, mountedSurface ?? null, {\n type: \"delete-row\",\n });\n },\n deleteColumn: () => {\n applyRuntimeTableStructureOperation(runtime, mountedSurface ?? null, {\n type: \"delete-column\",\n });\n },\n deleteTable: () => {\n applyRuntimeTableStructureOperation(runtime, mountedSurface ?? null, {\n type: \"delete-table\",\n });\n },\n mergeCells: () => {\n applyRuntimeTableStructureOperation(runtime, mountedSurface ?? null, {\n type: \"merge-cells\",\n });\n },\n splitCell: () => {\n applyRuntimeTableStructureOperation(runtime, mountedSurface ?? null, {\n type: \"split-cell\",\n });\n },\n setCellBackground: (color) => {\n applyRuntimeTableStructureOperation(runtime, mountedSurface ?? null, {\n type: \"set-cell-background\",\n color,\n });\n },\n search: (query, options) =>\n searchRuntimeDocument(runtime, mountedSurface ?? null, query, options),\n clearSearch: () => {\n mountedSurface?.clearSearch();\n },\n setSelection: (selection) => {\n applyRuntimeSelection(\n runtime,\n normalizeRequestedSelection(runtime.getRenderSnapshot(), selection),\n );\n },\n scrollToRevision: (revisionId: string) => {\n const revision = runtime.getRenderSnapshot().trackedChanges.revisions.find(\n (r) => r.revisionId === revisionId,\n );\n if (!revision || revision.anchor.kind === \"detached\") return;\n applyRuntimeSelection(runtime, createSelectionFromAnchor(revision.anchor));\n },\n scrollToComment: (commentId: string) => {\n const comment = runtime.getRenderSnapshot().comments.threads.find(\n (t) => t.commentId === commentId,\n );\n if (!comment || comment.anchor.kind === \"detached\") return;\n applyRuntimeSelection(runtime, createSelectionFromAnchor(comment.anchor));\n },\n openStory: (target: EditorStoryTarget) => {\n runtime.openStory(target);\n },\n closeStory: () => {\n runtime.closeStory();\n },\n getPageLayoutSnapshot: () => {\n return clonePublicValue(runtime.getPageLayoutSnapshot());\n },\n getDocumentNavigationSnapshot: () => {\n return clonePublicValue(runtime.getDocumentNavigationSnapshot());\n },\n getFieldSnapshot: () => {\n return clonePublicValue(runtime.getFieldSnapshot());\n },\n updateFields: (options) => {\n return runtime.updateFields(options);\n },\n updateTableOfContents: (options) => {\n return runtime.updateTableOfContents(options);\n },\n getViewState: () => {\n return clonePublicValue(runtime.getViewState());\n },\n setDocumentMode: (mode) => {\n runtime.setDocumentMode(mode);\n },\n getProtectionSnapshot: () => {\n return clonePublicValue(runtime.getProtectionSnapshot());\n },\n setWorkspaceMode: (mode) => {\n runtime.setWorkspaceMode(mode);\n },\n setZoom: (level) => {\n runtime.setZoom(level);\n },\n insertSectionBreak: (type, options) => {\n applyRuntimeInsertSectionBreak(runtime, type, options);\n },\n deleteSectionBreak: (sectionIndex) => {\n applyRuntimeDeleteSectionBreak(runtime, sectionIndex);\n },\n updateSectionLayout: (sectionIndex, patch) => {\n applyRuntimeUpdateSectionLayout(runtime, sectionIndex, patch);\n },\n setSectionPageNumbering: (sectionIndex, patch) => {\n applyRuntimeSetSectionPageNumbering(runtime, sectionIndex, patch);\n },\n setHeaderFooterLink: (sectionIndex, params) => {\n applyRuntimeSetHeaderFooterLink(runtime, sectionIndex, params);\n },\n setImageLayout: (mediaId, dimensions) => {\n applyRuntimeImageResize(runtime, mediaId, dimensions);\n },\n setImageFrame: (mediaId, offsets) => {\n applyRuntimeImageReposition(runtime, mediaId, offsets);\n },\n setWorkflowOverlay: (overlay) => {\n runtime.setWorkflowOverlay(clonePublicValue(overlay));\n },\n clearWorkflowOverlay: () => {\n runtime.clearWorkflowOverlay();\n },\n getWorkflowScopeSnapshot: () => {\n return clonePublicValue(runtime.getWorkflowScopeSnapshot());\n },\n getInteractionGuardSnapshot: () => {\n return clonePublicValue(runtime.getInteractionGuardSnapshot());\n },\n getWorkflowMarkupSnapshot: () => {\n return clonePublicValue(runtime.getWorkflowMarkupSnapshot());\n },\n setHostAnnotationOverlay: (overlay) => {\n runtime.setHostAnnotationOverlay(clonePublicValue(overlay));\n },\n clearHostAnnotationOverlay: () => {\n runtime.clearHostAnnotationOverlay();\n },\n getHostAnnotationSnapshot: () => {\n return clonePublicValue(runtime.getHostAnnotationSnapshot());\n },\n getWorkflowCandidateRanges: (options) => {\n return clonePublicValue(runtime.getWorkflowCandidateRanges(options));\n },\n replaceWorkflowMarkupText: (markupId, text) => {\n runtime.replaceWorkflowMarkupText(markupId, text);\n },\n };\n}\n\nexport function __applyRuntimeTextCommand(\n runtime: WordReviewEditorRuntime,\n command:\n | { type: \"insert-text\"; text: string }\n | { type: \"delete-backward\" }\n | { type: \"delete-forward\" }\n | { type: \"insert-tab\" }\n | { type: \"outdent-tab\" }\n | { type: \"insert-hard-break\" }\n | { type: \"split-paragraph\" },\n): void {\n applyRuntimeTextCommand(runtime, command);\n}\n\nexport const WordReviewEditor = forwardRef<WordReviewEditorRef, WordReviewEditorProps>(\n function WordReviewEditor(props, ref) {\n const {\n currentUser,\n hostAdapter,\n datastore,\n documentId,\n externalDocSource,\n externalDocumentRevision,\n initialDocx,\n loadRevision,\n loadSourcePolicy = \"prefer-saved-state\",\n initialSessionState,\n initialSnapshot,\n initialSourceLabel,\n markupDisplay,\n onError,\n onEvent,\n onWarning,\n readOnly = false,\n reviewMode = \"review\",\n suggestionsEnabled = false,\n showReviewPanel = true,\n chromeVisibility,\n } = props;\n\n const [activeRailTab, setActiveRailTab] = useState<ReviewRailTab>(\"comments\");\n const [showTrackedChanges, setShowTrackedChanges] = useState(false);\n const [activeRevisionId, setActiveRevisionId] = useState<string | undefined>();\n const [suppressedSuggestionRevisionId, setSuppressedSuggestionRevisionId] = useState<string | null>(null);\n const [selectionToolbarAnchor, setSelectionToolbarAnchor] = useState<SelectionToolbarAnchor | null>(null);\n const [selectionToolbarDismissedKey, setSelectionToolbarDismissedKey] = useState<string | null>(null);\n const [selectionToolbarFocusWithin, setSelectionToolbarFocusWithin] = useState(false);\n const surfaceRef = useRef<TwProseMirrorSurfaceRef | null>(null);\n const selectionToolbarElementRef = useRef<HTMLDivElement | null>(null);\n const shellRef = useRef<HTMLDivElement | null>(null);\n const lastSelectionToolbarKeyRef = useRef<string | null>(null);\n const lastAnnouncedErrorIdRef = useRef<string | null>(null);\n const {\n runtime,\n loadError,\n activeRuntime,\n fallbackSnapshot,\n loadingSessionState,\n loadingViewState,\n loadingNavigation,\n hostAdapterRef,\n datastoreRef,\n onEventRef,\n onWarningRef,\n onErrorRef,\n autosaveTimerRef,\n lastSavedRevisionTokenRef,\n runtimeViewStateSeedRef,\n } = useEditorRuntimeBoundary(props);\n const metaSlice = useRuntimeSnapshotSlice(\n runtime,\n fallbackSnapshot,\n selectMetaSlice,\n shallowEqualRecord,\n );\n const toolbarSlice = useRuntimeSnapshotSlice(\n runtime,\n fallbackSnapshot,\n selectToolbarSlice,\n shallowEqualRecord,\n );\n const surfaceSlice = useRuntimeSnapshotSlice(\n runtime,\n fallbackSnapshot,\n selectSurfaceSlice,\n shallowEqualRecord,\n );\n const reviewSlice = useRuntimeSnapshotSlice(\n runtime,\n fallbackSnapshot,\n selectReviewSlice,\n shallowEqualRecord,\n );\n const viewSlice = useRuntimeSnapshotSlice(\n runtime,\n fallbackSnapshot,\n selectViewSlice,\n shallowEqualRecord,\n );\n const statusSlice = useRuntimeSnapshotSlice(\n runtime,\n fallbackSnapshot,\n selectStatusSlice,\n shallowEqualRecord,\n );\n const snapshot = useMemo(\n () => ({\n documentId: metaSlice.documentId,\n sessionId: metaSlice.sessionId,\n sourceLabel: metaSlice.sourceLabel,\n revisionToken: surfaceSlice.revisionToken,\n isReady: toolbarSlice.isReady,\n isDirty: statusSlice.isDirty,\n readOnly: toolbarSlice.readOnly,\n documentMode: viewSlice.documentMode,\n selection: surfaceSlice.selection,\n activeStory: viewSlice.activeStory,\n pageLayout: viewSlice.pageLayout,\n documentStats: statusSlice.documentStats,\n comments: reviewSlice.comments,\n trackedChanges: reviewSlice.trackedChanges,\n compatibility: reviewSlice.compatibility,\n warnings: statusSlice.warnings,\n fatalError: statusSlice.fatalError,\n commandState: toolbarSlice.commandState,\n surface: surfaceSlice.surface,\n protectionSnapshot: statusSlice.protectionSnapshot,\n }),\n [\n metaSlice.documentId,\n metaSlice.sessionId,\n metaSlice.sourceLabel,\n surfaceSlice.revisionToken,\n surfaceSlice.selection,\n surfaceSlice.surface,\n toolbarSlice.isReady,\n toolbarSlice.readOnly,\n toolbarSlice.commandState,\n statusSlice.isDirty,\n statusSlice.documentStats,\n statusSlice.warnings,\n statusSlice.fatalError,\n statusSlice.protectionSnapshot,\n reviewSlice.comments,\n reviewSlice.trackedChanges,\n reviewSlice.compatibility,\n viewSlice.documentMode,\n viewSlice.activeStory,\n viewSlice.pageLayout,\n ],\n );\n const viewState = useRuntimeValue(\n runtime\n ? {\n subscribe: (listener) => runtime.subscribe(listener),\n getValue: () => runtime.getViewState(),\n }\n : null,\n loadingViewState,\n );\n const isPageWorkspace = viewState.workspaceMode === \"page\";\n const liveMarkupDisplay = __resolveLiveMarkupDisplay(markupDisplay, isPageWorkspace);\n const documentNavigation = useRuntimeValue(\n runtime\n ? {\n subscribe: (listener) => runtime.subscribe(listener),\n getValue: () => runtime.getDocumentNavigationSnapshot(),\n }\n : null,\n loadingNavigation,\n );\n const workflowScopeSnapshot = useRuntimeValue(\n runtime\n ? {\n subscribe: (listener) => runtime.subscribe(listener),\n getValue: () => runtime.getWorkflowScopeSnapshot(),\n }\n : null,\n null,\n workflowScopeSnapshotsEqual,\n );\n const interactionGuardSnapshot = useRuntimeValue(\n runtime\n ? {\n subscribe: (listener) => runtime.subscribe(listener),\n getValue: () => runtime.getInteractionGuardSnapshot(),\n }\n : null,\n { effectiveMode: \"edit\", blockedReasons: [] } satisfies InteractionGuardSnapshot,\n interactionGuardSnapshotsEqual,\n );\n const workflowMarkupSnapshot = useMemo(\n () => (runtime ? runtime.getWorkflowMarkupSnapshot() : null),\n [runtime, snapshot.revisionToken],\n );\n const workflowBlockedRails = useMemo(\n () => deriveVisibleWorkflowBlockedRails(snapshot.surface, workflowMarkupSnapshot),\n [snapshot.surface, workflowMarkupSnapshot],\n );\n const canonicalDocument = useMemo(\n () => (runtime ? runtime.getCanonicalDocument() : loadingSessionState.canonicalDocument),\n [loadingSessionState.canonicalDocument, runtime, snapshot.revisionToken],\n );\n const effectiveViewMode = deriveEditorViewMode(snapshot.readOnly, reviewMode);\n\n useEffect(() => {\n activeRuntime.setViewMode(effectiveViewMode);\n }, [activeRuntime, effectiveViewMode]);\n\n useEffect(() => {\n activeRuntime.setDocumentMode(suggestionsEnabled ? \"suggesting\" : \"editing\");\n }, [activeRuntime, suggestionsEnabled]);\n\n useEffect(() => {\n runtimeViewStateSeedRef.current = {\n workspaceMode: viewState.workspaceMode,\n zoomLevel: viewState.zoomLevel,\n };\n }, [viewState.workspaceMode, viewState.zoomLevel]);\n\n useEffect(() => {\n recordPerfSample(\"shell.render\");\n incrementInvalidationCounter(\"shell.rerenders\");\n }, [snapshot.revisionToken, snapshot.selection, viewState, documentNavigation]);\n\n useImperativeHandle(\n ref,\n () => ({\n focus: () => activeRuntime.focus(),\n blur: () => activeRuntime.blur(),\n undo: () => activeRuntime.undo(),\n redo: () => activeRuntime.redo(),\n replaceText: (text, target) => activeRuntime.replaceText(text, target),\n addComment: (params) =>\n activeRuntime.addComment({\n ...params,\n authorId: params.authorId ?? currentUser.userId,\n }),\n openComment: (commentId) => activeRuntime.openComment(commentId),\n resolveComment: (commentId) => activeRuntime.resolveComment(commentId),\n reopenComment: (commentId) => activeRuntime.reopenComment(commentId),\n addCommentReply: (commentId, body) =>\n activeRuntime.addCommentReply(commentId, body, currentUser.userId),\n editCommentBody: (commentId, body) =>\n activeRuntime.editCommentBody(commentId, body),\n deleteComment: (commentId) => {\n applyRuntimeDeleteComment(activeRuntime, commentId);\n },\n acceptChange: (changeId) => activeRuntime.acceptChange(changeId),\n rejectChange: (changeId) => activeRuntime.rejectChange(changeId),\n acceptAllChanges: () => activeRuntime.acceptAllChanges(),\n rejectAllChanges: () => activeRuntime.rejectAllChanges(),\n exportDocx: (options) =>\n runtime\n ? persistAndExportFromBoundary({\n hostAdapter: hostAdapterRef.current,\n datastore: datastoreRef.current,\n documentId,\n runtime,\n onError: onErrorRef.current,\n onEvent: onEventRef.current,\n options,\n lastSavedRevisionTokenRef,\n autosaveTimerRef,\n })\n : rejectExportWhileLoadingFromBoundary({\n documentId,\n hostAdapter: hostAdapterRef.current,\n datastore: datastoreRef.current,\n onError: onErrorRef.current,\n onEvent: onEventRef.current,\n }),\n getSessionState: () => activeRuntime.getSessionState(),\n getSnapshot: () => activeRuntime.getPersistedSnapshot(),\n getRenderSnapshot: () => clonePublicValue(activeRuntime.getRenderSnapshot()),\n getCompatibilityReport: () => activeRuntime.getCompatibilityReport(),\n getWarnings: () => activeRuntime.getWarnings(),\n getCommentSidebarSnapshot: () =>\n clonePublicValue(activeRuntime.getRenderSnapshot().comments),\n getTrackedChangesSnapshot: () =>\n clonePublicValue(activeRuntime.getRenderSnapshot().trackedChanges),\n getComments: () =>\n clonePublicValue(activeRuntime.getRenderSnapshot().comments),\n getTrackedChanges: () =>\n clonePublicValue(activeRuntime.getRenderSnapshot().trackedChanges),\n isDirty: () => activeRuntime.getRenderSnapshot().isDirty,\n getFormattingState: () =>\n getFormattingStateFromRenderSnapshot(activeRuntime.getRenderSnapshot()),\n getStyleCatalog: () => getRuntimeStyleCatalog(activeRuntime),\n toggleBold: () => {\n applyRuntimeFormattingOperation(activeRuntime, {\n type: \"toggle\",\n mark: \"bold\",\n });\n },\n toggleItalic: () => {\n applyRuntimeFormattingOperation(activeRuntime, {\n type: \"toggle\",\n mark: \"italic\",\n });\n },\n toggleUnderline: () => {\n applyRuntimeFormattingOperation(activeRuntime, {\n type: \"toggle\",\n mark: \"underline\",\n });\n },\n toggleStrikethrough: () => {\n applyRuntimeFormattingOperation(activeRuntime, {\n type: \"toggle\",\n mark: \"strikethrough\",\n });\n },\n toggleSuperscript: () => {\n applyRuntimeFormattingOperation(activeRuntime, {\n type: \"toggle\",\n mark: \"superscript\",\n });\n },\n toggleSubscript: () => {\n applyRuntimeFormattingOperation(activeRuntime, {\n type: \"toggle\",\n mark: \"subscript\",\n });\n },\n setFontFamily: (fontFamily) => {\n applyRuntimeFormattingOperation(activeRuntime, {\n type: \"set-font-family\",\n fontFamily,\n });\n },\n setFontSize: (size) => {\n applyRuntimeFormattingOperation(activeRuntime, {\n type: \"set-font-size\",\n size,\n });\n },\n setTextColor: (color) => {\n applyRuntimeFormattingOperation(activeRuntime, {\n type: \"set-text-color\",\n color,\n });\n },\n setHighlightColor: (color) => {\n applyRuntimeFormattingOperation(activeRuntime, {\n type: \"set-highlight-color\",\n color,\n });\n },\n setAlignment: (alignment) => {\n applyRuntimeFormattingOperation(activeRuntime, {\n type: \"set-alignment\",\n alignment,\n });\n },\n setParagraphStyle: (styleId) => {\n applyRuntimeParagraphStyle(activeRuntime, styleId);\n },\n setTableStyle: (styleId) => {\n applyRuntimeTableStyle(activeRuntime, styleId);\n },\n indent: () => {\n applyRuntimeFormattingOperation(activeRuntime, { type: \"indent\" });\n },\n outdent: () => {\n applyRuntimeFormattingOperation(activeRuntime, { type: \"outdent\" });\n },\n insertPageBreak: () => {\n applyRuntimeInsertPageBreak(activeRuntime);\n },\n insertTable: (options) => {\n applyRuntimeInsertTable(activeRuntime, options);\n },\n insertImage: (options) => {\n applyRuntimeInsertImage(activeRuntime, options);\n },\n addRowBefore: () => {\n applyRuntimeTableStructureOperation(activeRuntime, surfaceRef.current, {\n type: \"add-row-before\",\n });\n },\n addRowAfter: () => {\n applyRuntimeTableStructureOperation(activeRuntime, surfaceRef.current, {\n type: \"add-row-after\",\n });\n },\n addColumnBefore: () => {\n applyRuntimeTableStructureOperation(activeRuntime, surfaceRef.current, {\n type: \"add-column-before\",\n });\n },\n addColumnAfter: () => {\n applyRuntimeTableStructureOperation(activeRuntime, surfaceRef.current, {\n type: \"add-column-after\",\n });\n },\n deleteRow: () => {\n applyRuntimeTableStructureOperation(activeRuntime, surfaceRef.current, {\n type: \"delete-row\",\n });\n },\n deleteColumn: () => {\n applyRuntimeTableStructureOperation(activeRuntime, surfaceRef.current, {\n type: \"delete-column\",\n });\n },\n deleteTable: () => {\n applyRuntimeTableStructureOperation(activeRuntime, surfaceRef.current, {\n type: \"delete-table\",\n });\n },\n mergeCells: () => {\n applyRuntimeTableStructureOperation(activeRuntime, surfaceRef.current, {\n type: \"merge-cells\",\n });\n },\n splitCell: () => {\n applyRuntimeTableStructureOperation(activeRuntime, surfaceRef.current, {\n type: \"split-cell\",\n });\n },\n setCellBackground: (color) => {\n applyRuntimeTableStructureOperation(activeRuntime, surfaceRef.current, {\n type: \"set-cell-background\",\n color,\n });\n },\n search: (query, options) =>\n searchRuntimeDocument(\n activeRuntime,\n surfaceRef.current,\n query,\n options,\n ),\n clearSearch: () => {\n surfaceRef.current?.clearSearch();\n },\n setSelection: (selection) => {\n applyRuntimeSelection(\n activeRuntime,\n normalizeRequestedSelection(activeRuntime.getRenderSnapshot(), selection),\n );\n },\n scrollToRevision: (revisionId: string) => {\n const revision = activeRuntime.getRenderSnapshot().trackedChanges.revisions.find(\n (r) => r.revisionId === revisionId,\n );\n if (!revision || revision.anchor.kind === \"detached\") return;\n applyRuntimeSelection(\n activeRuntime,\n createSelectionFromAnchor(revision.anchor, revision.storyTarget),\n );\n },\n scrollToComment: (commentId: string) => {\n const comment = activeRuntime.getRenderSnapshot().comments.threads.find(\n (t) => t.commentId === commentId,\n );\n if (!comment || comment.anchor.kind === \"detached\") return;\n applyRuntimeSelection(\n activeRuntime,\n createSelectionFromAnchor(comment.anchor),\n );\n },\n openStory: (target: EditorStoryTarget) => {\n activeRuntime.openStory(target);\n },\n closeStory: () => {\n activeRuntime.closeStory();\n },\n getPageLayoutSnapshot: () => {\n return clonePublicValue(activeRuntime.getPageLayoutSnapshot());\n },\n getDocumentNavigationSnapshot: () => {\n return clonePublicValue(activeRuntime.getDocumentNavigationSnapshot());\n },\n getFieldSnapshot: () => {\n return clonePublicValue(activeRuntime.getFieldSnapshot());\n },\n updateFields: (options) => {\n return activeRuntime.updateFields(options);\n },\n updateTableOfContents: (options) => {\n return activeRuntime.updateTableOfContents(options);\n },\n getViewState: () => {\n return clonePublicValue(activeRuntime.getViewState());\n },\n setDocumentMode: (mode) => {\n activeRuntime.setDocumentMode(mode);\n },\n getProtectionSnapshot: () => {\n return clonePublicValue(activeRuntime.getProtectionSnapshot());\n },\n setWorkspaceMode: (mode) => {\n activeRuntime.setWorkspaceMode(mode);\n },\n setZoom: (level) => {\n activeRuntime.setZoom(level);\n },\n insertSectionBreak: (type, options) => {\n applyRuntimeInsertSectionBreak(activeRuntime, type, options);\n },\n deleteSectionBreak: (sectionIndex) => {\n applyRuntimeDeleteSectionBreak(activeRuntime, sectionIndex);\n },\n updateSectionLayout: (sectionIndex, patch) => {\n applyRuntimeUpdateSectionLayout(activeRuntime, sectionIndex, patch);\n },\n setSectionPageNumbering: (sectionIndex, patch) => {\n applyRuntimeSetSectionPageNumbering(activeRuntime, sectionIndex, patch);\n },\n setHeaderFooterLink: (sectionIndex, params) => {\n applyRuntimeSetHeaderFooterLink(activeRuntime, sectionIndex, params);\n },\n setImageLayout: (mediaId, dimensions) => {\n applyRuntimeImageResize(activeRuntime, mediaId, dimensions);\n },\n setImageFrame: (mediaId, offsets) => {\n applyRuntimeImageReposition(activeRuntime, mediaId, offsets);\n },\n setWorkflowOverlay: (overlay) => {\n activeRuntime.setWorkflowOverlay(clonePublicValue(overlay));\n },\n clearWorkflowOverlay: () => {\n activeRuntime.clearWorkflowOverlay();\n },\n getWorkflowScopeSnapshot: () => {\n return clonePublicValue(activeRuntime.getWorkflowScopeSnapshot());\n },\n getInteractionGuardSnapshot: () => {\n return clonePublicValue(activeRuntime.getInteractionGuardSnapshot());\n },\n getWorkflowMarkupSnapshot: () => {\n return clonePublicValue(activeRuntime.getWorkflowMarkupSnapshot());\n },\n setHostAnnotationOverlay: (overlay) => {\n activeRuntime.setHostAnnotationOverlay(clonePublicValue(overlay));\n },\n clearHostAnnotationOverlay: () => {\n activeRuntime.clearHostAnnotationOverlay();\n },\n getHostAnnotationSnapshot: () => {\n return clonePublicValue(activeRuntime.getHostAnnotationSnapshot());\n },\n getWorkflowCandidateRanges: (options) => {\n return clonePublicValue(activeRuntime.getWorkflowCandidateRanges(options));\n },\n replaceWorkflowMarkupText: (markupId, text) => {\n activeRuntime.replaceWorkflowMarkupText(markupId, text);\n },\n }),\n [activeRuntime, currentUser.userId, documentId, runtime],\n );\n\n useEffect(() => {\n const canPersist =\n Boolean(hostAdapterRef.current?.saveSession) || Boolean(datastoreRef.current?.saveSnapshot);\n if (!canPersist || props.autosave?.enabled === false || !runtime || readOnly) {\n if (autosaveTimerRef.current) {\n clearTimeout(autosaveTimerRef.current);\n autosaveTimerRef.current = null;\n }\n return;\n }\n\n if (!snapshot.isReady || !snapshot.isDirty) {\n return;\n }\n\n if (lastSavedRevisionTokenRef.current === snapshot.revisionToken) {\n return;\n }\n\n if (autosaveTimerRef.current) {\n clearTimeout(autosaveTimerRef.current);\n }\n\n const debounceMs = props.autosave?.debounceMs ?? 800;\n if (debounceMs <= 0) {\n void persistSessionFromBoundary({\n hostAdapter: hostAdapterRef.current,\n datastore: datastoreRef.current,\n documentId,\n runtime,\n isAutosave: true,\n onError: onErrorRef.current,\n onEvent: onEventRef.current,\n lastSavedRevisionTokenRef,\n });\n return;\n }\n\n autosaveTimerRef.current = setTimeout(() => {\n void persistSessionFromBoundary({\n hostAdapter: hostAdapterRef.current,\n datastore: datastoreRef.current,\n documentId,\n runtime,\n isAutosave: true,\n onError: onErrorRef.current,\n onEvent: onEventRef.current,\n lastSavedRevisionTokenRef,\n });\n }, debounceMs);\n\n return () => {\n if (autosaveTimerRef.current) {\n clearTimeout(autosaveTimerRef.current);\n autosaveTimerRef.current = null;\n }\n };\n }, [\n documentId,\n props.autosave?.debounceMs,\n props.autosave?.enabled,\n readOnly,\n runtime,\n snapshot.isDirty,\n snapshot.isReady,\n snapshot.revisionToken,\n ]);\n\n // Auto-select the most relevant rail tab based on content.\n // Health tab was moved to toolbar popover — rail has only comments/changes.\n useEffect(() => {\n if (\n activeRailTab === \"comments\" &&\n snapshot.comments.totalCount === 0 &&\n snapshot.trackedChanges.totalCount > 0\n ) {\n setActiveRailTab(\"changes\");\n return;\n }\n }, [\n activeRailTab,\n loadError,\n snapshot.comments.totalCount,\n snapshot.compatibility.blockExport,\n snapshot.fatalError,\n snapshot.trackedChanges.totalCount,\n ]);\n\n function focusAnchor(\n anchor: PublicSelectionSnapshot[\"activeRange\"],\n storyTarget?: EditorStoryTarget,\n ): void {\n if (anchor.kind === \"detached\") {\n return;\n }\n applyRuntimeSelection(activeRuntime, createSelectionFromAnchor(anchor, storyTarget));\n }\n\n function addReviewComment(): string | null {\n try {\n const commentId = activeRuntime.addComment({\n anchor: snapshot.selection.activeRange,\n body: \"\",\n authorId: currentUser.userId,\n });\n activeRuntime.openComment(commentId);\n setActiveRailTab(\"comments\");\n return commentId;\n } catch {\n // Runtime already emitted a concrete export-safety error for invalid anchors.\n return null;\n }\n }\n\n function exportCurrentDocument(): void {\n void (runtime\n ? persistAndExportFromBoundary({\n hostAdapter: hostAdapterRef.current,\n datastore: datastoreRef.current,\n documentId,\n runtime,\n onError: onErrorRef.current,\n onEvent: onEventRef.current,\n lastSavedRevisionTokenRef,\n autosaveTimerRef,\n })\n : rejectExportWhileLoadingFromBoundary({\n documentId,\n hostAdapter: hostAdapterRef.current,\n datastore: datastoreRef.current,\n onError: onErrorRef.current,\n onEvent: onEventRef.current,\n }));\n }\n\n const derivedCapabilities = deriveCapabilities(\n snapshot,\n reviewMode,\n workflowScopeSnapshot,\n );\n const resolvedChromeVisibility = resolveWordReviewEditorChromeVisibility(\n chromeVisibility,\n showReviewPanel,\n );\n const capabilities = resolvedChromeVisibility.reviewRail\n ? derivedCapabilities\n : { ...derivedCapabilities, reviewRailVisible: false };\n const formattingState = getFormattingStateFromRenderSnapshot(snapshot);\n const styleCatalog = useMemo(\n () => getRuntimeStyleCatalog(canonicalDocument.styles),\n [canonicalDocument.styles],\n );\n const diagnosticsModeMessage = getDiagnosticsModeMessage(loadError ?? snapshot.fatalError);\n const addCommentDisabledReason =\n !capabilities.canAddComment && !snapshot.selection.isCollapsed\n ? \"Select text within one paragraph to add a DOCX comment.\"\n : undefined;\n const activeImageContext = useMemo(\n () =>\n buildActiveImageContext({\n canonicalDocument,\n selection: snapshot.selection,\n storyTarget: viewState.activeStory,\n surface: snapshot.surface,\n }),\n [canonicalDocument, snapshot.selection, snapshot.surface, viewState.activeStory],\n );\n const sourcePackage = runtime\n ? runtime.getSourcePackage()\n : loadingSessionState.sourcePackage;\n const mediaPreviewCatalogKey = Object.values(canonicalDocument.media.items)\n .map((item) =>\n [\n item.mediaId,\n item.packagePartName,\n item.contentType ?? \"\",\n item.widthEmu ?? \"\",\n item.heightEmu ?? \"\",\n ].join(\":\"),\n )\n .sort()\n .join(\"|\");\n const mediaPreviews = useMemo(() => {\n if (!sourcePackage) {\n return {} as Record<string, MediaPreviewDescriptor>;\n }\n try {\n const bytes = decodePersistedSourcePackageBytes(sourcePackage);\n if (!hasValidPersistedSourcePackageDigest(sourcePackage, bytes)) {\n return {} as Record<string, MediaPreviewDescriptor>;\n }\n const opc = readOpcPackage(bytes);\n const previews: Record<string, MediaPreviewDescriptor> = {};\n for (const item of Object.values(canonicalDocument.media.items)) {\n const contentType = item.contentType?.toLowerCase();\n const part = opc.parts.get(item.packagePartName);\n if (\n !part?.bytes ||\n !contentType ||\n !BROWSER_SAFE_PREVIEW_TYPES.has(contentType)\n ) {\n continue;\n }\n previews[item.mediaId] = {\n src: createImageDataUrl(contentType, part.bytes),\n ...(item.widthEmu !== undefined ? { widthEmu: item.widthEmu } : {}),\n ...(item.heightEmu !== undefined ? { heightEmu: item.heightEmu } : {}),\n };\n }\n return previews;\n } catch {\n return {} as Record<string, MediaPreviewDescriptor>;\n }\n }, [mediaPreviewCatalogKey, sourcePackage?.sha256Hex]);\n const activeObjectContext = useMemo(\n () =>\n viewState.activeObjectFrame && viewState.activeObjectFrame.kind !== \"image\"\n ? {\n kind: viewState.activeObjectFrame.kind,\n display: viewState.activeObjectFrame.display,\n }\n : null,\n [viewState.activeObjectFrame],\n );\n const selectionToolbar = buildSelectionToolbarModel({\n snapshot,\n viewState,\n capabilities,\n documentNavigation,\n styleCatalog,\n formattingState,\n workflowScopeSnapshot,\n interactionGuardSnapshot,\n addCommentDisabledReason,\n });\n const suggestionCard = buildSuggestionCardModel({\n snapshot,\n viewState,\n capabilities,\n workflowScopeSnapshot,\n interactionGuardSnapshot,\n activeRevisionId,\n suppressedSuggestionRevisionId,\n addCommentDisabledReason,\n });\n const selectionToolbarSelectionKey = useMemo(\n () => createSelectionToolbarSelectionKey(snapshot.selection, viewState.activeStory, activeRevisionId),\n [activeRevisionId, snapshot.selection, viewState.activeStory],\n );\n const shouldRenderSelectionChrome = Boolean(\n (selectionToolbar || suggestionCard) &&\n selectionToolbarSelectionKey &&\n selectionToolbarDismissedKey !== selectionToolbarSelectionKey &&\n (viewState.isFocused || selectionToolbarFocusWithin),\n );\n const accessibilityInstructionsId = `${documentId}-accessibility-instructions`;\n const accessibilityStatusId = `${documentId}-accessibility-status`;\n const accessibilityAlertId = `${documentId}-accessibility-alert`;\n\n const dispatchSelection = (selection: PublicSelectionSnapshot) =>\n applyRuntimeSelection(activeRuntime, selection);\n\n const dismissSelectionToolbar = useCallback(\n (_reason: SelectionToolbarDismissReason) => {\n if (selectionToolbarSelectionKey) {\n setSelectionToolbarDismissedKey(selectionToolbarSelectionKey);\n } else {\n setSelectionToolbarDismissedKey(null);\n }\n setSelectionToolbarAnchor(null);\n setSelectionToolbarFocusWithin(false);\n },\n [selectionToolbarSelectionKey],\n );\n\n const getDocumentSurfaceElement = useCallback((): HTMLElement | null => {\n return shellRef.current?.querySelector<HTMLElement>(\"[data-wre-document-surface='true']\") ?? null;\n }, []);\n\n const isTargetWithinSelectionToolbar = useCallback((target: EventTarget | null): boolean => {\n return target instanceof Node && Boolean(selectionToolbarElementRef.current?.contains(target));\n }, []);\n\n const isTargetWithinDocumentSurface = useCallback(\n (target: EventTarget | null): boolean => {\n const surfaceElement = getDocumentSurfaceElement();\n return target instanceof Node && Boolean(surfaceElement?.contains(target));\n },\n [getDocumentSurfaceElement],\n );\n\n const focusDocumentSurface = useCallback((): void => {\n const surfaceElement = getDocumentSurfaceElement();\n surfaceElement?.focus();\n activeRuntime.focus();\n }, [activeRuntime, getDocumentSurfaceElement]);\n\n const handleSurfaceFocus = useCallback(\n (_event: FocusEvent<HTMLDivElement>) => {\n setSelectionToolbarFocusWithin(false);\n activeRuntime.focus();\n },\n [activeRuntime],\n );\n\n const handleSurfaceBlur = useCallback(\n (event: FocusEvent<HTMLDivElement>) => {\n if (isTargetWithinSelectionToolbar(event.relatedTarget)) {\n setSelectionToolbarFocusWithin(true);\n activeRuntime.focus();\n return;\n }\n\n setSelectionToolbarFocusWithin(false);\n activeRuntime.blur();\n dismissSelectionToolbar(\"blur\");\n },\n [activeRuntime, dismissSelectionToolbar, isTargetWithinSelectionToolbar],\n );\n\n const handleSelectionToolbarFocusCapture = useCallback(() => {\n setSelectionToolbarFocusWithin(true);\n activeRuntime.focus();\n }, [activeRuntime]);\n\n const handleSelectionToolbarBlurCapture = useCallback(\n (event: FocusEvent<HTMLDivElement>) => {\n if (isTargetWithinSelectionToolbar(event.relatedTarget)) {\n return;\n }\n\n if (isTargetWithinDocumentSurface(event.relatedTarget)) {\n setSelectionToolbarFocusWithin(false);\n activeRuntime.focus();\n return;\n }\n\n setSelectionToolbarFocusWithin(false);\n activeRuntime.blur();\n dismissSelectionToolbar(\"blur\");\n },\n [\n activeRuntime,\n dismissSelectionToolbar,\n isTargetWithinDocumentSurface,\n isTargetWithinSelectionToolbar,\n ],\n );\n\n const addSelectionToolbarComment = useCallback(() => {\n const commentId = addReviewComment();\n if (!commentId) {\n return;\n }\n dismissSelectionToolbar(\"comment-action\");\n queueMicrotask(() => {\n focusDocumentSurface();\n });\n }, [dismissSelectionToolbar, focusDocumentSurface]);\n\n const handleSelectionToolbarAnchorChange = useCallback(\n (nextAnchor: SelectionToolbarAnchor | null) => {\n setSelectionToolbarAnchor((current) =>\n selectionToolbarAnchorsEqual(current, nextAnchor) ? current : nextAnchor);\n },\n [],\n );\n\n useEffect(() => {\n if (!selectionToolbarSelectionKey) {\n setSuppressedSuggestionRevisionId(null);\n setSelectionToolbarDismissedKey(null);\n setSelectionToolbarFocusWithin(false);\n setSelectionToolbarAnchor(null);\n lastSelectionToolbarKeyRef.current = null;\n return;\n }\n\n if (lastSelectionToolbarKeyRef.current !== selectionToolbarSelectionKey) {\n lastSelectionToolbarKeyRef.current = selectionToolbarSelectionKey;\n setSuppressedSuggestionRevisionId(null);\n setSelectionToolbarDismissedKey(null);\n setSelectionToolbarFocusWithin(false);\n }\n }, [selectionToolbarSelectionKey]);\n\n useEffect(() => {\n if (!selectionToolbar && !suggestionCard) {\n setSelectionToolbarAnchor(null);\n setSelectionToolbarFocusWithin(false);\n }\n }, [selectionToolbar, suggestionCard]);\n\n useEffect(() => {\n const shell = shellRef.current;\n if (!shell) {\n return;\n }\n\n applyRegionAttributes(shell);\n }, [runtime, snapshot.fatalError, snapshot.isReady]);\n\n useEffect(() => {\n const shell = shellRef.current;\n const fatalError = loadError ?? snapshot.fatalError;\n if (!shell || !fatalError) {\n lastAnnouncedErrorIdRef.current = null;\n return;\n }\n\n if (lastAnnouncedErrorIdRef.current === fatalError.errorId) {\n return;\n }\n\n lastAnnouncedErrorIdRef.current = fatalError.errorId;\n const alertTarget = shell.querySelector<HTMLElement>(\"[data-wre-alert='true']\");\n alertTarget?.focus();\n }, [loadError, snapshot.fatalError]);\n\n function handleShellKeyDownCapture(event: React.KeyboardEvent<HTMLDivElement>): void {\n const targetWithinDocument = isTargetWithinDocumentSurface(event.target);\n const isUndoShortcut = (event.ctrlKey || event.metaKey) && !event.shiftKey && event.key.toLowerCase() === \"z\";\n const isRedoShortcut =\n ((event.ctrlKey || event.metaKey) && event.shiftKey && event.key.toLowerCase() === \"z\") ||\n (event.ctrlKey && event.key.toLowerCase() === \"y\");\n\n if ((isUndoShortcut || isRedoShortcut) && targetWithinDocument) {\n event.preventDefault();\n event.stopPropagation();\n if (isUndoShortcut) {\n activeRuntime.undo();\n } else {\n activeRuntime.redo();\n }\n return;\n }\n\n if (\n event.key === \"Escape\" &&\n shouldRenderSelectionChrome &&\n (isTargetWithinDocumentSurface(event.target) || isTargetWithinSelectionToolbar(event.target))\n ) {\n event.preventDefault();\n event.stopPropagation();\n const restoreSurfaceFocus = isTargetWithinSelectionToolbar(event.target);\n dismissSelectionToolbar(\"escape\");\n if (restoreSurfaceFocus) {\n queueMicrotask(() => {\n focusDocumentSurface();\n });\n }\n return;\n }\n\n if (event.key !== \"F6\") {\n return;\n }\n\n const shell = shellRef.current;\n if (!shell) {\n return;\n }\n\n event.preventDefault();\n focusRelativeRegion(shell, event.shiftKey ? -1 : 1);\n }\n\n const editorCallbacks = {\n onFocus: handleSurfaceFocus,\n onBlur: handleSurfaceBlur,\n onSelectionChange: dispatchSelection,\n onInsertText: (text: string) => applyRuntimeTextCommand(activeRuntime, { type: \"insert-text\", text }),\n onDeleteBackward: () => applyRuntimeTextCommand(activeRuntime, { type: \"delete-backward\" }),\n onDeleteForward: () => applyRuntimeTextCommand(activeRuntime, { type: \"delete-forward\" }),\n onInsertTab: () => applyRuntimeTextCommand(activeRuntime, { type: \"insert-tab\" }),\n onOutdentTab: () => applyRuntimeTextCommand(activeRuntime, { type: \"outdent-tab\" }),\n onInsertHardBreak: () => applyRuntimeTextCommand(activeRuntime, { type: \"insert-hard-break\" }),\n onSplitParagraph: () => applyRuntimeTextCommand(activeRuntime, { type: \"split-paragraph\" }),\n onUndo: () => activeRuntime.undo(),\n onRedo: () => activeRuntime.redo(),\n onBlockedInput: (command: \"paste\" | \"drop\", message: string) =>\n activeRuntime.emitBlockedCommand(command, [{\n code: \"unsupported_surface\",\n message,\n }]),\n };\n\n const reviewCallbacks = {\n onUndo: () => activeRuntime.undo(),\n onRedo: () => activeRuntime.redo(),\n onAddComment: addReviewComment,\n onExport: exportCurrentDocument,\n onOpenComment: (thread: typeof snapshot.comments.threads[number]) => {\n activeRuntime.openComment(thread.commentId);\n focusAnchor(thread.anchor);\n setActiveRailTab(\"comments\");\n },\n onResolveComment: (commentId: string) => {\n activeRuntime.resolveComment(commentId);\n setActiveRailTab(\"comments\");\n },\n onReopenComment: (commentId: string) => {\n activeRuntime.reopenComment(commentId);\n setActiveRailTab(\"comments\");\n },\n onAddReply: (commentId: string, body: string) => {\n activeRuntime.addCommentReply(commentId, body, currentUser.userId);\n },\n onEditBody: (commentId: string, body: string) => {\n activeRuntime.editCommentBody(commentId, body);\n },\n onOpenRevision: (revision: typeof snapshot.trackedChanges.revisions[number]) => {\n setActiveRevisionId(revision.revisionId);\n focusAnchor(revision.anchor, revision.storyTarget);\n setActiveRailTab(\"changes\");\n },\n onAcceptRevision: (revisionId: string) => {\n activeRuntime.acceptChange(revisionId);\n setActiveRailTab(\"changes\");\n },\n onRejectRevision: (revisionId: string) => {\n activeRuntime.rejectChange(revisionId);\n setActiveRailTab(\"changes\");\n },\n onAcceptAllChanges: () => {\n activeRuntime.acceptAllChanges();\n setActiveRailTab(\"changes\");\n },\n onRejectAllChanges: () => {\n activeRuntime.rejectAllChanges();\n setActiveRailTab(\"changes\");\n },\n onCloseStory: () => {\n activeRuntime.closeStory();\n },\n };\n\n const commands = useCommandBag<EditorCommandBag>({\n ...reviewCallbacks,\n onWorkspaceModeChange: (mode) => activeRuntime.setWorkspaceMode(mode),\n onZoomChange: (level) => activeRuntime.setZoom(level),\n onActiveRailTabChange: setActiveRailTab,\n onShowTrackedChangesChange: setShowTrackedChanges,\n onToggleBold: () =>\n applyRuntimeFormattingOperation(activeRuntime, { type: \"toggle\", mark: \"bold\" }),\n onToggleItalic: () =>\n applyRuntimeFormattingOperation(activeRuntime, { type: \"toggle\", mark: \"italic\" }),\n onToggleUnderline: () =>\n applyRuntimeFormattingOperation(activeRuntime, { type: \"toggle\", mark: \"underline\" }),\n onSetSelectionTextColor: (color) =>\n applyRuntimeFormattingOperation(activeRuntime, { type: \"set-text-color\", color }),\n onSetSelectionHighlightColor: (color) =>\n applyRuntimeFormattingOperation(activeRuntime, { type: \"set-highlight-color\", color }),\n onToggleStrikethrough: () =>\n applyRuntimeFormattingOperation(activeRuntime, {\n type: \"toggle\",\n mark: \"strikethrough\",\n }),\n onToggleSuperscript: () =>\n applyRuntimeFormattingOperation(activeRuntime, {\n type: \"toggle\",\n mark: \"superscript\",\n }),\n onToggleSubscript: () =>\n applyRuntimeFormattingOperation(activeRuntime, { type: \"toggle\", mark: \"subscript\" }),\n onSetFontFamily: (fontFamily) =>\n applyRuntimeFormattingOperation(activeRuntime, { type: \"set-font-family\", fontFamily }),\n onSetFontSize: (fontSize) =>\n applyRuntimeFormattingOperation(activeRuntime, { type: \"set-font-size\", size: fontSize }),\n onSetTextColor: (color) =>\n applyRuntimeFormattingOperation(activeRuntime, { type: \"set-text-color\", color }),\n onSetHighlightColor: (color) =>\n applyRuntimeFormattingOperation(activeRuntime, { type: \"set-highlight-color\", color }),\n onSetAlignment: (alignment) =>\n applyRuntimeFormattingOperation(activeRuntime, { type: \"set-alignment\", alignment }),\n onSetParagraphStyle: (styleId) => applyRuntimeParagraphStyle(activeRuntime, styleId),\n onOutdent: () => applyRuntimeFormattingOperation(activeRuntime, { type: \"outdent\" }),\n onIndent: () => applyRuntimeFormattingOperation(activeRuntime, { type: \"indent\" }),\n onInsertPageBreak: () => applyRuntimeInsertPageBreak(activeRuntime),\n onInsertTable: () => applyRuntimeInsertTable(activeRuntime, { rows: 3, columns: 3 }),\n onInsertSectionBreak: (type) => applyRuntimeInsertSectionBreak(activeRuntime, type),\n onInsertImage: (options) => applyRuntimeInsertImage(activeRuntime, options),\n onSetTableStyle: (styleId) => applyRuntimeTableStyle(activeRuntime, styleId),\n onAddRowBefore: () =>\n applyRuntimeTableStructureOperation(activeRuntime, surfaceRef.current ?? null, {\n type: \"add-row-before\",\n }),\n onAddRowAfter: () =>\n applyRuntimeTableStructureOperation(activeRuntime, surfaceRef.current ?? null, {\n type: \"add-row-after\",\n }),\n onAddColumnBefore: () =>\n applyRuntimeTableStructureOperation(activeRuntime, surfaceRef.current ?? null, {\n type: \"add-column-before\",\n }),\n onAddColumnAfter: () =>\n applyRuntimeTableStructureOperation(activeRuntime, surfaceRef.current ?? null, {\n type: \"add-column-after\",\n }),\n onDeleteRow: () =>\n applyRuntimeTableStructureOperation(activeRuntime, surfaceRef.current ?? null, {\n type: \"delete-row\",\n }),\n onDeleteColumn: () =>\n applyRuntimeTableStructureOperation(activeRuntime, surfaceRef.current ?? null, {\n type: \"delete-column\",\n }),\n onDeleteTable: () =>\n applyRuntimeTableStructureOperation(activeRuntime, surfaceRef.current ?? null, {\n type: \"delete-table\",\n }),\n onMergeCells: () =>\n applyRuntimeTableStructureOperation(activeRuntime, surfaceRef.current ?? null, {\n type: \"merge-cells\",\n }),\n onSplitCell: () =>\n applyRuntimeTableStructureOperation(activeRuntime, surfaceRef.current ?? null, {\n type: \"split-cell\",\n }),\n onSetCellBackground: (color) =>\n applyRuntimeTableStructureOperation(activeRuntime, surfaceRef.current ?? null, {\n type: \"set-cell-background\",\n color,\n }),\n onSetImageLayout: (mediaId, dimensions) =>\n applyRuntimeImageResize(activeRuntime, mediaId, dimensions),\n onSetImageFrame: (mediaId, offsets) =>\n applyRuntimeImageReposition(activeRuntime, mediaId, offsets),\n onOpenHeaderStory: () =>\n openDefaultStoryVariant(activeRuntime, snapshot.pageLayout, documentNavigation, \"header\"),\n onOpenFooterStory: () =>\n openDefaultStoryVariant(activeRuntime, snapshot.pageLayout, documentNavigation, \"footer\"),\n onDeleteSectionBreak: (sectionIndex) =>\n applyRuntimeDeleteSectionBreak(activeRuntime, sectionIndex),\n onUpdateSectionLayout: (sectionIndex, patch) =>\n applyRuntimeUpdateSectionLayout(activeRuntime, sectionIndex, patch),\n onSetSectionPageNumbering: (sectionIndex, patch) =>\n applyRuntimeSetSectionPageNumbering(activeRuntime, sectionIndex, patch),\n onSetHeaderFooterLink: (sectionIndex, patch) =>\n applyRuntimeSetHeaderFooterLink(activeRuntime, sectionIndex, patch),\n onSetParagraphIndentation: (indentation) =>\n applyRuntimeParagraphIndentation(activeRuntime, indentation),\n onSetParagraphTabStops: (tabStops) =>\n applyRuntimeParagraphTabStops(activeRuntime, tabStops),\n onRestartNumbering: () =>\n applyRuntimeNumberingFlow(activeRuntime, { type: \"restart\" }),\n onContinueNumbering: () =>\n applyRuntimeNumberingFlow(activeRuntime, { type: \"continue\" }),\n onNavigateHeading: (headingId) => {\n const heading = documentNavigation.headings.find(\n (entry) => entry.headingId === headingId,\n );\n if (!heading) {\n return;\n }\n applyRuntimeSelection(\n activeRuntime,\n createCollapsedPublicSelection(heading.offset),\n );\n },\n });\n\n const documentElement = (\n <EditorSurfaceController\n ref={surfaceRef}\n currentUser={currentUser}\n snapshot={snapshot}\n canonicalDocument={canonicalDocument}\n documentNavigation={documentNavigation}\n reviewMode={reviewMode}\n markupDisplay={liveMarkupDisplay}\n activeRevisionId={activeRevisionId}\n showTrackedChanges={showTrackedChanges}\n suggestionsEnabled={suggestionsEnabled}\n mediaPreviews={mediaPreviews}\n isPageWorkspace={isPageWorkspace}\n workflowScopes={workflowScopeSnapshot?.scopes}\n workflowCandidates={workflowScopeSnapshot?.candidates}\n workflowBlockedReasons={workflowBlockedRails}\n activeWorkflowWorkItemId={workflowScopeSnapshot?.activeWorkItemId ?? null}\n activeWorkflowScopeIds={workflowScopeSnapshot?.activeWorkItem?.scopeIds ?? []}\n onSelectionToolbarAnchorChange={handleSelectionToolbarAnchorChange}\n {...editorCallbacks}\n onCommentActivated={(commentId) => {\n activeRuntime.openComment(commentId);\n setActiveRailTab(\"comments\");\n }}\n onRevisionActivated={(revisionId) => {\n setActiveRevisionId(revisionId);\n setActiveRailTab(\"changes\");\n }}\n />\n );\n\n return (\n <EditorShellView\n shellRef={shellRef}\n documentId={documentId}\n snapshot={snapshot}\n loadError={loadError}\n diagnosticsModeMessage={diagnosticsModeMessage}\n accessibilityInstructionsId={accessibilityInstructionsId}\n accessibilityStatusId={accessibilityStatusId}\n accessibilityAlertId={accessibilityAlertId}\n accessibilityStatusMessage={buildAccessibilityStatusMessage(\n snapshot,\n loadError ?? undefined,\n )}\n visuallyHiddenStyles={VISUALLY_HIDDEN_STYLES}\n onShellKeyDownCapture={handleShellKeyDownCapture}\n viewState={viewState}\n markupDisplay={liveMarkupDisplay}\n currentUserId={currentUser.userId}\n capabilities={capabilities}\n chromeVisibility={resolvedChromeVisibility}\n documentNavigation={documentNavigation}\n reviewMode={reviewMode}\n workspaceMode={viewState.workspaceMode}\n zoomLevel={viewState.zoomLevel}\n formattingState={formattingState}\n styleCatalog={styleCatalog}\n activeRailTab={activeRailTab}\n activeCommentId={snapshot.comments.activeCommentId}\n activeRevisionId={activeRevisionId}\n showTrackedChanges={showTrackedChanges}\n workflowScopeSnapshot={workflowScopeSnapshot}\n interactionGuardSnapshot={interactionGuardSnapshot}\n selectionToolbar={shouldRenderSelectionChrome ? selectionToolbar : null}\n suggestionCard={shouldRenderSelectionChrome ? suggestionCard : null}\n selectionToolbarAnchor={shouldRenderSelectionChrome ? selectionToolbarAnchor : null}\n onAddCommentFromSelection={addSelectionToolbarComment}\n onAddCommentFromSuggestion={addSelectionToolbarComment}\n onAcceptSuggestion={suggestionCard\n ? () => {\n activeRuntime.acceptChange(suggestionCard.revisionId);\n dismissSelectionToolbar(\"chrome-action\");\n }\n : undefined}\n onRejectSuggestion={suggestionCard\n ? () => {\n activeRuntime.rejectChange(suggestionCard.revisionId);\n dismissSelectionToolbar(\"chrome-action\");\n }\n : undefined}\n onEditSuggestion={suggestionCard\n ? () => {\n setSuppressedSuggestionRevisionId(suggestionCard.revisionId);\n }\n : undefined}\n onDismissSelectionToolbar={() => dismissSelectionToolbar(\"chrome-action\")}\n onSelectionToolbarFocusCapture={handleSelectionToolbarFocusCapture}\n onSelectionToolbarBlurCapture={handleSelectionToolbarBlurCapture}\n selectionToolbarRef={selectionToolbarElementRef}\n activeImageContext={activeImageContext}\n activeObjectContext={activeObjectContext}\n commands={commands}\n document={documentElement}\n />\n );\n },\n);\n\nfunction applyRuntimeFormattingOperation(\n runtime: WordReviewEditorRuntime,\n operation:\n | { type: \"toggle\"; mark: \"bold\" | \"italic\" | \"underline\" | \"strikethrough\" | \"superscript\" | \"subscript\" }\n | { type: \"set-font-family\"; fontFamily: string | null }\n | { type: \"set-font-size\"; size: number | null }\n | { type: \"set-text-color\"; color: string | null }\n | { type: \"set-highlight-color\"; color: string | null }\n | { type: \"set-alignment\"; alignment: FormattingAlignment }\n | { type: \"indent\" }\n | { type: \"outdent\" },\n): void {\n if (emitSuggestingUnsupportedMutation(runtime, getFormattingOperationCommandName(operation))) {\n return;\n }\n const context = getStoryMutationContext(runtime, getFormattingOperationCommandName(operation));\n if (!context) {\n return;\n }\n\n const result = applyFormattingOperationToDocument(\n context.localDocument,\n context.localSnapshot,\n operation,\n );\n dispatchStoryMutationResult(\n runtime,\n context,\n {\n ...result,\n selection: toRuntimeSelectionSnapshot(result.selection),\n },\n context.timestamp,\n );\n}\n\nfunction getRuntimeStyleCatalog(\n input:\n | WordReviewEditorRuntime\n | EditorSessionState[\"canonicalDocument\"][\"styles\"],\n): StyleCatalogSnapshot {\n const styles =\n \"getSessionState\" in input\n ? input.getSessionState().canonicalDocument.styles\n : input;\n const mapRecord = <\n T extends {\n styleId: string;\n displayName: string;\n kind: \"paragraph\" | \"character\" | \"table\";\n isDefault: boolean;\n basedOn?: string;\n nextStyle?: string;\n },\n >(\n record: Record<string, T>,\n ) =>\n Object.values(record)\n .map((entry) => ({\n styleId: entry.styleId,\n displayName: entry.displayName,\n kind: entry.kind,\n isDefault: entry.isDefault,\n ...(entry.basedOn ? { basedOn: entry.basedOn } : {}),\n ...(entry.nextStyle ? { nextStyle: entry.nextStyle } : {}),\n }))\n .sort((left, right) =>\n left.displayName.localeCompare(right.displayName) ||\n left.styleId.localeCompare(right.styleId),\n );\n\n return {\n paragraphs: mapRecord(styles.paragraphs),\n characters: mapRecord(styles.characters),\n tables: mapRecord(styles.tables),\n fromPackage: styles.fromPackage === true,\n };\n}\n\nfunction applyRuntimeParagraphStyle(\n runtime: WordReviewEditorRuntime,\n styleId: string | null,\n): void {\n if (emitSuggestingUnsupportedMutation(runtime, \"setParagraphStyle\")) {\n return;\n }\n const context = getStoryMutationContext(runtime, \"setParagraphStyle\");\n if (!context) {\n return;\n }\n\n const result = applyParagraphStyleToDocument(\n context.localDocument,\n context.localSnapshot,\n styleId,\n );\n dispatchStoryMutationResult(\n runtime,\n context,\n {\n ...result,\n selection: toRuntimeSelectionSnapshot(result.selection),\n },\n context.timestamp,\n );\n}\n\nfunction applyRuntimeTableStyle(\n runtime: WordReviewEditorRuntime,\n styleId: string | null,\n): void {\n if (emitSuggestingUnsupportedMutation(runtime, \"setTableStyle\")) {\n return;\n }\n const context = getStoryMutationContext(runtime, \"setTableStyle\");\n if (!context) {\n return;\n }\n\n const result = applyTableStyleToDocument(\n context.localDocument,\n context.localSnapshot,\n styleId,\n );\n dispatchStoryMutationResult(\n runtime,\n context,\n {\n ...result,\n selection: toRuntimeSelectionSnapshot(result.selection),\n },\n context.timestamp,\n );\n}\n\nfunction applyRuntimeParagraphIndentation(\n runtime: WordReviewEditorRuntime,\n indentation: {\n left?: number;\n right?: number;\n firstLine?: number;\n hanging?: number;\n },\n): void {\n if (emitSuggestingUnsupportedMutation(runtime, \"setParagraphIndentation\")) {\n return;\n }\n const context = getStoryMutationContext(runtime, \"setParagraphIndentation\");\n if (!context) {\n return;\n }\n\n const result = setActiveParagraphIndentation(\n context.localDocument,\n context.localSnapshot,\n indentation,\n { timestamp: context.timestamp },\n );\n dispatchStoryMutationResult(\n runtime,\n context,\n {\n ...result,\n selection: toRuntimeSelectionSnapshot(result.selection),\n },\n context.timestamp,\n );\n}\n\nfunction applyRuntimeParagraphTabStops(\n runtime: WordReviewEditorRuntime,\n tabStops: Array<{ pos: number; val?: string; leader?: string }>,\n): void {\n if (emitSuggestingUnsupportedMutation(runtime, \"setParagraphTabStops\")) {\n return;\n }\n const context = getStoryMutationContext(runtime, \"setParagraphTabStops\");\n if (!context) {\n return;\n }\n\n const result = setActiveParagraphTabStops(\n context.localDocument,\n context.localSnapshot,\n tabStops,\n { timestamp: context.timestamp },\n );\n dispatchStoryMutationResult(\n runtime,\n context,\n {\n ...result,\n selection: toRuntimeSelectionSnapshot(result.selection),\n },\n context.timestamp,\n );\n}\n\nfunction applyRuntimeNumberingFlow(\n runtime: WordReviewEditorRuntime,\n operation: { type: \"restart\"; startAt?: number } | { type: \"continue\" },\n): void {\n if (\n emitSuggestingUnsupportedMutation(\n runtime,\n operation.type === \"restart\" ? \"restartNumbering\" : \"continueNumbering\",\n )\n ) {\n return;\n }\n const context = getStoryMutationContext(\n runtime,\n operation.type === \"restart\" ? \"restartNumbering\" : \"continueNumbering\",\n );\n if (!context) {\n return;\n }\n\n const paragraphContext = resolveActiveParagraphContext(context.localSnapshot);\n if (!paragraphContext?.paragraph.numbering) {\n return;\n }\n\n const result =\n operation.type === \"restart\"\n ? restartListNumbering(\n context.localDocument,\n paragraphContext.paragraphIndex,\n { timestamp: context.timestamp },\n operation.startAt,\n )\n : continueListNumbering(\n context.localDocument,\n paragraphContext.paragraphIndex,\n { timestamp: context.timestamp },\n );\n\n dispatchStoryMutationResult(\n runtime,\n context,\n {\n changed: result.affectedParagraphIndexes.length > 0,\n document: result.document,\n selection: toRuntimeSelectionSnapshot(context.localSnapshot.selection),\n },\n context.timestamp,\n );\n}\n\nfunction applyRuntimeInsertSectionBreak(\n runtime: WordReviewEditorRuntime,\n breakType: SectionBreakType,\n options?: { afterSectionIndex?: number },\n): void {\n const snapshot = runtime.getRenderSnapshot();\n if (!canApplyRuntimeMutation(snapshot) || snapshot.activeStory.kind !== \"main\") {\n return;\n }\n if (emitWorkflowBlockedMutation(runtime, \"insertSectionBreak\")) {\n return;\n }\n if (isSelectionSuggesting(runtime)) {\n runtime.emitBlockedCommand(\"insertSectionBreak\", [{\n code: \"unsupported_surface\",\n message: \"Section break insertion is not supported in suggesting mode.\",\n }]);\n return;\n }\n\n const sessionState = runtime.getSessionState();\n const timestamp = new Date().toISOString();\n const result =\n typeof options?.afterSectionIndex === \"number\"\n ? insertSectionBreakAfterSectionIndex(\n sessionState.canonicalDocument,\n options.afterSectionIndex,\n breakType,\n { timestamp },\n )\n : insertSectionBreakAfterSectionIndex(\n sessionState.canonicalDocument,\n runtime.getDocumentNavigationSnapshot().activeSectionIndex,\n breakType,\n { timestamp },\n );\n\n dispatchRuntimeDocumentMutation(\n runtime,\n {\n changed: result.changed,\n document: result.document,\n selection: toRuntimeSelectionSnapshot(result.selection),\n },\n timestamp,\n );\n}\n\nfunction emitSuggestingUnsupportedMutation(\n runtime: WordReviewEditorRuntime,\n command: string,\n): boolean {\n if (!isSelectionSuggesting(runtime)) {\n return false;\n }\n\n runtime.emitBlockedCommand(command, [{\n code: \"suggesting_unsupported\",\n message: `\"${command}\" is not supported in suggesting mode.`,\n }]);\n return true;\n}\n\nfunction isSelectionSuggesting(runtime: WordReviewEditorRuntime): boolean {\n return runtime.getInteractionGuardSnapshot().effectiveMode === \"suggest\";\n}\n\nfunction getFormattingOperationCommandName(\n operation:\n | { type: \"toggle\"; mark: \"bold\" | \"italic\" | \"underline\" | \"strikethrough\" | \"superscript\" | \"subscript\" }\n | { type: \"set-font-family\"; fontFamily: string | null }\n | { type: \"set-font-size\"; size: number | null }\n | { type: \"set-text-color\"; color: string | null }\n | { type: \"set-highlight-color\"; color: string | null }\n | { type: \"set-alignment\"; alignment: FormattingAlignment }\n | { type: \"indent\" }\n | { type: \"outdent\" },\n): string {\n switch (operation.type) {\n case \"toggle\":\n return `toggle${operation.mark.charAt(0).toUpperCase()}${operation.mark.slice(1)}`;\n case \"set-font-family\":\n return \"setFontFamily\";\n case \"set-font-size\":\n return \"setFontSize\";\n case \"set-text-color\":\n return \"setTextColor\";\n case \"set-highlight-color\":\n return \"setHighlightColor\";\n case \"set-alignment\":\n return \"setAlignment\";\n case \"indent\":\n return \"indent\";\n case \"outdent\":\n return \"outdent\";\n }\n}\n\nfunction applyRuntimeDeleteSectionBreak(\n runtime: WordReviewEditorRuntime,\n sectionIndex: number,\n): void {\n const snapshot = runtime.getRenderSnapshot();\n if (!canApplyRuntimeMutation(snapshot) || snapshot.activeStory.kind !== \"main\") {\n return;\n }\n if (emitWorkflowBlockedMutation(runtime, \"deleteSectionBreak\")) {\n return;\n }\n if (isSelectionSuggesting(runtime)) {\n runtime.emitBlockedCommand(\"deleteSectionBreak\", [{\n code: \"unsupported_surface\",\n message: \"Section break deletion is not supported in suggesting mode.\",\n }]);\n return;\n }\n\n const sessionState = runtime.getSessionState();\n const timestamp = new Date().toISOString();\n const result = deleteSectionBreakAtSectionIndex(\n sessionState.canonicalDocument,\n sectionIndex,\n { timestamp },\n );\n\n dispatchRuntimeDocumentMutation(\n runtime,\n {\n changed: result.changed,\n document: result.document,\n selection: toRuntimeSelectionSnapshot(result.selection),\n },\n timestamp,\n );\n}\n\nfunction applyRuntimeUpdateSectionLayout(\n runtime: WordReviewEditorRuntime,\n sectionIndex: number,\n patch: SectionLayoutPatch,\n): void {\n const snapshot = runtime.getRenderSnapshot();\n if (!canApplyRuntimeMutation(snapshot) || snapshot.activeStory.kind !== \"main\") {\n return;\n }\n if (emitWorkflowBlockedMutation(runtime, \"updateSectionLayout\")) {\n return;\n }\n if (isSelectionSuggesting(runtime)) {\n runtime.emitBlockedCommand(\"updateSectionLayout\", [{\n code: \"unsupported_surface\",\n message: \"Section layout updates are not supported in suggesting mode.\",\n }]);\n return;\n }\n\n const sessionState = runtime.getSessionState();\n const timestamp = new Date().toISOString();\n const result = updateSectionLayoutAtSectionIndex(\n sessionState.canonicalDocument,\n sectionIndex,\n {\n ...(patch.pageSize ? { pageSize: patch.pageSize } : {}),\n ...(patch.pageMargins ? { pageMargins: patch.pageMargins } : {}),\n ...(patch.columns ? { columns: patch.columns } : {}),\n ...(patch.titlePage !== undefined ? { titlePage: patch.titlePage } : {}),\n ...(patch.sectionType ? { sectionType: patch.sectionType } : {}),\n },\n { timestamp },\n );\n\n dispatchRuntimeDocumentMutation(\n runtime,\n {\n changed: result.changed,\n document: result.document,\n selection: toRuntimeSelectionSnapshot(result.selection),\n },\n timestamp,\n );\n}\n\nfunction applyRuntimeSetSectionPageNumbering(\n runtime: WordReviewEditorRuntime,\n sectionIndex: number,\n patch: SectionPageNumberingPatch | null,\n): void {\n const snapshot = runtime.getRenderSnapshot();\n if (!canApplyRuntimeMutation(snapshot) || snapshot.activeStory.kind !== \"main\") {\n return;\n }\n if (emitWorkflowBlockedMutation(runtime, \"setSectionPageNumbering\")) {\n return;\n }\n if (isSelectionSuggesting(runtime)) {\n runtime.emitBlockedCommand(\"setSectionPageNumbering\", [{\n code: \"unsupported_surface\",\n message: \"Section page numbering updates are not supported in suggesting mode.\",\n }]);\n return;\n }\n\n const sessionState = runtime.getSessionState();\n const timestamp = new Date().toISOString();\n const normalizedPatch =\n patch === null\n ? null\n : {\n ...(patch.format !== undefined\n ? { format: patch.format ?? undefined }\n : {}),\n ...(patch.start !== undefined\n ? { start: patch.start ?? undefined }\n : {}),\n ...(patch.chapterStyle !== undefined\n ? { chapStyle: patch.chapterStyle ?? undefined }\n : {}),\n ...(patch.chapterSeparator !== undefined\n ? { chapSep: patch.chapterSeparator ?? undefined }\n : {}),\n };\n const result = setSectionPageNumberingAtSectionIndex(\n sessionState.canonicalDocument,\n sectionIndex,\n normalizedPatch,\n { timestamp },\n );\n\n dispatchRuntimeDocumentMutation(\n runtime,\n {\n changed: result.changed,\n document: result.document,\n selection: toRuntimeSelectionSnapshot(result.selection),\n },\n timestamp,\n );\n}\n\nfunction applyRuntimeSetHeaderFooterLink(\n runtime: WordReviewEditorRuntime,\n sectionIndex: number,\n patch: HeaderFooterLinkPatch,\n): void {\n const snapshot = runtime.getRenderSnapshot();\n if (!canApplyRuntimeMutation(snapshot) || snapshot.activeStory.kind !== \"main\") {\n return;\n }\n if (emitWorkflowBlockedMutation(runtime, \"setHeaderFooterLink\")) {\n return;\n }\n if (isSelectionSuggesting(runtime)) {\n runtime.emitBlockedCommand(\"setHeaderFooterLink\", [{\n code: \"unsupported_surface\",\n message: \"Header and footer linkage updates are not supported in suggesting mode.\",\n }]);\n return;\n }\n\n const sessionState = runtime.getSessionState();\n const timestamp = new Date().toISOString();\n const result = setHeaderFooterLinkAtSectionIndex(\n sessionState.canonicalDocument,\n sectionIndex,\n patch,\n { timestamp },\n );\n\n dispatchRuntimeDocumentMutation(\n runtime,\n {\n changed: result.changed,\n document: result.document,\n selection: toRuntimeSelectionSnapshot(result.selection),\n },\n timestamp,\n );\n}\n\nfunction applyRuntimeInsertPageBreak(runtime: WordReviewEditorRuntime): void {\n if (isSelectionSuggesting(runtime)) {\n runtime.emitBlockedCommand(\"insertPageBreak\", [{\n code: \"unsupported_surface\",\n message: \"Page break insertion is not supported in suggesting mode.\",\n }]);\n return;\n }\n const context = getStoryMutationContext(runtime, \"insertPageBreak\");\n if (!context) {\n return;\n }\n\n const result = insertPageBreakInDocument(\n context.localDocument,\n toRuntimeSelectionSnapshot(context.localSnapshot.selection),\n { timestamp: context.timestamp },\n );\n dispatchStoryMutationResult(runtime, context, result, context.timestamp);\n}\n\nfunction applyRuntimeInsertTable(\n runtime: WordReviewEditorRuntime,\n options: InsertTableOptions,\n): void {\n if (isSelectionSuggesting(runtime)) {\n runtime.emitBlockedCommand(\"insertTable\", [{\n code: \"unsupported_surface\",\n message: \"Table insertion is not supported in suggesting mode.\",\n }]);\n return;\n }\n const context = getStoryMutationContext(runtime, \"insertTable\");\n if (!context) {\n return;\n }\n\n const result = insertTableInDocument(\n context.localDocument,\n toRuntimeSelectionSnapshot(context.localSnapshot.selection),\n options,\n { timestamp: context.timestamp },\n );\n dispatchStoryMutationResult(runtime, context, result, context.timestamp);\n}\n\nfunction applyRuntimeInsertImage(\n runtime: WordReviewEditorRuntime,\n options: InsertImageOptions,\n): void {\n if (isSelectionSuggesting(runtime)) {\n runtime.emitBlockedCommand(\"insertImage\", [{\n code: \"unsupported_surface\",\n message: \"Image insertion is not supported in suggesting mode.\",\n }]);\n return;\n }\n const context = getStoryMutationContext(runtime, \"insertImage\");\n if (!context) {\n return;\n }\n\n try {\n const result = insertImageInDocument(\n context.localDocument,\n toRuntimeSelectionSnapshot(context.localSnapshot.selection),\n options.data,\n options.mimeType,\n options.width,\n options.height,\n {\n timestamp: context.timestamp,\n altText: options.altText,\n },\n );\n dispatchStoryMutationResult(runtime, context, {\n changed: true,\n document: result.document,\n selection: result.selection,\n mapping: result.mapping,\n }, context.timestamp);\n } catch {\n return;\n }\n}\n\nfunction applyRuntimeImageResize(\n runtime: WordReviewEditorRuntime,\n mediaId: string,\n dimensions: { widthEmu: number; heightEmu: number },\n): void {\n const snapshot = runtime.getRenderSnapshot();\n if (!canApplyRuntimeMutation(snapshot)) {\n return;\n }\n if (emitWorkflowBlockedMutation(runtime, \"setImageLayout\")) {\n return;\n }\n if (isSelectionSuggesting(runtime)) {\n runtime.emitBlockedCommand(\"setImageLayout\", [{\n code: \"unsupported_surface\",\n message: \"Image resize is not supported in suggesting mode.\",\n }]);\n return;\n }\n\n try {\n const sessionState = runtime.getSessionState();\n const result = resizeImageInCatalog(\n sessionState.canonicalDocument,\n mediaId,\n dimensions,\n );\n runtime.dispatch({\n type: \"document.replace\",\n document: result.document,\n selection: toRuntimeSelectionSnapshot(snapshot.selection),\n origin: { source: \"api\", timestamp: new Date().toISOString() },\n });\n } catch {\n return;\n }\n}\n\nfunction applyRuntimeImageReposition(\n runtime: WordReviewEditorRuntime,\n mediaId: string,\n offsets: { horizontalOffsetEmu?: number; verticalOffsetEmu?: number },\n): void {\n if (emitWorkflowBlockedMutation(runtime, \"setImageFrame\")) {\n return;\n }\n if (isSelectionSuggesting(runtime)) {\n runtime.emitBlockedCommand(\"setImageFrame\", [{\n code: \"unsupported_surface\",\n message: \"Image reposition is not supported in suggesting mode.\",\n }]);\n return;\n }\n const context = getStoryMutationContext(runtime, \"setImageFrame\");\n if (!context) {\n return;\n }\n\n try {\n const result = repositionFloatingImageInDocument(\n context.localDocument,\n mediaId,\n offsets,\n context.timestamp,\n );\n dispatchStoryMutationResult(\n runtime,\n context,\n {\n changed: true,\n document: result.document,\n selection: toRuntimeSelectionSnapshot(context.localSnapshot.selection),\n },\n context.timestamp,\n );\n } catch {\n return;\n }\n}\n\n// deriveViewState removed — the runtime's getViewState() is now the single\n// source of truth for EditorViewStateSnapshot, backed by view-state.ts.\n\nfunction applyRuntimeTableStructureOperation(\n runtime: WordReviewEditorRuntime,\n mountedSurface: TwProseMirrorSurfaceRef | null | undefined,\n operation:\n | { type: \"add-row-before\" }\n | { type: \"add-row-after\" }\n | { type: \"add-column-before\" }\n | { type: \"add-column-after\" }\n | { type: \"delete-row\" }\n | { type: \"delete-column\" }\n | { type: \"delete-table\" }\n | { type: \"merge-cells\" }\n | { type: \"split-cell\" }\n | { type: \"set-cell-background\"; color: string },\n): void {\n if (isSelectionSuggesting(runtime)) {\n runtime.emitBlockedCommand(`table.${operation.type}`, [{\n code: \"unsupported_surface\",\n message: `Table operation \"${operation.type}\" is not supported in suggesting mode.`,\n }]);\n return;\n }\n const context = getStoryMutationContext(runtime, `table.${operation.type}`);\n if (!context) {\n return;\n }\n\n const result = applyTableStructureOperation(\n context.localDocument,\n context.localSnapshot,\n mountedSurface?.getTableSelection() ?? null,\n operation,\n );\n dispatchStoryMutationResult(runtime, context, result, context.timestamp);\n}\n\nfunction applyRuntimeTextCommand(\n runtime: WordReviewEditorRuntime,\n command:\n | { type: \"insert-text\"; text: string }\n | { type: \"delete-backward\" }\n | { type: \"delete-forward\" }\n | { type: \"insert-tab\" }\n | { type: \"outdent-tab\" }\n | { type: \"insert-hard-break\" }\n | { type: \"split-paragraph\" },\n): void {\n const snapshot = runtime.getRenderSnapshot();\n const context = getStoryMutationContext(runtime, getMountedTextCommandName(command));\n if (!context) {\n return;\n }\n\n const effectiveSelectionMode = runtime.getInteractionGuardSnapshot().effectiveMode;\n const listAwareResult = applyListAwareTextCommand(context, command);\n if (effectiveSelectionMode === \"suggest\" && listAwareResult) {\n runtime.emitBlockedCommand(getMountedTextCommandName(command), [{\n code: \"suggesting_unsupported\",\n message: \"List structure changes are not supported in suggesting mode.\",\n }]);\n return;\n }\n\n if (listAwareResult) {\n dispatchStoryMutationResult(runtime, context, listAwareResult, context.timestamp);\n return;\n }\n\n switch (command.type) {\n case \"insert-text\":\n runtime.applyActiveStoryTextCommand({ type: \"text.insert\", text: command.text });\n return;\n case \"delete-backward\":\n runtime.applyActiveStoryTextCommand({ type: \"text.delete-backward\" });\n return;\n case \"delete-forward\":\n runtime.applyActiveStoryTextCommand({ type: \"text.delete-forward\" });\n return;\n case \"insert-tab\":\n runtime.applyActiveStoryTextCommand({ type: \"text.insert-tab\" });\n return;\n case \"outdent-tab\":\n return;\n case \"insert-hard-break\":\n runtime.applyActiveStoryTextCommand({ type: \"text.insert-hard-break\" });\n return;\n case \"split-paragraph\":\n runtime.applyActiveStoryTextCommand({ type: \"paragraph.split\" });\n return;\n }\n}\n\nfunction getMountedTextCommandName(\n command:\n | { type: \"insert-text\"; text: string }\n | { type: \"delete-backward\" }\n | { type: \"delete-forward\" }\n | { type: \"insert-tab\" }\n | { type: \"outdent-tab\" }\n | { type: \"insert-hard-break\" }\n | { type: \"split-paragraph\" },\n): string {\n switch (command.type) {\n case \"insert-text\":\n return \"text.insert\";\n case \"delete-backward\":\n return \"text.delete-backward\";\n case \"delete-forward\":\n return \"text.delete-forward\";\n case \"insert-tab\":\n case \"outdent-tab\":\n return \"text.insert-tab\";\n case \"insert-hard-break\":\n return \"text.insert-hard-break\";\n case \"split-paragraph\":\n return \"paragraph.split\";\n }\n}\n\nfunction applyListAwareTextCommand(\n context: NonNullable<ReturnType<typeof getStoryMutationContext>>,\n command:\n | { type: \"insert-text\"; text: string }\n | { type: \"delete-backward\" }\n | { type: \"delete-forward\" }\n | { type: \"insert-tab\" }\n | { type: \"outdent-tab\" }\n | { type: \"insert-hard-break\" }\n | { type: \"split-paragraph\" },\n): {\n changed: boolean;\n document: EditorSessionState[\"canonicalDocument\"];\n selection: InternalSelectionSnapshot;\n} | null {\n const paragraphContext = resolveActiveParagraphContext(context.localSnapshot);\n if (!paragraphContext?.paragraph.numbering) {\n return null;\n }\n\n switch (command.type) {\n case \"insert-tab\": {\n const result = indentListItems(\n context.localDocument,\n [paragraphContext.paragraphIndex],\n { timestamp: context.timestamp },\n );\n return createListMutationResult(result, context.localSnapshot.selection);\n }\n case \"outdent-tab\": {\n const result = outdentListItems(\n context.localDocument,\n [paragraphContext.paragraphIndex],\n { timestamp: context.timestamp },\n );\n return createListMutationResult(result, context.localSnapshot.selection);\n }\n case \"delete-backward\": {\n if (!paragraphContext.atParagraphStart || !context.localSnapshot.selection.isCollapsed) {\n return null;\n }\n const result = backspaceAtListStart(\n context.localDocument,\n paragraphContext.paragraphIndex,\n { timestamp: context.timestamp },\n );\n return result.handled\n ? createListMutationResult(result, context.localSnapshot.selection)\n : null;\n }\n case \"split-paragraph\": {\n if (!context.localSnapshot.selection.isCollapsed || !paragraphContext.isEmpty) {\n return null;\n }\n const result = splitListParagraph(\n context.localDocument,\n paragraphContext.paragraphIndex,\n true,\n { timestamp: context.timestamp },\n );\n return result.action === \"split\"\n ? null\n : createListMutationResult(result, context.localSnapshot.selection);\n }\n default:\n return null;\n }\n}\n\nfunction createListMutationResult(\n result: {\n document: EditorSessionState[\"canonicalDocument\"];\n affectedParagraphIndexes: number[];\n },\n selection: RuntimeRenderSnapshot[\"selection\"],\n): {\n changed: boolean;\n document: EditorSessionState[\"canonicalDocument\"];\n selection: InternalSelectionSnapshot;\n} {\n return {\n changed: result.affectedParagraphIndexes.length > 0,\n document: result.document,\n selection: toRuntimeSelectionSnapshot(selection),\n };\n}\n\nfunction resolveActiveParagraphContext(\n snapshot: Pick<RuntimeRenderSnapshot, \"surface\" | \"selection\">,\n): {\n paragraphIndex: number;\n paragraph: Extract<SurfaceBlockSnapshot, { kind: \"paragraph\" }>;\n atParagraphStart: boolean;\n isEmpty: boolean;\n} | null {\n if (!snapshot.surface) {\n return null;\n }\n\n const paragraphIndex = resolveActiveParagraphIndex(\n snapshot.surface.blocks,\n snapshot.selection,\n );\n if (paragraphIndex === null) {\n return null;\n }\n\n const selectionPosition =\n snapshot.selection.activeRange.kind === \"node\"\n ? snapshot.selection.activeRange.at\n : snapshot.selection.head;\n const paragraph = findSurfaceParagraphAtPosition(snapshot.surface.blocks, selectionPosition);\n if (!paragraph) {\n return null;\n }\n\n return {\n paragraphIndex,\n paragraph,\n atParagraphStart:\n snapshot.selection.isCollapsed &&\n snapshot.selection.activeRange.kind !== \"node\" &&\n snapshot.selection.anchor === snapshot.selection.head &&\n snapshot.selection.head === paragraph.from,\n isEmpty: isSurfaceParagraphEmpty(paragraph),\n };\n}\n\nfunction findSurfaceParagraphAtPosition(\n blocks: readonly SurfaceBlockSnapshot[],\n position: number,\n): Extract<SurfaceBlockSnapshot, { kind: \"paragraph\" }> | null {\n for (const block of blocks) {\n if (position < block.from || position > block.to) {\n continue;\n }\n if (block.kind === \"paragraph\") {\n return block;\n }\n if (block.kind === \"table\") {\n for (const row of block.rows) {\n for (const cell of row.cells) {\n const paragraph = findSurfaceParagraphAtPosition(cell.content, position);\n if (paragraph) {\n return paragraph;\n }\n }\n }\n continue;\n }\n if (block.kind === \"sdt_block\") {\n const paragraph = findSurfaceParagraphAtPosition(block.children, position);\n if (paragraph) {\n return paragraph;\n }\n }\n }\n return null;\n}\n\nfunction isSurfaceParagraphEmpty(\n paragraph: Extract<SurfaceBlockSnapshot, { kind: \"paragraph\" }>,\n): boolean {\n if (paragraph.segments.length === 0) {\n return true;\n }\n return paragraph.segments.every((segment) => segment.kind === \"text\" && segment.text.length === 0);\n}\n\nfunction applyRuntimeSelection(\n runtime: WordReviewEditorRuntime,\n selection: PublicSelectionSnapshot,\n): void {\n const requestedStory = selection.storyTarget ?? { kind: \"main\" };\n if (requestedStory.kind === \"main\") {\n runtime.closeStory();\n } else if (!storyTargetsEqual(runtime.getActiveStory(), requestedStory)) {\n if (!runtime.openStory(requestedStory)) {\n return;\n }\n }\n\n runtime.dispatch({\n type: \"selection.set\",\n selection: toRuntimeSelectionSnapshot(stripStoryTarget(selection)),\n });\n}\n\nfunction canApplyRuntimeMutation(snapshot: RuntimeRenderSnapshot): boolean {\n return snapshot.isReady && !snapshot.readOnly && !snapshot.fatalError;\n}\n\nfunction emitWorkflowBlockedMutation(\n runtime: WordReviewEditorRuntime,\n command: string,\n): boolean {\n const interactionGuardSnapshot = runtime.getInteractionGuardSnapshot();\n if (interactionGuardSnapshot.blockedReasons.length === 0) {\n return false;\n }\n runtime.emitBlockedCommand(command, interactionGuardSnapshot.blockedReasons);\n return true;\n}\n\nfunction getStoryMutationContext(\n runtime: WordReviewEditorRuntime,\n command?: string,\n): {\n timestamp: string;\n activeStory: EditorStoryTarget;\n persistedDocument: EditorSessionState[\"canonicalDocument\"];\n localDocument: EditorSessionState[\"canonicalDocument\"];\n localSnapshot: RuntimeRenderSnapshot;\n} | null {\n const snapshot = runtime.getRenderSnapshot();\n if (!canApplyRuntimeMutation(snapshot)) {\n return null;\n }\n if (command && emitWorkflowBlockedMutation(runtime, command)) {\n return null;\n }\n\n const persistedDocument = runtime.getSessionState().canonicalDocument;\n const activeStory = snapshot.activeStory;\n if (activeStory.kind === \"main\") {\n return {\n timestamp: new Date().toISOString(),\n activeStory,\n persistedDocument,\n localDocument: persistedDocument,\n localSnapshot: snapshot,\n };\n }\n\n return {\n timestamp: new Date().toISOString(),\n activeStory,\n persistedDocument,\n localDocument: {\n ...persistedDocument,\n content: {\n type: \"doc\",\n children: [...getStoryBlocks(persistedDocument, activeStory)],\n },\n },\n localSnapshot: {\n ...snapshot,\n activeStory: { kind: \"main\" },\n selection: stripStoryTarget(snapshot.selection),\n },\n };\n}\n\nfunction dispatchStoryMutationResult(\n runtime: WordReviewEditorRuntime,\n context: {\n activeStory: EditorStoryTarget;\n persistedDocument: EditorSessionState[\"canonicalDocument\"];\n },\n result: {\n changed: boolean;\n document: EditorSessionState[\"canonicalDocument\"];\n selection: InternalSelectionSnapshot;\n mapping?: TransactionMapping;\n },\n timestamp: string,\n): void {\n if (context.activeStory.kind === \"main\") {\n dispatchRuntimeDocumentMutation(runtime, result, timestamp);\n return;\n }\n\n if (!result.changed) {\n return;\n }\n\n const nextDocument = replaceStoryBlocks(\n context.persistedDocument,\n context.activeStory,\n result.document.content.children,\n );\n dispatchRuntimeDocumentMutation(\n runtime,\n {\n changed: true,\n document: nextDocument,\n selection: result.selection,\n },\n timestamp,\n );\n}\n\nfunction dispatchRuntimeDocumentMutation(\n runtime: WordReviewEditorRuntime,\n result: {\n changed: boolean;\n document: EditorSessionState[\"canonicalDocument\"];\n selection: InternalSelectionSnapshot;\n mapping?: TransactionMapping;\n },\n timestamp: string,\n): void {\n if (!result.changed) {\n return;\n }\n\n runtime.dispatch({\n type: \"document.replace\",\n document: {\n ...result.document,\n updatedAt: timestamp,\n },\n mapping: result.mapping,\n selection: result.selection,\n origin: {\n source: \"api\",\n timestamp,\n },\n });\n}\n\nfunction stripStoryTarget(\n selection: PublicSelectionSnapshot,\n): PublicSelectionSnapshot {\n const { storyTarget: _storyTarget, ...rest } = selection;\n return rest;\n}\n\nfunction applyRuntimeDeleteComment(\n runtime: WordReviewEditorRuntime,\n commentId: string,\n): void {\n const snapshot = runtime.getRenderSnapshot();\n if (!snapshot.isReady || snapshot.readOnly || snapshot.fatalError) {\n return;\n }\n\n const sessionState = runtime.getSessionState();\n if (!sessionState.canonicalDocument.review.comments[commentId]) {\n return;\n }\n\n const nextComments = {\n ...sessionState.canonicalDocument.review.comments,\n };\n delete nextComments[commentId];\n\n runtime.dispatch({\n type: \"document.replace\",\n document: {\n ...sessionState.canonicalDocument,\n review: {\n ...sessionState.canonicalDocument.review,\n comments: nextComments,\n },\n },\n selection: toRuntimeSelectionSnapshot(snapshot.selection),\n origin: {\n source: \"api\",\n timestamp: new Date().toISOString(),\n },\n });\n}\n\nfunction normalizeRequestedSelection(\n snapshot: RuntimeRenderSnapshot,\n selection: PublicSelectionSnapshot | null,\n): PublicSelectionSnapshot {\n return (\n selection ??\n createCollapsedPublicSelection(\n snapshot.selection.head,\n snapshot.activeStory.kind === \"main\" ? undefined : snapshot.activeStory,\n )\n );\n}\n\nexport function __resolveLiveMarkupDisplay(\n requested: MarkupDisplay | undefined,\n isPageWorkspace: boolean,\n): MarkupDisplay {\n return requested ?? (isPageWorkspace ? \"all\" : \"clean\");\n}\n\nfunction createCollapsedPublicSelection(\n position: number,\n storyTarget?: EditorStoryTarget,\n): PublicSelectionSnapshot {\n return {\n anchor: position,\n head: position,\n isCollapsed: true,\n activeRange: {\n kind: \"range\",\n from: position,\n to: position,\n assoc: {\n start: -1,\n end: 1,\n },\n },\n ...(storyTarget ? { storyTarget } : {}),\n };\n}\n\nfunction clonePublicValue<T>(value: T): T {\n return structuredClone(value);\n}\n\nfunction openDefaultStoryVariant(\n runtime: WordReviewEditorRuntime,\n pageLayout: PageLayoutSnapshot | undefined,\n navigation: ReturnType<WordReviewEditorRuntime[\"getDocumentNavigationSnapshot\"]> | undefined,\n kind: \"header\" | \"footer\",\n): void {\n const variants =\n kind === \"header\"\n ? pageLayout?.headerVariants\n : pageLayout?.footerVariants;\n const activePage = navigation?.pages[navigation.activePageIndex];\n const isFirstPageInSection =\n activePage !== undefined &&\n activePage.sectionIndex === pageLayout?.sectionIndex &&\n activePage.pageInSection === 0;\n const isEvenDocumentPage = activePage !== undefined && (activePage.pageIndex + 1) % 2 === 0;\n\n let variant =\n pageLayout?.differentFirstPage && isFirstPageInSection\n ? variants?.find((entry) => entry.variant === \"first\")\n : undefined;\n\n if (!variant && pageLayout?.differentOddEvenPages && isEvenDocumentPage) {\n variant = variants?.find((entry) => entry.variant === \"even\");\n }\n\n if (!variant) {\n variant = variants?.find((entry) => entry.variant === \"default\") ?? variants?.[0];\n }\n\n if (!variant) {\n return;\n }\n runtime.openStory({\n kind,\n relationshipId: variant.relationshipId,\n variant: variant.variant,\n sectionIndex: pageLayout?.sectionIndex,\n });\n}\n\nfunction searchRuntimeDocument(\n runtime: WordReviewEditorRuntime,\n mountedSurface: TwProseMirrorSurfaceRef | null,\n query: string,\n options: SearchOptions = {},\n): SearchResultSnapshot[] {\n if (mountedSurface) {\n return mountedSurface.search(query, options);\n }\n\n const snapshot = runtime.getRenderSnapshot();\n return searchDocument(\n runtime.getSessionState().canonicalDocument,\n snapshot.selection,\n snapshot.activeStory,\n runtime.getDocumentNavigationSnapshot(),\n query,\n options,\n );\n}\n\nfunction applyRegionAttributes(shell: HTMLElement): void {\n const toolbar = shell.querySelector<HTMLElement>(\"header\");\n if (toolbar) {\n toolbar.dataset.wreRegion = \"toolbar\";\n toolbar.setAttribute(\"role\", toolbar.getAttribute(\"role\") ?? \"toolbar\");\n toolbar.setAttribute(\"aria-label\", toolbar.getAttribute(\"aria-label\") ?? \"Editor toolbar\");\n toolbar.tabIndex = -1;\n }\n\n const documentSurface = shell.querySelector<HTMLElement>('[aria-label=\"Document surface\"]');\n if (documentSurface) {\n documentSurface.dataset.wreRegion = \"document\";\n }\n\n const reviewRail = shell.querySelector<HTMLElement>('[aria-label=\"Review rail\"]');\n if (reviewRail) {\n reviewRail.dataset.wreRegion = \"review-rail\";\n reviewRail.tabIndex = -1;\n }\n\n const statusBar = shell.querySelector<HTMLElement>(\"footer\");\n if (statusBar) {\n statusBar.dataset.wreRegion = \"status\";\n statusBar.setAttribute(\"role\", statusBar.getAttribute(\"role\") ?? \"status\");\n statusBar.setAttribute(\"aria-label\", statusBar.getAttribute(\"aria-label\") ?? \"Editor status bar\");\n statusBar.tabIndex = -1;\n }\n}\n\nfunction focusRelativeRegion(shell: HTMLElement, direction: -1 | 1): void {\n const activeRegion = getActiveRegionId(shell);\n const startIndex =\n activeRegion === null ? (direction === 1 ? -1 : 0) : ACCESSIBLE_REGION_ORDER.indexOf(activeRegion);\n\n for (let offset = 1; offset <= ACCESSIBLE_REGION_ORDER.length; offset += 1) {\n const index =\n (startIndex + direction * offset + ACCESSIBLE_REGION_ORDER.length) %\n ACCESSIBLE_REGION_ORDER.length;\n const regionId = ACCESSIBLE_REGION_ORDER[index];\n const target = findRegionFocusTarget(shell, regionId);\n if (target) {\n target.focus();\n return;\n }\n }\n}\n\nfunction getActiveRegionId(shell: HTMLElement): AccessibleRegionId | null {\n const activeElement = shell.ownerDocument.activeElement;\n if (!(activeElement instanceof HTMLElement)) {\n return null;\n }\n\n const region = activeElement.closest<HTMLElement>(\"[data-wre-region]\");\n const regionId = region?.dataset.wreRegion;\n return isAccessibleRegionId(regionId) ? regionId : null;\n}\n\nfunction findRegionFocusTarget(\n shell: HTMLElement,\n regionId: AccessibleRegionId,\n): HTMLElement | null {\n const region = shell.querySelector<HTMLElement>(`[data-wre-region=\"${regionId}\"]`);\n if (!region) {\n return null;\n }\n\n if (regionId === \"document\" || regionId === \"toolbar\" || regionId === \"review-rail\" || regionId === \"status\") {\n return region;\n }\n\n return null;\n}\n\nfunction isAccessibleRegionId(value: string | undefined): value is AccessibleRegionId {\n return value === \"toolbar\" || value === \"document\" || value === \"review-rail\" || value === \"status\";\n}\n\nfunction buildAccessibilityStatusMessage(\n snapshot: RuntimeRenderSnapshot,\n loadError?: EditorError,\n): string {\n if (loadError) {\n return `Editor failed to load. ${loadError.message}`;\n }\n\n if (!snapshot.isReady) {\n return \"Editor loading. Document surface is not ready yet.\";\n }\n\n if (snapshot.fatalError) {\n return `Editor opened in diagnostics mode. ${snapshot.fatalError.message}`;\n }\n\n return [\n snapshot.readOnly ? \"Read-only mode.\" : \"Editing enabled.\",\n `${snapshot.comments.totalCount} comment${snapshot.comments.totalCount === 1 ? \"\" : \"s\"}.`,\n `${snapshot.trackedChanges.totalCount} tracked change${\n snapshot.trackedChanges.totalCount === 1 ? \"\" : \"s\"\n }.`,\n snapshot.compatibility.blockExport ? \"Export blocked.\" : \"Export available.\",\n ].join(\" \");\n}\n\nfunction getDiagnosticsModeMessage(error?: EditorError | null): string | null {\n if (!error) {\n return null;\n }\n\n if (error.code === \"package_corrupt\") {\n return `${error.message} The document opened in read-only diagnostics mode so you can inspect the issue safely, but editing and export stay blocked until you reload a valid .docx package.`;\n }\n\n if (error.code === \"validation_failed\") {\n return `${error.message} The document opened in read-only diagnostics mode because OOXML validation failed, so editing and export stay blocked until the source package is repaired.`;\n }\n\n return error.isFatal ? error.message : null;\n}\n\nfunction normalizeEditorError(error: unknown): EditorError {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"errorId\" in error &&\n \"code\" in error &&\n \"message\" in error\n ) {\n return error as EditorError;\n }\n\n return {\n errorId: \"word-review-editor-load\",\n code: \"internal_invariant\",\n message: error instanceof Error ? error.message : \"Unknown editor load failure.\",\n isFatal: true,\n source: \"runtime\",\n };\n}\n\nfunction guessSourceLabel(\n initialSourceLabel?: string,\n initialSessionState?: EditorSessionState,\n initialSnapshot?: PersistedEditorSnapshot,\n externalDocSource?: WordReviewEditorProps[\"externalDocSource\"],\n): string | undefined {\n return (\n externalDocSource?.sourceLabel ??\n (externalDocSource?.kind === \"session\"\n ? externalDocSource.sessionState.sourcePackage?.sourceLabel\n : undefined) ??\n (externalDocSource?.kind === \"snapshot\"\n ? externalDocSource.snapshot.sourcePackage?.sourceLabel\n : undefined) ??\n initialSourceLabel ??\n initialSessionState?.sourcePackage?.sourceLabel ??\n initialSessionState?.editorBuild ??\n initialSnapshot?.sourcePackage?.sourceLabel ??\n initialSnapshot?.editorBuild ??\n undefined\n );\n}\n\nfunction deriveEditorViewMode(\n readOnly: boolean,\n reviewMode: WordReviewEditorProps[\"reviewMode\"] = \"review\",\n): EditorViewMode {\n if (readOnly) {\n return \"view\";\n }\n return reviewMode === \"editing\" ? \"editing\" : \"review\";\n}\n\nfunction resolveWordReviewEditorChromeVisibility(\n chromeVisibility: WordReviewEditorProps[\"chromeVisibility\"],\n showReviewPanel: boolean,\n): Partial<WordReviewEditorChromeVisibility> {\n const legacyVisibility =\n showReviewPanel\n ? {}\n : { reviewRail: false } satisfies Partial<WordReviewEditorChromeVisibility>;\n return {\n ...legacyVisibility,\n ...chromeVisibility,\n };\n}\n\nfunction toRuntimeSelectionSnapshot(selection: PublicSelectionSnapshot) {\n return {\n anchor: selection.anchor,\n head: selection.head,\n isCollapsed: selection.isCollapsed,\n activeRange:\n selection.activeRange.kind === \"range\"\n ? createRangeAnchor(\n selection.activeRange.from,\n selection.activeRange.to,\n selection.activeRange.assoc,\n )\n : selection.activeRange.kind === \"node\"\n ? createNodeAnchor(selection.activeRange.at, selection.activeRange.assoc)\n : createDetachedAnchor(\n selection.activeRange.lastKnownRange,\n selection.activeRange.reason,\n ),\n };\n}\n\nfunction createSelectionFromAnchor(\n anchor: PublicSelectionSnapshot[\"activeRange\"],\n storyTarget?: EditorStoryTarget,\n): PublicSelectionSnapshot {\n switch (anchor.kind) {\n case \"range\":\n return {\n anchor: anchor.from,\n head: anchor.to,\n isCollapsed: anchor.from === anchor.to,\n activeRange: anchor,\n ...(storyTarget ? { storyTarget } : {}),\n };\n case \"node\":\n return {\n anchor: anchor.at,\n head: anchor.at,\n isCollapsed: true,\n activeRange: anchor,\n ...(storyTarget ? { storyTarget } : {}),\n };\n case \"detached\":\n return {\n anchor: anchor.lastKnownRange.from,\n head: anchor.lastKnownRange.to,\n isCollapsed: anchor.lastKnownRange.from === anchor.lastKnownRange.to,\n activeRange: anchor,\n ...(storyTarget ? { storyTarget } : {}),\n };\n }\n}\n\nfunction estimateStoryLength(\n sessionStateOrSnapshot?: EditorSessionState | PersistedEditorSnapshot,\n): number {\n if (!sessionStateOrSnapshot) {\n return 0;\n }\n\n const content = \"sessionVersion\" in sessionStateOrSnapshot\n ? sessionStateOrSnapshot.canonicalDocument.content\n : sessionStateOrSnapshot.canonicalDocument.content;\n return Array.isArray(content?.children) ? content.children.length : 0;\n}\n\nfunction collapsedSelection(): RuntimeRenderSnapshot[\"selection\"] {\n return {\n anchor: 0,\n head: 0,\n isCollapsed: true,\n activeRange: {\n kind: \"range\",\n from: 0,\n to: 0,\n assoc: {\n start: -1,\n end: 1,\n },\n },\n };\n}\n\nfunction toUint8Array(bytes: Uint8Array | ArrayBuffer): Uint8Array {\n return bytes instanceof Uint8Array ? new Uint8Array(bytes) : new Uint8Array(bytes);\n}\n\nfunction summarizeSelectionPreview(snapshot: RuntimeRenderSnapshot): string | null {\n if (!snapshot.surface || snapshot.selection.isCollapsed) {\n return null;\n }\n\n const range = snapshot.selection.activeRange;\n if (range.kind !== \"range\") {\n return \"Selected range\";\n }\n\n const preview = snapshot.surface.plainText\n .slice(range.from, range.to)\n .replace(/\\s+/g, \" \")\n .trim();\n\n if (!preview) {\n return \"Selected range\";\n }\n\n return preview.length > 48 ? `${preview.slice(0, 45)}...` : preview;\n}\n\nfunction selectionToolbarAnchorsEqual(\n left: SelectionToolbarAnchor | null,\n right: SelectionToolbarAnchor | null,\n): boolean {\n if (left === right) {\n return true;\n }\n if (!left || !right) {\n return false;\n }\n return (\n left.left === right.left &&\n left.right === right.right &&\n left.top === right.top &&\n left.bottom === right.bottom\n );\n}\n\nfunction workflowScopeSnapshotsEqual(\n left: WorkflowScopeSnapshot | null,\n right: WorkflowScopeSnapshot | null,\n): boolean {\n if (left === right) {\n return true;\n }\n if (!left || !right) {\n return false;\n }\n return (\n left.overlayPresent === right.overlayPresent &&\n left.activeWorkItemId === right.activeWorkItemId &&\n left.activeWorkItem === right.activeWorkItem &&\n left.scopes === right.scopes &&\n left.candidates === right.candidates &&\n workflowBlockedReasonsEqual(left.blockedReasons, right.blockedReasons)\n );\n}\n\nfunction interactionGuardSnapshotsEqual(\n left: InteractionGuardSnapshot,\n right: InteractionGuardSnapshot,\n): boolean {\n if (left === right) {\n return true;\n }\n return (\n left.effectiveMode === right.effectiveMode &&\n left.matchedScopeId === right.matchedScopeId &&\n left.matchedScopeMode === right.matchedScopeMode &&\n left.disabledReason === right.disabledReason &&\n workflowBlockedReasonsEqual(left.blockedReasons, right.blockedReasons)\n );\n}\n\nfunction workflowBlockedReasonsEqual(\n left: readonly WorkflowBlockedCommandReason[],\n right: readonly WorkflowBlockedCommandReason[],\n): boolean {\n if (left === right) {\n return true;\n }\n if (left.length !== right.length) {\n return false;\n }\n for (let index = 0; index < left.length; index += 1) {\n if (!workflowBlockedReasonEqual(left[index]!, right[index]!)) {\n return false;\n }\n }\n return true;\n}\n\nfunction workflowBlockedReasonEqual(\n left: WorkflowBlockedCommandReason,\n right: WorkflowBlockedCommandReason,\n): boolean {\n return (\n left.code === right.code &&\n left.message === right.message &&\n left.scopeId === right.scopeId &&\n left.workItemId === right.workItemId &&\n editorAnchorProjectionEqual(left.anchor, right.anchor) &&\n storyTargetsEqual(left.storyTarget, right.storyTarget)\n );\n}\n\nfunction editorAnchorProjectionEqual(\n left: EditorAnchorProjection | undefined,\n right: EditorAnchorProjection | undefined,\n): boolean {\n if (left === right) {\n return true;\n }\n if (!left || !right || left.kind !== right.kind) {\n return false;\n }\n\n switch (left.kind) {\n case \"range\":\n return (\n right.kind === \"range\" &&\n left.from === right.from &&\n left.to === right.to &&\n left.assoc.start === right.assoc.start &&\n left.assoc.end === right.assoc.end\n );\n case \"node\":\n return right.kind === \"node\" && left.at === right.at && left.assoc === right.assoc;\n case \"detached\":\n return (\n right.kind === \"detached\" &&\n left.lastKnownRange.from === right.lastKnownRange.from &&\n left.lastKnownRange.to === right.lastKnownRange.to &&\n left.reason === right.reason\n );\n }\n\n return false;\n}\n\nfunction createSelectionToolbarSelectionKey(\n selection: RuntimeRenderSnapshot[\"selection\"],\n activeStory: EditorStoryTarget,\n activeRevisionId?: string,\n): string | null {\n if (activeRevisionId) {\n return JSON.stringify({\n story: activeStory,\n revisionId: activeRevisionId,\n });\n }\n if (selection.isCollapsed || selection.activeRange.kind !== \"range\") {\n return null;\n }\n\n return JSON.stringify({\n story: activeStory,\n from: selection.activeRange.from,\n to: selection.activeRange.to,\n });\n}\n\nfunction buildSelectionToolbarModel(args: {\n snapshot: RuntimeRenderSnapshot;\n viewState: ReturnType<WordReviewEditorRuntime[\"getViewState\"]>;\n capabilities: ReturnType<typeof deriveCapabilities>;\n documentNavigation: ReturnType<WordReviewEditorRuntime[\"getDocumentNavigationSnapshot\"]>;\n styleCatalog: StyleCatalogSnapshot;\n formattingState: FormattingStateSnapshot;\n workflowScopeSnapshot?: WorkflowScopeSnapshot | null;\n interactionGuardSnapshot?: InteractionGuardSnapshot;\n addCommentDisabledReason?: string;\n}): SelectionToolbarModel | null {\n const {\n snapshot,\n viewState,\n capabilities,\n documentNavigation,\n styleCatalog,\n formattingState,\n workflowScopeSnapshot,\n interactionGuardSnapshot,\n addCommentDisabledReason,\n } = args;\n\n if (\n !snapshot.surface ||\n snapshot.selection.isCollapsed ||\n snapshot.selection.activeRange.kind !== \"range\" ||\n !capabilities.canEdit ||\n viewState.viewMode === \"view\"\n ) {\n return null;\n }\n\n const previewText = summarizeSelectionPreview(snapshot);\n if (!previewText) {\n return null;\n }\n\n const badges = [\n createSelectionToolbarStoryBadge(viewState.activeStory),\n createSelectionToolbarWorkflowBadge(\n resolveSelectionWorkflowPosture(\n snapshot,\n viewState,\n workflowScopeSnapshot,\n interactionGuardSnapshot,\n ),\n ),\n viewState.workspaceMode === \"page\" && documentNavigation.pageCount > 0\n ? { label: `Page ${documentNavigation.activePageIndex + 1}` as const }\n : null,\n createSelectionToolbarStyleBadge(styleCatalog, formattingState),\n createSelectionToolbarListBadge(viewState),\n ].filter((badge): badge is SelectionToolbarModel[\"badges\"][number] => Boolean(badge));\n\n const workflowPosture = resolveSelectionWorkflowPosture(\n snapshot,\n viewState,\n workflowScopeSnapshot,\n interactionGuardSnapshot,\n );\n const canToggleFormatting = workflowPosture.mode === \"edit\";\n const canAddComment = workflowPosture.mode === \"view\" || workflowPosture.mode === \"blocked\"\n ? false\n : capabilities.canAddComment;\n const disabledReason =\n workflowPosture.disabledReason ??\n (canAddComment ? undefined : addCommentDisabledReason);\n\n return {\n previewText,\n badges,\n canToggleFormatting,\n boldActive: formattingState.bold,\n italicActive: formattingState.italic,\n underlineActive: formattingState.underline,\n canAddComment,\n ...(disabledReason ? { disabledReason } : {}),\n };\n}\n\nfunction buildSuggestionCardModel(args: {\n snapshot: RuntimeRenderSnapshot;\n viewState: ReturnType<WordReviewEditorRuntime[\"getViewState\"]>;\n capabilities: ReturnType<typeof deriveCapabilities>;\n workflowScopeSnapshot?: WorkflowScopeSnapshot | null;\n interactionGuardSnapshot?: InteractionGuardSnapshot;\n activeRevisionId?: string;\n suppressedSuggestionRevisionId?: string | null;\n addCommentDisabledReason?: string;\n}): SuggestionCardModel | null {\n const {\n snapshot,\n viewState,\n capabilities,\n workflowScopeSnapshot,\n interactionGuardSnapshot,\n activeRevisionId,\n suppressedSuggestionRevisionId,\n addCommentDisabledReason,\n } = args;\n\n if (\n !snapshot.surface ||\n !capabilities.canEdit ||\n viewState.viewMode === \"view\"\n ) {\n return null;\n }\n\n const activeRange =\n !snapshot.selection.isCollapsed && snapshot.selection.activeRange.kind === \"range\"\n ? snapshot.selection.activeRange\n : null;\n const selectionFrom = activeRange\n ? Math.min(activeRange.from, activeRange.to)\n : null;\n const selectionTo = activeRange\n ? Math.max(activeRange.from, activeRange.to)\n : null;\n const candidateRevisions = snapshot.trackedChanges.revisions.filter((revision) =>\n storyTargetsEqual(revision.storyTarget ?? { kind: \"main\" }, viewState.activeStory) &&\n revision.status === \"active\" &&\n revision.actionability === \"actionable\" &&\n revision.anchor.kind === \"range\" &&\n (\n activeRevisionId === revision.revisionId ||\n (\n selectionFrom !== null &&\n selectionTo !== null &&\n rangesOverlap(\n selectionFrom,\n selectionTo,\n revision.anchor.from,\n revision.anchor.to,\n )\n )\n )\n );\n const focusedRevision = (\n activeRevisionId\n ? candidateRevisions.find((revision) => revision.revisionId === activeRevisionId)\n : null\n ) ?? candidateRevisions[0];\n\n if (!focusedRevision || focusedRevision.revisionId === suppressedSuggestionRevisionId) {\n return null;\n }\n\n const badges = [\n createSelectionToolbarStoryBadge(viewState.activeStory),\n workflowScopeSnapshot?.activeWorkItem?.title\n ? {\n label: workflowScopeSnapshot.activeWorkItem.title,\n tone: \"accent\" as const,\n }\n : null,\n ].filter((badge): badge is SuggestionCardModel[\"badges\"][number] => Boolean(badge));\n const workflowPosture = resolveSelectionWorkflowPosture(\n snapshot,\n viewState,\n workflowScopeSnapshot,\n interactionGuardSnapshot,\n );\n const canReviewSuggestion = workflowPosture.mode === \"edit\" || workflowPosture.mode === \"suggest\";\n const canAddComment = workflowPosture.mode === \"view\" || workflowPosture.mode === \"blocked\"\n ? false\n : capabilities.canAddComment;\n const disabledReason =\n workflowPosture.disabledReason ??\n (canAddComment ? undefined : addCommentDisabledReason);\n\n return {\n revisionId: focusedRevision.revisionId,\n kindLabel: getSuggestionKindLabel(focusedRevision.kind),\n previewText:\n focusedRevision.excerpt ??\n focusedRevision.detail ??\n focusedRevision.label ??\n \"Suggested change\",\n badges,\n canAccept: canReviewSuggestion && capabilities.canAcceptChange && focusedRevision.canAccept,\n canReject: canReviewSuggestion && capabilities.canRejectChange && focusedRevision.canReject,\n canEditSuggestion: canReviewSuggestion,\n canAddComment,\n ...(disabledReason ? { disabledReason } : {}),\n };\n}\n\nfunction createSelectionToolbarStoryBadge(\n target: EditorStoryTarget,\n): SelectionToolbarModel[\"badges\"][number] | null {\n if (target.kind === \"main\") {\n return null;\n }\n\n return {\n label:\n target.kind === \"header\"\n ? target.variant === \"default\"\n ? \"Header\"\n : `Header ${target.variant}`\n : target.kind === \"footer\"\n ? target.variant === \"default\"\n ? \"Footer\"\n : `Footer ${target.variant}`\n : target.kind === \"footnote\"\n ? \"Footnote\"\n : \"Endnote\",\n tone: \"accent\",\n };\n}\n\nfunction createSelectionToolbarStyleBadge(\n styleCatalog: StyleCatalogSnapshot,\n formattingState: FormattingStateSnapshot,\n): SelectionToolbarModel[\"badges\"][number] | null {\n if (!formattingState.paragraphStyleId) {\n return null;\n }\n\n const styleEntry = styleCatalog.paragraphs.find(\n (entry) => entry.styleId === formattingState.paragraphStyleId,\n );\n if (!styleEntry || styleEntry.isDefault) {\n return null;\n }\n\n return { label: styleEntry.displayName };\n}\n\nfunction createSelectionToolbarListBadge(\n viewState: ReturnType<WordReviewEditorRuntime[\"getViewState\"]>,\n): SelectionToolbarModel[\"badges\"][number] | null {\n if (!viewState.activeListContext) {\n return null;\n }\n\n return {\n label: viewState.activeListContext.isOrdered ? \"Numbered list\" : \"Bulleted list\",\n };\n}\n\nfunction createSelectionToolbarWorkflowBadge(\n posture: ReturnType<typeof resolveSelectionWorkflowPosture>,\n): SelectionToolbarModel[\"badges\"][number] | null {\n switch (posture.mode) {\n case \"suggest\":\n return { label: \"Suggest\", tone: \"accent\" };\n case \"comment\":\n return { label: \"Comment only\", tone: \"accent\" };\n case \"view\":\n return { label: \"View only\" };\n case \"blocked\":\n return { label: \"Blocked\" };\n default:\n return null;\n }\n}\n\nfunction resolveSelectionWorkflowPosture(\n snapshot: RuntimeRenderSnapshot,\n viewState: ReturnType<WordReviewEditorRuntime[\"getViewState\"]>,\n workflowScopeSnapshot?: WorkflowScopeSnapshot | null,\n interactionGuardSnapshot?: InteractionGuardSnapshot,\n): {\n mode: \"edit\" | \"suggest\" | \"comment\" | \"view\" | \"blocked\";\n disabledReason?: string;\n} {\n const blockedReasons =\n interactionGuardSnapshot?.blockedReasons ??\n workflowScopeSnapshot?.blockedReasons ??\n [];\n const blockingReason = blockedReasons[0];\n if (blockingReason) {\n if (blockingReason.code === \"workflow_comment_only\") {\n return {\n mode: \"comment\",\n disabledReason: blockingReason.message,\n };\n }\n if (blockingReason.code === \"workflow_view_only\") {\n return {\n mode: \"view\",\n disabledReason: blockingReason.message,\n };\n }\n return {\n mode: \"blocked\",\n disabledReason: blockingReason.message,\n };\n }\n\n if (interactionGuardSnapshot) {\n if (interactionGuardSnapshot.effectiveMode === \"suggest\") {\n return {\n mode: \"suggest\",\n disabledReason:\n interactionGuardSnapshot.disabledReason ??\n \"Suggestion authoring is active here; direct formatting changes are blocked.\",\n };\n }\n if (interactionGuardSnapshot.effectiveMode === \"comment\") {\n return {\n mode: \"comment\",\n disabledReason: interactionGuardSnapshot.disabledReason,\n };\n }\n if (interactionGuardSnapshot.effectiveMode === \"view\") {\n return {\n mode: \"view\",\n disabledReason: interactionGuardSnapshot.disabledReason,\n };\n }\n if (interactionGuardSnapshot.effectiveMode === \"blocked\") {\n return {\n mode: \"blocked\",\n disabledReason: interactionGuardSnapshot.disabledReason,\n };\n }\n }\n\n const activeRange =\n !snapshot.selection.isCollapsed && snapshot.selection.activeRange.kind === \"range\"\n ? snapshot.selection.activeRange\n : null;\n const matchingScope = activeRange && workflowScopeSnapshot\n ? workflowScopeSnapshot.scopes.find((scope) => {\n const scopeStoryTarget = scope.storyTarget ?? { kind: \"main\" as const };\n if (!storyTargetsEqual(scopeStoryTarget, viewState.activeStory)) {\n return false;\n }\n if (scope.anchor.kind === \"detached\") {\n return false;\n }\n const scopeFrom = scope.anchor.kind === \"range\" ? scope.anchor.from : scope.anchor.at;\n const scopeTo = scope.anchor.kind === \"range\" ? scope.anchor.to : scope.anchor.at;\n return activeRange.from >= scopeFrom && activeRange.to <= scopeTo;\n })\n : null;\n\n if (matchingScope?.mode === \"suggest\") {\n return {\n mode: \"suggest\",\n disabledReason: \"Suggestion authoring is active here; direct formatting changes are blocked.\",\n };\n }\n if (matchingScope?.mode === \"comment\") {\n return {\n mode: \"comment\",\n disabledReason: `Scope \"${matchingScope.label ?? matchingScope.scopeId}\" allows comments only.`,\n };\n }\n if (matchingScope?.mode === \"view\") {\n return {\n mode: \"view\",\n disabledReason: `Scope \"${matchingScope.label ?? matchingScope.scopeId}\" is view-only.`,\n };\n }\n return { mode: \"edit\" };\n}\n\nfunction rangesOverlap(\n leftFrom: number,\n leftTo: number,\n rightFrom: number,\n rightTo: number,\n): boolean {\n return leftFrom < rightTo && rightFrom < leftTo;\n}\n\nfunction getSuggestionKindLabel(kind: TrackedChangeEntrySnapshot[\"kind\"]): string {\n switch (kind) {\n case \"insertion\":\n return \"Suggested insertion\";\n case \"deletion\":\n return \"Suggested deletion\";\n case \"formatting\":\n return \"Suggested formatting change\";\n case \"property-change\":\n return \"Suggested property change\";\n case \"move\":\n return \"Suggested move\";\n }\n}\n\nfunction buildActiveImageContext(args: {\n canonicalDocument: PersistedEditorSnapshot[\"canonicalDocument\"];\n selection: RuntimeRenderSnapshot[\"selection\"];\n storyTarget: EditorStoryTarget;\n surface?: RuntimeRenderSnapshot[\"surface\"];\n}): {\n mediaId: string;\n display: \"inline\" | \"floating\";\n widthEmu?: number;\n heightEmu?: number;\n horizontalOffsetEmu?: number;\n verticalOffsetEmu?: number;\n} | null {\n const imageSegment = findSelectedImageSegment(args.surface, args.selection);\n if (!imageSegment) {\n return null;\n }\n\n const storyBlocks = getStoryBlocks(args.canonicalDocument, args.storyTarget);\n const imageNode = findImageNodeByMediaId(storyBlocks, imageSegment.mediaId);\n const mediaItem = args.canonicalDocument.media.items[imageSegment.mediaId];\n\n return {\n mediaId: imageSegment.mediaId,\n display: imageSegment.display === \"floating\" ? \"floating\" : \"inline\",\n widthEmu: mediaItem?.widthEmu,\n heightEmu: mediaItem?.heightEmu,\n horizontalOffsetEmu: imageNode?.floating?.horizontalPosition?.offset,\n verticalOffsetEmu: imageNode?.floating?.verticalPosition?.offset,\n };\n}\n\nfunction findSelectedImageSegment(\n surface: RuntimeRenderSnapshot[\"surface\"] | undefined,\n selection: RuntimeRenderSnapshot[\"selection\"],\n): Extract<NonNullable<RuntimeRenderSnapshot[\"surface\"]>[\"blocks\"][number], { kind: \"paragraph\" }>[\"segments\"][number] & {\n kind: \"image\";\n} | null {\n if (!surface) {\n return null;\n }\n\n const position =\n selection.activeRange.kind === \"node\" ? selection.activeRange.at : selection.head;\n\n return findSelectedImageSegmentInBlocks(surface.blocks, position);\n}\n\nfunction findSelectedImageSegmentInBlocks(\n blocks: readonly SurfaceBlockSnapshot[],\n position: number,\n): Extract<NonNullable<RuntimeRenderSnapshot[\"surface\"]>[\"blocks\"][number], { kind: \"paragraph\" }>[\"segments\"][number] & {\n kind: \"image\";\n} | null {\n for (const block of blocks) {\n if (position < block.from || position > block.to) {\n continue;\n }\n\n if (block.kind === \"paragraph\") {\n const imageSegment = block.segments.find(\n (segment) => segment.kind === \"image\" && position >= segment.from && position <= segment.to,\n );\n if (imageSegment && imageSegment.kind === \"image\") {\n return imageSegment;\n }\n continue;\n }\n\n if (block.kind === \"table\") {\n for (const row of block.rows) {\n for (const cell of row.cells) {\n const match = findSelectedImageSegmentInBlocks(cell.content, position);\n if (match) {\n return match;\n }\n }\n }\n continue;\n }\n\n if (block.kind === \"sdt_block\") {\n const match = findSelectedImageSegmentInBlocks(block.children, position);\n if (match) {\n return match;\n }\n }\n }\n\n return null;\n}\n\nfunction findImageNodeByMediaId(blocks: readonly unknown[], mediaId: string): {\n floating?: {\n horizontalPosition?: { offset?: number };\n verticalPosition?: { offset?: number };\n };\n} | null {\n for (const block of blocks) {\n const match = findImageNodeInValue(block, mediaId);\n if (match) {\n return match;\n }\n }\n return null;\n}\n\nfunction findImageNodeInValue(\n value: unknown,\n mediaId: string,\n): {\n floating?: {\n horizontalPosition?: { offset?: number };\n verticalPosition?: { offset?: number };\n };\n} | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n\n const record = value as {\n type?: string;\n mediaId?: string;\n children?: unknown[];\n rows?: Array<{ cells?: Array<{ children?: unknown[] }> }>;\n floating?: {\n horizontalPosition?: { offset?: number };\n verticalPosition?: { offset?: number };\n };\n };\n\n if (record.type === \"image\" && record.mediaId === mediaId) {\n return record;\n }\n\n if (Array.isArray(record.children)) {\n for (const child of record.children) {\n const match = findImageNodeInValue(child, mediaId);\n if (match) {\n return match;\n }\n }\n }\n\n if (Array.isArray(record.rows)) {\n for (const row of record.rows) {\n for (const cell of row.cells ?? []) {\n for (const child of cell.children ?? []) {\n const match = findImageNodeInValue(child, mediaId);\n if (match) {\n return match;\n }\n }\n }\n }\n }\n\n return null;\n}\n\nfunction createImageDataUrl(contentType: string, bytes: Uint8Array): string {\n const base64 = bytesToBase64(bytes);\n return `data:${contentType};base64,${base64}`;\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n let binary = \"\";\n for (let index = 0; index < bytes.length; index += 1) {\n binary += String.fromCharCode(bytes[index] ?? 0);\n }\n return btoa(binary);\n}\n","import type {\n AbstractNumberingDefinition,\n BlockNode,\n CanonicalDocument as CanonicalDocumentEnvelope,\n NumberingCatalog,\n NumberingInstance,\n ParagraphNode,\n} from \"../../model/canonical-document.ts\";\n\nexport interface ListCommandContext {\n timestamp: string;\n}\n\nexport interface ListCommandResult {\n document: CanonicalDocumentEnvelope;\n affectedParagraphIndexes: number[];\n createdNumberingInstanceId?: string;\n}\n\nexport function toggleNumberedList(\n document: CanonicalDocumentEnvelope,\n paragraphIndexes: readonly number[],\n context: ListCommandContext,\n): ListCommandResult {\n return toggleListKind(document, paragraphIndexes, \"numbered\", context);\n}\n\nexport function toggleBulletedList(\n document: CanonicalDocumentEnvelope,\n paragraphIndexes: readonly number[],\n context: ListCommandContext,\n): ListCommandResult {\n return toggleListKind(document, paragraphIndexes, \"bulleted\", context);\n}\n\nexport function indentListItems(\n document: CanonicalDocumentEnvelope,\n paragraphIndexes: readonly number[],\n context: ListCommandContext,\n): ListCommandResult {\n return adjustListLevels(document, paragraphIndexes, 1, context);\n}\n\nexport function outdentListItems(\n document: CanonicalDocumentEnvelope,\n paragraphIndexes: readonly number[],\n context: ListCommandContext,\n): ListCommandResult {\n return adjustListLevels(document, paragraphIndexes, -1, context);\n}\n\n/**\n * Word-like Enter behavior on a list paragraph:\n * - If the paragraph has content, split normally (caller handles the split).\n * Returns `action: \"split\"` so the caller can proceed with a standard paragraph split.\n * - If the paragraph is empty AND at level > 0, outdent one level → `action: \"outdented\"`.\n * - If the paragraph is empty AND at level 0, remove numbering → `action: \"removed\"`.\n */\nexport function splitListParagraph(\n document: CanonicalDocumentEnvelope,\n paragraphIndex: number,\n paragraphIsEmpty: boolean,\n context: ListCommandContext,\n): ListCommandResult & { action: \"split\" | \"outdented\" | \"removed\" } {\n if (!paragraphIsEmpty) {\n return {\n document,\n affectedParagraphIndexes: [],\n action: \"split\",\n };\n }\n\n const working = cloneEnvelope(document, context.timestamp);\n const paragraphs = captureEditableParagraphs(working);\n const target = paragraphs[paragraphIndex];\n\n if (!target?.numbering) {\n return {\n document: working,\n affectedParagraphIndexes: [],\n action: \"split\",\n };\n }\n\n if (target.numbering.level > 0) {\n target.numbering = {\n numberingInstanceId: target.numbering.numberingInstanceId,\n level: clampLevel(target.numbering.level - 1),\n };\n return {\n document: working,\n affectedParagraphIndexes: [paragraphIndex],\n action: \"outdented\",\n };\n }\n\n delete target.numbering;\n return {\n document: working,\n affectedParagraphIndexes: [paragraphIndex],\n action: \"removed\",\n };\n}\n\n/**\n * Word-like Backspace at the start of a list paragraph:\n * - If at level > 0, outdent one level.\n * - If at level 0, remove numbering entirely.\n * Returns the modified document and whether numbering was changed.\n */\nexport function backspaceAtListStart(\n document: CanonicalDocumentEnvelope,\n paragraphIndex: number,\n context: ListCommandContext,\n): ListCommandResult & { handled: boolean } {\n const working = cloneEnvelope(document, context.timestamp);\n const paragraphs = captureEditableParagraphs(working);\n const target = paragraphs[paragraphIndex];\n\n if (!target?.numbering) {\n return {\n document: working,\n affectedParagraphIndexes: [],\n handled: false,\n };\n }\n\n if (target.numbering.level > 0) {\n target.numbering = {\n numberingInstanceId: target.numbering.numberingInstanceId,\n level: clampLevel(target.numbering.level - 1),\n };\n } else {\n delete target.numbering;\n }\n\n return {\n document: working,\n affectedParagraphIndexes: [paragraphIndex],\n handled: true,\n };\n}\n\nexport function restartNumbering(\n document: CanonicalDocumentEnvelope,\n paragraphIndex: number,\n context: ListCommandContext,\n startAt = 1,\n): ListCommandResult {\n const working = cloneEnvelope(document, context.timestamp);\n const paragraphs = captureEditableParagraphs(working);\n const target = paragraphs[paragraphIndex];\n\n if (!target?.numbering) {\n return {\n document: working,\n affectedParagraphIndexes: [],\n };\n }\n\n const catalog = ensureNumberingCatalog(working.numbering);\n const existingInstance = catalog.instances[target.numbering.numberingInstanceId];\n if (!existingInstance) {\n return {\n document: working,\n affectedParagraphIndexes: [],\n };\n }\n\n const numberingInstanceId = createNumberingInstanceId(catalog);\n catalog.instances[numberingInstanceId] = {\n numberingInstanceId,\n abstractNumberingId: existingInstance.abstractNumberingId,\n overrides: mergeOverride(existingInstance.overrides, {\n level: target.numbering.level,\n startAt,\n }),\n };\n\n const affectedParagraphIndexes: number[] = [];\n for (let index = paragraphIndex; index < paragraphs.length; index += 1) {\n const paragraph = paragraphs[index];\n if (!paragraph?.numbering) {\n break;\n }\n if (paragraph.numbering.numberingInstanceId !== existingInstance.numberingInstanceId) {\n break;\n }\n\n paragraph.numbering = {\n numberingInstanceId,\n level: paragraph.numbering.level,\n };\n affectedParagraphIndexes.push(index);\n }\n\n working.numbering = catalog;\n\n return {\n document: working,\n affectedParagraphIndexes,\n createdNumberingInstanceId: numberingInstanceId,\n };\n}\n\nexport function continueNumbering(\n document: CanonicalDocumentEnvelope,\n paragraphIndex: number,\n context: ListCommandContext,\n): ListCommandResult {\n const working = cloneEnvelope(document, context.timestamp);\n const paragraphs = captureEditableParagraphs(working);\n const target = paragraphs[paragraphIndex];\n\n if (!target?.numbering) {\n return {\n document: working,\n affectedParagraphIndexes: [],\n };\n }\n\n const catalog = ensureNumberingCatalog(working.numbering);\n const currentInstanceId = target.numbering.numberingInstanceId;\n const currentKind = getListKind(catalog, currentInstanceId);\n if (!currentKind) {\n return {\n document: working,\n affectedParagraphIndexes: [],\n };\n }\n\n const compatibleInstanceId = findPreviousCompatibleInstance(\n paragraphs,\n catalog,\n paragraphIndex,\n currentKind,\n );\n if (!compatibleInstanceId || compatibleInstanceId === currentInstanceId) {\n return {\n document: working,\n affectedParagraphIndexes: [],\n };\n }\n\n const affectedParagraphIndexes: number[] = [];\n for (let index = paragraphIndex; index < paragraphs.length; index += 1) {\n const paragraph = paragraphs[index];\n if (!paragraph?.numbering) {\n break;\n }\n if (paragraph.numbering.numberingInstanceId !== currentInstanceId) {\n break;\n }\n paragraph.numbering = {\n numberingInstanceId: compatibleInstanceId,\n level: paragraph.numbering.level,\n };\n affectedParagraphIndexes.push(index);\n }\n\n working.numbering = catalog;\n\n return {\n document: working,\n affectedParagraphIndexes,\n createdNumberingInstanceId: compatibleInstanceId,\n };\n}\n\nfunction toggleListKind(\n document: CanonicalDocumentEnvelope,\n paragraphIndexes: readonly number[],\n kind: \"numbered\" | \"bulleted\",\n context: ListCommandContext,\n): ListCommandResult {\n const working = cloneEnvelope(document, context.timestamp);\n const paragraphs = captureEditableParagraphs(working);\n const normalizedIndexes = normalizeParagraphIndexes(paragraphs, paragraphIndexes);\n\n if (normalizedIndexes.length === 0) {\n return {\n document: working,\n affectedParagraphIndexes: [],\n };\n }\n\n const catalog = ensureNumberingCatalog(working.numbering);\n const allAlreadyKind = normalizedIndexes.every((index) => {\n const paragraph = paragraphs[index] as ParagraphNode;\n return paragraph.numbering\n ? getListKind(catalog, paragraph.numbering.numberingInstanceId) === kind\n : false;\n });\n\n if (allAlreadyKind) {\n for (const index of normalizedIndexes) {\n delete (paragraphs[index] as ParagraphNode).numbering;\n }\n working.numbering = catalog;\n return {\n document: working,\n affectedParagraphIndexes: normalizedIndexes,\n };\n }\n\n const numberingInstanceId =\n findAdjacentCompatibleInstance(paragraphs, catalog, normalizedIndexes[0]!, kind) ??\n ensureDefaultInstance(catalog, kind);\n\n for (const index of normalizedIndexes) {\n const paragraph = paragraphs[index] as ParagraphNode;\n paragraph.numbering = {\n numberingInstanceId,\n level: clampLevel(paragraph.numbering?.level ?? 0),\n };\n }\n\n working.numbering = catalog;\n\n return {\n document: working,\n affectedParagraphIndexes: normalizedIndexes,\n createdNumberingInstanceId: numberingInstanceId,\n };\n}\n\nfunction adjustListLevels(\n document: CanonicalDocumentEnvelope,\n paragraphIndexes: readonly number[],\n delta: -1 | 1,\n context: ListCommandContext,\n): ListCommandResult {\n const working = cloneEnvelope(document, context.timestamp);\n const paragraphs = captureEditableParagraphs(working);\n const affectedParagraphIndexes = normalizeParagraphIndexes(paragraphs, paragraphIndexes).filter(\n (index) => Boolean(paragraphs[index]?.numbering),\n );\n\n for (const index of affectedParagraphIndexes) {\n const paragraph = paragraphs[index] as ParagraphNode;\n if (!paragraph.numbering) {\n continue;\n }\n\n paragraph.numbering = {\n numberingInstanceId: paragraph.numbering.numberingInstanceId,\n level: clampLevel(paragraph.numbering.level + delta),\n };\n }\n\n return {\n document: working,\n affectedParagraphIndexes,\n };\n}\n\nfunction ensureDefaultInstance(\n catalog: NumberingCatalog,\n kind: \"numbered\" | \"bulleted\",\n): string {\n const existing = Object.values(catalog.instances).find(\n (instance) => getListKind(catalog, instance.numberingInstanceId) === kind,\n );\n if (existing) {\n return existing.numberingInstanceId;\n }\n\n const abstractNumberingId = createAbstractNumberingId(catalog);\n catalog.abstractDefinitions[abstractNumberingId] =\n kind === \"bulleted\" ? createDefaultBulletedDefinition(abstractNumberingId) : createDefaultNumberedDefinition(abstractNumberingId);\n\n const numberingInstanceId = createNumberingInstanceId(catalog);\n catalog.instances[numberingInstanceId] = {\n numberingInstanceId,\n abstractNumberingId,\n overrides: [],\n };\n\n return numberingInstanceId;\n}\n\nfunction findAdjacentCompatibleInstance(\n paragraphs: readonly ParagraphNode[],\n catalog: NumberingCatalog,\n fromIndex: number,\n kind: \"numbered\" | \"bulleted\",\n): string | undefined {\n const previous = paragraphs[fromIndex - 1];\n if (previous?.numbering) {\n const previousKind = getListKind(catalog, previous.numbering.numberingInstanceId);\n if (previousKind === kind) {\n return previous.numbering.numberingInstanceId;\n }\n }\n\n return undefined;\n}\n\nfunction findPreviousCompatibleInstance(\n paragraphs: readonly ParagraphNode[],\n catalog: NumberingCatalog,\n fromIndex: number,\n kind: \"numbered\" | \"bulleted\",\n): string | undefined {\n for (let index = fromIndex - 1; index >= 0; index -= 1) {\n const paragraph = paragraphs[index];\n if (!paragraph?.numbering) {\n continue;\n }\n if (getListKind(catalog, paragraph.numbering.numberingInstanceId) === kind) {\n return paragraph.numbering.numberingInstanceId;\n }\n }\n return undefined;\n}\n\nfunction getListKind(\n catalog: NumberingCatalog,\n numberingInstanceId: string,\n): \"numbered\" | \"bulleted\" | undefined {\n const instance = catalog.instances[numberingInstanceId];\n const definition = instance\n ? catalog.abstractDefinitions[instance.abstractNumberingId]\n : undefined;\n const levelZero = definition?.levels.find((level) => level.level === 0);\n if (!levelZero) {\n return undefined;\n }\n\n return levelZero.format === \"bullet\" ? \"bulleted\" : \"numbered\";\n}\n\nfunction mergeOverride(\n overrides: NumberingInstance[\"overrides\"],\n nextOverride: NumberingInstance[\"overrides\"][number],\n): NumberingInstance[\"overrides\"] {\n const filtered = overrides.filter((override) => override.level !== nextOverride.level);\n filtered.push(nextOverride);\n return filtered.sort((left, right) => left.level - right.level);\n}\n\nfunction createDefaultNumberedDefinition(abstractNumberingId: string): AbstractNumberingDefinition {\n return {\n abstractNumberingId,\n levels: [\n { level: 0, format: \"decimal\", text: \"%1.\" },\n { level: 1, format: \"decimal\", text: \"%1.%2.\" },\n { level: 2, format: \"lowerLetter\", text: \"(%3)\" },\n { level: 3, format: \"lowerRoman\", text: \"(%4)\" },\n { level: 4, format: \"decimal\", text: \"%5.\" },\n { level: 5, format: \"lowerLetter\", text: \"(%6)\" },\n { level: 6, format: \"lowerRoman\", text: \"(%7)\" },\n { level: 7, format: \"decimal\", text: \"%8.\" },\n { level: 8, format: \"lowerLetter\", text: \"(%9)\" },\n ],\n };\n}\n\nfunction createDefaultBulletedDefinition(abstractNumberingId: string): AbstractNumberingDefinition {\n return {\n abstractNumberingId,\n levels: [\n { level: 0, format: \"bullet\", text: \"•\" },\n { level: 1, format: \"bullet\", text: \"o\" },\n { level: 2, format: \"bullet\", text: \"■\" },\n { level: 3, format: \"bullet\", text: \"•\" },\n { level: 4, format: \"bullet\", text: \"o\" },\n { level: 5, format: \"bullet\", text: \"■\" },\n { level: 6, format: \"bullet\", text: \"•\" },\n { level: 7, format: \"bullet\", text: \"o\" },\n { level: 8, format: \"bullet\", text: \"■\" },\n ],\n };\n}\n\nfunction createAbstractNumberingId(catalog: NumberingCatalog): string {\n let index = 1;\n while (catalog.abstractDefinitions[`abstract-num:generated-${index}`]) {\n index += 1;\n }\n\n return `abstract-num:generated-${index}`;\n}\n\nfunction createNumberingInstanceId(catalog: NumberingCatalog): string {\n let index = 1;\n while (catalog.instances[`num:generated-${index}`]) {\n index += 1;\n }\n\n return `num:generated-${index}`;\n}\n\nfunction ensureNumberingCatalog(value: NumberingCatalog): NumberingCatalog {\n return structuredClone(value);\n}\n\nfunction cloneEnvelope(\n document: CanonicalDocumentEnvelope,\n timestamp: string,\n): CanonicalDocumentEnvelope {\n return {\n ...structuredClone(document),\n updatedAt: timestamp,\n };\n}\n\nfunction captureEditableParagraphs(document: CanonicalDocumentEnvelope): ParagraphNode[] {\n if (isDocumentRoot(document.content)) {\n const paragraphs: ParagraphNode[] = [];\n collectEditableParagraphs(document.content.children as BlockNode[], paragraphs);\n return paragraphs;\n }\n\n const fallback = {\n type: \"doc\" as const,\n children: [{ type: \"paragraph\" as const, children: [] }],\n };\n document.content = fallback;\n return fallback.children as ParagraphNode[];\n}\n\nfunction collectEditableParagraphs(\n blocks: readonly BlockNode[],\n output: ParagraphNode[],\n): void {\n for (const block of blocks) {\n switch (block.type) {\n case \"paragraph\":\n output.push(block);\n break;\n case \"table\":\n for (const row of block.rows) {\n for (const cell of row.cells) {\n collectEditableParagraphs(cell.children, output);\n }\n }\n break;\n case \"sdt\":\n collectEditableParagraphs(block.children, output);\n break;\n case \"custom_xml\":\n break;\n default:\n break;\n }\n }\n}\n\nfunction normalizeParagraphIndexes(\n paragraphs: readonly ParagraphNode[],\n paragraphIndexes: readonly number[],\n): number[] {\n return [...new Set(paragraphIndexes)]\n .filter((index) => Number.isInteger(index) && index >= 0 && index < paragraphs.length)\n .sort((left, right) => left - right);\n}\n\nfunction clampLevel(level: number): number {\n return Math.max(0, Math.min(8, level));\n}\n\nfunction isDocumentRoot(value: unknown): value is { type: \"doc\"; children: unknown[] } {\n return Boolean(value) && typeof value === \"object\" && (value as { type?: string }).type === \"doc\";\n}\n","import type {\n RuntimeRenderSnapshot,\n SurfaceBlockSnapshot,\n} from \"../../api/public-types\";\nimport type {\n BlockNode,\n CanonicalDocument as CanonicalDocumentEnvelope,\n ParagraphIndentation,\n ParagraphNode,\n TabStop,\n TableCellNode,\n TableNode,\n TableRowNode,\n} from \"../../model/canonical-document.ts\";\n\nexport interface ParagraphLayoutCommandContext {\n timestamp: string;\n}\n\nexport interface ParagraphLayoutMutationResult {\n document: CanonicalDocumentEnvelope;\n selection: RuntimeRenderSnapshot[\"selection\"];\n changed: boolean;\n}\n\nexport function setActiveParagraphIndentation(\n document: CanonicalDocumentEnvelope,\n snapshot: RuntimeRenderSnapshot,\n indentation: ParagraphIndentation,\n _context: ParagraphLayoutCommandContext,\n): ParagraphLayoutMutationResult {\n return mutateActiveParagraph(document, snapshot, (paragraph) => {\n const nextIndentation = mergeIndentationPatch(paragraph.indentation, indentation);\n if (indentationEquals(paragraph.indentation, nextIndentation)) {\n return false;\n }\n if (nextIndentation) {\n paragraph.indentation = nextIndentation;\n } else {\n delete paragraph.indentation;\n }\n return true;\n });\n}\n\nexport function setActiveParagraphTabStops(\n document: CanonicalDocumentEnvelope,\n snapshot: RuntimeRenderSnapshot,\n tabStops: ReadonlyArray<{ pos: number; val?: string; leader?: string }>,\n _context: ParagraphLayoutCommandContext,\n): ParagraphLayoutMutationResult {\n return mutateActiveParagraph(document, snapshot, (paragraph) => {\n const nextTabStops = normalizeTabStops(tabStops);\n if (tabStopsEqual(paragraph.tabStops, nextTabStops)) {\n return false;\n }\n if (nextTabStops.length > 0) {\n paragraph.tabStops = nextTabStops;\n } else {\n delete paragraph.tabStops;\n }\n return true;\n });\n}\n\nfunction mutateActiveParagraph(\n document: CanonicalDocumentEnvelope,\n snapshot: RuntimeRenderSnapshot,\n mutate: (paragraph: ParagraphNode) => boolean,\n): ParagraphLayoutMutationResult {\n const surface = snapshot.surface;\n if (!surface) {\n return {\n document,\n selection: snapshot.selection,\n changed: false,\n };\n }\n\n const paragraphIndex = resolveActiveParagraphIndex(surface.blocks, snapshot.selection);\n if (paragraphIndex === null) {\n return {\n document,\n selection: snapshot.selection,\n changed: false,\n };\n }\n\n const working = structuredClone(document) as CanonicalDocumentEnvelope;\n const paragraphs = collectCanonicalParagraphs(working.content.children);\n const target = paragraphs[paragraphIndex];\n if (!target) {\n return {\n document,\n selection: snapshot.selection,\n changed: false,\n };\n }\n\n const changed = mutate(target);\n return {\n document: changed ? working : document,\n selection: snapshot.selection,\n changed,\n };\n}\n\nexport function resolveActiveParagraphIndex(\n blocks: readonly SurfaceBlockSnapshot[],\n selection: RuntimeRenderSnapshot[\"selection\"],\n): number | null {\n const paragraphs = collectSurfaceParagraphs(blocks);\n if (paragraphs.length === 0) {\n return null;\n }\n\n if (selection.activeRange.kind === \"node\") {\n const nodePosition = selection.activeRange.at;\n const nodeIndex = paragraphs.findIndex(\n (paragraph) => nodePosition >= paragraph.from && nodePosition <= paragraph.to,\n );\n if (nodeIndex >= 0) {\n return nodeIndex;\n }\n }\n\n const selectionFrom = Math.min(selection.anchor, selection.head);\n const selectionTo = Math.max(selection.anchor, selection.head);\n\n const exactIndex = paragraphs.findIndex((paragraph) =>\n selection.isCollapsed\n ? selection.head >= paragraph.from && selection.head <= paragraph.to\n : selectionFrom < paragraph.to && paragraph.from < selectionTo,\n );\n if (exactIndex >= 0) {\n return exactIndex;\n }\n\n return null;\n}\n\nfunction collectSurfaceParagraphs(\n blocks: readonly SurfaceBlockSnapshot[],\n output: Array<Extract<SurfaceBlockSnapshot, { kind: \"paragraph\" }>> = [],\n): Array<Extract<SurfaceBlockSnapshot, { kind: \"paragraph\" }>> {\n for (const block of blocks) {\n if (block.kind === \"paragraph\") {\n output.push(block);\n continue;\n }\n if (block.kind === \"table\") {\n for (const row of block.rows) {\n for (const cell of row.cells) {\n collectSurfaceParagraphs(cell.content, output);\n }\n }\n continue;\n }\n if (block.kind === \"sdt_block\") {\n collectSurfaceParagraphs(block.children, output);\n }\n }\n return output;\n}\n\nfunction collectCanonicalParagraphs(\n blocks: readonly BlockNode[],\n output: ParagraphNode[] = [],\n): ParagraphNode[] {\n for (const block of blocks) {\n switch (block.type) {\n case \"paragraph\":\n output.push(block);\n break;\n case \"table\":\n collectParagraphsFromTable(block, output);\n break;\n case \"sdt\":\n collectCanonicalParagraphs(block.children, output);\n break;\n case \"custom_xml\":\n // `custom_xml` wrappers are projected as preserve-only opaque blocks on\n // the live surface, so their hidden descendants must stay out of the\n // paragraph mutation index or surface/canonical ordinals drift.\n break;\n default:\n break;\n }\n }\n return output;\n}\n\nfunction collectParagraphsFromTable(table: TableNode, output: ParagraphNode[]): void {\n for (const row of table.rows) {\n collectParagraphsFromRow(row, output);\n }\n}\n\nfunction collectParagraphsFromRow(row: TableRowNode, output: ParagraphNode[]): void {\n for (const cell of row.cells) {\n collectParagraphsFromCell(cell, output);\n }\n}\n\nfunction collectParagraphsFromCell(cell: TableCellNode, output: ParagraphNode[]): void {\n collectCanonicalParagraphs(cell.children, output);\n}\n\nfunction mergeIndentationPatch(\n current: ParagraphIndentation | undefined,\n patch: ParagraphIndentation,\n): ParagraphIndentation | undefined {\n const merged: ParagraphIndentation = {\n ...(current ?? {}),\n };\n\n if (\"left\" in patch) {\n merged.left = patch.left;\n }\n if (\"right\" in patch) {\n merged.right = patch.right;\n }\n if (\"firstLine\" in patch) {\n merged.firstLine = patch.firstLine;\n if (!(\"hanging\" in patch)) {\n delete merged.hanging;\n }\n }\n if (\"hanging\" in patch) {\n merged.hanging = patch.hanging;\n if (!(\"firstLine\" in patch)) {\n delete merged.firstLine;\n }\n }\n\n return normalizeIndentation(merged);\n}\n\nfunction normalizeIndentation(\n indentation: ParagraphIndentation,\n): ParagraphIndentation | undefined {\n const normalized: ParagraphIndentation = {};\n if (indentation.left !== undefined && indentation.left > 0) {\n normalized.left = Math.round(indentation.left);\n }\n if (indentation.right !== undefined && indentation.right > 0) {\n normalized.right = Math.round(indentation.right);\n }\n if (indentation.firstLine !== undefined && indentation.firstLine > 0) {\n normalized.firstLine = Math.round(indentation.firstLine);\n }\n if (indentation.hanging !== undefined && indentation.hanging > 0) {\n normalized.hanging = Math.round(indentation.hanging);\n delete normalized.firstLine;\n }\n return Object.keys(normalized).length > 0 ? normalized : undefined;\n}\n\nfunction indentationEquals(\n left: ParagraphIndentation | undefined,\n right: ParagraphIndentation | undefined,\n): boolean {\n return (\n (left?.left ?? 0) === (right?.left ?? 0) &&\n (left?.right ?? 0) === (right?.right ?? 0) &&\n (left?.firstLine ?? 0) === (right?.firstLine ?? 0) &&\n (left?.hanging ?? 0) === (right?.hanging ?? 0)\n );\n}\n\nfunction normalizeTabStops(\n tabStops: ReadonlyArray<{ pos: number; val?: string; leader?: string }>,\n): TabStop[] {\n const seen = new Set<number>();\n const normalized = [...tabStops]\n .map((tabStop) => ({\n position: Math.max(0, Math.round(tabStop.pos)),\n align: normalizeTabAlign(tabStop.val),\n ...(normalizeTabLeader(tabStop.leader)\n ? { leader: normalizeTabLeader(tabStop.leader) }\n : {}),\n }))\n .filter((tabStop) => {\n if (seen.has(tabStop.position)) {\n return false;\n }\n seen.add(tabStop.position);\n return true;\n })\n .sort((left, right) => left.position - right.position);\n\n return normalized;\n}\n\nfunction normalizeTabAlign(value: string | undefined): TabStop[\"align\"] {\n switch (value) {\n case \"center\":\n case \"right\":\n case \"decimal\":\n case \"bar\":\n case \"clear\":\n return value;\n default:\n return \"left\";\n }\n}\n\nfunction normalizeTabLeader(value: string | undefined): TabStop[\"leader\"] | undefined {\n switch (value) {\n case \"none\":\n case \"dot\":\n case \"hyphen\":\n case \"underscore\":\n case \"heavy\":\n case \"middleDot\":\n return value;\n default:\n return undefined;\n }\n}\n\nfunction tabStopsEqual(\n left: readonly TabStop[] | undefined,\n right: readonly TabStop[] | undefined,\n): boolean {\n const normalizedLeft = left ?? [];\n const normalizedRight = right ?? [];\n if (normalizedLeft.length !== normalizedRight.length) {\n return false;\n }\n return normalizedLeft.every((tabStop, index) => {\n const other = normalizedRight[index];\n return (\n tabStop.position === other?.position &&\n (tabStop.align ?? \"left\") === (other?.align ?? \"left\") &&\n (tabStop.leader ?? \"\") === (other?.leader ?? \"\")\n );\n });\n}\n","import type {\n DocumentNavigationSnapshot,\n EditorStoryTarget,\n SearchOptions,\n SearchResultSnapshot,\n SelectionSnapshot,\n} from \"../api/public-types\";\nimport {\n MAIN_STORY_TARGET,\n storyTargetsEqual,\n} from \"../core/selection/mapping.ts\";\nimport {\n createSelectionSnapshot,\n type CanonicalDocumentEnvelope,\n} from \"../core/state/editor-state.ts\";\nimport {\n searchSecondaryStories,\n searchSurfaceBlocks,\n} from \"../core/search/search-text.ts\";\nimport { findPageForOffset } from \"./document-navigation.ts\";\nimport {\n buildResolvedSections,\n resolveSectionForStoryTarget,\n} from \"./document-layout.ts\";\nimport { createEditorSurfaceSnapshot } from \"./surface-projection.ts\";\n\nexport function searchDocument(\n document: CanonicalDocumentEnvelope,\n selection: SelectionSnapshot,\n activeStory: EditorStoryTarget,\n navigation: DocumentNavigationSnapshot,\n query: string,\n options: SearchOptions = {},\n): SearchResultSnapshot[] {\n const normalizedQuery = query.trim();\n if (!normalizedQuery) {\n return [];\n }\n\n const mainSurface = createEditorSurfaceSnapshot(\n document,\n createSelectionSnapshot(selection.anchor, selection.head),\n MAIN_STORY_TARGET,\n );\n const sections = buildResolvedSections(document);\n const combined: SearchResultSnapshot[] = [];\n\n for (const match of searchSurfaceBlocks(mainSurface.blocks, normalizedQuery, options)) {\n const pageIndex = findPageForOffset(navigation.pages, match.from);\n combined.push({\n resultId: `search-main-${combined.length}`,\n anchor: {\n kind: \"range\",\n from: match.from,\n to: match.to,\n assoc: {\n start: -1,\n end: 1,\n },\n },\n excerpt: match.excerpt,\n isActive: false,\n storyTarget: MAIN_STORY_TARGET,\n sectionIndex: navigation.pages[pageIndex]?.sectionIndex ?? 0,\n pageIndex,\n });\n }\n\n for (const match of searchSecondaryStories(\n mainSurface.secondaryStories,\n normalizedQuery,\n options,\n )) {\n const section = resolveSectionForStoryTarget(\n document,\n sections,\n match.storyTarget,\n );\n const pageIndex =\n section === undefined\n ? undefined\n : navigation.pages.find((page) => page.sectionIndex === section.index)\n ?.pageIndex ?? 0;\n\n combined.push({\n resultId: `search-secondary-${combined.length}`,\n anchor: {\n kind: \"range\",\n from: match.from,\n to: match.to,\n assoc: {\n start: -1,\n end: 1,\n },\n },\n excerpt: match.excerpt,\n isActive: false,\n storyTarget: match.storyTarget,\n ...(section ? { sectionIndex: section.index } : {}),\n ...(pageIndex !== undefined ? { pageIndex } : {}),\n });\n }\n\n const limited = combined.slice(0, options.limit ?? Number.POSITIVE_INFINITY);\n const activeIndex = getActiveSearchResultIndex(limited, selection, activeStory);\n\n return limited.map((result, index) => ({\n ...result,\n isActive: index === activeIndex,\n }));\n}\n\nfunction getActiveSearchResultIndex(\n results: readonly SearchResultSnapshot[],\n selection: SelectionSnapshot,\n activeStory: EditorStoryTarget,\n): number {\n if (results.length === 0) {\n return -1;\n }\n\n const selectionFrom = Math.min(selection.anchor, selection.head);\n const selectionTo = Math.max(selection.anchor, selection.head);\n const activeIndex = results.findIndex((result) => {\n if (!result.storyTarget || !storyTargetsEqual(result.storyTarget, activeStory)) {\n return false;\n }\n\n if (result.anchor.kind !== \"range\") {\n return false;\n }\n\n if (selectionFrom === selectionTo) {\n return (\n selectionFrom >= result.anchor.from && selectionFrom <= result.anchor.to\n );\n }\n\n return (\n selectionFrom < result.anchor.to && selectionTo > result.anchor.from\n );\n });\n\n return activeIndex >= 0 ? activeIndex : 0;\n}\n","import { useRef, useSyncExternalStore } from \"react\";\nimport type {\n DocumentNavigationSnapshot,\n RuntimeRenderSnapshot,\n} from \"../api/public-types.ts\";\n\nexport interface RuntimeSnapshotSource {\n subscribe(listener: () => void): () => void;\n getRenderSnapshot(): RuntimeRenderSnapshot;\n}\n\nexport interface RuntimeValueSource<T> {\n subscribe(listener: () => void): () => void;\n getValue(): T;\n}\n\nexport interface ToolbarSlice {\n commandState: RuntimeRenderSnapshot[\"commandState\"];\n isDirty: RuntimeRenderSnapshot[\"isDirty\"];\n isReady: RuntimeRenderSnapshot[\"isReady\"];\n readOnly: RuntimeRenderSnapshot[\"readOnly\"];\n fatalError: RuntimeRenderSnapshot[\"fatalError\"];\n}\n\nexport interface SurfaceSlice {\n revisionToken: RuntimeRenderSnapshot[\"revisionToken\"];\n selection: RuntimeRenderSnapshot[\"selection\"];\n activeStory: RuntimeRenderSnapshot[\"activeStory\"];\n surface: RuntimeRenderSnapshot[\"surface\"];\n}\n\nexport interface ReviewSlice {\n comments: RuntimeRenderSnapshot[\"comments\"];\n trackedChanges: RuntimeRenderSnapshot[\"trackedChanges\"];\n compatibility: RuntimeRenderSnapshot[\"compatibility\"];\n}\n\nexport interface ViewSlice {\n documentMode: RuntimeRenderSnapshot[\"documentMode\"];\n activeStory: RuntimeRenderSnapshot[\"activeStory\"];\n pageLayout: RuntimeRenderSnapshot[\"pageLayout\"];\n}\n\nexport interface StatusSlice {\n warnings: RuntimeRenderSnapshot[\"warnings\"];\n fatalError: RuntimeRenderSnapshot[\"fatalError\"];\n isDirty: RuntimeRenderSnapshot[\"isDirty\"];\n documentStats: RuntimeRenderSnapshot[\"documentStats\"];\n protectionSnapshot: RuntimeRenderSnapshot[\"protectionSnapshot\"];\n}\n\nexport interface NavigationSlice {\n documentNavigation: DocumentNavigationSnapshot | undefined;\n}\n\nexport interface MetaSlice {\n documentId: RuntimeRenderSnapshot[\"documentId\"];\n sessionId: RuntimeRenderSnapshot[\"sessionId\"];\n sourceLabel: RuntimeRenderSnapshot[\"sourceLabel\"];\n}\n\nexport function selectToolbarSlice(snapshot: RuntimeRenderSnapshot): ToolbarSlice {\n return {\n commandState: snapshot.commandState,\n isDirty: snapshot.isDirty,\n isReady: snapshot.isReady,\n readOnly: snapshot.readOnly,\n fatalError: snapshot.fatalError,\n };\n}\n\nexport function selectSurfaceSlice(snapshot: RuntimeRenderSnapshot): SurfaceSlice {\n return {\n revisionToken: snapshot.revisionToken,\n selection: snapshot.selection,\n activeStory: snapshot.activeStory,\n surface: snapshot.surface,\n };\n}\n\nexport function selectReviewSlice(snapshot: RuntimeRenderSnapshot): ReviewSlice {\n return {\n comments: snapshot.comments,\n trackedChanges: snapshot.trackedChanges,\n compatibility: snapshot.compatibility,\n };\n}\n\nexport function selectViewSlice(snapshot: RuntimeRenderSnapshot): ViewSlice {\n return {\n documentMode: snapshot.documentMode,\n activeStory: snapshot.activeStory,\n pageLayout: snapshot.pageLayout,\n };\n}\n\nexport function selectStatusSlice(snapshot: RuntimeRenderSnapshot): StatusSlice {\n return {\n warnings: snapshot.warnings,\n fatalError: snapshot.fatalError,\n isDirty: snapshot.isDirty,\n documentStats: snapshot.documentStats,\n protectionSnapshot: snapshot.protectionSnapshot,\n };\n}\n\nexport function selectNavigationSlice(\n documentNavigation?: DocumentNavigationSnapshot,\n): NavigationSlice {\n return {\n documentNavigation,\n };\n}\n\nexport function selectMetaSlice(snapshot: RuntimeRenderSnapshot): MetaSlice {\n return {\n documentId: snapshot.documentId,\n sessionId: snapshot.sessionId,\n sourceLabel: snapshot.sourceLabel,\n };\n}\n\nexport function shallowEqualRecord<T extends object>(\n left: T,\n right: T,\n): boolean {\n const leftRecord = left as Record<string, unknown>;\n const rightRecord = right as Record<string, unknown>;\n const leftKeys = Object.keys(left);\n const rightKeys = Object.keys(right);\n if (leftKeys.length !== rightKeys.length) {\n return false;\n }\n\n for (const key of leftKeys) {\n if (leftRecord[key] !== rightRecord[key]) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function useRuntimeSnapshotSlice<T>(\n runtime: RuntimeSnapshotSource | null,\n fallbackSnapshot: RuntimeRenderSnapshot,\n selector: (snapshot: RuntimeRenderSnapshot) => T,\n isEqual: (left: T, right: T) => boolean = Object.is,\n): T {\n const cachedSelectionRef = useRef<T>(selector(fallbackSnapshot));\n return useSyncExternalStore(\n (listener) => runtime?.subscribe(listener) ?? (() => undefined),\n () => {\n const next = selector(runtime?.getRenderSnapshot() ?? fallbackSnapshot);\n if (isEqual(cachedSelectionRef.current, next)) {\n return cachedSelectionRef.current;\n }\n cachedSelectionRef.current = next;\n return next;\n },\n () => {\n const next = selector(runtime?.getRenderSnapshot() ?? fallbackSnapshot);\n if (isEqual(cachedSelectionRef.current, next)) {\n return cachedSelectionRef.current;\n }\n cachedSelectionRef.current = next;\n return next;\n },\n );\n}\n\nexport function useRuntimeValue<T>(\n source: RuntimeValueSource<T> | null,\n fallbackValue: T,\n isEqual: (left: T, right: T) => boolean = Object.is,\n): T {\n const cachedValueRef = useRef<T>(fallbackValue);\n return useSyncExternalStore(\n (listener) => source?.subscribe(listener) ?? (() => undefined),\n () => {\n const next = source?.getValue() ?? fallbackValue;\n if (isEqual(cachedValueRef.current, next)) {\n return cachedValueRef.current;\n }\n cachedValueRef.current = next;\n return next;\n },\n () => {\n const next = source?.getValue() ?? fallbackValue;\n if (isEqual(cachedValueRef.current, next)) {\n return cachedValueRef.current;\n }\n cachedValueRef.current = next;\n return next;\n },\n );\n}\n","import { useMemo, useRef } from \"react\";\n\nimport type {\n CommentSidebarThreadSnapshot,\n FormattingAlignment,\n HeaderFooterLinkPatch,\n InsertImageOptions,\n SectionBreakType,\n SectionLayoutPatch,\n SectionPageNumberingPatch,\n TrackedChangeEntrySnapshot,\n ZoomLevel,\n WorkspaceMode,\n} from \"../api/public-types.ts\";\nimport type { ReviewRailTab } from \"../ui-tailwind/review/tw-review-rail.tsx\";\n\ntype CommandHandler = (...args: any[]) => unknown;\n\nexport interface EditorCommandBag {\n onWorkspaceModeChange(value: WorkspaceMode): void;\n onZoomChange?(level: ZoomLevel): void;\n onActiveRailTabChange(value: ReviewRailTab): void;\n onShowTrackedChangesChange(show: boolean): void;\n onUndo(): void;\n onRedo(): void;\n onSetParagraphStyle?(styleId: string): void;\n onToggleBold?(): void;\n onToggleItalic?(): void;\n onToggleUnderline?(): void;\n onSetSelectionTextColor?(color: string): void;\n onSetSelectionHighlightColor?(color: string | null): void;\n onToggleStrikethrough?(): void;\n onToggleSuperscript?(): void;\n onToggleSubscript?(): void;\n onSetFontFamily?(fontFamily: string): void;\n onSetFontSize?(fontSize: number): void;\n onSetTextColor?(color: string): void;\n onSetHighlightColor?(color: string | null): void;\n onSetAlignment?(alignment: FormattingAlignment): void;\n onOutdent?(): void;\n onIndent?(): void;\n onAddComment(): void;\n onInsertPageBreak?(): void;\n onInsertTable?(): void;\n onInsertSectionBreak?(type: SectionBreakType): void;\n onInsertImage?(options: InsertImageOptions): void;\n onSetTableStyle?(styleId: string): void;\n onAddRowBefore?(): void;\n onAddRowAfter?(): void;\n onAddColumnBefore?(): void;\n onAddColumnAfter?(): void;\n onDeleteRow?(): void;\n onDeleteColumn?(): void;\n onDeleteTable?(): void;\n onMergeCells?(): void;\n onSplitCell?(): void;\n onSetCellBackground?(color: string): void;\n onSetImageLayout?(\n mediaId: string,\n dimensions: { widthEmu: number; heightEmu: number },\n ): void;\n onSetImageFrame?(\n mediaId: string,\n offsets: { horizontalOffsetEmu?: number; verticalOffsetEmu?: number },\n ): void;\n onDeleteSectionBreak?(sectionIndex: number): void;\n onUpdateSectionLayout?(sectionIndex: number, patch: SectionLayoutPatch): void;\n onSetSectionPageNumbering?(\n sectionIndex: number,\n patch: SectionPageNumberingPatch | null,\n ): void;\n onSetHeaderFooterLink?(\n sectionIndex: number,\n patch: HeaderFooterLinkPatch,\n ): void;\n onExport(): void;\n onOpenComment(thread: CommentSidebarThreadSnapshot): void;\n onResolveComment(commentId: string): void;\n onReopenComment?(commentId: string): void;\n onAddReply?(commentId: string, body: string): void;\n onEditBody?(commentId: string, body: string): void;\n onOpenRevision(revision: TrackedChangeEntrySnapshot): void;\n onAcceptRevision(revisionId: string): void;\n onRejectRevision(revisionId: string): void;\n onAcceptAllChanges(): void;\n onRejectAllChanges(): void;\n onCloseStory?(): void;\n onOpenHeaderStory?(): void;\n onOpenFooterStory?(): void;\n onSetParagraphIndentation?(indentation: {\n left?: number;\n right?: number;\n firstLine?: number;\n hanging?: number;\n }): void;\n onSetParagraphTabStops?(\n tabStops: Array<{ pos: number; val?: string; leader?: string }>,\n ): void;\n onRestartNumbering?(): void;\n onContinueNumbering?(): void;\n onNavigateHeading?(headingId: string): void;\n}\n\nexport function useCommandBag<T extends object>(commands: T): T {\n const commandsRef = useRef(commands);\n commandsRef.current = commands;\n\n return useMemo(() => {\n const stableBag: Partial<T> = {};\n\n for (const key of Object.keys(commands) as Array<keyof T>) {\n stableBag[key] = ((...args: unknown[]) => {\n const handler = commandsRef.current[key] as CommandHandler | undefined;\n return handler?.(...args);\n }) as T[typeof key];\n }\n\n return stableBag as T;\n }, []);\n}\n","import type {\n EditorStoryTarget,\n RuntimeRenderSnapshot,\n SurfaceBlockSnapshot,\n WorkflowBlockedCommandReason,\n WorkflowMarkupSnapshot,\n} from \"../api/public-types\";\n\nexport function deriveVisibleWorkflowBlockedRails(\n surface: RuntimeRenderSnapshot[\"surface\"] | undefined,\n markupSnapshot: WorkflowMarkupSnapshot | null,\n): WorkflowBlockedCommandReason[] {\n if (!surface || !markupSnapshot) {\n return [];\n }\n\n const visibleFragments = collectVisibleOpaqueFragmentStoryKeys(surface);\n return markupSnapshot.opaqueFragments\n .filter((fragment) =>\n visibleFragments.has(\n createOpaqueFragmentStoryKey(fragment.fragmentId, fragment.storyTarget ?? { kind: \"main\" }),\n ),\n )\n .map((fragment) => ({\n code: fragment.blockedReasonCode,\n message: fragment.detail,\n anchor: fragment.anchor,\n storyTarget: fragment.storyTarget,\n }));\n}\n\nfunction collectVisibleOpaqueFragmentStoryKeys(\n surface: NonNullable<RuntimeRenderSnapshot[\"surface\"]>,\n): Set<string> {\n const keys = new Set<string>();\n collectVisibleOpaqueFragmentStoryKeysInBlocks(surface.blocks, { kind: \"main\" }, keys);\n for (const story of surface.secondaryStories) {\n collectVisibleOpaqueFragmentStoryKeysInBlocks(story.blocks, story.target, keys);\n }\n return keys;\n}\n\nfunction collectVisibleOpaqueFragmentStoryKeysInBlocks(\n blocks: readonly SurfaceBlockSnapshot[],\n storyTarget: EditorStoryTarget,\n keys: Set<string>,\n): void {\n for (const block of blocks) {\n if (block.kind === \"paragraph\") {\n for (const segment of block.segments) {\n if (segment.kind === \"opaque_inline\") {\n keys.add(createOpaqueFragmentStoryKey(segment.fragmentId, storyTarget));\n }\n }\n continue;\n }\n\n if (block.kind === \"table\") {\n for (const row of block.rows) {\n for (const cell of row.cells) {\n collectVisibleOpaqueFragmentStoryKeysInBlocks(cell.content, storyTarget, keys);\n }\n }\n continue;\n }\n\n if (block.kind === \"sdt_block\") {\n collectVisibleOpaqueFragmentStoryKeysInBlocks(block.children, storyTarget, keys);\n continue;\n }\n\n keys.add(createOpaqueFragmentStoryKey(block.fragmentId, storyTarget));\n }\n}\n\nfunction createOpaqueFragmentStoryKey(\n fragmentId: string,\n storyTarget: EditorStoryTarget,\n): string {\n return `${fragmentId}:${serializeStoryTargetKey(storyTarget)}`;\n}\n\nfunction serializeStoryTargetKey(storyTarget: EditorStoryTarget): string {\n switch (storyTarget.kind) {\n case \"main\":\n return \"main\";\n case \"header\":\n case \"footer\":\n return `${storyTarget.kind}:${storyTarget.relationshipId}:${storyTarget.variant}:${storyTarget.sectionIndex ?? \"none\"}`;\n case \"footnote\":\n case \"endnote\":\n return `${storyTarget.kind}:${storyTarget.noteId}`;\n }\n}\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\n\nimport type {\n AutosaveState,\n CompatibilityReport,\n DocumentNavigationSnapshot,\n EditorDatastoreAdapter,\n EditorError,\n EditorHostAdapter,\n EditorSessionState,\n EditorViewStateSnapshot,\n EditorWarning,\n ExportDocxOptions,\n ExportResult,\n FieldSnapshot,\n PersistedEditorSnapshot,\n RuntimeRenderSnapshot,\n TocRefreshResult,\n UpdateFieldsResult,\n ViewMode as EditorViewMode,\n WordReviewEditorEvent,\n WordReviewEditorProps,\n WorkspaceMode,\n ZoomLevel,\n} from \"../api/public-types\";\nimport {\n editorSessionStateFromPersistedSnapshot,\n persistedSnapshotFromEditorSessionState,\n} from \"../api/session-state.ts\";\nimport { createCanonicalDocumentId } from \"../core/state/editor-state.ts\";\nimport {\n createDocumentRuntime,\n type DocumentRuntime,\n} from \"../runtime/document-runtime.ts\";\nimport { loadDocxEditorSession } from \"../io/docx-session.ts\";\nimport {\n decodePersistedSourcePackageBytes,\n hasValidPersistedSourcePackageDigest,\n} from \"../io/source-package-provenance.ts\";\nimport {\n createEditorViewStateSnapshot,\n createViewState,\n} from \"../runtime/view-state.ts\";\nimport {\n recordPerfSample,\n} from \"../ui-tailwind/editor-surface/perf-probe.ts\";\nimport {\n downloadExportResult,\n withExportDelivery,\n} from \"./browser-export\";\n\nexport interface ResolvedSource {\n source: \"docx\" | \"session\" | \"snapshot\";\n sourceLabel?: string;\n initialDocx?: Uint8Array | ArrayBuffer;\n initialSessionState?: EditorSessionState;\n initialSnapshot?: PersistedEditorSnapshot;\n}\n\nexport interface CreateRuntimeArgs {\n documentId: string;\n readOnly: boolean;\n source: ResolvedSource;\n initialViewState?: {\n workspaceMode?: WorkspaceMode;\n zoomLevel?: ZoomLevel;\n };\n hostAdapter?: EditorHostAdapter;\n datastore?: EditorDatastoreAdapter;\n currentUserId?: string;\n}\n\ninterface RuntimeLifecycleHandlers {\n onWarning?: (warning: EditorWarning) => void;\n onError?: (error: EditorError) => void;\n onEvent?: (event: WordReviewEditorEvent) => void;\n}\n\nexport interface WordReviewEditorRuntime extends DocumentRuntime {\n getFatalError?(): EditorError | undefined;\n dispose?(): void;\n setDefaultAuthorId?(authorId?: string): void;\n emitBlockedCommand(\n command: string,\n reasons: Extract<WordReviewEditorEvent, { type: \"command_blocked\" }>[\"reasons\"],\n ): void;\n}\n\ntype PackageBackedDocxSession = ReturnType<typeof loadDocxEditorSession>;\n\ninterface SnapshotExportBarrier {\n reason:\n | \"missing_source_package_provenance\"\n | \"invalid_source_package_provenance\";\n message: string;\n}\n\nexport interface EditorRuntimeBoundaryState {\n runtime: WordReviewEditorRuntime | null;\n loadError: EditorError | null;\n activeRuntime: WordReviewEditorRuntime;\n fallbackSnapshot: RuntimeRenderSnapshot;\n loadingSessionState: EditorSessionState;\n loadingViewState: EditorViewStateSnapshot;\n loadingNavigation: DocumentNavigationSnapshot;\n hostAdapterRef: React.MutableRefObject<EditorHostAdapter | undefined>;\n datastoreRef: React.MutableRefObject<EditorDatastoreAdapter | undefined>;\n onEventRef: React.MutableRefObject<((event: WordReviewEditorEvent) => void) | undefined>;\n onWarningRef: React.MutableRefObject<((warning: EditorWarning) => void) | undefined>;\n onErrorRef: React.MutableRefObject<((error: EditorError) => void) | undefined>;\n autosaveTimerRef: React.MutableRefObject<ReturnType<typeof setTimeout> | null>;\n lastSavedRevisionTokenRef: React.MutableRefObject<string | null>;\n runtimeViewStateSeedRef: React.MutableRefObject<{\n workspaceMode: WorkspaceMode;\n zoomLevel: ZoomLevel;\n }>;\n}\n\nexport async function __resolveWordReviewEditorSource(\n props: Pick<\n WordReviewEditorProps,\n | \"documentId\"\n | \"hostAdapter\"\n | \"datastore\"\n | \"externalDocSource\"\n | \"initialDocx\"\n | \"initialSessionState\"\n | \"initialSnapshot\"\n | \"initialSourceLabel\"\n | \"loadRevision\"\n | \"loadSourcePolicy\"\n >,\n): Promise<ResolvedSource> {\n const explicitInitialCount =\n Number(Boolean(props.initialDocx)) +\n Number(Boolean(props.initialSessionState)) +\n Number(Boolean(props.initialSnapshot));\n if (explicitInitialCount > 1) {\n throw new Error(\n \"Provide exactly one of initialDocx, initialSessionState, or initialSnapshot.\",\n );\n }\n\n if (props.externalDocSource) {\n if (props.externalDocSource.kind === \"docx\") {\n return {\n source: \"docx\",\n initialDocx: props.externalDocSource.bytes,\n sourceLabel: props.externalDocSource.sourceLabel,\n };\n }\n\n if (props.externalDocSource.kind === \"session\") {\n return {\n source: \"session\",\n initialSessionState: props.externalDocSource.sessionState,\n sourceLabel:\n props.externalDocSource.sourceLabel ??\n props.externalDocSource.sessionState.sourcePackage?.sourceLabel,\n };\n }\n\n return {\n source: \"snapshot\",\n initialSnapshot: props.externalDocSource.snapshot,\n sourceLabel: props.externalDocSource.sourceLabel,\n };\n }\n\n if (props.initialSessionState) {\n return {\n source: \"session\",\n initialSessionState: props.initialSessionState,\n sourceLabel:\n props.initialSourceLabel ??\n props.initialSessionState.sourcePackage?.sourceLabel,\n };\n }\n\n if (props.initialSnapshot) {\n return {\n source: \"snapshot\",\n initialSnapshot: props.initialSnapshot,\n sourceLabel: props.initialSourceLabel,\n };\n }\n\n if (props.initialDocx) {\n return {\n source: \"docx\",\n initialDocx: props.initialDocx,\n sourceLabel: props.initialSourceLabel,\n };\n }\n\n const loader = props.hostAdapter?.load ?? props.datastore?.load;\n if (!loader) {\n throw new Error(\n `WordReviewEditor ${props.documentId} needs initialDocx, initialSessionState, initialSnapshot, or a host/datastore load source.`,\n );\n }\n\n const loadResult = await loader({\n documentId: props.documentId,\n loadRevision: props.loadRevision,\n loadSourcePolicy: props.loadSourcePolicy,\n });\n\n if (!loadResult.source) {\n throw new Error(\n `Host or datastore loader did not return a loadable source for ${props.documentId}.`,\n );\n }\n\n if (loadResult.source.kind === \"docx\") {\n return {\n source: \"docx\",\n initialDocx: loadResult.source.bytes,\n sourceLabel: loadResult.source.sourceLabel,\n };\n }\n\n if (loadResult.source.kind === \"session\") {\n return {\n source: \"session\",\n initialSessionState: loadResult.source.sessionState,\n sourceLabel:\n loadResult.source.sourceLabel ??\n loadResult.source.sessionState.sourcePackage?.sourceLabel,\n };\n }\n\n return {\n source: \"snapshot\",\n initialSnapshot: loadResult.source.snapshot,\n sourceLabel: loadResult.source.sourceLabel,\n };\n}\n\nexport function __createFallbackRuntime(args: CreateRuntimeArgs): WordReviewEditorRuntime {\n return createRuntime(args);\n}\n\nexport function useEditorRuntimeBoundary(\n props: WordReviewEditorProps,\n): EditorRuntimeBoundaryState {\n const {\n currentUser,\n datastore,\n documentId,\n externalDocSource,\n externalDocumentRevision,\n hostAdapter,\n initialDocx,\n initialSessionState,\n initialSnapshot,\n initialSourceLabel,\n loadRevision,\n loadSourcePolicy = \"prefer-saved-state\",\n onError,\n onEvent,\n onWarning,\n readOnly = false,\n reviewMode = \"review\",\n } = props;\n\n const [runtime, setRuntime] = useState<WordReviewEditorRuntime | null>(null);\n const [loadError, setLoadError] = useState<EditorError | null>(null);\n const runtimeRef = useRef<WordReviewEditorRuntime | null>(null);\n const autosaveTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const lastSavedRevisionTokenRef = useRef<string | null>(null);\n const hostAdapterRef = useRef(hostAdapter);\n const datastoreRef = useRef(datastore);\n const onEventRef = useRef(onEvent);\n const onWarningRef = useRef(onWarning);\n const onErrorRef = useRef(onError);\n const runtimeViewStateSeedRef = useRef<{\n workspaceMode: WorkspaceMode;\n zoomLevel: ZoomLevel;\n }>({\n workspaceMode: \"canvas\",\n zoomLevel: 100,\n });\n const initialSourceRef = useRef<{\n documentId: string;\n initialDocx?: Uint8Array | ArrayBuffer;\n initialSessionState?: EditorSessionState;\n initialSnapshot?: PersistedEditorSnapshot;\n initialSourceLabel?: string;\n } | null>(null);\n\n if (!initialSourceRef.current || initialSourceRef.current.documentId !== documentId) {\n initialSourceRef.current = {\n documentId,\n initialDocx,\n initialSessionState,\n initialSnapshot,\n initialSourceLabel,\n };\n }\n\n const stableInitialSource = initialSourceRef.current;\n const sourceReloadKey = externalDocSource\n ? `external:${externalDocSource.kind}:${externalDocumentRevision ?? \"static\"}`\n : stableInitialSource?.initialSessionState\n ? \"initial-session\"\n : stableInitialSource?.initialSnapshot\n ? \"initial-snapshot\"\n : stableInitialSource?.initialDocx\n ? \"initial-docx\"\n : hostAdapter\n ? `host-adapter:${loadRevision ?? \"static\"}`\n : `datastore:${loadRevision ?? \"static\"}`;\n\n useEffect(() => {\n hostAdapterRef.current = hostAdapter;\n datastoreRef.current = datastore;\n onEventRef.current = onEvent;\n onWarningRef.current = onWarning;\n onErrorRef.current = onError;\n }, [datastore, hostAdapter, onError, onEvent, onWarning]);\n\n useEffect(() => {\n runtimeRef.current?.setDefaultAuthorId?.(currentUser.userId);\n }, [currentUser.userId]);\n\n useEffect(() => {\n let cancelled = false;\n\n async function loadRuntime(): Promise<void> {\n setLoadError(null);\n\n try {\n const source = await __resolveWordReviewEditorSource({\n documentId,\n hostAdapter: hostAdapterRef.current,\n datastore: datastoreRef.current,\n externalDocSource,\n initialDocx: stableInitialSource?.initialDocx,\n initialSessionState: stableInitialSource?.initialSessionState,\n initialSnapshot: stableInitialSource?.initialSnapshot,\n initialSourceLabel: stableInitialSource?.initialSourceLabel,\n loadRevision,\n loadSourcePolicy,\n });\n\n if (cancelled) {\n return;\n }\n\n runtimeRef.current?.dispose?.();\n const nextRuntime = createRuntime(\n {\n documentId,\n readOnly,\n source,\n initialViewState: runtimeViewStateSeedRef.current,\n hostAdapter: hostAdapterRef.current,\n datastore: datastoreRef.current,\n currentUserId: currentUser.userId,\n },\n {\n onWarning: onWarningRef.current,\n onError: onErrorRef.current,\n onEvent: onEventRef.current,\n },\n );\n recordPerfSample(\"runtime.create\");\n emitEditorEvent({\n hostAdapter: hostAdapterRef.current,\n datastore: datastoreRef.current,\n onEvent: onEventRef.current,\n event: createReadyEvent(nextRuntime, source.source),\n });\n runtimeRef.current = nextRuntime;\n setRuntime(nextRuntime);\n } catch (error) {\n if (cancelled) {\n return;\n }\n\n const normalized = normalizeEditorError(error);\n setLoadError(normalized);\n onErrorRef.current?.(normalized);\n emitEditorEvent({\n hostAdapter: hostAdapterRef.current,\n datastore: datastoreRef.current,\n onEvent: onEventRef.current,\n event: {\n type: \"error\",\n documentId,\n error: normalized,\n },\n });\n }\n }\n\n void loadRuntime();\n\n return () => {\n cancelled = true;\n };\n }, [\n documentId,\n readOnly,\n sourceReloadKey,\n ]);\n\n useEffect(() => {\n if (!runtime?.subscribeToEvents) {\n return;\n }\n\n return runtime.subscribeToEvents((event) => {\n if (event.type === \"export_completed\" || event.type === \"ready\") {\n return;\n }\n emitEditorEvent({\n hostAdapter: hostAdapterRef.current,\n datastore: datastoreRef.current,\n onEvent: onEventRef.current,\n event,\n });\n });\n }, [runtime]);\n\n useEffect(() => {\n return () => {\n if (autosaveTimerRef.current) {\n clearTimeout(autosaveTimerRef.current);\n autosaveTimerRef.current = null;\n }\n runtimeRef.current?.dispose?.();\n runtimeRef.current = null;\n };\n }, []);\n\n const fallbackSnapshot = useMemo(\n () =>\n loadError\n ? createErrorSnapshot(documentId, loadError)\n : createLoadingSnapshot(\n documentId,\n readOnly,\n guessSourceLabel(\n initialSourceLabel,\n initialSessionState,\n initialSnapshot,\n externalDocSource,\n ),\n ),\n [\n documentId,\n externalDocSource,\n initialSessionState,\n initialSnapshot,\n initialSourceLabel,\n loadError,\n readOnly,\n ],\n );\n const loadingPersistedSnapshot = useMemo(\n () => createFallbackPersistedSnapshot(documentId, initialSourceLabel),\n [documentId, initialSourceLabel],\n );\n const loadingSessionState = useMemo(\n () =>\n initialSessionState ??\n (initialSnapshot\n ? editorSessionStateFromPersistedSnapshot(initialSnapshot)\n : editorSessionStateFromPersistedSnapshot(loadingPersistedSnapshot)),\n [initialSessionState, initialSnapshot, loadingPersistedSnapshot],\n );\n const loadingViewState = useMemo(\n () =>\n createLoadingViewStateSnapshot(\n fallbackSnapshot,\n runtimeViewStateSeedRef.current,\n deriveEditorViewMode(fallbackSnapshot.readOnly, reviewMode),\n ),\n [fallbackSnapshot, reviewMode],\n );\n const loadingNavigation = useMemo(\n () => createLoadingNavigationSnapshot(),\n [],\n );\n const loadingRuntimeBridge = useMemo(\n () =>\n createLoadingRuntimeBridge({\n snapshot: fallbackSnapshot,\n sessionState: loadingSessionState,\n viewState: loadingViewState,\n navigation: loadingNavigation,\n }),\n [fallbackSnapshot, loadingNavigation, loadingSessionState, loadingViewState],\n );\n\n return {\n runtime,\n loadError,\n activeRuntime: runtime ?? loadingRuntimeBridge,\n fallbackSnapshot,\n loadingSessionState,\n loadingViewState,\n loadingNavigation,\n hostAdapterRef,\n datastoreRef,\n onEventRef,\n onWarningRef,\n onErrorRef,\n autosaveTimerRef,\n lastSavedRevisionTokenRef,\n runtimeViewStateSeedRef,\n };\n}\n\nfunction createRuntime(\n args: CreateRuntimeArgs,\n handlers: RuntimeLifecycleHandlers = {},\n): WordReviewEditorRuntime {\n const docxSession = args.source.initialDocx\n ? loadDocxEditorSession({\n documentId: args.documentId,\n sourceLabel: args.source.sourceLabel,\n bytes: args.source.initialDocx,\n editorBuild: \"dev\",\n })\n : undefined;\n const snapshotExportResolution = !args.source.initialDocx\n ? resolvePackageBackedExportSession(args)\n : undefined;\n const initialSessionState =\n args.source.initialSessionState ??\n docxSession?.initialSessionState ??\n (args.source.initialSnapshot\n ? editorSessionStateFromPersistedSnapshot(args.source.initialSnapshot)\n : editorSessionStateFromPersistedSnapshot(\n createFallbackPersistedSnapshot(\n args.documentId,\n args.source.sourceLabel ?? \"Generated shell snapshot\",\n ),\n ));\n const runtimeSessionState = snapshotExportResolution?.barrier\n ? applySessionExportBarrier(initialSessionState, snapshotExportResolution.barrier)\n : initialSessionState;\n\n const runtime: WordReviewEditorRuntime = Object.assign(createDocumentRuntime({\n documentId: args.documentId,\n initialSessionState: runtimeSessionState,\n sourceKind: args.source.source,\n sourceLabel: args.source.sourceLabel,\n initialViewState: args.initialViewState,\n readOnly: args.readOnly || docxSession?.readOnly,\n editorBuild: runtimeSessionState.editorBuild,\n fatalError: docxSession?.fatalError,\n protectionSnapshot: docxSession?.protectionSnapshot,\n exportDocx: async (sessionState, options) => {\n if (docxSession) {\n return docxSession.exportDocx(sessionState, options);\n }\n\n if (snapshotExportResolution?.session) {\n return snapshotExportResolution.session.exportDocx(sessionState, options);\n }\n\n throw createSnapshotExportBlockedError(\n args.documentId,\n snapshotExportResolution?.barrier ?? {\n reason: \"missing_source_package_provenance\",\n message:\n \"DOCX export is blocked because this session does not carry embedded source package provenance.\",\n },\n );\n },\n onWarning: handlers.onWarning,\n onError: handlers.onError,\n defaultAuthorId: args.currentUserId,\n }), {\n emitBlockedCommand: (\n command: string,\n reasons: Extract<WordReviewEditorEvent, { type: \"command_blocked\" }>[\"reasons\"],\n ) => {\n emitEditorEvent({\n hostAdapter: args.hostAdapter,\n datastore: args.datastore,\n onEvent: handlers.onEvent,\n event: {\n type: \"command_blocked\",\n documentId: args.documentId,\n command,\n reasons,\n },\n });\n },\n });\n\n return runtime;\n}\n\nfunction createLoadingSnapshot(\n documentId: string,\n readOnly: boolean,\n sourceLabel?: string,\n): RuntimeRenderSnapshot {\n return {\n documentId,\n sessionId: `${documentId}-loading`,\n sourceLabel,\n revisionToken: `${documentId}:loading`,\n isReady: false,\n isDirty: false,\n readOnly,\n documentMode: \"editing\",\n selection: collapsedSelection(),\n activeStory: { kind: \"main\" },\n documentStats: {\n storyLength: 0,\n commentCount: 0,\n revisionCount: 0,\n opaqueFragmentCount: 0,\n },\n comments: {\n openCommentIds: [],\n resolvedCommentIds: [],\n detachedCommentIds: [],\n totalCount: 0,\n threads: [],\n },\n trackedChanges: {\n pendingChangeIds: [],\n acceptedChangeIds: [],\n rejectedChangeIds: [],\n detachedChangeIds: [],\n actionableChangeIds: [],\n preserveOnlyChangeIds: [],\n totalCount: 0,\n revisions: [],\n },\n compatibility: {\n blockExport: false,\n blockExportReasons: [],\n warningCount: 0,\n errorCount: 0,\n featureEntries: [],\n },\n warnings: [],\n commandState: {\n canUndo: false,\n canRedo: false,\n readOnly,\n },\n protectionSnapshot: {\n hasDocumentProtection: false,\n enforcementActive: false,\n ranges: [],\n enforcedRangeCount: 0,\n preservedRangeCount: 0,\n },\n };\n}\n\nfunction createLoadingNavigationSnapshot(): DocumentNavigationSnapshot {\n return {\n pageCount: 0,\n pages: [],\n headings: [],\n activePageIndex: 0,\n activeSectionIndex: 0,\n };\n}\n\nfunction createLoadingViewStateSnapshot(\n snapshot: RuntimeRenderSnapshot,\n seed: {\n workspaceMode?: WorkspaceMode;\n zoomLevel?: ZoomLevel;\n },\n viewMode: EditorViewMode,\n): EditorViewStateSnapshot {\n return createEditorViewStateSnapshot(\n createViewState({\n viewMode,\n workspaceMode: seed.workspaceMode,\n zoomLevel: seed.zoomLevel,\n }),\n snapshot.activeStory,\n snapshot.selection,\n snapshot.surface,\n snapshot.surface,\n snapshot.pageLayout,\n );\n}\n\nfunction createLoadingRuntimeBridge(input: {\n snapshot: RuntimeRenderSnapshot;\n sessionState: EditorSessionState;\n viewState: EditorViewStateSnapshot;\n navigation: DocumentNavigationSnapshot;\n}): WordReviewEditorRuntime {\n const emptyFieldSnapshot: FieldSnapshot = {\n totalCount: 0,\n supportedCount: 0,\n preserveOnlyCount: 0,\n fields: [],\n };\n const emptyFieldResult: UpdateFieldsResult = {\n totalCount: 0,\n updatedCount: 0,\n preserveOnlyCount: 0,\n };\n const emptyTocResult: TocRefreshResult = {\n entryCount: 0,\n entries: [],\n };\n\n return {\n subscribe: () => () => undefined,\n subscribeToEvents: () => () => undefined,\n emitBlockedCommand: () => undefined,\n getRenderSnapshot: () => input.snapshot,\n getCanonicalDocument: () => input.sessionState.canonicalDocument,\n getSourcePackage: () => input.sessionState.sourcePackage,\n replaceText: () => undefined,\n applyActiveStoryTextCommand: () => undefined,\n dispatch: () => undefined,\n undo: () => undefined,\n redo: () => undefined,\n focus: () => undefined,\n blur: () => undefined,\n addComment: () => {\n throw createLoadingBoundaryError(input.snapshot.documentId, \"comment\");\n },\n openComment: () => undefined,\n resolveComment: () => undefined,\n reopenComment: () => undefined,\n addCommentReply: () => undefined,\n editCommentBody: () => undefined,\n acceptChange: () => undefined,\n rejectChange: () => undefined,\n acceptAllChanges: () => undefined,\n rejectAllChanges: () => undefined,\n openStory: () => false,\n closeStory: () => undefined,\n getActiveStory: () => input.snapshot.activeStory,\n getViewState: () => input.viewState,\n setViewMode: () => undefined,\n setDocumentMode: () => undefined,\n getProtectionSnapshot: () => input.snapshot.protectionSnapshot,\n setWorkspaceMode: () => undefined,\n setZoom: () => undefined,\n getPageLayoutSnapshot: () => null,\n getDocumentNavigationSnapshot: () => input.navigation,\n getFieldSnapshot: () => emptyFieldSnapshot,\n updateFields: () => emptyFieldResult,\n updateTableOfContents: () => emptyTocResult,\n getSessionState: () => {\n throw createLoadingBoundaryError(input.snapshot.documentId, \"session\");\n },\n getPersistedSnapshot: () => {\n throw createLoadingBoundaryError(input.snapshot.documentId, \"snapshot\");\n },\n getCompatibilityReport: () => ({\n reportVersion: \"compatibility-report/1\",\n generatedAt: input.sessionState.updatedAt,\n blockExport: input.snapshot.compatibility.blockExport,\n featureEntries: input.snapshot.compatibility.featureEntries,\n warnings: input.snapshot.warnings,\n errors: input.snapshot.fatalError ? [input.snapshot.fatalError] : [],\n }),\n getWarnings: () => input.snapshot.warnings,\n exportDocx: () =>\n Promise.reject(createLoadingBoundaryError(input.snapshot.documentId, \"export\")),\n setWorkflowOverlay: () => undefined,\n clearWorkflowOverlay: () => undefined,\n getWorkflowScopeSnapshot: () => null,\n getInteractionGuardSnapshot: () => ({ effectiveMode: \"edit\", blockedReasons: [] }),\n getWorkflowMarkupSnapshot: () => ({\n totalCount: 0,\n items: [],\n highlights: [],\n comments: [],\n revisions: [],\n fields: [],\n protectedRanges: [],\n opaqueFragments: [],\n }),\n setHostAnnotationOverlay: () => undefined,\n clearHostAnnotationOverlay: () => undefined,\n getHostAnnotationSnapshot: () => ({\n totalCount: 0,\n annotations: [],\n }),\n getWorkflowCandidateRanges: () => [],\n replaceWorkflowMarkupText: () => undefined,\n };\n}\n\nfunction createLoadingBoundaryError(\n documentId: string,\n target: \"comment\" | \"session\" | \"snapshot\" | \"export\",\n): EditorError {\n return {\n errorId: `${documentId}-loading-${target}`,\n code: \"internal_invariant\",\n message: \"Editor is still loading.\",\n isFatal: false,\n source: \"runtime\",\n };\n}\n\nfunction deriveEditorViewMode(\n readOnly: boolean,\n reviewMode: WordReviewEditorProps[\"reviewMode\"] = \"review\",\n): EditorViewMode {\n if (readOnly) {\n return \"view\";\n }\n return reviewMode === \"editing\" ? \"editing\" : \"review\";\n}\n\nfunction createErrorSnapshot(documentId: string, error: EditorError): RuntimeRenderSnapshot {\n return {\n ...createLoadingSnapshot(documentId, true),\n isReady: true,\n sessionId: `${documentId}-error`,\n revisionToken: `${documentId}:error`,\n compatibility: {\n blockExport: true,\n blockExportReasons: [error.message],\n warningCount: 0,\n errorCount: 1,\n featureEntries: [],\n },\n fatalError: error,\n };\n}\n\nexport async function persistAndExport(input: {\n hostAdapter?: EditorHostAdapter;\n datastore?: EditorDatastoreAdapter;\n documentId: string;\n runtime: WordReviewEditorRuntime;\n onError?: (error: EditorError) => void;\n onEvent?: (event: WordReviewEditorEvent) => void;\n options?: ExportDocxOptions;\n lastSavedRevisionTokenRef: React.MutableRefObject<string | null>;\n autosaveTimerRef: React.MutableRefObject<ReturnType<typeof setTimeout> | null>;\n}): Promise<ExportResult> {\n if (input.autosaveTimerRef.current) {\n clearTimeout(input.autosaveTimerRef.current);\n input.autosaveTimerRef.current = null;\n }\n\n await persistSession({\n hostAdapter: input.hostAdapter,\n datastore: input.datastore,\n documentId: input.documentId,\n runtime: input.runtime,\n isAutosave: false,\n onError: input.onError,\n onEvent: input.onEvent,\n lastSavedRevisionTokenRef: input.lastSavedRevisionTokenRef,\n });\n\n let result: ExportResult;\n try {\n result = await input.runtime.exportDocx(input.options);\n } catch (error) {\n const normalized = normalizeExportError(error, input.documentId, input.options);\n input.onError?.(normalized);\n emitEditorEvent({\n hostAdapter: input.hostAdapter,\n datastore: input.datastore,\n onEvent: input.onEvent,\n event: {\n type: \"error\",\n documentId: input.documentId,\n error: normalized,\n },\n });\n throw normalized;\n }\n\n const saveExport = input.hostAdapter?.saveExport ?? input.datastore?.saveExport;\n const saveExportSource = input.hostAdapter?.saveExport ? \"host\" : \"datastore\";\n if (!saveExport) {\n result = downloadExportResult(result);\n emitEditorEvent({\n hostAdapter: input.hostAdapter,\n datastore: input.datastore,\n onEvent: input.onEvent,\n event: {\n type: \"export_completed\",\n documentId: input.documentId,\n result,\n },\n });\n return result;\n }\n\n try {\n const saveResult = await saveExport({\n documentId: input.documentId,\n result,\n });\n result = withExportDelivery(result, {\n mode: \"persisted-by-host\",\n savedAt: saveResult.savedAt,\n });\n } catch (error) {\n const normalized = normalizeStorageError(error, {\n message: \"Export persisted bytes could not be stored.\",\n source: saveExportSource,\n details: {\n operation: \"saveExport\",\n },\n });\n input.onError?.(normalized);\n emitEditorEvent({\n hostAdapter: input.hostAdapter,\n datastore: input.datastore,\n onEvent: input.onEvent,\n event: {\n type: \"error\",\n documentId: input.documentId,\n error: normalized,\n },\n });\n result = withExportDelivery(result, {\n mode: \"exported-bytes-only\",\n });\n }\n\n emitEditorEvent({\n hostAdapter: input.hostAdapter,\n datastore: input.datastore,\n onEvent: input.onEvent,\n event: {\n type: \"export_completed\",\n documentId: input.documentId,\n result,\n },\n });\n\n return result;\n}\n\nexport function rejectExportWhileLoading(input: {\n documentId: string;\n hostAdapter?: EditorHostAdapter;\n datastore?: EditorDatastoreAdapter;\n onError?: (error: EditorError) => void;\n onEvent?: (event: WordReviewEditorEvent) => void;\n}): Promise<never> {\n const error: EditorError = {\n errorId: \"word-review-editor-loading-export\",\n code: \"internal_invariant\",\n message: \"WordReviewEditor is still loading and cannot export yet.\",\n isFatal: false,\n source: \"runtime\",\n };\n input.onError?.(error);\n emitEditorEvent({\n hostAdapter: input.hostAdapter,\n datastore: input.datastore,\n onEvent: input.onEvent,\n event: {\n type: \"error\",\n documentId: input.documentId,\n error,\n },\n });\n return Promise.reject(error);\n}\n\nexport async function persistSession(input: {\n hostAdapter?: EditorHostAdapter;\n datastore?: EditorDatastoreAdapter;\n documentId: string;\n runtime: WordReviewEditorRuntime;\n isAutosave: boolean;\n onError?: (error: EditorError) => void;\n onEvent?: (event: WordReviewEditorEvent) => void;\n lastSavedRevisionTokenRef: React.MutableRefObject<string | null>;\n}): Promise<void> {\n const saveSession = input.hostAdapter?.saveSession;\n const saveSnapshot = input.datastore?.saveSnapshot;\n if (!saveSession && !saveSnapshot) {\n return;\n }\n\n const sessionState = input.runtime.getSessionState();\n const snapshot = input.runtime.getPersistedSnapshot();\n const revisionToken = input.runtime.getRenderSnapshot().revisionToken;\n\n if (input.isAutosave) {\n emitEditorEvent({\n hostAdapter: input.hostAdapter,\n datastore: input.datastore,\n onEvent: input.onEvent,\n event: {\n type: \"autosave_state\",\n documentId: input.documentId,\n state: {\n status: \"saving\",\n } satisfies AutosaveState,\n },\n });\n }\n\n try {\n const result = saveSession\n ? await saveSession({\n documentId: input.documentId,\n sessionState,\n isAutosave: input.isAutosave,\n })\n : await saveSnapshot!({\n documentId: input.documentId,\n snapshot,\n isAutosave: input.isAutosave,\n });\n input.lastSavedRevisionTokenRef.current = revisionToken;\n emitEditorEvent({\n hostAdapter: input.hostAdapter,\n datastore: input.datastore,\n onEvent: input.onEvent,\n event: saveSession\n ? {\n type: \"session_saved\",\n documentId: input.documentId,\n sessionState: input.runtime.getSessionState(),\n savedAt: result.savedAt,\n isAutosave: input.isAutosave,\n }\n : {\n type: \"snapshot_saved\",\n documentId: input.documentId,\n snapshot: {\n ...snapshot,\n savedAt: result.savedAt,\n },\n isAutosave: input.isAutosave,\n },\n });\n if (input.isAutosave) {\n emitEditorEvent({\n hostAdapter: input.hostAdapter,\n datastore: input.datastore,\n onEvent: input.onEvent,\n event: {\n type: \"autosave_state\",\n documentId: input.documentId,\n state: {\n status: \"saved\",\n savedAt: result.savedAt,\n } satisfies AutosaveState,\n },\n });\n }\n } catch (error) {\n const normalized = normalizeStorageError(error, {\n message: input.isAutosave\n ? saveSession\n ? \"Autosave failed while storing the editor session.\"\n : \"Autosave failed while storing the editor snapshot.\"\n : saveSession\n ? \"Session save failed while preparing the export checkpoint.\"\n : \"Snapshot save failed while preparing the export checkpoint.\",\n source: saveSession ? \"host\" : \"datastore\",\n details: {\n operation: saveSession ? \"saveSession\" : \"saveSnapshot\",\n isAutosave: input.isAutosave,\n },\n });\n input.onError?.(normalized);\n emitEditorEvent({\n hostAdapter: input.hostAdapter,\n datastore: input.datastore,\n onEvent: input.onEvent,\n event: {\n type: \"error\",\n documentId: input.documentId,\n error: normalized,\n },\n });\n if (input.isAutosave) {\n emitEditorEvent({\n hostAdapter: input.hostAdapter,\n datastore: input.datastore,\n onEvent: input.onEvent,\n event: {\n type: \"autosave_state\",\n documentId: input.documentId,\n state: {\n status: \"error\",\n error: normalized,\n } satisfies AutosaveState,\n },\n });\n }\n if (!input.isAutosave) {\n throw normalized;\n }\n }\n}\n\nfunction emitEditorEvent(input: {\n hostAdapter?: EditorHostAdapter;\n datastore?: EditorDatastoreAdapter;\n onEvent?: (event: WordReviewEditorEvent) => void;\n event: WordReviewEditorEvent;\n}): void {\n input.onEvent?.(input.event);\n const logEvent = input.hostAdapter?.logEvent ?? input.datastore?.logEvent;\n logEvent?.({\n type: input.event.type,\n documentId: input.event.documentId,\n detail: summarizeEventDetail(input.event),\n });\n}\n\nfunction summarizeEventDetail(\n event: WordReviewEditorEvent,\n): Record<string, unknown> | undefined {\n switch (event.type) {\n case \"dirty_changed\":\n return { isDirty: event.isDirty };\n case \"comment_added\":\n case \"comment_resolved\":\n return { commentId: event.commentId };\n case \"change_accepted\":\n case \"change_rejected\":\n return { changeId: event.changeId };\n case \"warning_added\":\n return { warningId: event.warning.warningId, code: event.warning.code };\n case \"warning_cleared\":\n return { warningId: event.warningId, code: event.code };\n case \"error\":\n return { errorId: event.error.errorId, code: event.error.code };\n case \"autosave_state\":\n return { status: event.state.status };\n case \"snapshot_saved\":\n return { isAutosave: event.isAutosave, savedAt: event.snapshot.savedAt };\n case \"session_saved\":\n return { isAutosave: event.isAutosave, savedAt: event.savedAt };\n case \"export_completed\":\n return {\n fileName: event.result.fileName,\n deliveryMode: event.result.delivery?.mode,\n savedAt: event.result.delivery?.savedAt,\n };\n case \"story_changed\":\n return { activeStory: event.activeStory };\n case \"selection_changed\":\n return {\n anchor: event.selection.anchor,\n head: event.selection.head,\n };\n case \"ready\":\n return {\n source: event.source,\n blockExport: event.compatibility.blockExport,\n };\n }\n}\n\nfunction createReadyEvent(\n runtime: Pick<WordReviewEditorRuntime, \"getCompatibilityReport\" | \"getRenderSnapshot\">,\n source: \"docx\" | \"session\" | \"snapshot\",\n): Extract<WordReviewEditorEvent, { type: \"ready\" }> {\n const snapshot = runtime.getRenderSnapshot();\n return {\n type: \"ready\",\n documentId: snapshot.documentId,\n sessionId: snapshot.sessionId,\n source,\n stats: snapshot.documentStats,\n compatibility: runtime.getCompatibilityReport(),\n comments: snapshot.comments,\n trackedChanges: snapshot.trackedChanges,\n };\n}\n\nfunction normalizeEditorError(error: unknown): EditorError {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"errorId\" in error &&\n \"code\" in error &&\n \"message\" in error\n ) {\n return error as EditorError;\n }\n\n return {\n errorId: \"word-review-editor-load\",\n code: \"internal_invariant\",\n message: error instanceof Error ? error.message : \"Unknown editor load failure.\",\n isFatal: true,\n source: \"runtime\",\n };\n}\n\nfunction guessSourceLabel(\n initialSourceLabel?: string,\n initialSessionState?: EditorSessionState,\n initialSnapshot?: PersistedEditorSnapshot,\n externalDocSource?: WordReviewEditorProps[\"externalDocSource\"],\n): string | undefined {\n return (\n externalDocSource?.sourceLabel ??\n (externalDocSource?.kind === \"session\"\n ? externalDocSource.sessionState.sourcePackage?.sourceLabel\n : undefined) ??\n (externalDocSource?.kind === \"snapshot\"\n ? externalDocSource.snapshot.sourcePackage?.sourceLabel\n : undefined) ??\n initialSourceLabel ??\n initialSessionState?.sourcePackage?.sourceLabel ??\n initialSessionState?.editorBuild ??\n initialSnapshot?.sourcePackage?.sourceLabel ??\n initialSnapshot?.editorBuild ??\n undefined\n );\n}\n\nfunction createFallbackPersistedSnapshot(\n documentId: string,\n label = \"Generated shell snapshot\",\n): PersistedEditorSnapshot {\n const docId = createCanonicalDocumentId(documentId);\n return {\n snapshotVersion: \"persisted-editor-snapshot/2\",\n schemaVersion: \"cds/1.0.0\",\n documentId,\n docId,\n createdAt: \"1970-01-01T00:00:00.000Z\",\n updatedAt: \"1970-01-01T00:00:00.000Z\",\n savedAt: \"1970-01-01T00:00:00.000Z\",\n editorBuild: label,\n canonicalDocument: {\n schemaVersion: \"cds/1.0.0\",\n docId,\n createdAt: \"1970-01-01T00:00:00.000Z\",\n updatedAt: \"1970-01-01T00:00:00.000Z\",\n metadata: { customProperties: {} },\n styles: { paragraphs: {}, characters: {}, tables: {} },\n numbering: { abstractDefinitions: {}, instances: {} },\n media: { items: {} },\n content: {\n type: \"doc\",\n children: [{ type: \"paragraph\", children: [] }],\n },\n review: { comments: {}, revisions: {} },\n preservation: { opaqueFragments: {}, packageParts: {} },\n diagnostics: { warnings: [], errors: [] },\n },\n compatibility: emptyCompatibilityReport(),\n warningLog: [],\n };\n}\n\nfunction emptyCompatibilityReport(): CompatibilityReport {\n return {\n reportVersion: \"compatibility-report/1\",\n generatedAt: \"1970-01-01T00:00:00.000Z\",\n blockExport: false,\n featureEntries: [],\n warnings: [],\n errors: [],\n };\n}\n\nfunction resolvePackageBackedExportSession(args: CreateRuntimeArgs): {\n session?: PackageBackedDocxSession;\n barrier?: SnapshotExportBarrier;\n} {\n const sourcePackage =\n args.source.initialSessionState?.sourcePackage ??\n args.source.initialSnapshot?.sourcePackage;\n if (!sourcePackage) {\n return {\n barrier: {\n reason: \"missing_source_package_provenance\",\n message:\n \"DOCX export is blocked because this session was loaded without embedded source package provenance.\",\n },\n };\n }\n\n try {\n const bytes = decodePersistedSourcePackageBytes(sourcePackage);\n if (!hasValidPersistedSourcePackageDigest(sourcePackage, bytes)) {\n return {\n barrier: {\n reason: \"invalid_source_package_provenance\",\n message:\n \"DOCX export is blocked because the embedded source package provenance failed its integrity check.\",\n },\n };\n }\n\n const session = loadDocxEditorSession({\n documentId: args.documentId,\n sourceLabel: sourcePackage.sourceLabel ?? args.source.sourceLabel,\n bytes,\n editorBuild:\n args.source.initialSessionState?.editorBuild ??\n args.source.initialSnapshot?.editorBuild ??\n \"dev\",\n });\n if (session.readOnly || session.fatalError) {\n return {\n barrier: {\n reason: \"invalid_source_package_provenance\",\n message:\n \"DOCX export is blocked because the embedded source package provenance is no longer loadable as a valid package-backed session.\",\n },\n };\n }\n\n return { session };\n } catch {\n return {\n barrier: {\n reason: \"invalid_source_package_provenance\",\n message:\n \"DOCX export is blocked because the embedded source package provenance could not be decoded into a package-backed session.\",\n },\n };\n }\n}\n\nfunction applySessionExportBarrier(\n sessionState: EditorSessionState,\n barrier: SnapshotExportBarrier,\n): EditorSessionState {\n const featureEntryId = `feature:source-package-provenance:${barrier.reason}`;\n const featureEntries = sessionState.compatibility.featureEntries.some(\n (entry) => entry.featureEntryId === featureEntryId,\n )\n ? sessionState.compatibility.featureEntries\n : [\n ...sessionState.compatibility.featureEntries,\n {\n featureEntryId,\n featureKey: \"source-package-provenance\",\n featureClass: \"unsupported-fatal\" as const,\n message: barrier.message,\n details: {\n reason: barrier.reason,\n },\n },\n ];\n\n return {\n ...sessionState,\n compatibility: {\n ...sessionState.compatibility,\n blockExport: true,\n featureEntries,\n },\n };\n}\n\nfunction createSnapshotExportBlockedError(\n documentId: string,\n barrier: SnapshotExportBarrier,\n): EditorError {\n return {\n errorId: `${documentId}:export:${barrier.reason}`,\n code: \"export_failed\",\n message: barrier.message,\n isFatal: false,\n source: \"export\",\n details: {\n reason: barrier.reason,\n },\n };\n}\n\nfunction normalizeStorageError(\n error: unknown,\n fallback: {\n message: string;\n source: \"host\" | \"datastore\";\n details?: Record<string, unknown>;\n },\n): EditorError {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"errorId\" in error &&\n \"code\" in error &&\n \"message\" in error\n ) {\n return error as EditorError;\n }\n\n return {\n errorId:\n fallback.source === \"host\"\n ? \"word-review-editor-host\"\n : \"word-review-editor-datastore\",\n code: \"datastore_failed\",\n message: error instanceof Error ? error.message : fallback.message,\n isFatal: false,\n source: fallback.source === \"host\" ? \"host\" : \"datastore\",\n details: fallback.details,\n };\n}\n\nfunction normalizeExportError(\n error: unknown,\n documentId: string,\n options?: ExportDocxOptions,\n): EditorError {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"errorId\" in error &&\n \"code\" in error &&\n \"message\" in error\n ) {\n return error as EditorError;\n }\n\n return {\n errorId: `${documentId}:export:failed`,\n code: \"export_failed\",\n message:\n error instanceof Error ? error.message : \"DOCX export failed for an unknown reason.\",\n isFatal: false,\n source: \"export\",\n details: {\n requestedOptions: options ?? {},\n },\n };\n}\n\nfunction collapsedSelection(): RuntimeRenderSnapshot[\"selection\"] {\n return {\n anchor: 0,\n head: 0,\n isCollapsed: true,\n activeRange: {\n kind: \"range\",\n from: 0,\n to: 0,\n assoc: {\n start: -1,\n end: 1,\n },\n },\n };\n}\n","import type { ExportDelivery, ExportResult } from \"../api/public-types\";\n\nexport function withExportDelivery(\n result: ExportResult,\n delivery: ExportDelivery,\n): ExportResult {\n return {\n ...result,\n delivery,\n };\n}\n\nexport function downloadExportResult(result: ExportResult): ExportResult {\n const delivery = canDownloadInBrowser()\n ? triggerBrowserDownload(result)\n : {\n mode: \"exported-bytes-only\" as const,\n };\n return withExportDelivery(result, delivery);\n}\n\nfunction canDownloadInBrowser(): boolean {\n return (\n typeof window !== \"undefined\" &&\n typeof document !== \"undefined\" &&\n typeof URL !== \"undefined\" &&\n typeof URL.createObjectURL === \"function\" &&\n typeof URL.revokeObjectURL === \"function\" &&\n typeof Blob !== \"undefined\"\n );\n}\n\nfunction triggerBrowserDownload(result: ExportResult): ExportDelivery {\n const blob = new Blob([Uint8Array.from(result.bytes)], { type: result.mimeType });\n const objectUrl = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = objectUrl;\n link.download = result.fileName;\n link.rel = \"noopener\";\n link.style.display = \"none\";\n document.body?.appendChild(link);\n try {\n link.click();\n } finally {\n link.remove();\n URL.revokeObjectURL(objectUrl);\n }\n\n return {\n mode: \"downloaded\",\n };\n}\n","import React, { type CSSProperties, type ReactNode } from \"react\";\n\nimport type {\n DocumentNavigationSnapshot,\n EditorError,\n FormattingStateSnapshot,\n InteractionGuardSnapshot,\n RuntimeRenderSnapshot,\n StyleCatalogSnapshot,\n WordReviewEditorChromeVisibility,\n WorkflowScopeSnapshot,\n WorkspaceMode,\n ZoomLevel,\n} from \"../api/public-types.ts\";\nimport type { SessionCapabilities } from \"../runtime/session-capabilities.ts\";\nimport type { MarkupDisplay } from \"./headless/comment-decoration-model.ts\";\nimport type {\n SelectionToolbarAnchor,\n SelectionToolbarModel,\n SuggestionCardModel,\n} from \"./headless/selection-toolbar-model.ts\";\nimport type { EditorCommandBag } from \"./editor-command-bag.ts\";\nimport type { ReviewRailTab } from \"../ui-tailwind/review/tw-review-rail.tsx\";\nimport { TwReviewWorkspace } from \"../ui-tailwind/tw-review-workspace.tsx\";\nimport type {\n ActiveImageContext,\n} from \"../ui-tailwind/chrome/tw-image-context-toolbar.tsx\";\nimport type {\n ActiveObjectContext,\n} from \"../ui-tailwind/chrome/tw-object-context-toolbar.tsx\";\nimport type { EditorViewStateSnapshot } from \"../api/public-types.ts\";\n\nexport interface EditorShellViewProps {\n shellRef: React.RefObject<HTMLDivElement | null>;\n documentId: string;\n snapshot: RuntimeRenderSnapshot;\n loadError: EditorError | null;\n diagnosticsModeMessage: string | null;\n accessibilityInstructionsId: string;\n accessibilityStatusId: string;\n accessibilityAlertId: string;\n accessibilityStatusMessage: string;\n visuallyHiddenStyles: CSSProperties;\n onShellKeyDownCapture: React.KeyboardEventHandler<HTMLDivElement>;\n viewState: EditorViewStateSnapshot;\n markupDisplay: MarkupDisplay;\n currentUserId: string;\n capabilities: SessionCapabilities;\n reviewMode: \"editing\" | \"review\";\n workspaceMode: WorkspaceMode;\n zoomLevel?: ZoomLevel;\n formattingState?: FormattingStateSnapshot;\n styleCatalog?: StyleCatalogSnapshot;\n activeRailTab: ReviewRailTab;\n activeCommentId?: string;\n activeRevisionId?: string;\n showTrackedChanges: boolean;\n workflowScopeSnapshot?: WorkflowScopeSnapshot | null;\n interactionGuardSnapshot?: InteractionGuardSnapshot;\n selectionToolbar?: SelectionToolbarModel | null;\n suggestionCard?: SuggestionCardModel | null;\n selectionToolbarAnchor?: SelectionToolbarAnchor | null;\n documentNavigation?: DocumentNavigationSnapshot;\n commands: EditorCommandBag;\n document: ReactNode;\n onAddCommentFromSelection?: () => void;\n onAddCommentFromSuggestion?: () => void;\n onAcceptSuggestion?: () => void;\n onRejectSuggestion?: () => void;\n onEditSuggestion?: () => void;\n onDismissSelectionToolbar?: () => void;\n onSelectionToolbarFocusCapture?: React.FocusEventHandler<HTMLDivElement>;\n onSelectionToolbarBlurCapture?: React.FocusEventHandler<HTMLDivElement>;\n selectionToolbarRef?: React.Ref<HTMLDivElement>;\n activeImageContext?: ActiveImageContext | null;\n activeObjectContext?: ActiveObjectContext | null;\n chromeVisibility?: Partial<WordReviewEditorChromeVisibility>;\n}\n\nexport function EditorShellView(props: EditorShellViewProps) {\n const {\n shellRef,\n documentId,\n snapshot,\n loadError,\n diagnosticsModeMessage,\n accessibilityInstructionsId,\n accessibilityStatusId,\n accessibilityAlertId,\n accessibilityStatusMessage,\n visuallyHiddenStyles,\n onShellKeyDownCapture,\n document,\n commands,\n ...workspaceProps\n } = props;\n\n return (\n <div\n ref={shellRef}\n role=\"region\"\n aria-label={`Word review editor for ${snapshot.sourceLabel ?? documentId}`}\n aria-describedby={`${accessibilityInstructionsId} ${accessibilityStatusId}${\n diagnosticsModeMessage ? ` ${accessibilityAlertId}` : \"\"\n }`}\n className=\"relative h-full\"\n onKeyDownCapture={onShellKeyDownCapture}\n >\n <p id={accessibilityInstructionsId} style={visuallyHiddenStyles}>\n Press F6 to move focus between the toolbar, document surface, review rail, and status bar.\n </p>\n <div\n id={accessibilityStatusId}\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n style={visuallyHiddenStyles}\n >\n {accessibilityStatusMessage}\n </div>\n {diagnosticsModeMessage ? (\n <div\n id={accessibilityAlertId}\n data-wre-alert=\"true\"\n role=\"alert\"\n aria-live=\"assertive\"\n aria-atomic=\"true\"\n tabIndex={-1}\n className=\"border-b border-danger/30 bg-danger/5 px-4 py-3 text-sm text-danger\"\n >\n {diagnosticsModeMessage}\n </div>\n ) : null}\n <TwReviewWorkspace\n snapshot={snapshot}\n commands={commands}\n document={document}\n {...workspaceProps}\n />\n </div>\n );\n}\n","import React, { forwardRef } from \"react\";\n\nimport type {\n DocumentNavigationSnapshot,\n EditorUser,\n RuntimeRenderSnapshot,\n SelectionSnapshot,\n WorkflowBlockedCommandReason,\n WorkflowCandidateRange,\n WorkflowScope,\n} from \"../api/public-types.ts\";\nimport type { CanonicalDocumentEnvelope } from \"../core/state/editor-state.ts\";\nimport type { MarkupDisplay } from \"./headless/comment-decoration-model.ts\";\nimport type { SelectionToolbarAnchor } from \"./headless/selection-toolbar-model.ts\";\nimport {\n TwProseMirrorSurface,\n type TwProseMirrorSurfaceRef,\n} from \"../ui-tailwind/editor-surface/tw-prosemirror-surface.tsx\";\nimport type { MediaPreviewDescriptor } from \"../ui-tailwind/editor-surface/pm-state-from-snapshot.ts\";\n\nexport interface EditorSurfaceControllerProps {\n currentUser: EditorUser;\n snapshot: RuntimeRenderSnapshot;\n canonicalDocument: CanonicalDocumentEnvelope;\n documentNavigation: DocumentNavigationSnapshot;\n reviewMode: \"editing\" | \"review\";\n markupDisplay: MarkupDisplay;\n activeRevisionId?: string;\n showTrackedChanges?: boolean;\n suggestionsEnabled?: boolean;\n mediaPreviews?: Record<string, MediaPreviewDescriptor>;\n isPageWorkspace?: boolean;\n onSelectionToolbarAnchorChange?: (anchor: SelectionToolbarAnchor | null) => void;\n onFocus: React.FocusEventHandler<HTMLDivElement>;\n onBlur: React.FocusEventHandler<HTMLDivElement>;\n onSelectionChange?: (selection: SelectionSnapshot) => void;\n onInsertText?: (text: string) => void;\n onDeleteBackward?: () => void;\n onDeleteForward?: () => void;\n onInsertTab?: () => void;\n onOutdentTab?: () => void;\n onInsertHardBreak?: () => void;\n onSplitParagraph?: () => void;\n onUndo?: () => void;\n onRedo?: () => void;\n onBlockedInput?: (command: \"paste\" | \"drop\", message: string) => void;\n onCommentActivated?: (commentId: string) => void;\n onRevisionActivated?: (revisionId: string) => void;\n workflowScopes?: readonly WorkflowScope[];\n workflowCandidates?: readonly WorkflowCandidateRange[];\n workflowBlockedReasons?: readonly WorkflowBlockedCommandReason[];\n activeWorkflowWorkItemId?: string | null;\n activeWorkflowScopeIds?: readonly string[];\n}\n\nexport const EditorSurfaceController = forwardRef<\n TwProseMirrorSurfaceRef,\n EditorSurfaceControllerProps\n>(function EditorSurfaceController(props, ref) {\n return <TwProseMirrorSurface ref={ref} {...props} />;\n});\n","import React, {\n forwardRef,\n type FocusEventHandler,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n} from \"react\";\nimport { EditorView } from \"prosemirror-view\";\n\nimport type {\n DocumentNavigationSnapshot,\n EditorUser,\n RuntimeRenderSnapshot,\n SearchOptions,\n SearchResultSnapshot,\n SelectionSnapshot,\n WorkflowBlockedCommandReason,\n WorkflowCandidateRange,\n WorkflowScope,\n} from \"../../api/public-types\";\nimport type { CanonicalDocumentEnvelope } from \"../../core/state/editor-state.ts\";\nimport { searchDocument } from \"../../runtime/document-search.ts\";\nimport {\n getTableSelectionDescriptor,\n type TableSelectionDescriptor,\n} from \"../../runtime/table-commands.ts\";\nimport {\n createCommentDecorationModel,\n type MarkupDisplay,\n} from \"../../ui/headless/comment-decoration-model\";\nimport { createRevisionDecorationModel } from \"../../ui/headless/revision-decoration-model\";\nimport {\n createPMSelectionFromSnapshot,\n createPMStateFromSnapshot,\n} from \"./pm-state-from-snapshot\";\nimport {\n createCommandBridgePlugins,\n type CommandBridgeCallbacks,\n} from \"./pm-command-bridge\";\nimport { buildDecorations } from \"./pm-decorations\";\nimport { createContextualInteractionPlugin } from \"./pm-contextual-ui\";\nimport {\n finishPerfProbe,\n incrementInvalidationCounter,\n recordPerfSample,\n startPerfProbe,\n} from \"./perf-probe\";\nimport type { PositionMap } from \"./pm-position-map\";\nimport {\n clearSearch as clearSearchPlugin,\n createSearchPlugin,\n DEFAULT_SEARCH_HIGHLIGHT_COLOR,\n performSearch,\n searchPluginKey,\n} from \"./search-plugin\";\nimport {\n createSurfaceDecorationKey,\n createSurfaceDocumentBuildKey,\n} from \"./surface-build-keys\";\nimport { tableNodeViews } from \"./tw-table-node-view\";\nimport type { SelectionToolbarAnchor } from \"../../ui/headless/selection-toolbar-model\";\nimport type { MediaPreviewDescriptor } from \"./pm-state-from-snapshot\";\n\n/**\n * Same props interface as the legacy TwEditorSurface — drop-in replacement.\n */\nexport interface TwProseMirrorSurfaceProps {\n currentUser: EditorUser;\n snapshot: RuntimeRenderSnapshot;\n canonicalDocument: CanonicalDocumentEnvelope;\n documentNavigation: DocumentNavigationSnapshot;\n reviewMode: \"editing\" | \"review\";\n markupDisplay: MarkupDisplay;\n activeRevisionId?: string;\n showTrackedChanges?: boolean;\n suggestionsEnabled?: boolean;\n /** When true, the surface renders inside the page workspace (vs canvas). */\n isPageWorkspace?: boolean;\n onFocus: FocusEventHandler<HTMLDivElement>;\n onBlur: FocusEventHandler<HTMLDivElement>;\n onSelectionChange?: (selection: SelectionSnapshot) => void;\n onInsertText?: (text: string) => void;\n onDeleteBackward?: () => void;\n onDeleteForward?: () => void;\n onInsertTab?: () => void;\n onOutdentTab?: () => void;\n onInsertHardBreak?: () => void;\n onSplitParagraph?: () => void;\n onUndo?: () => void;\n onRedo?: () => void;\n onBlockedInput?: (command: \"paste\" | \"drop\", message: string) => void;\n onCommentActivated?: (commentId: string) => void;\n onRevisionActivated?: (revisionId: string) => void;\n onSelectionToolbarAnchorChange?: (anchor: SelectionToolbarAnchor | null) => void;\n mediaPreviews?: Record<string, MediaPreviewDescriptor>;\n workflowScopes?: readonly WorkflowScope[];\n workflowCandidates?: readonly WorkflowCandidateRange[];\n workflowBlockedReasons?: readonly WorkflowBlockedCommandReason[];\n activeWorkflowWorkItemId?: string | null;\n activeWorkflowScopeIds?: readonly string[];\n}\n\nexport interface TwProseMirrorSurfaceRef {\n search(query: string, options?: SearchOptions): SearchResultSnapshot[];\n clearSearch(): void;\n getTableSelection(): TableSelectionDescriptor | null;\n}\n\nexport const TwProseMirrorSurface = forwardRef<\n TwProseMirrorSurfaceRef,\n TwProseMirrorSurfaceProps\n>(function TwProseMirrorSurface(props, ref) {\n const {\n currentUser,\n snapshot,\n markupDisplay,\n onFocus,\n onBlur,\n } = props;\n const surface = snapshot.surface;\n const mediaPreviewKey = useMemo(\n () =>\n Object.entries(props.mediaPreviews ?? {})\n .sort(([leftId], [rightId]) => leftId.localeCompare(rightId))\n .map(\n ([mediaId, preview]) =>\n `${mediaId}:${preview.widthEmu ?? \"\"}:${preview.heightEmu ?? \"\"}:${preview.src}`,\n )\n .join(\"|\"),\n [props.mediaPreviews],\n );\n\n const canEdit = Boolean(\n surface && snapshot.isReady && !snapshot.readOnly && !snapshot.fatalError,\n );\n\n const mountRef = useRef<HTMLDivElement>(null);\n const viewRef = useRef<EditorView | null>(null);\n const positionMapRef = useRef<PositionMap | null>(null);\n const callbacksRef = useRef<CommandBridgeCallbacks | null>(null);\n const activeSearchRef = useRef<{ query: string; options: SearchOptions } | null>(null);\n const pendingTypingProbeRef = useRef<string | null>(null);\n const pendingSelectionProbeRef = useRef<string | null>(null);\n const documentBuildKeyRef = useRef<string | null>(null);\n const decorationBuildKeyRef = useRef<string | null>(null);\n const suppressSelectionEchoRef = useRef(false);\n const selectionToolbarFrameRef = useRef<number | null>(null);\n const lastSelectionToolbarMeasurementRef = useRef<{\n key: string | null;\n anchor: SelectionToolbarAnchor | null;\n }>({\n key: null,\n anchor: null,\n });\n\n // Keep callbacks ref up to date (avoids stale closures in PM plugins)\n callbacksRef.current = {\n onInsertText: (text) => {\n pendingTypingProbeRef.current = startPerfProbe(\"typing\");\n props.onInsertText?.(text);\n },\n onDeleteBackward: () => props.onDeleteBackward?.(),\n onDeleteForward: () => props.onDeleteForward?.(),\n onSplitParagraph: () => props.onSplitParagraph?.(),\n onInsertHardBreak: () => props.onInsertHardBreak?.(),\n onInsertTab: () => props.onInsertTab?.(),\n onOutdentTab: () => props.onOutdentTab?.(),\n onUndo: () => props.onUndo?.(),\n onRedo: () => props.onRedo?.(),\n onBlockedInput: (command, message) => {\n props.onBlockedInput?.(command, message);\n },\n onSelectionChange: (sel) => {\n pendingSelectionProbeRef.current = startPerfProbe(\"selection\");\n props.onSelectionChange?.(\n snapshot.activeStory.kind === \"main\"\n ? sel\n : { ...sel, storyTarget: snapshot.activeStory },\n );\n },\n getPositionMap: () => positionMapRef.current,\n isSelectionSyncSuppressed: () => suppressSelectionEchoRef.current,\n };\n\n // Comment/revision decoration models\n const commentModel = useMemo(\n () => createCommentDecorationModel(snapshot.comments),\n [snapshot.comments],\n );\n const showTrackedChanges = props.showTrackedChanges !== false;\n // Always create the revision model — needed for deletion hiding in clean mode\n // even when the tracked changes display toggle is off.\n const revisionModel = useMemo(\n () => createRevisionDecorationModel(snapshot.trackedChanges, props.activeRevisionId),\n [snapshot.trackedChanges, props.activeRevisionId],\n );\n const documentBuildKey = useMemo(\n () =>\n createSurfaceDocumentBuildKey({\n surface,\n activeStory: snapshot.activeStory,\n mediaPreviewKey,\n }),\n [mediaPreviewKey, snapshot.activeStory, surface],\n );\n const suggestionsEnabled = props.suggestionsEnabled === true;\n const decorationBuildKey = useMemo(\n () =>\n createSurfaceDecorationKey({\n markupDisplay,\n showTrackedChanges,\n canEdit,\n activeCommentId: snapshot.comments.activeCommentId,\n activeRevisionId: props.activeRevisionId,\n workflowScopeSignature: createWorkflowScopeSignature(props.workflowScopes),\n workflowCandidateSignature: createWorkflowCandidateSignature(props.workflowCandidates),\n workflowBlockedSignature: createWorkflowBlockedSignature(props.workflowBlockedReasons),\n activeWorkflowWorkItemId: props.activeWorkflowWorkItemId ?? null,\n activeWorkflowScopeIds: props.activeWorkflowScopeIds ?? [],\n suggestionsEnabled,\n }),\n [\n canEdit,\n markupDisplay,\n props.activeRevisionId,\n props.workflowCandidates,\n props.workflowBlockedReasons,\n props.activeWorkflowWorkItemId,\n props.activeWorkflowScopeIds,\n props.workflowScopes,\n showTrackedChanges,\n snapshot.comments.activeCommentId,\n suggestionsEnabled,\n ],\n );\n\n // Create PM plugins (stable across renders — callbacks accessed via ref)\n const plugins = useMemo(() => {\n return [\n ...createCommandBridgePlugins({\n onInsertText: (text) => callbacksRef.current?.onInsertText(text),\n onDeleteBackward: () => callbacksRef.current?.onDeleteBackward(),\n onDeleteForward: () => callbacksRef.current?.onDeleteForward(),\n onSplitParagraph: () => callbacksRef.current?.onSplitParagraph(),\n onInsertHardBreak: () => callbacksRef.current?.onInsertHardBreak(),\n onInsertTab: () => callbacksRef.current?.onInsertTab(),\n onOutdentTab: () => callbacksRef.current?.onOutdentTab?.(),\n onUndo: () => callbacksRef.current?.onUndo(),\n onRedo: () => callbacksRef.current?.onRedo(),\n onBlockedInput: (command, message) => callbacksRef.current?.onBlockedInput?.(command, message),\n onSelectionChange: (sel) => callbacksRef.current?.onSelectionChange(sel),\n getPositionMap: () => callbacksRef.current?.getPositionMap() ?? null,\n isSelectionSyncSuppressed: () =>\n callbacksRef.current?.isSelectionSyncSuppressed?.() ?? false,\n }),\n createContextualInteractionPlugin({\n onCommentActivated: (commentId) => props.onCommentActivated?.(commentId),\n onRevisionActivated: (revisionId) => props.onRevisionActivated?.(revisionId),\n }),\n createSearchPlugin(),\n ];\n }, [props.onCommentActivated, props.onRevisionActivated]);\n\n const applyDecorationProps = useCallback(\n (view: EditorView, positionMap: PositionMap): void => {\n const decorations = buildDecorations(\n view.state.doc,\n positionMap,\n commentModel,\n revisionModel,\n markupDisplay,\n showTrackedChanges,\n props.workflowScopes,\n snapshot.activeStory,\n props.workflowCandidates,\n props.workflowBlockedReasons,\n props.activeWorkflowWorkItemId,\n props.activeWorkflowScopeIds,\n suggestionsEnabled,\n );\n view.setProps({\n editable: () => canEdit,\n decorations: () => decorations,\n });\n decorationBuildKeyRef.current = decorationBuildKey;\n recordPerfSample(\"pm.decorations\");\n incrementInvalidationCounter(\"pm.laneB.decorationUpdates\");\n },\n [\n canEdit,\n commentModel,\n decorationBuildKey,\n markupDisplay,\n props.activeWorkflowScopeIds,\n props.activeWorkflowWorkItemId,\n props.workflowBlockedReasons,\n props.workflowCandidates,\n props.workflowScopes,\n revisionModel,\n showTrackedChanges,\n ],\n );\n\n // Create or update the PM document only when the structural key changes.\n useEffect(() => {\n if (!mountRef.current || !surface) return;\n\n if (viewRef.current && documentBuildKeyRef.current === documentBuildKey) {\n return;\n }\n\n const { state, positionMap } = createPMStateFromSnapshot(\n surface,\n snapshot.selection,\n plugins,\n props.mediaPreviews,\n );\n positionMapRef.current = positionMap;\n const decorations = buildDecorations(\n state.doc,\n positionMap,\n commentModel,\n revisionModel,\n markupDisplay,\n showTrackedChanges,\n props.workflowScopes,\n snapshot.activeStory,\n props.workflowCandidates,\n props.workflowBlockedReasons,\n props.activeWorkflowWorkItemId,\n props.activeWorkflowScopeIds,\n );\n recordPerfSample(\"pm.rebuild\");\n incrementInvalidationCounter(\"pm.laneA.rebuilds\");\n\n if (!viewRef.current) {\n // First time surface is available — create the EditorView\n const view = new EditorView(mountRef.current, {\n state,\n nodeViews: tableNodeViews,\n editable: () => canEdit,\n decorations: () => decorations,\n dispatchTransaction(tr) {\n const newState = view.state.apply(tr);\n view.updateState(newState);\n },\n });\n viewRef.current = view;\n recordPerfSample(\"pm.mount\");\n } else {\n suppressSelectionEchoRef.current = true;\n viewRef.current.updateState(state);\n queueMicrotask(() => {\n suppressSelectionEchoRef.current = false;\n });\n }\n documentBuildKeyRef.current = documentBuildKey;\n applyDecorationProps(viewRef.current, positionMap);\n\n if (activeSearchRef.current) {\n applySearch(\n activeSearchRef.current.query,\n activeSearchRef.current.options,\n );\n }\n if (pendingTypingProbeRef.current) {\n finishPerfProbe(pendingTypingProbeRef.current);\n pendingTypingProbeRef.current = null;\n }\n }, [\n applyDecorationProps,\n documentBuildKey,\n surface,\n snapshot.selection,\n plugins,\n props.mediaPreviews,\n ]);\n\n // Update decorations and editability without rebuilding the PM document.\n useEffect(() => {\n const view = viewRef.current;\n const positionMap = positionMapRef.current;\n if (!view || !surface || !positionMap) {\n return;\n }\n\n if (decorationBuildKeyRef.current === decorationBuildKey) {\n return;\n }\n\n applyDecorationProps(view, positionMap);\n }, [applyDecorationProps, decorationBuildKey, surface]);\n\n useEffect(() => {\n if (!activeSearchRef.current || !surface) {\n return;\n }\n applySearch(activeSearchRef.current.query, activeSearchRef.current.options);\n }, [\n markupDisplay,\n props.canonicalDocument,\n props.documentNavigation,\n snapshot.activeStory,\n snapshot.trackedChanges,\n surface,\n ]);\n\n useEffect(() => {\n const view = viewRef.current;\n const positionMap = positionMapRef.current;\n if (!view || !surface || !positionMap) {\n return;\n }\n\n const nextSelection = createPMSelectionFromSnapshot(\n view.state.doc,\n positionMap,\n snapshot.selection,\n );\n if (view.state.selection.eq(nextSelection)) {\n return;\n }\n\n suppressSelectionEchoRef.current = true;\n view.dispatch(view.state.tr.setSelection(nextSelection));\n recordPerfSample(\"selection.sync\");\n queueMicrotask(() => {\n suppressSelectionEchoRef.current = false;\n });\n }, [snapshot.selection, surface]);\n\n useEffect(() => {\n if (!pendingSelectionProbeRef.current) {\n return;\n }\n finishPerfProbe(pendingSelectionProbeRef.current);\n pendingSelectionProbeRef.current = null;\n }, [snapshot.selection]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n const win = mountRef.current?.ownerDocument.defaultView;\n if (selectionToolbarFrameRef.current !== null && win) {\n win.cancelAnimationFrame(selectionToolbarFrameRef.current);\n selectionToolbarFrameRef.current = null;\n }\n viewRef.current?.destroy();\n viewRef.current = null;\n };\n }, []);\n\n useImperativeHandle(\n ref,\n () => ({\n search: (query, options = {}) => {\n const normalizedQuery = query.trim();\n if (!normalizedQuery) {\n activeSearchRef.current = null;\n clearLiveSearch();\n return [];\n }\n\n activeSearchRef.current = { query: normalizedQuery, options };\n return applySearch(normalizedQuery, options);\n },\n clearSearch: () => {\n activeSearchRef.current = null;\n clearLiveSearch();\n },\n getTableSelection: () => {\n const view = viewRef.current;\n if (!view) {\n return null;\n }\n return getTableSelectionDescriptor(view.state);\n },\n }),\n [\n markupDisplay,\n props.canonicalDocument,\n props.documentNavigation,\n snapshot.activeStory,\n snapshot.selection,\n snapshot.surface,\n snapshot.trackedChanges,\n ],\n );\n\n function applySearch(query: string, options: SearchOptions): SearchResultSnapshot[] {\n const view = viewRef.current;\n const hiddenDeletionRanges =\n markupDisplay === \"clean\"\n ? snapshot.trackedChanges.revisions\n .filter(\n (\n revision,\n ): revision is typeof revision & {\n anchor: Extract<typeof revision.anchor, { kind: \"range\" }>;\n } =>\n revision.kind === \"deletion\" &&\n revision.status === \"active\" &&\n revision.anchor.kind === \"range\",\n )\n .map((revision) => ({\n from: revision.anchor.from,\n to: revision.anchor.to,\n }))\n : [];\n if (view) {\n const rawResults = performSearch(view.state, query, options)\n .filter((result) => {\n if (hiddenDeletionRanges.length === 0) {\n return true;\n }\n const positionMap = positionMapRef.current;\n if (!positionMap) {\n return true;\n }\n const runtimeFrom = positionMap.pmToRuntime(result.from);\n const runtimeTo = positionMap.pmToRuntime(result.to);\n return !hiddenDeletionRanges.some(\n (range) => runtimeFrom < range.to && runtimeTo > range.from,\n );\n })\n .slice(0, options.limit ?? Number.POSITIVE_INFINITY);\n view.dispatch(\n view.state.tr.setMeta(searchPluginKey, {\n results: rawResults,\n highlightColor: DEFAULT_SEARCH_HIGHLIGHT_COLOR,\n }),\n );\n }\n\n return filterHiddenDeletionSearchResults(\n searchDocument(\n props.canonicalDocument,\n snapshot.selection,\n snapshot.activeStory,\n props.documentNavigation,\n query,\n options,\n ),\n hiddenDeletionRanges,\n );\n }\n\n function filterHiddenDeletionSearchResults(\n results: SearchResultSnapshot[],\n hiddenRanges: Array<{ from: number; to: number }>,\n ): SearchResultSnapshot[] {\n if (hiddenRanges.length === 0) {\n return results;\n }\n return results.filter((result) => {\n const anchor = result.anchor;\n if (anchor.kind !== \"range\") {\n return true;\n }\n return !hiddenRanges.some(\n (range) => anchor.from < range.to && anchor.to > range.from,\n );\n });\n }\n\n function clearLiveSearch(): void {\n const view = viewRef.current;\n if (!view) {\n return;\n }\n\n clearSearchPlugin(view.state, (tr) => {\n view.dispatch(tr);\n });\n }\n\n const fontClass =\n markupDisplay === \"clean\"\n ? \"font-[family-name:var(--font-legal-sans)]\"\n : \"font-[family-name:var(--font-legal-serif)]\";\n\n // Story focus indicator — runtime-backed, not DOM-only\n const storyKind = snapshot.activeStory.kind;\n const storyFocusAttr = storyKind !== \"main\" ? storyKind : undefined;\n\n // Table focus cue — add subtle ring when selection head is inside a table block\n const tableFocusClass = (() => {\n if (!surface || !snapshot.selection) return \"\";\n const head = snapshot.selection.head;\n const inTable = surface.blocks.some(\n (b) => b.kind === \"table\" && head >= b.from && head <= b.to,\n );\n return inTable ? \"prosemirror-table-focus\" : \"\";\n })();\n\n const workspaceLabel = props.isPageWorkspace ? \"Document page\" : \"Document canvas\";\n\n const selectionToolbarMeasurementKey = useMemo(\n () => buildSelectionToolbarMeasurementKey(snapshot.selection, snapshot.activeStory),\n [snapshot.activeStory, snapshot.selection],\n );\n\n const emitSelectionToolbarAnchor = useCallback((): void => {\n const callback = props.onSelectionToolbarAnchorChange;\n if (!callback) {\n return;\n }\n\n const nextAnchor = measureSelectionToolbarAnchor();\n const previous = lastSelectionToolbarMeasurementRef.current;\n if (\n previous.key === selectionToolbarMeasurementKey &&\n selectionToolbarAnchorsEqual(previous.anchor, nextAnchor)\n ) {\n return;\n }\n\n lastSelectionToolbarMeasurementRef.current = {\n key: selectionToolbarMeasurementKey,\n anchor: nextAnchor,\n };\n callback(nextAnchor);\n }, [\n props.onSelectionToolbarAnchorChange,\n selectionToolbarMeasurementKey,\n snapshot.activeStory,\n snapshot.selection,\n ]);\n\n const scheduleSelectionToolbarAnchorUpdate = useCallback((): void => {\n const callback = props.onSelectionToolbarAnchorChange;\n const mount = mountRef.current;\n const win = mount?.ownerDocument.defaultView;\n if (!callback || !win) {\n emitSelectionToolbarAnchor();\n return;\n }\n\n if (selectionToolbarFrameRef.current !== null) {\n win.cancelAnimationFrame(selectionToolbarFrameRef.current);\n selectionToolbarFrameRef.current = null;\n }\n\n selectionToolbarFrameRef.current = win.requestAnimationFrame(() => {\n selectionToolbarFrameRef.current = null;\n emitSelectionToolbarAnchor();\n });\n }, [emitSelectionToolbarAnchor, props.onSelectionToolbarAnchorChange]);\n\n useEffect(() => {\n scheduleSelectionToolbarAnchorUpdate();\n }, [\n scheduleSelectionToolbarAnchorUpdate,\n snapshot.revisionToken,\n snapshot.selection,\n snapshot.surface,\n props.isPageWorkspace,\n ]);\n\n useEffect(() => {\n const mount = mountRef.current;\n const callback = props.onSelectionToolbarAnchorChange;\n if (!mount || !callback) {\n return;\n }\n\n const updateAnchor = () => {\n scheduleSelectionToolbarAnchorUpdate();\n };\n const scrollRoot = mount.closest<HTMLElement>(\"[data-wre-scroll-root='true']\");\n const win = mount.ownerDocument.defaultView;\n const resizeObserver =\n typeof ResizeObserver !== \"undefined\"\n ? new ResizeObserver(() => {\n updateAnchor();\n })\n : null;\n\n updateAnchor();\n scrollRoot?.addEventListener(\"scroll\", updateAnchor, { passive: true });\n win?.addEventListener(\"resize\", updateAnchor);\n resizeObserver?.observe(mount);\n if (scrollRoot) {\n resizeObserver?.observe(scrollRoot);\n }\n\n return () => {\n scrollRoot?.removeEventListener(\"scroll\", updateAnchor);\n win?.removeEventListener(\"resize\", updateAnchor);\n resizeObserver?.disconnect();\n };\n }, [\n props.onSelectionToolbarAnchorChange,\n scheduleSelectionToolbarAnchorUpdate,\n snapshot.revisionToken,\n snapshot.selection,\n ]);\n\n useEffect(() => {\n return () => {\n lastSelectionToolbarMeasurementRef.current = {\n key: null,\n anchor: null,\n };\n props.onSelectionToolbarAnchorChange?.(null);\n };\n }, [props.onSelectionToolbarAnchorChange]);\n\n return (\n <section\n aria-label={workspaceLabel}\n className=\"min-w-0\"\n data-active-story={storyFocusAttr}\n data-workspace={props.isPageWorkspace ? \"page\" : \"canvas\"}\n >\n {/* ProseMirror mount point — document content including headings is editable */}\n {surface ? (\n <div\n ref={mountRef}\n role=\"textbox\"\n tabIndex={0}\n aria-multiline=\"true\"\n className={`px-12 py-10 ${fontClass} text-[15px] text-primary leading-relaxed prosemirror-surface outline-none ${tableFocusClass}`}\n onFocus={(event) => {\n onFocus(event);\n if (event.target === event.currentTarget) {\n viewRef.current?.focus();\n }\n }}\n onBlur={onBlur as unknown as React.FocusEventHandler<HTMLDivElement>}\n onKeyDown={(event) => {\n if (event.target !== event.currentTarget) {\n return;\n }\n\n switch (event.key) {\n case \"Backspace\":\n event.preventDefault();\n props.onDeleteBackward?.();\n return;\n case \"Delete\":\n event.preventDefault();\n props.onDeleteForward?.();\n return;\n case \"Enter\":\n event.preventDefault();\n if (event.shiftKey) {\n props.onInsertHardBreak?.();\n } else {\n props.onSplitParagraph?.();\n }\n return;\n case \"Tab\":\n event.preventDefault();\n if (event.shiftKey) {\n props.onOutdentTab?.();\n } else {\n props.onInsertTab?.();\n }\n return;\n default:\n return;\n }\n }}\n aria-label=\"Document surface\"\n data-wre-document-surface=\"true\"\n data-story-focus={storyFocusAttr}\n />\n ) : (\n <div className=\"px-12 pb-10\">\n <p className=\"text-sm text-secondary leading-relaxed\">\n Loading the review surface...\n </p>\n </div>\n )}\n\n {snapshot.fatalError ? (\n <div className=\"px-12 pb-10\">\n <p className=\"text-sm text-danger\">\n Fatal runtime error: {snapshot.fatalError.message}\n </p>\n </div>\n ) : null}\n </section>\n );\n\n function measureSelectionToolbarAnchor(): SelectionToolbarAnchor | null {\n const callback = props.onSelectionToolbarAnchorChange;\n const view = viewRef.current;\n const mount = mountRef.current;\n const positionMap = positionMapRef.current;\n const range = snapshot.selection.activeRange;\n\n if (!callback || !view || !mount || !positionMap || snapshot.selection.isCollapsed || range.kind !== \"range\") {\n return null;\n }\n\n const rootRect = mount.getBoundingClientRect();\n if (rootRect.width <= 0 || rootRect.height <= 0) {\n return null;\n }\n\n try {\n const pmFrom = positionMap.runtimeToPm(range.from);\n const pmTo = positionMap.runtimeToPm(range.to);\n const startRect = view.coordsAtPos(pmFrom);\n const endRect = view.coordsAtPos(pmTo);\n const left = Math.max(rootRect.left, Math.min(startRect.left, endRect.left));\n const right = Math.min(rootRect.right, Math.max(startRect.right, endRect.right));\n const top = Math.max(rootRect.top, Math.min(startRect.top, endRect.top));\n const bottom = Math.min(rootRect.bottom, Math.max(startRect.bottom, endRect.bottom));\n\n if (\n !Number.isFinite(left) ||\n !Number.isFinite(right) ||\n !Number.isFinite(top) ||\n !Number.isFinite(bottom) ||\n right <= left ||\n bottom <= top ||\n bottom < rootRect.top ||\n top > rootRect.bottom\n ) {\n return null;\n }\n\n return { left, right, top, bottom };\n } catch {\n return null;\n }\n }\n});\n\nfunction createWorkflowScopeSignature(scopes: readonly WorkflowScope[] | undefined): string {\n if (!scopes || scopes.length === 0) {\n return \"\";\n }\n return scopes.map((scope) =>\n [\n scope.scopeId,\n scope.mode,\n scope.workItemId ?? \"\",\n serializeAnchorSignature(scope.anchor),\n serializeStoryTargetSignature(scope.storyTarget),\n ].join(\":\")\n ).join(\"|\");\n}\n\nfunction createWorkflowCandidateSignature(\n candidates: readonly WorkflowCandidateRange[] | undefined,\n): string {\n if (!candidates || candidates.length === 0) {\n return \"\";\n }\n return candidates.map((candidate) =>\n [\n candidate.candidateId,\n serializeAnchorSignature(candidate.anchor),\n serializeStoryTargetSignature(candidate.storyTarget),\n candidate.source ?? \"\",\n ].join(\":\")\n ).join(\"|\");\n}\n\nfunction createWorkflowBlockedSignature(\n blockedReasons: readonly WorkflowBlockedCommandReason[] | undefined,\n): string {\n if (!blockedReasons || blockedReasons.length === 0) {\n return \"\";\n }\n return blockedReasons.map((reason) =>\n [\n reason.code,\n reason.scopeId ?? \"\",\n reason.workItemId ?? \"\",\n serializeAnchorSignature(reason.anchor),\n serializeStoryTargetSignature(reason.storyTarget),\n ].join(\":\")\n ).join(\"|\");\n}\n\nfunction serializeAnchorSignature(anchor: WorkflowScope[\"anchor\"] | WorkflowCandidateRange[\"anchor\"] | WorkflowBlockedCommandReason[\"anchor\"] | undefined): string {\n if (!anchor) {\n return \"\";\n }\n switch (anchor.kind) {\n case \"range\":\n return `range:${anchor.from}:${anchor.to}:${anchor.assoc.start}:${anchor.assoc.end}`;\n case \"node\":\n return `node:${anchor.at}:${anchor.assoc}`;\n case \"detached\":\n return `detached:${anchor.lastKnownRange.from}:${anchor.lastKnownRange.to}:${anchor.reason}`;\n }\n}\n\nfunction serializeStoryTargetSignature(storyTarget: WorkflowScope[\"storyTarget\"] | WorkflowCandidateRange[\"storyTarget\"] | WorkflowBlockedCommandReason[\"storyTarget\"]): string {\n if (!storyTarget) {\n return \"\";\n }\n switch (storyTarget.kind) {\n case \"main\":\n return \"main\";\n case \"header\":\n case \"footer\":\n return `${storyTarget.kind}:${storyTarget.relationshipId}:${storyTarget.variant}:${storyTarget.sectionIndex ?? \"\"}`;\n case \"footnote\":\n case \"endnote\":\n return `${storyTarget.kind}:${storyTarget.noteId}`;\n }\n}\n\nfunction buildSelectionToolbarMeasurementKey(\n selection: SelectionSnapshot,\n activeStory: RuntimeRenderSnapshot[\"activeStory\"],\n): string | null {\n if (selection.isCollapsed || selection.activeRange.kind !== \"range\") {\n return null;\n }\n\n return JSON.stringify({\n story: activeStory,\n from: selection.activeRange.from,\n to: selection.activeRange.to,\n });\n}\n\nfunction selectionToolbarAnchorsEqual(\n left: SelectionToolbarAnchor | null,\n right: SelectionToolbarAnchor | null,\n): boolean {\n if (left === right) {\n return true;\n }\n if (!left || !right) {\n return false;\n }\n return (\n left.left === right.left &&\n left.right === right.right &&\n left.top === right.top &&\n left.bottom === right.bottom\n );\n}\n","/**\n * ProseMirror table editing commands backed by prosemirror-tables.\n *\n * Each command follows the standard ProseMirror command signature:\n * (state, dispatch?) => boolean\n *\n * The prosemirror-tables commands replace the previous hand-rolled\n * implementations and support merged cells, colspan/rowspan, and\n * the full prosemirror-tables table model including table_header nodes.\n */\n\nimport type { Command as PMCommand, EditorState } from \"prosemirror-state\";\nimport {\n CellSelection,\n TableMap,\n addColumnAfter as pmAddColumnAfter,\n addColumnBefore as pmAddColumnBefore,\n addRowAfter as pmAddRowAfter,\n addRowBefore as pmAddRowBefore,\n deleteColumn as pmDeleteColumn,\n deleteRow as pmDeleteRow,\n deleteTable,\n goToNextCell,\n mergeCells,\n selectedRect,\n selectionCell,\n splitCell,\n toggleHeaderCell,\n toggleHeaderColumn,\n toggleHeaderRow,\n findTable,\n} from \"prosemirror-tables\";\n\n// prosemirror-tables does not export goToPreviousCell; replicate via direction -1.\nconst goToPreviousCell: PMCommand = (state, dispatch, view) =>\n goToNextCell(-1)(state, dispatch, view);\n\nexport type { Command as TableCommand } from \"prosemirror-state\";\n\nexport interface TableSelectionDescriptor {\n tableBlockIndex: number;\n selectionKind: \"text\" | \"cell\";\n anchorCell: {\n rowIndex: number;\n columnIndex: number;\n };\n headCell: {\n rowIndex: number;\n columnIndex: number;\n };\n rect: {\n top: number;\n left: number;\n bottom: number;\n right: number;\n };\n}\n\nfunction tableAtSelection(state: EditorState) {\n const { $head } = state.selection;\n for (let depth = $head.depth; depth > 0; depth -= 1) {\n const node = $head.node(depth);\n if (node.type.spec.tableRole === \"table\") {\n return node;\n }\n }\n return null;\n}\n\nfunction withTableGuard(\n canRun: (state: EditorState) => boolean,\n command: PMCommand,\n): PMCommand {\n return (state, dispatch, view) => {\n try {\n if (!canRun(state)) {\n return false;\n }\n return command(state, dispatch, view);\n } catch {\n return false;\n }\n };\n}\n\nexport const addRowBefore: PMCommand = (state, dispatch) =>\n pmAddRowBefore(state, dispatch);\n\nexport const addRowAfter: PMCommand = (state, dispatch) =>\n pmAddRowAfter(state, dispatch);\n\nexport const deleteRow: PMCommand = withTableGuard((state) => {\n const table = tableAtSelection(state);\n return table !== null && table.childCount > 1;\n}, pmDeleteRow);\n\nexport const addColumnBefore: PMCommand = (state, dispatch) =>\n pmAddColumnBefore(state, dispatch);\n\nexport const addColumnAfter: PMCommand = (state, dispatch) =>\n pmAddColumnAfter(state, dispatch);\n\nexport const deleteColumn: PMCommand = withTableGuard((state) => {\n const table = tableAtSelection(state);\n return table !== null && TableMap.get(table).width > 1;\n}, pmDeleteColumn);\n\nexport {\n deleteTable,\n mergeCells,\n splitCell,\n toggleHeaderRow,\n toggleHeaderColumn,\n toggleHeaderCell,\n goToNextCell,\n goToPreviousCell,\n};\n\nexport function getTableSelectionDescriptor(\n state: EditorState,\n): TableSelectionDescriptor | null {\n const tableInfo = findTable(state.selection.$from);\n if (!tableInfo) {\n return null;\n }\n\n const tableBlockIndex = resolveTopLevelTableIndex(state, tableInfo.pos);\n if (tableBlockIndex < 0) {\n return null;\n }\n\n const rect = selectedRect(state);\n const isCellSelection = state.selection instanceof CellSelection;\n const anchorCellPos = (\n isCellSelection ? (state.selection as CellSelection).$anchorCell : selectionCell(state)\n ).pos - rect.tableStart;\n const headCellPos = (\n isCellSelection ? (state.selection as CellSelection).$headCell : selectionCell(state)\n ).pos - rect.tableStart;\n const anchorRect = rect.map.findCell(anchorCellPos);\n const headRect = rect.map.findCell(headCellPos);\n\n return {\n tableBlockIndex,\n selectionKind: isCellSelection ? \"cell\" : \"text\",\n anchorCell: {\n rowIndex: anchorRect.top,\n columnIndex: anchorRect.left,\n },\n headCell: {\n rowIndex: headRect.top,\n columnIndex: headRect.left,\n },\n rect: {\n top: rect.top,\n left: rect.left,\n bottom: rect.bottom,\n right: rect.right,\n },\n };\n}\n\nfunction resolveTopLevelTableIndex(state: EditorState, tablePos: number): number {\n let index = -1;\n\n state.doc.forEach((node, offset, currentIndex) => {\n if (offset === tablePos && node.type.spec.tableRole === \"table\") {\n index = currentIndex;\n }\n });\n\n return index;\n}\n","import { Fragment, type Node as PMNode } from \"prosemirror-model\";\nimport { EditorState, NodeSelection, type Plugin, Selection, TextSelection } from \"prosemirror-state\";\n\nimport type {\n EditorSurfaceSnapshot,\n SelectionSnapshot,\n SurfaceBlockSnapshot,\n SurfaceInlineSegment,\n SurfaceTableRowSnapshot,\n SurfaceTableCellSnapshot,\n} from \"../../api/public-types\";\nimport { editorSchema } from \"./pm-schema\";\nimport { buildPositionMap, type PositionMap } from \"./pm-position-map\";\n\nexport interface PMStateResult {\n state: EditorState;\n positionMap: PositionMap;\n}\n\nexport interface MediaPreviewDescriptor {\n src: string;\n widthEmu?: number;\n heightEmu?: number;\n}\n\n/**\n * Create a ProseMirror EditorState from a runtime surface snapshot.\n *\n * The PM document mirrors the snapshot for rendering and input.\n * It is NOT the canonical source — the runtime owns that.\n */\nexport function createPMStateFromSnapshot(\n surface: EditorSurfaceSnapshot,\n selection: SelectionSnapshot,\n plugins: Plugin[],\n mediaPreviews: Record<string, MediaPreviewDescriptor> = {},\n): PMStateResult {\n const doc = buildPMDoc(surface, mediaPreviews);\n const positionMap = buildPositionMap(surface);\n const pmSelection = createPMSelectionFromSnapshot(doc, positionMap, selection);\n\n const state = EditorState.create({\n doc,\n selection: pmSelection,\n plugins,\n });\n\n return { state, positionMap };\n}\n\nexport function createPMSelectionFromSnapshot(\n doc: PMNode,\n positionMap: PositionMap,\n selection: SelectionSnapshot,\n): Selection {\n const pmAnchor = clamp(positionMap.runtimeToPm(selection.anchor), 1, positionMap.pmDocSize - 1);\n const pmHead = clamp(positionMap.runtimeToPm(selection.head), 1, positionMap.pmDocSize - 1);\n try {\n if (selection.activeRange.kind === \"node\") {\n const pmNodePos = clamp(pmAnchor - 1, 0, positionMap.pmDocSize - 2);\n return NodeSelection.create(doc, pmNodePos);\n }\n\n const forward = selection.head >= selection.anchor;\n const resolvedAnchor = resolveInlineBoundary(doc, pmAnchor, forward ? 1 : -1);\n const resolvedHead = resolveInlineBoundary(doc, pmHead, forward ? -1 : 1);\n if (resolvedAnchor !== null && resolvedHead !== null) {\n return TextSelection.create(doc, resolvedAnchor, resolvedHead);\n }\n\n const $anchor = doc.resolve(pmAnchor);\n const $head = doc.resolve(pmHead);\n return (\n Selection.findFrom($anchor, 1, true) ??\n Selection.findFrom($anchor, -1, true) ??\n Selection.findFrom($head, 1, true) ??\n Selection.findFrom($head, -1, true) ??\n Selection.near($anchor, 1)\n );\n } catch {\n // If the mapped runtime selection is invalid or lands in a non-text block,\n // let ProseMirror choose the nearest valid starting selection.\n return Selection.atStart(doc);\n }\n}\n\nfunction resolveInlineBoundary(\n doc: PMNode,\n pos: number,\n bias: -1 | 1,\n): number | null {\n const $pos = doc.resolve(pos);\n if ($pos.parent.inlineContent) {\n return pos;\n }\n\n const candidate =\n Selection.findFrom($pos, bias, true) ??\n Selection.findFrom($pos, -bias, true) ??\n Selection.near($pos, bias);\n\n if (candidate.$from.parent.inlineContent || candidate.$to.parent.inlineContent) {\n return bias < 0 ? candidate.to : candidate.from;\n }\n\n return null;\n}\n\nfunction buildPMDoc(\n surface: EditorSurfaceSnapshot,\n mediaPreviews: Record<string, MediaPreviewDescriptor>,\n): PMNode {\n const blocks = buildPMBlocks(surface.blocks, mediaPreviews);\n\n // Ensure at least one block (PM requires non-empty doc)\n if (blocks.length === 0) {\n blocks.push(editorSchema.nodes.paragraph.create());\n }\n\n return editorSchema.nodes.doc.create(null, Fragment.from(blocks));\n}\n\nfunction buildPMBlocks(\n blocks: SurfaceBlockSnapshot[],\n mediaPreviews: Record<string, MediaPreviewDescriptor>,\n): PMNode[] {\n const nodes: PMNode[] = [];\n\n for (let index = 0; index < blocks.length; index += 1) {\n const block = blocks[index];\n const previousBlock = index > 0 ? blocks[index - 1] : null;\n const nextBlock = blocks[index + 1];\n const previousParagraph = previousBlock?.kind === \"paragraph\" ? previousBlock : null;\n const nextParagraph = nextBlock?.kind === \"paragraph\" ? nextBlock : null;\n\n if (block.kind === \"paragraph\") {\n nodes.push(buildParagraph(block, previousParagraph, nextParagraph, mediaPreviews));\n } else if (block.kind === \"table\") {\n nodes.push(buildTable(block, mediaPreviews));\n } else if (block.kind === \"sdt_block\") {\n nodes.push(buildSdtBlock(block, mediaPreviews));\n } else {\n nodes.push(buildOpaqueBlock(block));\n }\n }\n\n return nodes;\n}\n\nfunction buildParagraph(\n block: Extract<SurfaceBlockSnapshot, { kind: \"paragraph\" }>,\n previousParagraph: Extract<SurfaceBlockSnapshot, { kind: \"paragraph\" }> | null,\n nextParagraph: Extract<SurfaceBlockSnapshot, { kind: \"paragraph\" }> | null,\n mediaPreviews: Record<string, MediaPreviewDescriptor>,\n): PMNode {\n const content: PMNode[] = [];\n const tabStops = block.tabStops ?? [];\n let tabIndex = 0;\n\n for (const segment of block.segments) {\n if (segment.kind === \"tab\" && tabIndex < tabStops.length) {\n const stop = tabStops[tabIndex];\n const stopPos = (stop as { pos?: number }).pos ?? (stop as { position?: number }).position ?? 0;\n const prevStop = tabIndex > 0 ? tabStops[tabIndex - 1] : null;\n const prevPos = prevStop\n ? ((prevStop as { pos?: number }).pos ?? (prevStop as { position?: number }).position ?? 0)\n : 0;\n const widthPx = Math.round((stopPos - prevPos) / 15);\n const leader = (stop as { leader?: string }).leader ?? null;\n const align = (stop as { val?: string }).val ?? null;\n content.push(\n editorSchema.nodes.tab_char.create({\n tabWidth: widthPx > 8 ? widthPx : null,\n leader,\n align,\n }),\n );\n tabIndex++;\n } else {\n const nodes = buildInlineContent(segment, mediaPreviews);\n content.push(...nodes);\n }\n }\n\n const listContinuation = Boolean(\n block.numbering &&\n nextParagraph?.numbering &&\n nextParagraph.numbering.numberingInstanceId === block.numbering.numberingInstanceId &&\n nextParagraph.numbering.level === block.numbering.level,\n );\n const contextualSpacingAfter = Boolean(\n block.contextualSpacing &&\n nextParagraph?.contextualSpacing &&\n (nextParagraph.styleId ?? \"__default__\") === (block.styleId ?? \"__default__\"),\n );\n const contextualSpacingBefore = Boolean(\n block.contextualSpacing &&\n previousParagraph?.contextualSpacing &&\n (previousParagraph.styleId ?? \"__default__\") === (block.styleId ?? \"__default__\"),\n );\n\n return editorSchema.nodes.paragraph.create(\n {\n styleId: block.styleId ?? null,\n numberingInstanceId: block.numbering?.numberingInstanceId ?? null,\n numberingLevel: block.numbering?.level ?? null,\n numberingPrefix:\n (block as typeof block & { numberingPrefix?: string }).numberingPrefix ??\n null,\n numberingSuffix:\n (block as typeof block & { numberingSuffix?: string }).numberingSuffix ??\n null,\n alignment: block.alignment ?? null,\n spacingBefore: block.spacing?.before ?? null,\n spacingAfter: block.spacing?.after ?? null,\n lineSpacing: block.spacing?.line ?? null,\n lineRule: block.spacing?.lineRule ?? null,\n contextualSpacing: block.contextualSpacing ?? null,\n listContinuation: listContinuation || null,\n contextualSpacingBefore: contextualSpacingBefore || null,\n contextualSpacingAfter: contextualSpacingAfter || null,\n indentLeft: block.indentation?.left ?? null,\n indentRight: block.indentation?.right ?? null,\n indentFirstLine: block.indentation?.firstLine ?? null,\n indentHanging: block.indentation?.hanging ?? null,\n shadingFill: block.shading?.fill ?? null,\n borderTop: (block.borders as Record<string, unknown>)?.top ?? null,\n borderBottom: (block.borders as Record<string, unknown>)?.bottom ?? null,\n borderLeft: (block.borders as Record<string, unknown>)?.left ?? null,\n borderRight: (block.borders as Record<string, unknown>)?.right ?? null,\n outlineLevel: block.outlineLevel ?? null,\n bidi: block.bidi ?? null,\n pageBreakBefore: block.pageBreakBefore ?? null,\n },\n content.length > 0 ? Fragment.from(content) : undefined,\n );\n}\n\nfunction buildInlineContent(\n segment: SurfaceInlineSegment,\n mediaPreviews: Record<string, MediaPreviewDescriptor>,\n): PMNode[] {\n switch (segment.kind) {\n case \"text\": {\n if (!segment.text) return [];\n\n // Build PM marks from segment marks\n let marks = editorSchema.marks.bold.isInSet([])\n ? [] // shouldn't happen, just type safety\n : [];\n\n const pmMarks = [];\n if (segment.marks) {\n for (const mark of segment.marks) {\n // Map surface mark names that differ from PM schema mark names\n if (mark === \"smallCaps\") {\n pmMarks.push(editorSchema.marks.small_caps.create());\n continue;\n }\n if (mark === \"allCaps\") {\n pmMarks.push(editorSchema.marks.all_caps.create());\n continue;\n }\n const pmMark = editorSchema.marks[mark];\n if (pmMark) {\n pmMarks.push(pmMark.create());\n }\n }\n }\n if (segment.kind === \"text\" && segment.markAttrs) {\n if (segment.markAttrs.backgroundColor) {\n pmMarks.push(editorSchema.marks.highlight.create({ color: `#${segment.markAttrs.backgroundColor}` }));\n }\n if (segment.markAttrs.fontFamily) {\n pmMarks.push(editorSchema.marks.font_family.create({ family: segment.markAttrs.fontFamily }));\n }\n if (segment.markAttrs.fontSize) {\n pmMarks.push(editorSchema.marks.font_size.create({ size: segment.markAttrs.fontSize / 2 }));\n }\n if (segment.markAttrs.textColor) {\n pmMarks.push(editorSchema.marks.text_color.create({ color: `#${segment.markAttrs.textColor}` }));\n }\n if (segment.markAttrs.charSpacing) {\n pmMarks.push(editorSchema.marks.char_spacing.create({ value: segment.markAttrs.charSpacing }));\n }\n if (segment.markAttrs.kerning) {\n pmMarks.push(editorSchema.marks.font_kerning.create({ threshold: segment.markAttrs.kerning }));\n }\n if (segment.markAttrs.textFill && !segment.markAttrs.textColor) {\n const colorMatch = segment.markAttrs.textFill.match(/\\bval=\"([0-9A-Fa-f]{6})\"/);\n if (colorMatch) {\n pmMarks.push(editorSchema.marks.text_color.create({ color: `#${colorMatch[1]}` }));\n }\n }\n }\n if (segment.hyperlinkHref) {\n pmMarks.push(editorSchema.marks.link.create({ href: segment.hyperlinkHref }));\n }\n\n return [editorSchema.text(segment.text, pmMarks.length > 0 ? pmMarks : undefined)];\n }\n\n case \"hard_break\":\n return [editorSchema.nodes.hard_break.create()];\n\n case \"tab\":\n return [editorSchema.nodes.tab_char.create()];\n\n case \"image\":\n {\n const preview = mediaPreviews[segment.mediaId];\n return [\n editorSchema.nodes.image_atom.create({\n mediaId: segment.mediaId,\n altText: segment.altText ?? null,\n state: segment.state,\n display: segment.display ?? \"inline\",\n detail: segment.detail ?? null,\n src: preview?.src ?? null,\n widthEmu: preview?.widthEmu ?? null,\n heightEmu: preview?.heightEmu ?? null,\n }),\n ];\n }\n\n case \"opaque_inline\":\n return [buildOpaqueInlineOrComplexAtom(segment)];\n\n case \"note_ref\": {\n const text = editorSchema.text(\n segment.label,\n [editorSchema.marks.superscript.create()],\n );\n return [text];\n }\n\n case \"field_ref\":\n return [\n editorSchema.nodes.field_ref_atom.create({\n fieldFamily: segment.fieldFamily,\n fieldTarget: segment.fieldTarget ?? null,\n instruction: segment.instruction,\n refreshStatus: segment.refreshStatus,\n label: segment.label,\n }),\n ];\n\n default:\n return [];\n }\n}\n\nfunction buildTable(\n block: Extract<SurfaceBlockSnapshot, { kind: \"table\" }>,\n mediaPreviews: Record<string, MediaPreviewDescriptor>,\n): PMNode {\n const rows: PMNode[] = [];\n for (const row of block.rows) {\n const cells: PMNode[] = [];\n for (const cell of row.cells) {\n const cellContent = buildPMBlocks(cell.content, mediaPreviews);\n // Ensure at least one paragraph in cell (PM requires non-empty)\n if (cellContent.length === 0) {\n cellContent.push(editorSchema.nodes.paragraph.create());\n }\n cells.push(\n editorSchema.nodes.table_cell.create(\n {\n colspan: cell.colspan,\n rowspan: cell.rowspan,\n gridSpan: cell.gridSpan,\n verticalMerge: cell.verticalMerge,\n backgroundColor: cell.backgroundColor ?? null,\n verticalAlign: cell.verticalAlign ?? null,\n borderTop: cell.borderTop ?? null,\n borderRight: cell.borderRight ?? null,\n borderBottom: cell.borderBottom ?? null,\n borderLeft: cell.borderLeft ?? null,\n },\n Fragment.from(cellContent),\n ),\n );\n }\n rows.push(editorSchema.nodes.table_row.create(\n {\n gridBefore: row.gridBefore ?? 0,\n gridAfter: row.gridAfter ?? 0,\n height: row.height ?? null,\n heightRule: row.heightRule ?? null,\n isHeader: row.isHeader ?? false,\n },\n Fragment.from(cells),\n ));\n }\n return editorSchema.nodes.table.create(\n {\n styleId: block.styleId ?? null,\n gridColumns: block.gridColumns,\n alignment: block.alignment ?? null,\n tblLookFirstRow: block.tblLook?.firstRow ?? false,\n tblLookLastRow: block.tblLook?.lastRow ?? false,\n tblLookFirstColumn: block.tblLook?.firstColumn ?? false,\n tblLookLastColumn: block.tblLook?.lastColumn ?? false,\n tblLookNoHBand: block.tblLook?.noHBand ?? false,\n tblLookNoVBand: block.tblLook?.noVBand ?? false,\n },\n Fragment.from(rows),\n );\n}\n\nfunction buildSdtBlock(\n block: Extract<SurfaceBlockSnapshot, { kind: \"sdt_block\" }>,\n mediaPreviews: Record<string, MediaPreviewDescriptor>,\n): PMNode {\n const children = buildPMBlocks(block.children, mediaPreviews);\n\n if (children.length === 0) {\n children.push(editorSchema.nodes.paragraph.create());\n }\n\n return editorSchema.nodes.sdt_block.create(\n {\n sdtType: block.sdtType ?? null,\n alias: block.alias ?? null,\n tag: block.tag ?? null,\n lock: block.lock ?? null,\n checkboxChecked: block.checkboxChecked ?? null,\n dateValue: block.dateValue ?? null,\n dropdownItems: block.dropdownItems ?? null,\n comboBoxItems: block.comboBoxItems ?? null,\n showingPlcHdr: block.showingPlcHdr ?? false,\n },\n Fragment.from(children),\n );\n}\n\n/**\n * Map an opaque_inline surface segment to a dedicated complex-rendering PM atom\n * node when the label identifies a known complex content type, or fall back to\n * the generic opaque_inline node.\n */\nfunction buildOpaqueInlineOrComplexAtom(\n segment: Extract<import(\"../../api/public-types\").SurfaceInlineSegment, { kind: \"opaque_inline\" }>,\n): PMNode {\n const label = segment.label;\n const detail = segment.detail;\n\n if (label === \"Embedded chart\") {\n return editorSchema.nodes.chart_atom.create({ detail });\n }\n if (label === \"SmartArt diagram\") {\n return editorSchema.nodes.smartart_atom.create({ detail });\n }\n if (label === \"Drawing shape\" || label === \"Text box\") {\n const textMatch = /(?:Text content|Content): \"([^\"]+)\"/.exec(detail);\n const geometryMatch = /Geometry: ([^.]+)\\./.exec(detail);\n return editorSchema.nodes.shape_atom.create({\n text: textMatch ? textMatch[1] : null,\n geometry: geometryMatch ? geometryMatch[1] : null,\n detail,\n });\n }\n if (label === \"WordArt\") {\n const textMatch = /Text: \"([^\"]+)\"/.exec(detail);\n const effectMatch = /Effect: ([^.]+)\\./.exec(detail);\n return editorSchema.nodes.wordart_atom.create({\n text: textMatch ? textMatch[1] : \"\",\n geometry: effectMatch ? effectMatch[1] : null,\n detail,\n });\n }\n if (label === \"Legacy VML drawing\") {\n const textMatch = /Text content: \"([^\"]+)\"/.exec(detail);\n const typeMatch = /Type: ([^.]+)\\./.exec(detail);\n return editorSchema.nodes.vml_atom.create({\n text: textMatch ? textMatch[1] : null,\n shapeType: typeMatch ? typeMatch[1] : null,\n detail,\n });\n }\n\n return editorSchema.nodes.opaque_inline.create({\n fragmentId: segment.fragmentId,\n warningId: segment.warningId,\n label,\n detail,\n presentation: segment.presentation ?? \"inline-chip\",\n });\n}\n\nfunction buildOpaqueBlock(\n block: Extract<SurfaceBlockSnapshot, { kind: \"opaque_block\" }>,\n): PMNode {\n return editorSchema.nodes.opaque_block.create({\n fragmentId: block.fragmentId,\n warningId: block.warningId,\n label: block.label,\n detail: block.detail,\n });\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n","import { Schema } from \"prosemirror-model\";\nimport {\n tableNodeSpec,\n tableRowNodeSpec,\n tableCellNodeSpec,\n tableHeaderCellNodeSpec,\n} from \"../../runtime/table-schema.ts\";\n\nconst HEX_COLOR_RE = /^[0-9A-Fa-f]{3,8}$/;\nconst SAFE_FONT_RE = /^[A-Za-z0-9 ,\\-'\"]+$/;\nconst SAFE_ALIGNMENT = new Set([\"left\", \"center\", \"right\", \"justify\", \"start\", \"end\"]);\n\nfunction resolveHeadingLevel(\n styleId: string | null,\n outlineLevel: number | null,\n): number | null {\n if (styleId) {\n const normalized = styleId.toLowerCase();\n const compact = normalized.replace(/[\\s_-]+/g, \"\");\n const headingMatch = /^heading([1-6])$/.exec(compact);\n if (headingMatch) {\n return Number.parseInt(headingMatch[1], 10);\n }\n if (compact === \"title\") {\n return 1;\n }\n if (compact === \"subtitle\") {\n return 2;\n }\n if (compact === \"tocheading\") {\n return 1;\n }\n if (/^(appendix|schedule|annex|exhibit|attachment)(heading|title)$/.test(compact)) {\n return 2;\n }\n }\n\n if (\n typeof outlineLevel === \"number\" &&\n Number.isInteger(outlineLevel) &&\n outlineLevel >= 0 &&\n outlineLevel <= 5\n ) {\n return outlineLevel + 1;\n }\n\n return null;\n}\n\nfunction headingClassList(level: number): string[] {\n switch (level) {\n case 1:\n return [\"text-3xl\", \"font-semibold\", \"tracking-tight\", \"leading-tight\"];\n case 2:\n return [\"text-2xl\", \"font-semibold\", \"tracking-tight\"];\n case 3:\n return [\"text-xl\", \"font-medium\"];\n case 4:\n return [\"text-lg\", \"font-medium\"];\n case 5:\n return [\"text-base\", \"font-semibold\", \"uppercase\", \"tracking-[0.12em]\"];\n case 6:\n return [\"text-sm\", \"font-semibold\", \"uppercase\", \"tracking-[0.16em]\"];\n default:\n return [];\n }\n}\n\n/** Validate a raw hex color string from OOXML (no leading #). Returns sanitized `#hex` or null. */\nfunction safeHexColor(raw: string | null | undefined): string | null {\n if (!raw || raw === \"auto\") return null;\n return HEX_COLOR_RE.test(raw) ? `#${raw}` : null;\n}\n\n/** Validate a CSS color value (may already include #). Returns the value or null. */\nfunction safeCssColor(raw: string | null | undefined): string | null {\n if (!raw) return null;\n // Allow #hex, named colors (single word), rgb/rgba functions\n if (/^#[0-9A-Fa-f]{3,8}$/.test(raw)) return raw;\n if (/^[a-zA-Z]+$/.test(raw)) return raw;\n return null;\n}\n\nfunction sanitizeLinkHref(raw: string | null | undefined): string | null {\n if (!raw) return null;\n const trimmed = raw.trim();\n if (trimmed.startsWith(\"#\")) {\n return trimmed;\n }\n const lower = trimmed.toLowerCase();\n if (\n lower.startsWith(\"http://\") ||\n lower.startsWith(\"https://\") ||\n lower.startsWith(\"mailto:\") ||\n lower.startsWith(\"tel:\")\n ) {\n return trimmed;\n }\n return null;\n}\n\n/**\n * ProseMirror schema for the supported live surface slice.\n *\n * Maps canonical document node types to PM nodes and marks.\n * This schema is used for rendering and input capture only —\n * ProseMirror does not own the canonical document state.\n */\nexport const editorSchema = new Schema({\n nodes: {\n doc: {\n content: \"block+\",\n },\n\n paragraph: {\n content: \"inline*\",\n group: \"block\",\n attrs: {\n styleId: { default: null },\n numberingInstanceId: { default: null },\n numberingLevel: { default: null },\n numberingPrefix: { default: null },\n numberingSuffix: { default: null },\n alignment: { default: null },\n spacingBefore: { default: null },\n spacingAfter: { default: null },\n lineSpacing: { default: null },\n lineRule: { default: null },\n contextualSpacing: { default: null },\n listContinuation: { default: null },\n contextualSpacingBefore: { default: null },\n contextualSpacingAfter: { default: null },\n indentLeft: { default: null },\n indentRight: { default: null },\n indentFirstLine: { default: null },\n indentHanging: { default: null },\n shadingFill: { default: null },\n borderTop: { default: null },\n borderBottom: { default: null },\n borderLeft: { default: null },\n borderRight: { default: null },\n outlineLevel: { default: null },\n bidi: { default: null },\n pageBreakBefore: { default: null },\n },\n parseDOM: [{ tag: \"p\" }],\n toDOM(node) {\n const classes: string[] = [\"leading-relaxed\"];\n const styleId = node.attrs.styleId as string | null;\n const outlineLevel = node.attrs.outlineLevel as number | null;\n const headingLevel = resolveHeadingLevel(styleId, outlineLevel);\n if (headingLevel) {\n classes.push(...headingClassList(headingLevel));\n }\n const attrs: Record<string, string> = { class: classes.join(\" \") };\n const styles: string[] = [];\n const alignment = node.attrs.alignment as string | null;\n const safeAlign = alignment === \"both\" ? \"justify\" : alignment;\n if (safeAlign && SAFE_ALIGNMENT.has(safeAlign)) styles.push(`text-align: ${safeAlign}`);\n const spacingBefore = node.attrs.spacingBefore as number | null;\n const contextualSpacingBefore = node.attrs.contextualSpacingBefore as boolean | null;\n if (contextualSpacingBefore) styles.push(\"margin-top: 0\");\n else if (spacingBefore) styles.push(`margin-top: ${spacingBefore / 20}px`);\n const contextualSpacingAfter = node.attrs.contextualSpacingAfter as boolean | null;\n const spacingAfter = node.attrs.spacingAfter as number | null;\n if (contextualSpacingAfter) styles.push(\"margin-bottom: 0\");\n else if (spacingAfter) styles.push(`margin-bottom: ${spacingAfter / 20}px`);\n const lineSpacing = node.attrs.lineSpacing as number | null;\n const lineRule = node.attrs.lineRule as string | null;\n if (lineSpacing && lineRule === \"auto\") styles.push(`line-height: ${lineSpacing / 240}`);\n else if (lineSpacing && lineRule === \"exact\") styles.push(`line-height: ${lineSpacing / 20}px`);\n else if (lineSpacing && lineRule === \"atLeast\") styles.push(`min-height: ${lineSpacing / 20}px`);\n const indentLeft = node.attrs.indentLeft as number | null;\n if (indentLeft) styles.push(`padding-left: ${indentLeft / 20}px`);\n const indentRight = node.attrs.indentRight as number | null;\n if (indentRight) styles.push(`padding-right: ${indentRight / 20}px`);\n const indentFirstLine = node.attrs.indentFirstLine as number | null;\n const indentHanging = node.attrs.indentHanging as number | null;\n if (indentHanging) styles.push(`text-indent: -${indentHanging / 20}px`);\n else if (indentFirstLine) styles.push(`text-indent: ${indentFirstLine / 20}px`);\n const shadingColor = safeHexColor(node.attrs.shadingFill as string | null);\n if (shadingColor) styles.push(`background-color: ${shadingColor}`);\n for (const [side, attrName] of [[\"top\", \"borderTop\"], [\"bottom\", \"borderBottom\"], [\"left\", \"borderLeft\"], [\"right\", \"borderRight\"]] as const) {\n const border = node.attrs[attrName] as { color?: string; sz?: number; val?: string } | null;\n if (border && border.val && border.val !== \"none\") {\n const width = border.sz ? `${border.sz / 8}px` : \"1px\";\n const color = safeHexColor(border.color ?? null) ?? \"#000000\";\n const bStyle = border.val === \"dotted\" ? \"dotted\" : border.val === \"dashed\" ? \"dashed\" : \"solid\";\n styles.push(`border-${side}: ${width} ${bStyle} ${color}`);\n }\n }\n const pageBreak = node.attrs.pageBreakBefore as boolean | null;\n if (pageBreak) styles.push(\"border-top: 2px dashed rgba(0,0,0,0.1); padding-top: 8px; margin-top: 16px\");\n const bidi = node.attrs.bidi as boolean | null;\n if (bidi) attrs.dir = \"rtl\";\n if (headingLevel) {\n attrs[\"data-heading-level\"] = String(headingLevel);\n }\n const isNumbered = node.attrs.numberingInstanceId !== null;\n if (isNumbered) {\n attrs[\"data-numbered\"] = \"true\";\n }\n const contextualSpacing = node.attrs.contextualSpacing as boolean | null;\n if (contextualSpacing) {\n attrs[\"data-contextual-spacing\"] = \"true\";\n }\n const listContinuation = node.attrs.listContinuation as boolean | null;\n if (listContinuation) {\n attrs[\"data-list-continuation\"] = \"true\";\n }\n if (contextualSpacingBefore) {\n attrs[\"data-contextual-spacing-before\"] = \"true\";\n }\n if (contextualSpacingAfter) {\n attrs[\"data-contextual-spacing-after\"] = \"true\";\n }\n if (styles.length > 0) attrs.style = styles.join(\"; \");\n const numberingPrefix = node.attrs.numberingPrefix as string | null;\n const numberingLevel = node.attrs.numberingLevel as number | null;\n const numberingSuffix = node.attrs.numberingSuffix as \"tab\" | \"space\" | \"nothing\" | null;\n const children: Array<string | number | readonly unknown[]> = [];\n if (pageBreak) {\n children.push([\n \"span\",\n {\n class:\n \"mb-2 inline-flex items-center gap-2 text-[10px] font-medium uppercase tracking-[0.18em] text-tertiary\",\n contenteditable: \"false\",\n \"data-page-break-before\": \"true\",\n },\n \"Page break\",\n ]);\n }\n if (numberingPrefix) {\n const minWidth = Math.min(Math.max(numberingPrefix.length + 1, 4), 14);\n const marginRight = numberingSuffix === \"nothing\" ? \"0.25rem\" : numberingSuffix === \"space\" ? \"0.5rem\" : \"0.75rem\";\n children.push([\n \"span\",\n {\n class:\n \"inline-flex select-none items-center justify-end text-tertiary font-[family-name:var(--font-legal-sans)]\",\n contenteditable: \"false\",\n \"data-numbering-prefix\": numberingPrefix,\n ...(typeof numberingLevel === \"number\"\n ? { \"data-numbering-level\": String(numberingLevel) }\n : {}),\n ...(numberingSuffix ? { \"data-numbering-suffix\": numberingSuffix } : {}),\n style: `min-width: ${minWidth}ch; margin-right: ${marginRight}; font-variant-numeric: tabular-nums;`,\n },\n numberingPrefix,\n ]);\n }\n children.push([\n \"span\",\n {\n class: \"pm-paragraph-content\",\n },\n 0,\n ]);\n return [\"p\", attrs, ...children];\n },\n },\n\n text: {\n group: \"inline\",\n },\n\n hard_break: {\n inline: true,\n group: \"inline\",\n selectable: false,\n parseDOM: [{ tag: \"br\" }],\n toDOM() {\n return [\"br\"];\n },\n },\n\n tab_char: {\n inline: true,\n group: \"inline\",\n atom: true,\n selectable: false,\n attrs: {\n tabWidth: { default: null },\n leader: { default: null },\n align: { default: null },\n },\n toDOM(node) {\n const width = node.attrs.tabWidth as number | null;\n const leader = node.attrs.leader as string | null;\n const align = node.attrs.align as string | null;\n const styles = [\n `display: inline-block`,\n `width: ${width && width > 0 ? width : 32}px`,\n `min-width: 8px`,\n ];\n if (leader === \"dot\" || leader === \"middleDot\") {\n styles.push(\n `background-image: radial-gradient(circle, currentColor 1px, transparent 1.25px)`,\n `background-size: 6px 3px`,\n `background-repeat: repeat-x`,\n `background-position: left calc(100% - 2px)`,\n `opacity: 0.55`,\n );\n } else if (leader === \"hyphen\") {\n styles.push(`border-bottom: 1px dashed rgba(107,107,107,0.65)`);\n } else if (leader === \"underscore\") {\n styles.push(`border-bottom: 1px solid rgba(107,107,107,0.65)`);\n } else if (leader === \"heavy\") {\n styles.push(`border-bottom: 2px solid rgba(107,107,107,0.75)`);\n }\n return [\n \"span\",\n {\n style: styles.join(\"; \"),\n \"data-node-type\": \"tab\",\n title: align ? `Tab stop · ${align}` : \"Tab stop\",\n },\n \"\\u00A0\",\n ];\n },\n },\n\n image_atom: {\n inline: true,\n group: \"inline\",\n atom: true,\n attrs: {\n mediaId: { default: \"\" },\n altText: { default: null },\n state: { default: \"editable\" },\n display: { default: \"inline\" },\n detail: { default: null },\n src: { default: null },\n widthEmu: { default: null },\n heightEmu: { default: null },\n },\n toDOM(node) {\n const isMissing = node.attrs.state === \"missing\";\n const isFloating = node.attrs.display === \"floating\";\n const src = node.attrs.src as string | null;\n const widthEmu = node.attrs.widthEmu as number | null;\n const heightEmu = node.attrs.heightEmu as number | null;\n if (!isMissing && src) {\n const widthPx = widthEmu ? Math.max(24, Math.round(widthEmu / 9525)) : undefined;\n const heightPx = heightEmu ? Math.max(24, Math.round(heightEmu / 9525)) : undefined;\n const style = [\n \"display:inline-block\",\n \"vertical-align:middle\",\n \"margin:0 4px\",\n widthPx ? `width:${widthPx}px` : \"\",\n heightPx ? `height:${heightPx}px` : \"\",\n ].filter(Boolean).join(\";\");\n return [\n \"span\",\n {\n class: \"inline-flex items-center rounded\",\n \"data-node-type\": \"image\",\n title: (node.attrs.detail as string) ?? (node.attrs.altText as string) ?? \"Image\",\n },\n [\n \"img\",\n {\n src,\n alt: (node.attrs.altText as string) ?? \"\",\n style,\n },\n ],\n ];\n }\n return [\n \"span\",\n {\n class: `inline-flex items-center gap-1 mx-0.5 px-1.5 py-0.5 rounded text-xs border-none ${\n isMissing ? \"text-danger bg-delete-soft\" : \"text-secondary bg-surface\"\n }`,\n \"data-node-type\": \"image\",\n title: (node.attrs.detail as string) ?? (node.attrs.altText as string) ?? \"Image\",\n },\n \"\\uD83D\\uDCF7 \" + ((node.attrs.altText as string) ?? (isMissing ? \"Missing\" : isFloating ? \"Floating image\" : \"Image\")),\n ];\n },\n },\n\n sdt_block: {\n group: \"block\",\n content: \"block+\",\n isolating: true,\n attrs: {\n sdtType: { default: null },\n alias: { default: null },\n tag: { default: null },\n lock: { default: null },\n checkboxChecked: { default: null },\n dateValue: { default: null },\n dropdownItems: { default: null },\n comboBoxItems: { default: null },\n showingPlcHdr: { default: false },\n },\n toDOM(node) {\n const sdtType = node.attrs.sdtType as string | null;\n const typeLabel = sdtType === \"checkbox\" ? \"\\u2611 Checkbox\"\n : sdtType === \"date\" ? \"\\uD83D\\uDCC5 Date\"\n : sdtType === \"dropDownList\" ? \"\\u25BE Dropdown\"\n : sdtType === \"comboBox\" ? \"\\u25BE Combo box\"\n : sdtType === \"plainText\" ? \"\\u270E Plain text\"\n : sdtType === \"richText\" ? \"\\u270E Rich text\"\n : sdtType ?? undefined;\n const meta = [node.attrs.alias, node.attrs.tag, typeLabel].filter(Boolean).join(\" \\u00B7 \");\n return [\n \"section\",\n {\n class: \"my-2 rounded-xl border border-primary/15 bg-surface-raised/60 px-3 py-2\",\n \"data-node-type\": \"sdt_block\",\n ...(sdtType ? { \"data-sdt-type\": sdtType } : {}),\n },\n [\n \"div\",\n {\n class: \"mb-2 text-[11px] uppercase tracking-[0.18em] text-tertiary\",\n contenteditable: \"false\",\n },\n meta || \"Content control\",\n ],\n [\"div\", 0],\n ];\n },\n },\n\n opaque_inline: {\n inline: true,\n group: \"inline\",\n atom: true,\n selectable: false,\n attrs: {\n fragmentId: { default: \"\" },\n warningId: { default: \"\" },\n label: { default: \"Locked\" },\n detail: { default: \"\" },\n presentation: { default: \"inline-chip\" },\n },\n toDOM(node) {\n const presentation = node.attrs.presentation as string;\n if (presentation === \"quiet-marker\") {\n return [\n \"span\",\n {\n class: \"inline-block h-0 w-0 overflow-hidden align-baseline\",\n \"data-node-type\": \"opaque_inline\",\n \"data-inline-presentation\": \"quiet-marker\",\n contenteditable: \"false\",\n title: node.attrs.detail as string,\n \"aria-label\": node.attrs.label as string,\n },\n ];\n }\n return [\n \"span\",\n {\n class: \"inline-flex items-center gap-1 mx-0.5 px-1.5 py-0.5 rounded text-xs text-comment bg-warning-soft\",\n \"data-node-type\": \"opaque_inline\",\n \"data-inline-presentation\": \"inline-chip\",\n title: node.attrs.detail as string,\n },\n \"\\uD83D\\uDD12 \" + (node.attrs.label as string),\n ];\n },\n },\n\n field_ref_atom: {\n inline: true,\n group: \"inline\",\n atom: true,\n selectable: false,\n attrs: {\n fieldFamily: { default: \"REF\" },\n fieldTarget: { default: null },\n instruction: { default: \"\" },\n refreshStatus: { default: \"stale\" },\n label: { default: \"Field\" },\n },\n toDOM(node) {\n const refreshStatus = node.attrs.refreshStatus as string;\n const statusClass =\n refreshStatus === \"current\"\n ? \"text-blue-700 bg-blue-50 border-blue-200\"\n : refreshStatus === \"unresolvable\"\n ? \"text-amber-800 bg-amber-50 border-amber-200\"\n : \"text-slate-700 bg-slate-50 border-slate-200\";\n return [\n \"span\",\n {\n class: `inline-flex items-center gap-1 mx-0.5 px-1.5 py-0.5 rounded text-xs border ${statusClass}`,\n \"data-node-type\": \"field_ref_atom\",\n \"data-field-family\": node.attrs.fieldFamily as string,\n title: node.attrs.instruction as string,\n },\n (node.attrs.label as string) || \"Field\",\n ];\n },\n },\n\n table: tableNodeSpec,\n table_row: tableRowNodeSpec,\n table_cell: tableCellNodeSpec,\n table_header_cell: tableHeaderCellNodeSpec,\n\n // ---- Complex rendering atoms (read-only previews) ----\n\n chart_atom: {\n inline: true,\n group: \"inline\",\n atom: true,\n selectable: false,\n attrs: {\n previewMediaId: { default: null },\n detail: { default: null },\n },\n toDOM(node) {\n return [\n \"span\",\n {\n class: \"inline-flex items-center gap-1 mx-0.5 px-1.5 py-0.5 rounded text-xs text-blue-700 bg-blue-50 border border-blue-200\",\n \"data-node-type\": \"chart_atom\",\n contenteditable: \"false\",\n title: (node.attrs.detail as string) ?? \"Chart\",\n },\n \"\\uD83D\\uDCC8 Chart\",\n ];\n },\n },\n\n smartart_atom: {\n inline: true,\n group: \"inline\",\n atom: true,\n selectable: false,\n attrs: {\n previewMediaId: { default: null },\n detail: { default: null },\n },\n toDOM(node) {\n return [\n \"span\",\n {\n class: \"inline-flex items-center gap-1 mx-0.5 px-1.5 py-0.5 rounded text-xs text-purple-700 bg-purple-50 border border-purple-200\",\n \"data-node-type\": \"smartart_atom\",\n contenteditable: \"false\",\n title: (node.attrs.detail as string) ?? \"SmartArt\",\n },\n \"\\uD83D\\uDDFA SmartArt\",\n ];\n },\n },\n\n shape_atom: {\n inline: true,\n group: \"inline\",\n atom: true,\n selectable: true,\n attrs: {\n text: { default: null },\n geometry: { default: null },\n detail: { default: null },\n },\n toDOM(node) {\n const text = node.attrs.text as string | null;\n const label = text ? `Shape: ${text}` : \"Shape\";\n return [\n \"span\",\n {\n class: \"inline-flex items-center gap-1 mx-0.5 px-1.5 py-0.5 rounded text-xs text-green-700 bg-green-50 border border-green-200\",\n \"data-node-type\": \"shape_atom\",\n contenteditable: \"false\",\n title: (node.attrs.detail as string) ?? label,\n },\n \"\\u25A1 \" + label,\n ];\n },\n },\n\n wordart_atom: {\n inline: true,\n group: \"inline\",\n atom: true,\n selectable: false,\n attrs: {\n text: { default: \"\" },\n geometry: { default: null },\n detail: { default: null },\n },\n toDOM(node) {\n const text = node.attrs.text as string;\n return [\n \"span\",\n {\n class: \"inline-flex items-center gap-1 mx-0.5 px-1.5 py-0.5 rounded text-xs text-orange-700 bg-orange-50 border border-orange-200 font-medium italic\",\n \"data-node-type\": \"wordart_atom\",\n contenteditable: \"false\",\n title: (node.attrs.detail as string) ?? `WordArt: ${text}`,\n },\n \"\\u2728 \" + (text || \"WordArt\"),\n ];\n },\n },\n\n vml_atom: {\n inline: true,\n group: \"inline\",\n atom: true,\n selectable: true,\n attrs: {\n text: { default: null },\n shapeType: { default: null },\n detail: { default: null },\n },\n toDOM(node) {\n const text = node.attrs.text as string | null;\n const label = text ? `VML: ${text}` : \"VML shape\";\n return [\n \"span\",\n {\n class: \"inline-flex items-center gap-1 mx-0.5 px-1.5 py-0.5 rounded text-xs text-gray-600 bg-gray-100 border border-gray-300\",\n \"data-node-type\": \"vml_atom\",\n contenteditable: \"false\",\n title: (node.attrs.detail as string) ?? label,\n },\n \"\\u25A6 \" + label,\n ];\n },\n },\n\n opaque_block: {\n group: \"block\",\n atom: true,\n selectable: false,\n attrs: {\n fragmentId: { default: \"\" },\n warningId: { default: \"\" },\n label: { default: \"Locked\" },\n detail: { default: \"\" },\n },\n toDOM(node) {\n const fragmentId = node.attrs.fragmentId as string;\n const isPreview = fragmentId.startsWith(\"preview:\");\n return [\n \"div\",\n {\n class: isPreview\n ? \"my-3 rounded-xl border border-primary/15 bg-surface-raised/50 px-4 py-3\"\n : \"border-l-2 border-dashed border-warning/30 pl-4 py-2 rounded-r bg-warning-soft/20 my-2\",\n contenteditable: \"false\",\n \"data-node-type\": \"opaque_block\",\n },\n [\n \"div\",\n {\n class: isPreview\n ? \"mb-2 text-[11px] uppercase tracking-[0.18em] text-tertiary\"\n : \"flex items-center gap-1.5 text-xs text-tertiary mb-1\",\n },\n `${isPreview ? \"\" : \"\\uD83D\\uDD12 \"}${node.attrs.label as string}`,\n ],\n [\n \"p\",\n {\n class: isPreview ? \"text-sm text-secondary whitespace-pre-wrap leading-relaxed\" : \"text-sm text-secondary whitespace-pre-wrap\",\n },\n node.attrs.detail as string,\n ],\n ];\n },\n },\n },\n\n marks: {\n bold: {\n parseDOM: [{ tag: \"strong\" }, { tag: \"b\" }],\n toDOM() {\n return [\"strong\", 0];\n },\n },\n italic: {\n parseDOM: [{ tag: \"em\" }, { tag: \"i\" }],\n toDOM() {\n return [\"em\", 0];\n },\n },\n underline: {\n parseDOM: [{ tag: \"u\" }],\n toDOM() {\n return [\"u\", 0];\n },\n },\n strikethrough: {\n parseDOM: [{ tag: \"s\" }, { tag: \"del\" }],\n toDOM() {\n return [\"s\", 0];\n },\n },\n doubleStrikethrough: {\n toDOM() {\n return [\"span\", { style: \"text-decoration: line-through double\" }, 0];\n },\n },\n vanish: {\n toDOM() {\n return [\n \"span\",\n {\n style: \"display: none\",\n \"data-hidden-text\": \"true\",\n \"aria-hidden\": \"true\",\n },\n 0,\n ];\n },\n },\n emboss: {\n toDOM() {\n return [\"span\", { style: \"text-shadow: 1px -1px 0 rgba(255,255,255,0.6), -1px 1px 0 rgba(0,0,0,0.2)\" }, 0];\n },\n },\n imprint: {\n toDOM() {\n return [\"span\", { style: \"text-shadow: -1px 1px 0 rgba(255,255,255,0.6), 1px -1px 0 rgba(0,0,0,0.2)\" }, 0];\n },\n },\n shadow: {\n toDOM() {\n return [\"span\", { style: \"text-shadow: 1px 1px 2px rgba(0,0,0,0.3)\" }, 0];\n },\n },\n superscript: {\n excludes: \"subscript\",\n parseDOM: [{ tag: \"sup\" }],\n toDOM() {\n return [\"sup\", 0];\n },\n },\n subscript: {\n excludes: \"superscript\",\n parseDOM: [{ tag: \"sub\" }],\n toDOM() {\n return [\"sub\", 0];\n },\n },\n small_caps: {\n parseDOM: [\n {\n style: \"font-variant\",\n getAttrs: (value) => (value === \"small-caps\" ? null : false),\n },\n ],\n toDOM() {\n return [\"span\", { style: \"font-variant: small-caps\" }, 0];\n },\n },\n all_caps: {\n parseDOM: [\n {\n style: \"text-transform\",\n getAttrs: (value) => (value === \"uppercase\" ? null : false),\n },\n ],\n toDOM() {\n return [\"span\", { style: \"text-transform: uppercase\" }, 0];\n },\n },\n char_spacing: {\n attrs: { value: { default: 0 } },\n toDOM(mark) {\n const twips = mark.attrs.value as number;\n return [\"span\", { style: `letter-spacing: ${twips / 20}px` }, 0];\n },\n },\n font_kerning: {\n attrs: { threshold: { default: 0 } },\n toDOM() {\n return [\"span\", { style: \"font-kerning: normal\" }, 0];\n },\n },\n font_family: {\n attrs: { family: { default: null } },\n parseDOM: [\n {\n style: \"font-family\",\n getAttrs: (value) => ({ family: (value as string).replace(/['\"]/g, \"\") }),\n },\n ],\n toDOM(mark) {\n const family = mark.attrs.family as string;\n if (!SAFE_FONT_RE.test(family)) return [\"span\", 0];\n return [\"span\", { style: `font-family: ${family}` }, 0];\n },\n },\n font_size: {\n attrs: { size: { default: null } },\n parseDOM: [\n {\n style: \"font-size\",\n getAttrs: (value) => {\n const match = (value as string).match(/^(\\d+(?:\\.\\d+)?)/);\n return match ? { size: Number.parseFloat(match[1]) } : false;\n },\n },\n ],\n toDOM(mark) {\n return [\"span\", { style: `font-size: ${mark.attrs.size as number}pt` }, 0];\n },\n },\n text_color: {\n attrs: { color: { default: null } },\n parseDOM: [\n {\n style: \"color\",\n getAttrs: (value) => ({ color: value }),\n },\n ],\n toDOM(mark) {\n const color = safeCssColor(mark.attrs.color as string);\n if (!color) return [\"span\", 0];\n return [\"span\", { style: `color: ${color}` }, 0];\n },\n },\n highlight: {\n attrs: { color: { default: \"yellow\" } },\n parseDOM: [\n {\n tag: \"mark\",\n getAttrs: (dom) => ({ color: (dom as HTMLElement).style.backgroundColor || \"yellow\" }),\n },\n ],\n toDOM(mark) {\n const color = safeCssColor(mark.attrs.color as string);\n if (!color) return [\"mark\", 0];\n return [\"mark\", { style: `background-color: ${color}` }, 0];\n },\n },\n link: {\n attrs: { href: { default: \"\" } },\n inclusive: false,\n parseDOM: [\n {\n tag: \"a[href]\",\n getAttrs(dom) {\n return { href: sanitizeLinkHref((dom as HTMLElement).getAttribute(\"href\")) ?? \"\" };\n },\n },\n ],\n toDOM(mark) {\n const href = sanitizeLinkHref(mark.attrs.href as string);\n if (!href) {\n return [\n \"span\",\n {\n class: \"text-accent underline decoration-1 underline-offset-2\",\n \"data-invalid-link\": \"true\",\n },\n 0,\n ];\n }\n return [\n \"a\",\n {\n href,\n class: \"text-accent underline decoration-1 underline-offset-2\",\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n },\n 0,\n ];\n },\n },\n },\n});\n","/**\n * ProseMirror table node specifications for first-class table editing.\n *\n * These specs define the structure required for tables in the ProseMirror schema,\n * compatible with prosemirror-tables when used as a dependency, or standalone for\n * basic cell-content editing.\n *\n * All four specs must be included together when merging into a schema because\n * table_row references both table_cell and table_header_cell in its content model.\n */\n\nimport type { NodeSpec } from \"prosemirror-model\";\n\n/** Characters that must never appear in CSS values derived from OOXML tokens. */\nconst CSS_INJECTION_RE = /[;{}()[\\]\\\\@!]/;\n\n/** Validate a CSS color token — allows #hex (3/6/8 digits) and named colors only. */\nfunction safeCssColor(raw: string | null | undefined): string | null {\n if (!raw) return null;\n if (/^#[0-9A-Fa-f]{3,8}$/.test(raw)) return raw;\n if (/^[a-zA-Z]+$/.test(raw) && raw !== \"expression\") return raw;\n return null;\n}\n\n/** Sanitize a composite CSS border shorthand (e.g. \"1px solid #abc\"). Rejects injection attempts. */\nfunction safeCssBorder(raw: string | null | undefined): string | null {\n if (!raw) return null;\n if (CSS_INJECTION_RE.test(raw)) return null;\n if (raw.length > 100) return null;\n return raw;\n}\n\ntype TableCellAttrs = {\n colspan?: number | null;\n rowspan?: number | null;\n colwidth?: number[] | null;\n gridSpan?: number | null;\n verticalMerge?: \"restart\" | \"continue\" | null;\n backgroundColor?: string | null;\n verticalAlign?: \"top\" | \"center\" | \"bottom\" | null;\n borderTop?: string | null;\n borderRight?: string | null;\n borderBottom?: string | null;\n borderLeft?: string | null;\n};\n\nfunction resolveRenderedColspan(attrs: {\n colspan?: number | null;\n gridSpan?: number | null;\n}): number {\n if (typeof attrs.colspan === \"number\" && attrs.colspan > 1) {\n return attrs.colspan;\n }\n if (typeof attrs.gridSpan === \"number\" && attrs.gridSpan > 1) {\n return attrs.gridSpan;\n }\n return 1;\n}\n\nfunction resolveRenderedRowspan(attrs: { rowspan?: number | null }): number {\n return typeof attrs.rowspan === \"number\" && attrs.rowspan > 1 ? attrs.rowspan : 1;\n}\n\nfunction parseColwidthAttr(dom: HTMLElement, colspan: number): number[] | null {\n const widthAttr = dom.getAttribute(\"data-colwidth\");\n if (!widthAttr || !/^\\d+(,\\d+)*$/.test(widthAttr)) {\n return null;\n }\n\n const widths = widthAttr.split(\",\").map((value) => Number.parseInt(value, 10));\n return widths.length === colspan ? widths : null;\n}\n\nfunction getCellAttrs(dom: HTMLElement): TableCellAttrs {\n const colspan = Number(dom.getAttribute(\"colspan\") || 1);\n const rowspan = Number(dom.getAttribute(\"rowspan\") || 1);\n const gridSpanAttr = dom.getAttribute(\"data-grid-span\");\n const verticalMergeAttr = dom.getAttribute(\"data-vertical-merge\");\n const gridSpan = gridSpanAttr ? Number.parseInt(gridSpanAttr, 10) : colspan;\n const backgroundColor =\n dom.getAttribute(\"data-cell-background\") ?? dom.style.backgroundColor ?? null;\n const verticalAlign = dom.getAttribute(\"data-vertical-align\") as \"top\" | \"center\" | \"bottom\" | null;\n\n return {\n colspan,\n rowspan,\n colwidth: parseColwidthAttr(dom, colspan),\n gridSpan: Number.isFinite(gridSpan) && gridSpan > 0 ? gridSpan : colspan,\n verticalMerge:\n verticalMergeAttr === \"restart\" || verticalMergeAttr === \"continue\"\n ? verticalMergeAttr\n : null,\n backgroundColor,\n verticalAlign: verticalAlign === \"top\" || verticalAlign === \"center\" || verticalAlign === \"bottom\" ? verticalAlign : null,\n borderTop: dom.getAttribute(\"data-border-top\"),\n borderRight: dom.getAttribute(\"data-border-right\"),\n borderBottom: dom.getAttribute(\"data-border-bottom\"),\n borderLeft: dom.getAttribute(\"data-border-left\"),\n };\n}\n\nfunction setCellDomAttrs(nodeAttrs: TableCellAttrs, className: string): Record<string, string> {\n const attrs: Record<string, string> = { class: className };\n const colspan = resolveRenderedColspan(nodeAttrs);\n const rowspan = resolveRenderedRowspan(nodeAttrs);\n\n if (colspan > 1) {\n attrs.colspan = String(colspan);\n }\n if (rowspan > 1) {\n attrs.rowspan = String(rowspan);\n }\n if (nodeAttrs.colwidth && nodeAttrs.colwidth.length > 0) {\n attrs[\"data-colwidth\"] = nodeAttrs.colwidth.join(\",\");\n }\n if (typeof nodeAttrs.gridSpan === \"number\" && nodeAttrs.gridSpan > 1) {\n attrs[\"data-grid-span\"] = String(nodeAttrs.gridSpan);\n }\n if (nodeAttrs.verticalMerge) {\n attrs[\"data-vertical-merge\"] = nodeAttrs.verticalMerge;\n }\n if (nodeAttrs.backgroundColor) {\n attrs[\"data-cell-background\"] = nodeAttrs.backgroundColor;\n }\n if (nodeAttrs.verticalAlign && nodeAttrs.verticalAlign !== \"top\") {\n attrs[\"data-vertical-align\"] = nodeAttrs.verticalAlign;\n }\n if (nodeAttrs.borderTop) attrs[\"data-border-top\"] = nodeAttrs.borderTop;\n if (nodeAttrs.borderRight) attrs[\"data-border-right\"] = nodeAttrs.borderRight;\n if (nodeAttrs.borderBottom) attrs[\"data-border-bottom\"] = nodeAttrs.borderBottom;\n if (nodeAttrs.borderLeft) attrs[\"data-border-left\"] = nodeAttrs.borderLeft;\n\n const styles: string[] = [];\n const bgColor = safeCssColor(nodeAttrs.backgroundColor);\n if (bgColor) styles.push(`background-color: ${bgColor}`);\n if (nodeAttrs.verticalAlign) styles.push(`vertical-align: ${nodeAttrs.verticalAlign === \"center\" ? \"middle\" : nodeAttrs.verticalAlign}`);\n const bTop = safeCssBorder(nodeAttrs.borderTop);\n if (bTop) styles.push(`border-top: ${bTop}`);\n const bRight = safeCssBorder(nodeAttrs.borderRight);\n if (bRight) styles.push(`border-right: ${bRight}`);\n const bBottom = safeCssBorder(nodeAttrs.borderBottom);\n if (bBottom) styles.push(`border-bottom: ${bBottom}`);\n const bLeft = safeCssBorder(nodeAttrs.borderLeft);\n if (bLeft) styles.push(`border-left: ${bLeft}`);\n if (styles.length > 0) attrs.style = styles.join(\"; \");\n\n return attrs;\n}\n\nfunction validateColwidth(value: unknown): void {\n if (value === null) {\n return;\n }\n if (!Array.isArray(value)) {\n throw new TypeError(\"colwidth must be null or an array\");\n }\n for (const item of value) {\n if (typeof item !== \"number\") {\n throw new TypeError(\"colwidth must be null or an array of numbers\");\n }\n }\n}\n\nfunction validateVerticalMerge(value: unknown): void {\n if (value === null || value === \"restart\" || value === \"continue\") {\n return;\n }\n throw new TypeError(\"verticalMerge must be null, 'restart', or 'continue'\");\n}\n\nconst tableCellSpecAttrs = {\n propertiesXml: { default: null },\n gridSpan: { default: 1, validate: \"number\" },\n verticalMerge: { default: null, validate: validateVerticalMerge },\n colspan: { default: 1, validate: \"number\" },\n rowspan: { default: 1, validate: \"number\" },\n colwidth: { default: null, validate: validateColwidth },\n backgroundColor: { default: null },\n verticalAlign: { default: null },\n borderTop: { default: null },\n borderRight: { default: null },\n borderBottom: { default: null },\n borderLeft: { default: null },\n} as const;\n\nexport const tableNodeSpec: NodeSpec = {\n content: \"table_row+\",\n tableRole: \"table\",\n group: \"block\",\n isolating: true,\n attrs: {\n styleId: { default: null },\n propertiesXml: { default: null },\n gridColumns: { default: [] },\n alignment: { default: null },\n tblLookFirstRow: { default: false },\n tblLookLastRow: { default: false },\n tblLookFirstColumn: { default: false },\n tblLookLastColumn: { default: false },\n tblLookNoHBand: { default: false },\n tblLookNoVBand: { default: false },\n },\n parseDOM: [{ tag: \"table\" }],\n toDOM(node) {\n const style = node.attrs.alignment === \"center\"\n ? \"margin-left: auto; margin-right: auto\"\n : node.attrs.alignment === \"right\"\n ? \"margin-left: auto\"\n : undefined;\n return [\n \"table\",\n {\n class: \"border-collapse w-full my-2 text-sm\",\n ...(style ? { style } : {}),\n },\n [\"tbody\", 0],\n ];\n },\n};\n\nexport const tableRowNodeSpec: NodeSpec = {\n content: \"(table_cell | table_header_cell)+\",\n tableRole: \"row\",\n attrs: {\n propertiesXml: { default: null },\n gridBefore: { default: 0, validate: \"number\" },\n gridAfter: { default: 0, validate: \"number\" },\n height: { default: null },\n heightRule: { default: null },\n isHeader: { default: false },\n },\n parseDOM: [{ tag: \"tr\" }],\n toDOM(node) {\n const style = node.attrs.heightRule === \"exact\" && node.attrs.height\n ? `height: ${Math.round((node.attrs.height as number) / 20)}pt`\n : node.attrs.heightRule === \"atLeast\" && node.attrs.height\n ? `min-height: ${Math.round((node.attrs.height as number) / 20)}pt`\n : undefined;\n return [\"tr\", { ...(style ? { style } : {}) }, 0];\n },\n};\n\nexport const tableCellNodeSpec: NodeSpec = {\n content: \"block+\",\n tableRole: \"cell\",\n isolating: true,\n attrs: tableCellSpecAttrs,\n parseDOM: [\n {\n tag: \"td\",\n getAttrs(dom) {\n if (!(dom instanceof HTMLElement)) {\n return false;\n }\n return getCellAttrs(dom);\n },\n },\n ],\n toDOM(node) {\n return [\n \"td\",\n setCellDomAttrs(node.attrs as TableCellAttrs, \"border border-primary/20 p-2 align-top\"),\n 0,\n ];\n },\n};\n\nexport const tableHeaderCellNodeSpec: NodeSpec = {\n content: \"block+\",\n tableRole: \"header_cell\",\n isolating: true,\n attrs: tableCellSpecAttrs,\n parseDOM: [\n {\n tag: \"th\",\n getAttrs(dom) {\n if (!(dom instanceof HTMLElement)) {\n return false;\n }\n return getCellAttrs(dom);\n },\n },\n ],\n toDOM(node) {\n return [\n \"th\",\n setCellDomAttrs(\n node.attrs as TableCellAttrs,\n \"border border-primary/20 p-2 align-top font-semibold bg-surface-raised\",\n ),\n 0,\n ];\n },\n};\n\n/**\n * Returns a record of all four table node specs to merge into an existing ProseMirror Schema.\n *\n * All four must be included together because table_row references both table_cell and\n * table_header_cell in its content model.\n */\nexport function getTableNodeSpecs(): Record<string, NodeSpec> {\n return {\n table: tableNodeSpec,\n table_row: tableRowNodeSpec,\n table_cell: tableCellNodeSpec,\n table_header_cell: tableHeaderCellNodeSpec,\n };\n}\n","import type { EditorSurfaceSnapshot, SurfaceBlockSnapshot } from \"../../api/public-types\";\n\nexport interface PositionMap {\n runtimeToPm(runtimePos: number): number;\n pmToRuntime(pmPos: number): number;\n pmDocSize: number;\n runtimeStorySize: number;\n}\n\ninterface MapEntry {\n runtimeStart: number;\n pmStart: number;\n runtimeEnd: number;\n pmEnd: number;\n}\n\nexport function buildPositionMap(surface: EditorSurfaceSnapshot): PositionMap {\n const entries: MapEntry[] = [];\n const pmDocSize = walkBlocks(surface.blocks, 1, entries);\n const runtimeStorySize = surface.storySize;\n\n return {\n runtimeToPm(runtimePos: number): number {\n if (runtimePos <= 0) {\n return entries[0]?.pmStart ?? 1;\n }\n if (runtimePos >= runtimeStorySize) {\n return entries[entries.length - 1]?.pmEnd ?? pmDocSize - 1;\n }\n\n for (const entry of entries) {\n if (runtimePos >= entry.runtimeStart && runtimePos < entry.runtimeEnd) {\n return entry.pmStart + (runtimePos - entry.runtimeStart);\n }\n if (runtimePos < entry.runtimeStart) {\n return entry.pmStart;\n }\n }\n\n return entries[entries.length - 1]?.pmEnd ?? 1;\n },\n\n pmToRuntime(pmPos: number): number {\n if (pmPos <= 1) {\n return 0;\n }\n if (pmPos >= pmDocSize - 1) {\n return runtimeStorySize;\n }\n\n for (const entry of entries) {\n if (pmPos >= entry.pmStart && pmPos <= entry.pmEnd) {\n return entry.runtimeStart + (pmPos - entry.pmStart);\n }\n if (pmPos < entry.pmStart) {\n return entry.runtimeStart;\n }\n }\n\n return runtimeStorySize;\n },\n\n pmDocSize,\n runtimeStorySize,\n };\n}\n\nfunction walkBlocks(\n blocks: SurfaceBlockSnapshot[],\n pmCursor: number,\n entries: MapEntry[],\n): number {\n let nextPmCursor = pmCursor;\n\n for (const block of blocks) {\n switch (block.kind) {\n case \"paragraph\": {\n const pmContentStart = nextPmCursor;\n const runtimeLength = block.to - block.from;\n entries.push({\n runtimeStart: block.from,\n pmStart: pmContentStart,\n runtimeEnd: block.to,\n pmEnd: pmContentStart + runtimeLength,\n });\n nextPmCursor += runtimeLength + 2;\n break;\n }\n case \"opaque_block\": {\n entries.push({\n runtimeStart: block.from,\n pmStart: nextPmCursor,\n runtimeEnd: block.to,\n pmEnd: nextPmCursor + 1,\n });\n nextPmCursor += 1;\n break;\n }\n case \"sdt_block\": {\n nextPmCursor += 1;\n nextPmCursor = walkBlocks(block.children, nextPmCursor, entries);\n nextPmCursor += 1;\n break;\n }\n case \"table\": {\n nextPmCursor += 1;\n for (const row of block.rows) {\n nextPmCursor += 1;\n for (const cell of row.cells) {\n nextPmCursor += 1;\n nextPmCursor = walkBlocks(cell.content, nextPmCursor, entries);\n nextPmCursor += 1;\n }\n nextPmCursor += 1;\n }\n nextPmCursor += 1;\n break;\n }\n }\n }\n\n return nextPmCursor;\n}\n","import { NodeSelection, Plugin, PluginKey } from \"prosemirror-state\";\nimport { keymap } from \"prosemirror-keymap\";\nimport { columnResizing, goToNextCell, isInTable, tableEditing } from \"prosemirror-tables\";\n\nimport type { SelectionSnapshot } from \"../../api/public-types\";\nimport {\n createNodeSelectionSnapshot,\n createSelectionSnapshot,\n} from \"../../ui/headless/selection-helpers\";\nimport type { PositionMap } from \"./pm-position-map\";\n\nexport interface CommandBridgeCallbacks {\n onInsertText: (text: string) => void;\n onDeleteBackward: () => void;\n onDeleteForward: () => void;\n onSplitParagraph: () => void;\n onInsertHardBreak: () => void;\n onInsertTab: () => void;\n onOutdentTab?: () => void;\n onUndo: () => void;\n onRedo: () => void;\n onBlockedInput?: (command: \"paste\" | \"drop\", message: string) => void;\n onSelectionChange: (selection: SelectionSnapshot) => void;\n getPositionMap: () => PositionMap | null;\n isSelectionSyncSuppressed?: () => boolean;\n}\n\nconst bridgeKey = new PluginKey(\"command-bridge\");\n\n/**\n * Creates ProseMirror plugins that intercept user input and dispatch\n * runtime commands instead of letting PM mutate its own state.\n *\n * All doc-changing transactions are blocked. Only the explicit input\n * hooks below are allowed to trigger runtime commands.\n */\nexport function createCommandBridgePlugins(\n callbacks: CommandBridgeCallbacks,\n): Plugin[] {\n let isComposing = false;\n\n // Transaction filter: block ALL doc-changing transactions.\n // The runtime is the sole authority for document mutations.\n const filterPlugin = new Plugin({\n key: bridgeKey,\n filterTransaction(tr) {\n // Allow selection-only and metadata-only transactions\n if (!tr.docChanged) return true;\n // Block doc changes — runtime handles mutations via callbacks\n return false;\n },\n });\n\n // Selection sync: when PM selection changes, notify the runtime.\n const selectionPlugin = new Plugin({\n view() {\n return {\n update(view, prevState) {\n if (callbacks.isSelectionSyncSuppressed?.()) {\n return;\n }\n if (isComposing) {\n return;\n }\n if (!view.state.selection.eq(prevState.selection)) {\n const posMap = callbacks.getPositionMap();\n if (!posMap) return;\n\n if (view.state.selection instanceof NodeSelection) {\n callbacks.onSelectionChange(\n createNodeSelectionSnapshot(posMap.pmToRuntime(view.state.selection.from), 1),\n );\n return;\n }\n\n const { anchor, head } = view.state.selection;\n callbacks.onSelectionChange(\n createSelectionSnapshot(posMap.pmToRuntime(anchor), posMap.pmToRuntime(head)),\n );\n }\n },\n };\n },\n });\n\n // Text input hook: intercept typed characters.\n const inputPlugin = new Plugin({\n props: {\n handleDOMEvents: {\n blur() {\n isComposing = false;\n return false;\n },\n compositionstart() {\n isComposing = true;\n return false;\n },\n compositionend() {\n isComposing = false;\n return false;\n },\n },\n handleTextInput(_view, _from, _to, text) {\n if (isComposing) {\n return true;\n }\n callbacks.onInsertText(text);\n return true; // Block PM from processing\n },\n\n // Block paste (rich paste is not safe, plain paste via text.insert is TODO)\n handlePaste() {\n callbacks.onBlockedInput?.(\"paste\", \"Paste is not supported in the mounted editor yet.\");\n return true; // Block\n },\n\n // Block drop\n handleDrop() {\n callbacks.onBlockedInput?.(\"drop\", \"Drag and drop is not supported in the mounted editor.\");\n return true; // Block\n },\n },\n });\n\n // Keymap: intercept editing keys and dispatch runtime commands.\n const keymapPlugin = keymap({\n Backspace: () => {\n if (isComposing) return false;\n callbacks.onDeleteBackward();\n return true;\n },\n Delete: () => {\n if (isComposing) return false;\n callbacks.onDeleteForward();\n return true;\n },\n Enter: () => {\n if (isComposing) return false;\n callbacks.onSplitParagraph();\n return true;\n },\n \"Shift-Enter\": () => {\n if (isComposing) return false;\n callbacks.onInsertHardBreak();\n return true;\n },\n Tab: (state, dispatch, view) => {\n if (isComposing) return false;\n if (isInTable(state)) {\n return goToNextCell(1)(state, dispatch, view);\n }\n callbacks.onInsertTab();\n return true;\n },\n \"Shift-Tab\": (state, dispatch, view) => {\n if (isComposing) return false;\n if (isInTable(state)) {\n return goToNextCell(-1)(state, dispatch, view);\n }\n callbacks.onOutdentTab?.();\n return true;\n },\n \"Mod-z\": () => {\n callbacks.onUndo();\n return true;\n },\n \"Mod-y\": () => {\n callbacks.onRedo();\n return true;\n },\n \"Shift-Mod-z\": () => {\n callbacks.onRedo();\n return true;\n },\n });\n\n // Table editing: provides Tab/Shift-Tab navigation between cells and\n // selection handles. Doc-changing table transactions (new rows, etc.) are\n // filtered by the runtime filter above; navigation-only steps pass through.\n const tablePlugin = tableEditing();\n const columnResizingPlugin = columnResizing();\n\n return [filterPlugin, selectionPlugin, inputPlugin, keymapPlugin, tablePlugin, columnResizingPlugin];\n}\n","import { Decoration, DecorationSet } from \"prosemirror-view\";\n\nimport type { CommentDecorationModel } from \"../../ui/headless/comment-decoration-model\";\nimport { getCommentHighlightClass, type MarkupDisplay } from \"../../ui/headless/comment-decoration-model\";\nimport type { RevisionDecorationModel } from \"../../ui/headless/revision-decoration-model\";\nimport { getRevisionHighlightClass } from \"../../ui/headless/revision-decoration-model\";\nimport type {\n EditorAnchorProjection,\n EditorStoryTarget,\n WorkflowBlockedCommandReason,\n WorkflowCandidateRange,\n WorkflowScope,\n} from \"../../api/public-types\";\nimport { MAIN_STORY_TARGET, storyTargetsEqual } from \"../../core/selection/mapping.ts\";\nimport type { PositionMap } from \"./pm-position-map\";\nimport type { Node as PMNode } from \"prosemirror-model\";\n\ntype RailDecorationSpec = {\n railKind: \"scope\" | \"candidate\" | \"blocked\";\n className: string;\n attrs: Record<string, string>;\n};\n\nfunction isSelectionZoneScope(scope: WorkflowScope): boolean {\n return (\n scope.scopeId.startsWith(\"scope-lab-\") ||\n scope.scopeId.startsWith(\"metadata-lab-\") ||\n scope.workItemId?.startsWith(\"scope-lab-\") === true ||\n scope.workItemId?.startsWith(\"metadata-lab-\") === true ||\n scope.label?.toLowerCase().includes(\"scope lab\") === true ||\n scope.label?.toLowerCase().includes(\"metadata lab\") === true\n );\n}\n\nfunction getWorkflowInlineClass(\n scope: WorkflowScope,\n isActiveWorkItem: boolean,\n isSelectionZone: boolean,\n): string {\n const base =\n scope.mode === \"edit\"\n ? \"wre-workflow-inline wre-workflow-inline-edit\"\n : scope.mode === \"suggest\"\n ? \"wre-workflow-inline wre-workflow-inline-suggest\"\n : scope.mode === \"comment\"\n ? \"wre-workflow-inline wre-workflow-inline-comment\"\n : \"wre-workflow-inline wre-workflow-inline-view\";\n const withZone = isSelectionZone ? `${base} wre-workflow-inline-zone` : base;\n return isActiveWorkItem ? `${withZone} wre-workflow-inline-active` : withZone;\n}\n\nfunction getWorkflowRailClass(\n scope: WorkflowScope,\n isActiveWorkItem: boolean,\n isSelectionZone: boolean,\n): string {\n const base =\n scope.mode === \"edit\"\n ? \"wre-workflow-rail wre-workflow-rail-edit\"\n : scope.mode === \"suggest\"\n ? \"wre-workflow-rail wre-workflow-rail-suggest\"\n : scope.mode === \"comment\"\n ? \"wre-workflow-rail wre-workflow-rail-comment\"\n : \"wre-workflow-rail wre-workflow-rail-view\";\n const withZone = isSelectionZone ? `${base} wre-workflow-rail-selection-zone` : base;\n return isActiveWorkItem ? `${withZone} wre-workflow-rail-active` : withZone;\n}\n\nfunction getWorkflowCandidateInlineClass(): string {\n return \"wre-workflow-inline wre-workflow-inline-candidate\";\n}\n\nfunction getWorkflowCandidateRailClass(): string {\n return \"wre-workflow-rail wre-workflow-rail-candidate\";\n}\n\nfunction getWorkflowBlockedInlineClass(reason: WorkflowBlockedCommandReason): string {\n if (reason.code === \"workflow_blocked_import\") {\n return \"wre-workflow-inline wre-workflow-inline-blocked-import\";\n }\n return \"wre-workflow-inline wre-workflow-inline-preserve-only\";\n}\n\nfunction getWorkflowBlockedRailClass(reason: WorkflowBlockedCommandReason): string {\n if (reason.code === \"workflow_blocked_import\") {\n return \"wre-workflow-rail wre-workflow-rail-blocked-import\";\n }\n return \"wre-workflow-rail wre-workflow-rail-preserve-only\";\n}\n\nfunction hasBlockChildren(node: PMNode): boolean {\n for (let index = 0; index < node.childCount; index += 1) {\n if (node.child(index).isBlock) {\n return true;\n }\n }\n return false;\n}\n\nfunction collectRailRanges(doc: PMNode, from: number, to: number): Array<{ from: number; to: number }> {\n const effectiveTo = Math.max(to, from + 1);\n const ranges = new Map<string, { from: number; to: number }>();\n let fallbackFrom: number | null = null;\n let fallbackTo: number | null = null;\n let fallbackSize: number | null = null;\n\n doc.descendants((node, pos) => {\n if (!node.isBlock || node.type.name === \"doc\") {\n return true;\n }\n\n const nodeFrom = pos;\n const nodeTo = pos + node.nodeSize;\n if (nodeTo <= from || nodeFrom >= effectiveTo) {\n return true;\n }\n\n if (!hasBlockChildren(node)) {\n ranges.set(`${nodeFrom}:${nodeTo}`, { from: nodeFrom, to: nodeTo });\n return true;\n }\n\n if (nodeFrom <= from && nodeTo >= effectiveTo) {\n const size = nodeTo - nodeFrom;\n if (fallbackSize === null || size < fallbackSize) {\n fallbackFrom = nodeFrom;\n fallbackTo = nodeTo;\n fallbackSize = size;\n }\n }\n\n return true;\n });\n\n if (ranges.size > 0) {\n return [...ranges.values()];\n }\n\n if (fallbackFrom !== null && fallbackTo !== null) {\n return [{ from: fallbackFrom, to: fallbackTo }];\n }\n\n return [];\n}\n\nfunction buildAnchorPmRange(\n anchor: EditorAnchorProjection,\n positionMap: PositionMap,\n): { from: number; to: number; allowInline: boolean } | null {\n if (anchor.kind === \"detached\") {\n return null;\n }\n\n if (anchor.kind === \"range\") {\n return {\n from: positionMap.runtimeToPm(anchor.from),\n to: positionMap.runtimeToPm(anchor.to),\n allowInline: true,\n };\n }\n\n const pmAt = positionMap.runtimeToPm(anchor.at);\n return {\n from: pmAt,\n to: pmAt + 1,\n allowInline: false,\n };\n}\n\nfunction pushRailDecorations(\n decorations: Decoration[],\n doc: PMNode,\n from: number,\n to: number,\n spec: RailDecorationSpec,\n rangeCache: Map<string, Array<{ from: number; to: number }>>,\n): void {\n const cacheKey = `${from}:${to}`;\n const ranges = rangeCache.get(cacheKey) ?? collectRailRanges(doc, from, to);\n if (!rangeCache.has(cacheKey)) {\n rangeCache.set(cacheKey, ranges);\n }\n for (const range of ranges) {\n decorations.push(\n Decoration.node(range.from, range.to, {\n class: spec.className,\n \"data-workflow-rail\": spec.railKind,\n ...spec.attrs,\n }),\n );\n }\n}\n\n/**\n * Build ProseMirror DecorationSet from runtime comment and revision models.\n *\n * Uses the existing headless decoration models to compute Tailwind class\n * strings, then converts them to PM inline decorations at the correct\n * PM positions via the PositionMap.\n */\nexport function buildDecorations(\n doc: PMNode,\n positionMap: PositionMap,\n commentModel: CommentDecorationModel | undefined,\n revisionModel: RevisionDecorationModel | undefined,\n markupDisplay: MarkupDisplay,\n showTrackedChanges = true,\n workflowScopes?: readonly WorkflowScope[],\n activeStory: EditorStoryTarget = MAIN_STORY_TARGET,\n workflowCandidates?: readonly WorkflowCandidateRange[],\n workflowBlockedReasons?: readonly WorkflowBlockedCommandReason[],\n activeWorkflowWorkItemId?: string | null,\n activeWorkflowScopeIds?: readonly string[],\n suggestionsEnabled = false,\n): DecorationSet {\n const decorations: Decoration[] = [];\n const railRangeCache = new Map<string, Array<{ from: number; to: number }>>();\n const activeScopeIds = new Set(activeWorkflowScopeIds ?? []);\n // In suggestions mode, tracked changes are always shown regardless of the toggle.\n const effectiveShowTracked = suggestionsEnabled ? true : showTrackedChanges;\n\n // Walk comment threads and create inline decorations\n if (commentModel) {\n for (const thread of commentModel.threads) {\n const cls = getCommentHighlightClass(\n commentModel,\n thread.from,\n thread.to,\n markupDisplay,\n );\n if (!cls) continue;\n\n const pmFrom = positionMap.runtimeToPm(thread.from);\n const pmTo = positionMap.runtimeToPm(thread.to);\n if (pmFrom < pmTo) {\n decorations.push(\n Decoration.inline(pmFrom, pmTo, {\n class: cls,\n \"data-comment-id\": thread.commentId,\n }),\n );\n }\n }\n }\n\n // Walk revision entries and create inline decorations.\n // Deletion hiding in clean mode ALWAYS applies, even when showTrackedChanges is off.\n // Visual styling (underlines, colors) only applies when showTrackedChanges is on.\n if (revisionModel) {\n for (const rev of revisionModel.revisions) {\n // Always hide deletions in clean mode (final-text semantics).\n // This is the critical behavior: \"hide tracked changes\" must show\n // the document as if accepted, not show deleted text as kept text.\n if (markupDisplay === \"clean\" && rev.kind === \"deletion\" && !suggestionsEnabled) {\n const pmFrom = positionMap.runtimeToPm(rev.from);\n const pmTo = positionMap.runtimeToPm(rev.to);\n if (pmFrom < pmTo) {\n decorations.push(\n Decoration.inline(pmFrom, pmTo, {\n class: \"hidden\",\n \"data-revision-id\": rev.revisionId,\n }),\n );\n }\n continue;\n }\n\n // Skip visual styling when tracked changes display is off\n if (!effectiveShowTracked) continue;\n\n const pmFrom = positionMap.runtimeToPm(rev.from);\n const pmTo = positionMap.runtimeToPm(rev.to);\n if (pmFrom >= pmTo) continue;\n\n if (suggestionsEnabled) {\n if (rev.kind === \"insertion\") {\n decorations.push(\n Decoration.inline(pmFrom, pmTo, {\n class: \"text-insert\",\n \"data-revision-id\": rev.revisionId,\n }),\n );\n decorations.push(\n Decoration.widget(pmFrom, () => {\n const el = document.createElement(\"span\");\n el.textContent = \"[\";\n el.className = \"text-insert\";\n el.setAttribute(\"contenteditable\", \"false\");\n return el;\n }, { side: -1, key: `${rev.revisionId}-open` }),\n );\n decorations.push(\n Decoration.widget(pmTo, () => {\n const el = document.createElement(\"span\");\n el.textContent = \"]\";\n el.className = \"text-insert\";\n el.setAttribute(\"contenteditable\", \"false\");\n return el;\n }, { side: 1, key: `${rev.revisionId}-close` }),\n );\n } else if (rev.kind === \"deletion\") {\n decorations.push(\n Decoration.inline(pmFrom, pmTo, {\n class: \"text-danger line-through decoration-danger/80 decoration-1\",\n \"data-revision-id\": rev.revisionId,\n }),\n );\n }\n continue;\n }\n\n const cls = getRevisionHighlightClass(\n revisionModel,\n rev.from,\n rev.to,\n markupDisplay,\n );\n if (!cls) continue;\n\n decorations.push(\n Decoration.inline(pmFrom, pmTo, {\n class: cls,\n \"data-revision-id\": rev.revisionId,\n }),\n );\n }\n }\n\n if (workflowScopes) {\n for (const scope of workflowScopes) {\n const scopeStoryTarget = scope.storyTarget ?? MAIN_STORY_TARGET;\n if (!storyTargetsEqual(scopeStoryTarget, activeStory)) continue;\n const pmRange = buildAnchorPmRange(scope.anchor, positionMap);\n if (!pmRange) continue;\n const isSelectionZone = isSelectionZoneScope(scope);\n const isActiveWorkItem =\n Boolean(activeWorkflowWorkItemId) &&\n (\n scope.workItemId === activeWorkflowWorkItemId ||\n activeScopeIds.has(scope.scopeId)\n );\n\n if (pmRange.allowInline && pmRange.from < pmRange.to) {\n decorations.push(\n Decoration.inline(pmRange.from, pmRange.to, {\n class: getWorkflowInlineClass(scope, isActiveWorkItem, isSelectionZone),\n \"data-workflow-scope-id\": scope.scopeId,\n \"data-workflow-scope-mode\": scope.mode,\n \"data-workflow-active\": isActiveWorkItem ? \"true\" : \"false\",\n ...(isSelectionZone ? { \"data-workflow-zone\": \"selection\" } : {}),\n }),\n );\n }\n\n pushRailDecorations(decorations, doc, pmRange.from, pmRange.to, {\n railKind: \"scope\",\n className: getWorkflowRailClass(scope, isActiveWorkItem, isSelectionZone),\n attrs: {\n \"data-workflow-scope-id\": scope.scopeId,\n \"data-workflow-scope-mode\": scope.mode,\n \"data-workflow-active\": isActiveWorkItem ? \"true\" : \"false\",\n ...(isSelectionZone ? { \"data-workflow-zone\": \"selection\" } : {}),\n },\n }, railRangeCache);\n }\n }\n\n if (workflowCandidates) {\n for (const candidate of workflowCandidates) {\n const candidateStoryTarget = candidate.storyTarget ?? MAIN_STORY_TARGET;\n if (!storyTargetsEqual(candidateStoryTarget, activeStory)) continue;\n const pmRange = buildAnchorPmRange(candidate.anchor, positionMap);\n if (!pmRange) continue;\n\n if (pmRange.allowInline && pmRange.from < pmRange.to) {\n decorations.push(\n Decoration.inline(pmRange.from, pmRange.to, {\n class: getWorkflowCandidateInlineClass(),\n \"data-workflow-candidate-id\": candidate.candidateId,\n }),\n );\n }\n\n pushRailDecorations(decorations, doc, pmRange.from, pmRange.to, {\n railKind: \"candidate\",\n className: getWorkflowCandidateRailClass(),\n attrs: {\n \"data-workflow-candidate-id\": candidate.candidateId,\n },\n }, railRangeCache);\n }\n }\n\n if (workflowBlockedReasons) {\n for (const reason of workflowBlockedReasons) {\n if (\n reason.code !== \"workflow_preserve_only\" &&\n reason.code !== \"workflow_blocked_import\"\n ) {\n continue;\n }\n const reasonStoryTarget = reason.storyTarget ?? MAIN_STORY_TARGET;\n if (!storyTargetsEqual(reasonStoryTarget, activeStory) || !reason.anchor) continue;\n const pmRange = buildAnchorPmRange(reason.anchor, positionMap);\n if (!pmRange) continue;\n\n if (pmRange.allowInline && pmRange.from < pmRange.to) {\n decorations.push(\n Decoration.inline(pmRange.from, pmRange.to, {\n class: getWorkflowBlockedInlineClass(reason),\n \"data-workflow-blocked-code\": reason.code,\n }),\n );\n }\n\n pushRailDecorations(decorations, doc, pmRange.from, pmRange.to, {\n railKind: \"blocked\",\n className: getWorkflowBlockedRailClass(reason),\n attrs: {\n \"data-workflow-blocked-code\": reason.code,\n },\n }, railRangeCache);\n }\n }\n\n return DecorationSet.create(doc, decorations);\n}\n","import { Plugin } from \"prosemirror-state\";\n\nexport interface ContextualInteractionCallbacks {\n onCommentActivated?: (commentId: string) => void;\n onRevisionActivated?: (revisionId: string) => void;\n}\n\nexport function createContextualInteractionPlugin(\n callbacks: ContextualInteractionCallbacks,\n): Plugin {\n return new Plugin({\n props: {\n handleClick(_view, _pos, event) {\n const target = event.target as HTMLElement | null;\n const commentId = target?.closest?.(\"[data-comment-id]\")?.getAttribute(\"data-comment-id\");\n if (commentId) {\n callbacks.onCommentActivated?.(commentId);\n return true;\n }\n\n const revisionId = target?.closest?.(\"[data-revision-id]\")?.getAttribute(\"data-revision-id\");\n if (revisionId) {\n callbacks.onRevisionActivated?.(revisionId);\n return true;\n }\n\n return false;\n },\n },\n });\n}\n","import type {\n EditorStoryTarget,\n EditorSurfaceSnapshot,\n} from \"../../api/public-types.ts\";\n\nconst surfaceIdentityMap = new WeakMap<EditorSurfaceSnapshot, number>();\nlet nextSurfaceIdentity = 0;\n\nfunction getSurfaceIdentity(surface: EditorSurfaceSnapshot): number {\n const cached = surfaceIdentityMap.get(surface);\n if (cached !== undefined) {\n return cached;\n }\n const identity = nextSurfaceIdentity;\n nextSurfaceIdentity += 1;\n surfaceIdentityMap.set(surface, identity);\n return identity;\n}\n\nexport function createSurfaceDocumentBuildKey(input: {\n surface: EditorSurfaceSnapshot | null | undefined;\n activeStory: EditorStoryTarget;\n mediaPreviewKey: string;\n}): string {\n return JSON.stringify({\n surfaceIdentity:\n input.surface === undefined || input.surface === null\n ? \"loading\"\n : getSurfaceIdentity(input.surface),\n activeStory: input.activeStory,\n mediaPreviewKey: input.mediaPreviewKey,\n });\n}\n\nexport function createSurfaceDecorationKey(input: {\n markupDisplay: string;\n showTrackedChanges: boolean;\n canEdit: boolean;\n activeCommentId?: string;\n activeRevisionId?: string;\n workflowScopeSignature?: string;\n workflowCandidateSignature?: string;\n workflowBlockedSignature?: string;\n activeWorkflowWorkItemId?: string | null;\n activeWorkflowScopeIds?: readonly string[];\n suggestionsEnabled?: boolean;\n}): string {\n return JSON.stringify({\n markupDisplay: input.markupDisplay,\n showTrackedChanges: input.showTrackedChanges,\n canEdit: input.canEdit,\n activeCommentId: input.activeCommentId ?? null,\n activeRevisionId: input.activeRevisionId ?? null,\n workflowScopeSignature: input.workflowScopeSignature ?? null,\n workflowCandidateSignature: input.workflowCandidateSignature ?? null,\n workflowBlockedSignature: input.workflowBlockedSignature ?? null,\n activeWorkflowWorkItemId: input.activeWorkflowWorkItemId ?? null,\n activeWorkflowScopeIds: input.activeWorkflowScopeIds ?? [],\n suggestionsEnabled: input.suggestionsEnabled ?? false,\n });\n}\n","/**\n * ProseMirror NodeView implementations for table nodes.\n *\n * These NodeViews render table structure as proper HTML tables with\n * colspan/rowspan support for merged cells. Horizontal merges come\n * directly from `colspan`/`gridSpan`. Vertical merges can be rendered\n * from either explicit `rowspan` attrs or OOXML `verticalMerge`\n * chains when upstream projection has not yet materialized row spans.\n */\n\nimport type { Node as PMNode } from \"prosemirror-model\";\nimport type { NodeViewConstructor, ViewMutationRecord } from \"prosemirror-view\";\n\nconst TABLE_LAYOUT_SYNC_EVENT = \"pm-table-layout-sync\";\n\ninterface TableCellLayout {\n cellIndex: number;\n colSpan: number;\n hidden: boolean;\n rowSpan: number;\n}\n\ninterface OpenVerticalMerge {\n col: number;\n colSpan: number;\n continuedThisRow: boolean;\n layout: TableCellLayout;\n}\n\ninterface OpenExplicitRowSpan {\n col: number;\n colSpan: number;\n remainingRows: number;\n}\n\nfunction readRowPadding(node: PMNode, side: \"gridBefore\" | \"gridAfter\"): number {\n const value = node.attrs[side];\n return typeof value === \"number\" && value > 0 ? value : 0;\n}\n\nfunction sumGridColumns(\n gridColumns: readonly number[],\n start: number,\n count: number,\n): number {\n let total = 0;\n for (let index = start; index < start + count; index += 1) {\n total += gridColumns[index] ?? 0;\n }\n return total;\n}\n\nfunction removePaddingCells(rowElement: HTMLTableRowElement): void {\n for (const cell of Array.from(rowElement.cells)) {\n if (cell.hasAttribute(\"data-row-padding\")) {\n cell.remove();\n }\n }\n}\n\nfunction createPaddingCell(colSpan: number, widthTwips: number): HTMLTableCellElement {\n const cell = document.createElement(\"td\");\n cell.setAttribute(\"data-row-padding\", \"true\");\n cell.setAttribute(\"aria-hidden\", \"true\");\n cell.colSpan = Math.max(1, colSpan);\n cell.style.border = \"none\";\n cell.style.padding = \"0\";\n cell.style.background = \"transparent\";\n if (widthTwips > 0) {\n cell.style.width = `${widthTwips / 20}pt`;\n }\n return cell;\n}\n\nfunction nodesAreOnlyRowPadding(nodes: ArrayLike<Node> & { item?(index: number): Node | null }): boolean {\n for (let index = 0; index < nodes.length; index += 1) {\n const node = nodes.item ? nodes.item(index) : nodes[index];\n if (!node) {\n continue;\n }\n if (!(node instanceof HTMLElement) || !node.hasAttribute(\"data-row-padding\")) {\n return false;\n }\n }\n return true;\n}\n\nfunction resolveRenderedColspan(node: PMNode): number {\n const colspan = node.attrs.colspan as number | undefined;\n if (typeof colspan === \"number\" && colspan > 1) {\n return colspan;\n }\n\n const gridSpan = node.attrs.gridSpan as number | undefined;\n if (typeof gridSpan === \"number\" && gridSpan > 1) {\n return gridSpan;\n }\n\n return 1;\n}\n\nfunction resolveRenderedRowspan(node: PMNode): number {\n const rowspan = node.attrs.rowspan as number | undefined;\n return typeof rowspan === \"number\" && rowspan > 1 ? rowspan : 1;\n}\n\nfunction readVerticalMerge(node: PMNode): \"restart\" | \"continue\" | null {\n const value = node.attrs.verticalMerge;\n return value === \"restart\" || value === \"continue\" ? value : null;\n}\n\nfunction isColumnCoveredBySpan(spans: readonly OpenExplicitRowSpan[], column: number): boolean {\n return spans.some(\n (span) => column >= span.col && column < span.col + span.colSpan,\n );\n}\n\nfunction findVerticalMergeOwner(\n openVerticalMerges: readonly OpenVerticalMerge[],\n column: number,\n colSpan: number,\n): OpenVerticalMerge | null {\n const matchingByWidth = openVerticalMerges.find(\n (merge) => merge.col >= column && merge.colSpan === colSpan,\n );\n if (matchingByWidth) {\n return matchingByWidth;\n }\n\n return openVerticalMerges.find((merge) => merge.col >= column) ?? null;\n}\n\nfunction computeTableLayout(tableNode: PMNode): TableCellLayout[][] {\n const rowLayouts: TableCellLayout[][] = [];\n const openVerticalMerges: OpenVerticalMerge[] = [];\n const openExplicitRowSpans: OpenExplicitRowSpan[] = [];\n\n for (let rowIndex = 0; rowIndex < tableNode.childCount; rowIndex += 1) {\n for (const merge of openVerticalMerges) {\n merge.continuedThisRow = false;\n }\n\n const rowNode = tableNode.child(rowIndex);\n const layoutRow: TableCellLayout[] = [];\n let column = 0;\n\n for (let cellIndex = 0; cellIndex < rowNode.childCount; cellIndex += 1) {\n const cellNode = rowNode.child(cellIndex);\n const colSpan = resolveRenderedColspan(cellNode);\n const explicitRowSpan = resolveRenderedRowspan(cellNode);\n const verticalMerge = readVerticalMerge(cellNode);\n\n if (verticalMerge === \"continue\") {\n const owner = findVerticalMergeOwner(openVerticalMerges, column, colSpan);\n if (owner) {\n owner.layout.rowSpan += 1;\n owner.continuedThisRow = true;\n layoutRow.push({\n cellIndex,\n colSpan,\n hidden: true,\n rowSpan: 1,\n });\n column = owner.col + owner.colSpan;\n continue;\n }\n }\n\n while (isColumnCoveredBySpan(openExplicitRowSpans, column)) {\n column += 1;\n }\n\n const layout: TableCellLayout = {\n cellIndex,\n colSpan,\n hidden: false,\n rowSpan: explicitRowSpan,\n };\n layoutRow.push(layout);\n\n if (verticalMerge === \"restart\") {\n openVerticalMerges.push({\n col: column,\n colSpan,\n continuedThisRow: true,\n layout,\n });\n }\n\n if (explicitRowSpan > 1) {\n openExplicitRowSpans.push({\n col: column,\n colSpan,\n remainingRows: explicitRowSpan - 1,\n });\n }\n\n column += colSpan;\n }\n\n for (let index = openVerticalMerges.length - 1; index >= 0; index -= 1) {\n if (!openVerticalMerges[index]?.continuedThisRow) {\n openVerticalMerges.splice(index, 1);\n }\n }\n\n for (let index = openExplicitRowSpans.length - 1; index >= 0; index -= 1) {\n const span = openExplicitRowSpans[index];\n if (!span) {\n continue;\n }\n span.remainingRows -= 1;\n if (span.remainingRows <= 0) {\n openExplicitRowSpans.splice(index, 1);\n }\n }\n\n rowLayouts.push(layoutRow);\n }\n\n return rowLayouts;\n}\n\nfunction syncRenderedTableLayout(tableBody: HTMLTableSectionElement, tableNode: PMNode): void {\n const rowLayouts = computeTableLayout(tableNode);\n const rowElements = Array.from(tableBody.rows);\n const gridColumns = Array.isArray(tableNode.attrs.gridColumns) ? tableNode.attrs.gridColumns as number[] : [];\n\n for (let rowIndex = 0; rowIndex < rowLayouts.length; rowIndex += 1) {\n const rowLayout = rowLayouts[rowIndex];\n const rowElement = rowElements[rowIndex];\n if (!rowLayout || !rowElement) {\n continue;\n }\n\n removePaddingCells(rowElement);\n const cellElements = Array.from(rowElement.cells);\n for (const cellLayout of rowLayout) {\n const element = cellElements[cellLayout.cellIndex];\n if (!element) {\n continue;\n }\n\n element.colSpan = cellLayout.colSpan > 1 ? cellLayout.colSpan : 1;\n element.rowSpan = cellLayout.hidden ? 1 : cellLayout.rowSpan > 1 ? cellLayout.rowSpan : 1;\n element.style.display = cellLayout.hidden ? \"none\" : \"\";\n\n if (cellLayout.hidden) {\n element.setAttribute(\"aria-hidden\", \"true\");\n element.setAttribute(\"data-vertical-merge-hidden\", \"true\");\n } else {\n element.removeAttribute(\"aria-hidden\");\n element.removeAttribute(\"data-vertical-merge-hidden\");\n }\n }\n\n const rowNode = tableNode.child(rowIndex);\n const gridBefore = readRowPadding(rowNode, \"gridBefore\");\n const gridAfter = readRowPadding(rowNode, \"gridAfter\");\n if (gridBefore > 0) {\n rowElement.insertBefore(\n createPaddingCell(gridBefore, sumGridColumns(gridColumns, 0, gridBefore)),\n rowElement.firstChild,\n );\n }\n if (gridAfter > 0) {\n const start = Math.max(0, gridColumns.length - gridAfter);\n rowElement.appendChild(\n createPaddingCell(gridAfter, sumGridColumns(gridColumns, start, gridAfter)),\n );\n }\n }\n}\n\nfunction requestTableLayoutSync(start: HTMLElement): void {\n const table = start.closest(\"[data-pm-table-root='true']\");\n table?.dispatchEvent(new Event(TABLE_LAYOUT_SYNC_EVENT));\n}\n\n/**\n * NodeView for the table node.\n * Renders as <table><tbody>...</tbody></table>.\n * ProseMirror places row content into the tbody via contentDOM.\n */\nexport class TableNodeView {\n dom: HTMLElement;\n contentDOM: HTMLTableSectionElement;\n private node: PMNode;\n private syncQueued = false;\n private readonly onSyncRequest: EventListener;\n\n constructor(node: PMNode) {\n this.node = node;\n\n const table = document.createElement(\"table\");\n table.className = \"border-collapse w-full my-2 text-sm\";\n table.setAttribute(\"data-pm-table-root\", \"true\");\n\n const tbody = document.createElement(\"tbody\");\n table.appendChild(tbody);\n\n this.dom = table;\n this.contentDOM = tbody;\n this.onSyncRequest = () => {\n this.scheduleLayoutSync();\n };\n this.dom.addEventListener(TABLE_LAYOUT_SYNC_EVENT, this.onSyncRequest);\n this.scheduleLayoutSync();\n }\n\n update(node: PMNode): boolean {\n if (node.type !== this.node.type) {\n return false;\n }\n\n this.node = node;\n this.scheduleLayoutSync();\n return true;\n }\n\n destroy(): void {\n this.dom.removeEventListener(TABLE_LAYOUT_SYNC_EVENT, this.onSyncRequest);\n }\n\n ignoreMutation(record: ViewMutationRecord): boolean {\n if (record.type === \"attributes\") {\n return record.target === this.dom\n || (record.target instanceof HTMLElement && record.target.hasAttribute(\"data-row-padding\"));\n }\n if (record.type === \"childList\" && this.dom.contains(record.target)) {\n const addedNodes = record.addedNodes as ArrayLike<Node> & { item?(index: number): Node | null };\n const removedNodes = record.removedNodes as ArrayLike<Node> & { item?(index: number): Node | null };\n const addedOkay = (addedNodes?.length ?? 0) === 0 || nodesAreOnlyRowPadding(addedNodes);\n const removedOkay = (removedNodes?.length ?? 0) === 0 || nodesAreOnlyRowPadding(removedNodes);\n return addedOkay && removedOkay;\n }\n return false;\n }\n\n private scheduleLayoutSync(): void {\n if (this.syncQueued) {\n return;\n }\n this.syncQueued = true;\n queueMicrotask(() => {\n this.syncQueued = false;\n syncRenderedTableLayout(this.contentDOM, this.node);\n });\n }\n}\n\n/**\n * NodeView for table_row nodes.\n * Renders as <tr>...</tr>.\n */\nexport class TableRowNodeView {\n dom: HTMLElement;\n contentDOM: HTMLElement;\n\n constructor(_node: PMNode) {\n const tr = document.createElement(\"tr\");\n this.dom = tr;\n this.contentDOM = tr;\n }\n}\n\n/**\n * NodeView for table_cell and table_header_cell nodes.\n *\n * Applies colspan immediately and defers final rowspan/vertical-merge\n * layout to the owning table node view.\n */\nexport class TableCellNodeView {\n dom: HTMLElement;\n contentDOM: HTMLElement;\n\n constructor(node: PMNode) {\n const isHeader = (node.type.spec as { tableRole?: string }).tableRole === \"header_cell\";\n const cell = document.createElement(isHeader ? \"th\" : \"td\");\n\n cell.className = isHeader\n ? \"border border-primary/20 p-2 align-top font-semibold bg-surface-raised\"\n : \"border border-primary/20 p-2 align-top\";\n\n const colspan = resolveRenderedColspan(node);\n const rowspan = resolveRenderedRowspan(node);\n if (colspan > 1) {\n (cell as HTMLTableCellElement).colSpan = colspan;\n }\n if (rowspan > 1) {\n (cell as HTMLTableCellElement).rowSpan = rowspan;\n }\n\n this.dom = cell;\n this.contentDOM = cell;\n }\n\n /**\n * Update the DOM when the node's attrs change (e.g., after a merge/split operation).\n * Return false to let ProseMirror rebuild the node view from scratch.\n */\n update(node: PMNode): boolean {\n const isHeader = (node.type.spec as { tableRole?: string }).tableRole === \"header_cell\";\n const expectedTag = isHeader ? \"TH\" : \"TD\";\n if (this.dom.tagName !== expectedTag) {\n return false;\n }\n\n const colspan = resolveRenderedColspan(node);\n const rowspan = resolveRenderedRowspan(node);\n const cell = this.dom as HTMLTableCellElement;\n cell.colSpan = colspan > 1 ? colspan : 1;\n cell.rowSpan = rowspan > 1 ? rowspan : 1;\n cell.style.display = \"\";\n cell.removeAttribute(\"aria-hidden\");\n cell.removeAttribute(\"data-vertical-merge-hidden\");\n requestTableLayoutSync(this.dom);\n return true;\n }\n\n ignoreMutation(record: ViewMutationRecord): boolean {\n return record.type === \"attributes\" && record.target === this.dom;\n }\n}\n\n/**\n * NodeView factory map for use with EditorView.nodeViews.\n *\n * Pass this object directly to the EditorView constructor options:\n * new EditorView(mount, { nodeViews: tableNodeViews, ... })\n */\nexport const tableNodeViews: { [node: string]: NodeViewConstructor } = {\n table: (node: PMNode) => new TableNodeView(node),\n table_cell: (node: PMNode) => new TableCellNodeView(node),\n table_header_cell: (node: PMNode) => new TableCellNodeView(node),\n};\n"],"mappings":"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","names":["forwardRef","useCallback","useEffect","useImperativeHandle","useMemo","useRef","useState","document","document","document","document","document","useRef","useMemo","useRef","useRef","useMemo","document","forwardRef","useEffect","useMemo","useRef","safeCssColor","NodeSelection","goToNextCell","NodeSelection","createSelectionSnapshot","goToNextCell","pmFrom","pmTo","Plugin","resolveRenderedColspan","resolveRenderedRowspan","resolveRenderedColspan","resolveRenderedRowspan","jsx","jsxs","TwProseMirrorSurface","useMemo","useRef","useEffect","jsx","forwardRef","EditorSurfaceController","jsx","forwardRef","WordReviewEditor","useState","useRef","useMemo","deriveEditorViewMode","useEffect","useImperativeHandle","useCallback","selectionToolbarAnchorsEqual","jsx","deriveEditorViewMode","selectionToolbarAnchorsEqual"]}