@beyondwork/docx-react-component 1.0.27 → 1.0.29

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 (356) hide show
  1. package/dist/canonical-document-BLEbzL2J.d.cts +844 -0
  2. package/dist/canonical-document-BLEbzL2J.d.ts +844 -0
  3. package/dist/chunk-2FJS5GZM.js +763 -0
  4. package/dist/chunk-2FJS5GZM.js.map +1 -0
  5. package/{src/core/commands/section-layout-commands.ts → dist/chunk-2OQBZS3F.js} +106 -340
  6. package/dist/chunk-2OQBZS3F.js.map +1 -0
  7. package/dist/chunk-2S7W4KFO.js +127 -0
  8. package/dist/chunk-2S7W4KFO.js.map +1 -0
  9. package/dist/chunk-2TG72QSW.js +3874 -0
  10. package/dist/chunk-2TG72QSW.js.map +1 -0
  11. package/{src/core/commands/table-structure-commands.ts → dist/chunk-36QNIZBO.js} +126 -315
  12. package/dist/chunk-36QNIZBO.js.map +1 -0
  13. package/dist/chunk-4AQOYAW4.js +3069 -0
  14. package/dist/chunk-4AQOYAW4.js.map +1 -0
  15. package/dist/chunk-4D5EWJ3P.js +77 -0
  16. package/dist/chunk-4D5EWJ3P.js.map +1 -0
  17. package/dist/chunk-5FN54NDH.js +2257 -0
  18. package/dist/chunk-5FN54NDH.js.map +1 -0
  19. package/dist/chunk-BOYGQYRQ.js +7306 -0
  20. package/dist/chunk-BOYGQYRQ.js.map +1 -0
  21. package/dist/chunk-CN3XMECL.js +212 -0
  22. package/dist/chunk-CN3XMECL.js.map +1 -0
  23. package/dist/chunk-EBI3BX6U.js +164 -0
  24. package/dist/chunk-EBI3BX6U.js.map +1 -0
  25. package/dist/chunk-EILUG3VB.js +1275 -0
  26. package/dist/chunk-EILUG3VB.js.map +1 -0
  27. package/dist/chunk-FUDY333O.js +70 -0
  28. package/dist/chunk-FUDY333O.js.map +1 -0
  29. package/dist/chunk-GBVOWFIK.js +1237 -0
  30. package/dist/chunk-GBVOWFIK.js.map +1 -0
  31. package/dist/chunk-H4TQ3H3Y.js +262 -0
  32. package/dist/chunk-H4TQ3H3Y.js.map +1 -0
  33. package/{src/core/commands/style-commands.ts → dist/chunk-JGB3IXZO.js} +40 -113
  34. package/dist/chunk-JGB3IXZO.js.map +1 -0
  35. package/dist/chunk-KD2QRQPY.js +4342 -0
  36. package/dist/chunk-KD2QRQPY.js.map +1 -0
  37. package/dist/chunk-KLMXQVYK.js +369 -0
  38. package/dist/chunk-KLMXQVYK.js.map +1 -0
  39. package/dist/chunk-KZUG5KFQ.js +214 -0
  40. package/dist/chunk-KZUG5KFQ.js.map +1 -0
  41. package/{src/core/state/text-transaction.ts → dist/chunk-QDAQ4CJU.js} +79 -236
  42. package/dist/chunk-QDAQ4CJU.js.map +1 -0
  43. package/{src/legal/bookmarks.ts → dist/chunk-RMH72RZI.js} +44 -130
  44. package/dist/chunk-RMH72RZI.js.map +1 -0
  45. package/dist/chunk-SWKWQZXM.js +117 -0
  46. package/dist/chunk-SWKWQZXM.js.map +1 -0
  47. package/{src/core/commands/formatting-commands.ts → dist/chunk-TJBP2K4T.js} +196 -536
  48. package/dist/chunk-TJBP2K4T.js.map +1 -0
  49. package/dist/chunk-TLCEAQDQ.js +542 -0
  50. package/dist/chunk-TLCEAQDQ.js.map +1 -0
  51. package/{src/core/commands/text-commands.ts → dist/chunk-UZXBISGO.js} +86 -142
  52. package/dist/chunk-UZXBISGO.js.map +1 -0
  53. package/dist/chunk-WGBAKP3Q.js +3220 -0
  54. package/dist/chunk-WGBAKP3Q.js.map +1 -0
  55. package/dist/compare/index.cjs +5475 -0
  56. package/dist/compare/index.cjs.map +1 -0
  57. package/dist/compare/index.d.cts +114 -0
  58. package/dist/compare/index.d.ts +114 -0
  59. package/dist/compare/index.js +731 -0
  60. package/dist/compare/index.js.map +1 -0
  61. package/dist/core/commands/formatting-commands.cjs +828 -0
  62. package/dist/core/commands/formatting-commands.cjs.map +1 -0
  63. package/dist/core/commands/formatting-commands.d.cts +63 -0
  64. package/dist/core/commands/formatting-commands.d.ts +63 -0
  65. package/dist/core/commands/formatting-commands.js +37 -0
  66. package/dist/core/commands/formatting-commands.js.map +1 -0
  67. package/dist/core/commands/image-commands.cjs +2023 -0
  68. package/dist/core/commands/image-commands.cjs.map +1 -0
  69. package/dist/core/commands/image-commands.d.cts +58 -0
  70. package/dist/core/commands/image-commands.d.ts +58 -0
  71. package/dist/core/commands/image-commands.js +18 -0
  72. package/dist/core/commands/image-commands.js.map +1 -0
  73. package/dist/core/commands/section-layout-commands.cjs +477 -0
  74. package/dist/core/commands/section-layout-commands.cjs.map +1 -0
  75. package/dist/core/commands/section-layout-commands.d.cts +62 -0
  76. package/dist/core/commands/section-layout-commands.d.ts +62 -0
  77. package/dist/core/commands/section-layout-commands.js +21 -0
  78. package/dist/core/commands/section-layout-commands.js.map +1 -0
  79. package/dist/core/commands/style-commands.cjs +214 -0
  80. package/dist/core/commands/style-commands.cjs.map +1 -0
  81. package/dist/core/commands/style-commands.d.cts +13 -0
  82. package/dist/core/commands/style-commands.d.ts +13 -0
  83. package/dist/core/commands/style-commands.js +9 -0
  84. package/dist/core/commands/style-commands.js.map +1 -0
  85. package/dist/core/commands/table-structure-commands.cjs +1883 -0
  86. package/dist/core/commands/table-structure-commands.cjs.map +1 -0
  87. package/dist/core/commands/table-structure-commands.d.cts +59 -0
  88. package/dist/core/commands/table-structure-commands.d.ts +59 -0
  89. package/dist/core/commands/table-structure-commands.js +12 -0
  90. package/dist/core/commands/table-structure-commands.js.map +1 -0
  91. package/dist/core/commands/text-commands.cjs +2391 -0
  92. package/dist/core/commands/text-commands.cjs.map +1 -0
  93. package/dist/core/commands/text-commands.d.cts +24 -0
  94. package/dist/core/commands/text-commands.d.ts +24 -0
  95. package/dist/core/commands/text-commands.js +28 -0
  96. package/dist/core/commands/text-commands.js.map +1 -0
  97. package/dist/core/selection/mapping.cjs +200 -0
  98. package/dist/core/selection/mapping.cjs.map +1 -0
  99. package/dist/core/selection/mapping.d.cts +2 -0
  100. package/dist/core/selection/mapping.d.ts +2 -0
  101. package/dist/core/selection/mapping.js +31 -0
  102. package/dist/core/selection/mapping.js.map +1 -0
  103. package/dist/core/state/editor-state.cjs +2278 -0
  104. package/dist/core/state/editor-state.cjs.map +1 -0
  105. package/dist/core/state/editor-state.d.cts +2 -0
  106. package/dist/core/state/editor-state.d.ts +2 -0
  107. package/dist/core/state/editor-state.js +26 -0
  108. package/dist/core/state/editor-state.js.map +1 -0
  109. package/dist/index.cjs +38553 -0
  110. package/dist/index.cjs.map +1 -0
  111. package/dist/index.d.cts +15 -0
  112. package/dist/index.d.ts +15 -0
  113. package/dist/index.js +7856 -0
  114. package/dist/index.js.map +1 -0
  115. package/dist/io/docx-session.cjs +16236 -0
  116. package/dist/io/docx-session.cjs.map +1 -0
  117. package/dist/io/docx-session.d.cts +21 -0
  118. package/dist/io/docx-session.d.ts +21 -0
  119. package/dist/io/docx-session.js +18 -0
  120. package/dist/io/docx-session.js.map +1 -0
  121. package/dist/legal/index.cjs +3900 -0
  122. package/dist/legal/index.cjs.map +1 -0
  123. package/dist/legal/index.d.cts +86 -0
  124. package/dist/legal/index.d.ts +86 -0
  125. package/dist/legal/index.js +616 -0
  126. package/dist/legal/index.js.map +1 -0
  127. package/dist/public-types-7ZL_94cz.d.ts +1573 -0
  128. package/dist/public-types-CeMaDueh.d.cts +1573 -0
  129. package/dist/public-types.cjs +19 -0
  130. package/dist/public-types.cjs.map +1 -0
  131. package/dist/public-types.d.cts +2 -0
  132. package/dist/public-types.d.ts +2 -0
  133. package/dist/public-types.js +1 -0
  134. package/dist/public-types.js.map +1 -0
  135. package/dist/runtime/document-runtime.cjs +11140 -0
  136. package/dist/runtime/document-runtime.cjs.map +1 -0
  137. package/dist/runtime/document-runtime.d.cts +231 -0
  138. package/dist/runtime/document-runtime.d.ts +231 -0
  139. package/dist/runtime/document-runtime.js +21 -0
  140. package/dist/runtime/document-runtime.js.map +1 -0
  141. package/dist/structural-helpers-CilgOVhh.d.cts +10 -0
  142. package/dist/structural-helpers-q0Gd-eBN.d.ts +10 -0
  143. package/dist/ui-tailwind/editor-surface/search-plugin.cjs +313 -0
  144. package/dist/ui-tailwind/editor-surface/search-plugin.cjs.map +1 -0
  145. package/dist/ui-tailwind/editor-surface/search-plugin.d.cts +67 -0
  146. package/dist/ui-tailwind/editor-surface/search-plugin.d.ts +67 -0
  147. package/dist/ui-tailwind/editor-surface/search-plugin.js +23 -0
  148. package/dist/ui-tailwind/editor-surface/search-plugin.js.map +1 -0
  149. package/dist/ui-tailwind/index.cjs +4833 -0
  150. package/dist/ui-tailwind/index.cjs.map +1 -0
  151. package/dist/ui-tailwind/index.d.cts +617 -0
  152. package/dist/ui-tailwind/index.d.ts +617 -0
  153. package/dist/ui-tailwind/index.js +575 -0
  154. package/dist/ui-tailwind/index.js.map +1 -0
  155. package/package.json +64 -54
  156. package/src/README.md +0 -85
  157. package/src/api/README.md +0 -26
  158. package/src/api/public-types.ts +0 -1418
  159. package/src/api/session-state.ts +0 -60
  160. package/src/compare/diff-engine.ts +0 -623
  161. package/src/compare/export-redlines.ts +0 -280
  162. package/src/compare/index.ts +0 -25
  163. package/src/compare/snapshot.ts +0 -97
  164. package/src/component-inventory.md +0 -99
  165. package/src/core/README.md +0 -10
  166. package/src/core/commands/README.md +0 -3
  167. package/src/core/commands/image-commands.ts +0 -373
  168. package/src/core/commands/index.ts +0 -1757
  169. package/src/core/commands/list-commands.ts +0 -565
  170. package/src/core/commands/paragraph-layout-commands.ts +0 -339
  171. package/src/core/commands/review-commands.ts +0 -108
  172. package/src/core/commands/structural-helpers.ts +0 -309
  173. package/src/core/schema/README.md +0 -3
  174. package/src/core/schema/text-schema.ts +0 -516
  175. package/src/core/search/search-text.ts +0 -357
  176. package/src/core/selection/README.md +0 -3
  177. package/src/core/selection/mapping.ts +0 -289
  178. package/src/core/selection/review-anchors.ts +0 -183
  179. package/src/core/state/README.md +0 -3
  180. package/src/core/state/editor-state.ts +0 -892
  181. package/src/formats/xlsx/io/parse-shared-strings.ts +0 -41
  182. package/src/formats/xlsx/io/parse-sheet.ts +0 -459
  183. package/src/formats/xlsx/io/parse-styles.ts +0 -59
  184. package/src/formats/xlsx/io/parse-workbook.ts +0 -75
  185. package/src/formats/xlsx/io/serialize-shared-strings.ts +0 -72
  186. package/src/formats/xlsx/io/serialize-sheet.ts +0 -333
  187. package/src/formats/xlsx/io/serialize-styles.ts +0 -98
  188. package/src/formats/xlsx/io/serialize-workbook.ts +0 -429
  189. package/src/formats/xlsx/io/xlsx-session.ts +0 -314
  190. package/src/formats/xlsx/model/cell.ts +0 -189
  191. package/src/formats/xlsx/model/sheet.ts +0 -326
  192. package/src/formats/xlsx/model/styles.ts +0 -118
  193. package/src/formats/xlsx/model/workbook.ts +0 -453
  194. package/src/formats/xlsx/runtime/cell-commands.ts +0 -567
  195. package/src/formats/xlsx/runtime/sheet-commands.ts +0 -206
  196. package/src/formats/xlsx/runtime/workbook-runtime.ts +0 -177
  197. package/src/formats/xlsx/runtime/workbook-transaction.ts +0 -822
  198. package/src/index.ts +0 -101
  199. package/src/io/README.md +0 -10
  200. package/src/io/docx-session.ts +0 -2882
  201. package/src/io/export/README.md +0 -3
  202. package/src/io/export/export-session.ts +0 -220
  203. package/src/io/export/minimal-docx.ts +0 -115
  204. package/src/io/export/reattach-preserved-parts.ts +0 -54
  205. package/src/io/export/serialize-comments.ts +0 -947
  206. package/src/io/export/serialize-footnotes.ts +0 -399
  207. package/src/io/export/serialize-headers-footers.ts +0 -372
  208. package/src/io/export/serialize-main-document.ts +0 -1376
  209. package/src/io/export/serialize-numbering.ts +0 -118
  210. package/src/io/export/serialize-revisions.ts +0 -389
  211. package/src/io/export/serialize-runtime-revisions.ts +0 -269
  212. package/src/io/export/serialize-tables.ts +0 -174
  213. package/src/io/export/split-review-boundaries.ts +0 -356
  214. package/src/io/normalize/README.md +0 -3
  215. package/src/io/normalize/normalize-text.ts +0 -639
  216. package/src/io/ooxml/README.md +0 -3
  217. package/src/io/ooxml/highlight-colors.ts +0 -39
  218. package/src/io/ooxml/numbering-sentinels.ts +0 -44
  219. package/src/io/ooxml/parse-comments.ts +0 -846
  220. package/src/io/ooxml/parse-complex-content.ts +0 -287
  221. package/src/io/ooxml/parse-fields.ts +0 -834
  222. package/src/io/ooxml/parse-footnotes.ts +0 -896
  223. package/src/io/ooxml/parse-headers-footers.ts +0 -1169
  224. package/src/io/ooxml/parse-inline-media.ts +0 -461
  225. package/src/io/ooxml/parse-main-document.ts +0 -2877
  226. package/src/io/ooxml/parse-numbering.ts +0 -432
  227. package/src/io/ooxml/parse-revisions.ts +0 -931
  228. package/src/io/ooxml/parse-settings.ts +0 -184
  229. package/src/io/ooxml/parse-shapes.ts +0 -296
  230. package/src/io/ooxml/parse-styles.ts +0 -463
  231. package/src/io/ooxml/parse-tables.ts +0 -618
  232. package/src/io/ooxml/parse-theme.ts +0 -346
  233. package/src/io/ooxml/part-manifest.ts +0 -136
  234. package/src/io/ooxml/revision-boundaries.ts +0 -351
  235. package/src/io/opc/README.md +0 -3
  236. package/src/io/opc/corrupt-package.ts +0 -166
  237. package/src/io/opc/docx-package.ts +0 -74
  238. package/src/io/opc/package-reader.ts +0 -325
  239. package/src/io/opc/package-writer.ts +0 -273
  240. package/src/io/source-package-provenance.ts +0 -241
  241. package/src/legal/cross-references.ts +0 -414
  242. package/src/legal/defined-terms.ts +0 -203
  243. package/src/legal/index.ts +0 -32
  244. package/src/legal/signature-blocks.ts +0 -259
  245. package/src/model/README.md +0 -3
  246. package/src/model/canonical-document.ts +0 -2632
  247. package/src/model/cds-1.0.0.ts +0 -212
  248. package/src/model/snapshot.ts +0 -649
  249. package/src/preservation/README.md +0 -3
  250. package/src/preservation/markup-compatibility.ts +0 -48
  251. package/src/preservation/opaque-fragment-store.ts +0 -89
  252. package/src/preservation/opaque-region.ts +0 -233
  253. package/src/preservation/package-preservation.ts +0 -113
  254. package/src/preservation/preserved-part-manifest.ts +0 -56
  255. package/src/preservation/relationship-retention.ts +0 -57
  256. package/src/preservation/store.ts +0 -185
  257. package/src/review/README.md +0 -16
  258. package/src/review/store/README.md +0 -3
  259. package/src/review/store/comment-anchors.ts +0 -70
  260. package/src/review/store/comment-remapping.ts +0 -154
  261. package/src/review/store/comment-store.ts +0 -331
  262. package/src/review/store/comment-thread.ts +0 -109
  263. package/src/review/store/revision-actions.ts +0 -394
  264. package/src/review/store/revision-store.ts +0 -312
  265. package/src/review/store/revision-types.ts +0 -171
  266. package/src/review/store/runtime-comment-store.ts +0 -43
  267. package/src/runtime/README.md +0 -3
  268. package/src/runtime/ai-action-policy.ts +0 -764
  269. package/src/runtime/collab-review-sync.ts +0 -254
  270. package/src/runtime/document-layout.ts +0 -332
  271. package/src/runtime/document-navigation.ts +0 -603
  272. package/src/runtime/document-runtime.ts +0 -3159
  273. package/src/runtime/document-search.ts +0 -145
  274. package/src/runtime/numbering-prefix.ts +0 -216
  275. package/src/runtime/page-layout-estimation.ts +0 -212
  276. package/src/runtime/read-only-diagnostics-runtime.ts +0 -241
  277. package/src/runtime/review-runtime.ts +0 -44
  278. package/src/runtime/revision-runtime.ts +0 -107
  279. package/src/runtime/session-capabilities.ts +0 -192
  280. package/src/runtime/story-context.ts +0 -164
  281. package/src/runtime/story-targeting.ts +0 -162
  282. package/src/runtime/surface-projection.ts +0 -1357
  283. package/src/runtime/table-commands.ts +0 -173
  284. package/src/runtime/table-schema.ts +0 -309
  285. package/src/runtime/view-state.ts +0 -477
  286. package/src/runtime/virtualized-rendering.ts +0 -258
  287. package/src/runtime/workflow-markup.ts +0 -353
  288. package/src/ui/README.md +0 -30
  289. package/src/ui/WordReviewEditor.tsx +0 -4097
  290. package/src/ui/browser-export.ts +0 -52
  291. package/src/ui/comments/README.md +0 -3
  292. package/src/ui/compatibility/README.md +0 -3
  293. package/src/ui/editor-command-bag.ts +0 -120
  294. package/src/ui/editor-runtime-boundary.ts +0 -1457
  295. package/src/ui/editor-shell-view.tsx +0 -142
  296. package/src/ui/editor-surface/README.md +0 -3
  297. package/src/ui/editor-surface-controller.tsx +0 -63
  298. package/src/ui/headless/comment-decoration-model.ts +0 -124
  299. package/src/ui/headless/preserve-editor-selection.ts +0 -5
  300. package/src/ui/headless/revision-decoration-model.ts +0 -128
  301. package/src/ui/headless/selection-helpers.ts +0 -54
  302. package/src/ui/headless/selection-toolbar-model.ts +0 -34
  303. package/src/ui/headless/use-editor-keyboard.ts +0 -103
  304. package/src/ui/review/README.md +0 -3
  305. package/src/ui/runtime-snapshot-selectors.ts +0 -197
  306. package/src/ui/shared/revision-filters.ts +0 -31
  307. package/src/ui/status/README.md +0 -3
  308. package/src/ui/theme/README.md +0 -3
  309. package/src/ui/toolbar/README.md +0 -3
  310. package/src/ui/workflow-surface-blocked-rails.ts +0 -94
  311. package/src/ui-tailwind/chrome/tw-alert-banner.tsx +0 -64
  312. package/src/ui-tailwind/chrome/tw-image-context-toolbar.tsx +0 -129
  313. package/src/ui-tailwind/chrome/tw-layout-panel.tsx +0 -114
  314. package/src/ui-tailwind/chrome/tw-object-context-toolbar.tsx +0 -34
  315. package/src/ui-tailwind/chrome/tw-page-ruler.tsx +0 -386
  316. package/src/ui-tailwind/chrome/tw-selection-toolbar.tsx +0 -186
  317. package/src/ui-tailwind/chrome/tw-suggestion-card.tsx +0 -139
  318. package/src/ui-tailwind/chrome/tw-table-context-toolbar.tsx +0 -128
  319. package/src/ui-tailwind/chrome/tw-unsaved-modal.tsx +0 -58
  320. package/src/ui-tailwind/chrome/use-before-unload.ts +0 -20
  321. package/src/ui-tailwind/editor-surface/perf-probe.ts +0 -179
  322. package/src/ui-tailwind/editor-surface/pm-collab-plugins.ts +0 -40
  323. package/src/ui-tailwind/editor-surface/pm-command-bridge.ts +0 -178
  324. package/src/ui-tailwind/editor-surface/pm-contextual-ui.ts +0 -31
  325. package/src/ui-tailwind/editor-surface/pm-decorations.ts +0 -427
  326. package/src/ui-tailwind/editor-surface/pm-position-map.ts +0 -123
  327. package/src/ui-tailwind/editor-surface/pm-schema.ts +0 -876
  328. package/src/ui-tailwind/editor-surface/pm-state-from-snapshot.ts +0 -504
  329. package/src/ui-tailwind/editor-surface/search-plugin.ts +0 -168
  330. package/src/ui-tailwind/editor-surface/surface-build-keys.ts +0 -61
  331. package/src/ui-tailwind/editor-surface/tw-caret.tsx +0 -12
  332. package/src/ui-tailwind/editor-surface/tw-editor-surface.tsx +0 -150
  333. package/src/ui-tailwind/editor-surface/tw-inline-token.tsx +0 -129
  334. package/src/ui-tailwind/editor-surface/tw-opaque-block.tsx +0 -58
  335. package/src/ui-tailwind/editor-surface/tw-paragraph-block.tsx +0 -151
  336. package/src/ui-tailwind/editor-surface/tw-prosemirror-surface.tsx +0 -973
  337. package/src/ui-tailwind/editor-surface/tw-segment-view.tsx +0 -111
  338. package/src/ui-tailwind/editor-surface/tw-table-node-view.tsx +0 -436
  339. package/src/ui-tailwind/index.ts +0 -62
  340. package/src/ui-tailwind/page-chrome-model.ts +0 -27
  341. package/src/ui-tailwind/review/tw-comment-sidebar.tsx +0 -406
  342. package/src/ui-tailwind/review/tw-health-panel.tsx +0 -149
  343. package/src/ui-tailwind/review/tw-review-rail.tsx +0 -120
  344. package/src/ui-tailwind/review/tw-revision-sidebar.tsx +0 -164
  345. package/src/ui-tailwind/status/tw-status-bar.tsx +0 -61
  346. package/src/ui-tailwind/toolbar/tw-toolbar-icon-button.tsx +0 -52
  347. package/src/ui-tailwind/toolbar/tw-toolbar.tsx +0 -1064
  348. package/src/ui-tailwind/tw-review-workspace.tsx +0 -1417
  349. package/src/validation/README.md +0 -3
  350. package/src/validation/compatibility-engine.ts +0 -634
  351. package/src/validation/compatibility-report.ts +0 -161
  352. package/src/validation/diagnostics.ts +0 -204
  353. package/src/validation/docx-comment-proof.ts +0 -707
  354. package/src/validation/import-diagnostics.ts +0 -128
  355. package/src/validation/low-priority-word-surfaces.ts +0 -373
  356. /package/{src → dist}/ui-tailwind/theme/editor-theme.css +0 -0
@@ -0,0 +1 @@
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"]}