@beyondwork/docx-react-component 1.0.29 → 1.0.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (381) hide show
  1. package/package.json +65 -96
  2. package/src/README.md +85 -0
  3. package/src/api/README.md +26 -0
  4. package/src/api/public-types.ts +1952 -0
  5. package/src/api/session-state.ts +62 -0
  6. package/src/compare/diff-engine.ts +623 -0
  7. package/src/compare/export-redlines.ts +280 -0
  8. package/src/compare/index.ts +25 -0
  9. package/src/compare/snapshot.ts +97 -0
  10. package/src/component-inventory.md +99 -0
  11. package/src/core/README.md +10 -0
  12. package/src/core/commands/README.md +3 -0
  13. package/{dist/chunk-TJBP2K4T.js → src/core/commands/formatting-commands.ts} +536 -196
  14. package/src/core/commands/image-commands.ts +373 -0
  15. package/src/core/commands/index.ts +1879 -0
  16. package/src/core/commands/list-commands.ts +565 -0
  17. package/src/core/commands/paragraph-layout-commands.ts +339 -0
  18. package/src/core/commands/review-commands.ts +108 -0
  19. package/{dist/core/commands/section-layout-commands.cjs → src/core/commands/section-layout-commands.ts} +340 -137
  20. package/src/core/commands/structural-helpers.ts +309 -0
  21. package/{dist/core/commands/style-commands.cjs → src/core/commands/style-commands.ts} +113 -65
  22. package/src/core/commands/table-structure-commands.ts +854 -0
  23. package/{dist/chunk-UZXBISGO.js → src/core/commands/text-commands.ts} +142 -86
  24. package/src/core/schema/README.md +3 -0
  25. package/src/core/schema/text-schema.ts +516 -0
  26. package/src/core/search/search-text.ts +357 -0
  27. package/src/core/selection/README.md +3 -0
  28. package/src/core/selection/mapping.ts +289 -0
  29. package/src/core/selection/review-anchors.ts +183 -0
  30. package/src/core/state/README.md +3 -0
  31. package/src/core/state/editor-state.ts +892 -0
  32. package/src/core/state/text-transaction.ts +869 -0
  33. package/src/formats/xlsx/io/parse-shared-strings.ts +41 -0
  34. package/src/formats/xlsx/io/parse-sheet.ts +459 -0
  35. package/src/formats/xlsx/io/parse-styles.ts +59 -0
  36. package/src/formats/xlsx/io/parse-workbook.ts +75 -0
  37. package/src/formats/xlsx/io/serialize-shared-strings.ts +72 -0
  38. package/src/formats/xlsx/io/serialize-sheet.ts +333 -0
  39. package/src/formats/xlsx/io/serialize-styles.ts +98 -0
  40. package/src/formats/xlsx/io/serialize-workbook.ts +429 -0
  41. package/src/formats/xlsx/io/xlsx-session.ts +314 -0
  42. package/src/formats/xlsx/model/cell.ts +189 -0
  43. package/src/formats/xlsx/model/sheet.ts +326 -0
  44. package/src/formats/xlsx/model/styles.ts +118 -0
  45. package/src/formats/xlsx/model/workbook.ts +453 -0
  46. package/src/formats/xlsx/runtime/cell-commands.ts +567 -0
  47. package/src/formats/xlsx/runtime/sheet-commands.ts +206 -0
  48. package/src/formats/xlsx/runtime/workbook-runtime.ts +177 -0
  49. package/src/formats/xlsx/runtime/workbook-transaction.ts +822 -0
  50. package/src/index.ts +142 -0
  51. package/src/io/README.md +10 -0
  52. package/src/io/docx-session.ts +3175 -0
  53. package/src/io/export/README.md +3 -0
  54. package/src/io/export/export-session.ts +220 -0
  55. package/src/io/export/minimal-docx.ts +115 -0
  56. package/src/io/export/reattach-preserved-parts.ts +54 -0
  57. package/src/io/export/serialize-comments.ts +947 -0
  58. package/src/io/export/serialize-footnotes.ts +394 -0
  59. package/src/io/export/serialize-headers-footers.ts +368 -0
  60. package/src/io/export/serialize-main-document.ts +1342 -0
  61. package/src/io/export/serialize-numbering.ts +218 -0
  62. package/src/io/export/serialize-revisions.ts +389 -0
  63. package/src/io/export/serialize-runtime-revisions.ts +463 -0
  64. package/src/io/export/serialize-tables.ts +174 -0
  65. package/src/io/export/split-review-boundaries.ts +356 -0
  66. package/src/io/export/split-story-blocks-for-runtime-revisions.ts +252 -0
  67. package/src/io/export/table-properties-xml.ts +318 -0
  68. package/src/io/normalize/README.md +3 -0
  69. package/src/io/normalize/normalize-text.ts +670 -0
  70. package/src/io/ooxml/README.md +3 -0
  71. package/src/io/ooxml/highlight-colors.ts +39 -0
  72. package/src/io/ooxml/numbering-sentinels.ts +44 -0
  73. package/src/io/ooxml/parse-comments.ts +852 -0
  74. package/src/io/ooxml/parse-complex-content.ts +287 -0
  75. package/src/io/ooxml/parse-fields.ts +834 -0
  76. package/src/io/ooxml/parse-footnotes.ts +952 -0
  77. package/src/io/ooxml/parse-headers-footers.ts +1212 -0
  78. package/src/io/ooxml/parse-inline-media.ts +461 -0
  79. package/src/io/ooxml/parse-main-document.ts +2947 -0
  80. package/src/io/ooxml/parse-numbering.ts +747 -0
  81. package/src/io/ooxml/parse-revisions.ts +1045 -0
  82. package/src/io/ooxml/parse-settings.ts +184 -0
  83. package/src/io/ooxml/parse-shapes.ts +296 -0
  84. package/src/io/ooxml/parse-styles.ts +639 -0
  85. package/src/io/ooxml/parse-tables.ts +627 -0
  86. package/src/io/ooxml/parse-theme.ts +346 -0
  87. package/src/io/ooxml/part-manifest.ts +136 -0
  88. package/src/io/ooxml/revision-boundaries.ts +475 -0
  89. package/src/io/ooxml/workflow-payload.ts +544 -0
  90. package/src/io/opc/README.md +3 -0
  91. package/src/io/opc/corrupt-package.ts +166 -0
  92. package/src/io/opc/docx-package.ts +74 -0
  93. package/src/io/opc/package-reader.ts +325 -0
  94. package/src/io/opc/package-writer.ts +273 -0
  95. package/src/io/source-package-provenance.ts +241 -0
  96. package/{dist/chunk-RMH72RZI.js → src/legal/bookmarks.ts} +130 -44
  97. package/src/legal/cross-references.ts +414 -0
  98. package/src/legal/defined-terms.ts +203 -0
  99. package/src/legal/index.ts +32 -0
  100. package/src/legal/signature-blocks.ts +259 -0
  101. package/src/model/README.md +3 -0
  102. package/src/model/canonical-document.ts +2722 -0
  103. package/src/model/cds-1.0.0.ts +212 -0
  104. package/src/model/snapshot.ts +760 -0
  105. package/src/preservation/README.md +3 -0
  106. package/src/preservation/markup-compatibility.ts +48 -0
  107. package/src/preservation/opaque-fragment-store.ts +89 -0
  108. package/src/preservation/opaque-region.ts +233 -0
  109. package/src/preservation/package-preservation.ts +113 -0
  110. package/src/preservation/preserved-part-manifest.ts +56 -0
  111. package/src/preservation/relationship-retention.ts +57 -0
  112. package/src/preservation/store.ts +255 -0
  113. package/src/review/README.md +16 -0
  114. package/src/review/store/README.md +3 -0
  115. package/src/review/store/comment-anchors.ts +70 -0
  116. package/src/review/store/comment-remapping.ts +154 -0
  117. package/src/review/store/comment-store.ts +349 -0
  118. package/src/review/store/comment-thread.ts +109 -0
  119. package/src/review/store/revision-actions.ts +423 -0
  120. package/src/review/store/revision-store.ts +323 -0
  121. package/src/review/store/revision-types.ts +182 -0
  122. package/src/review/store/runtime-comment-store.ts +43 -0
  123. package/src/runtime/README.md +3 -0
  124. package/src/runtime/ai-action-policy.ts +764 -0
  125. package/src/runtime/context-analytics.ts +824 -0
  126. package/src/runtime/document-layout.ts +332 -0
  127. package/src/runtime/document-locations.ts +521 -0
  128. package/src/runtime/document-navigation.ts +616 -0
  129. package/src/runtime/document-outline.ts +440 -0
  130. package/src/runtime/document-runtime.ts +4055 -0
  131. package/src/runtime/document-search.ts +145 -0
  132. package/src/runtime/event-refresh-hints.ts +137 -0
  133. package/src/runtime/numbering-prefix.ts +244 -0
  134. package/src/runtime/page-layout-estimation.ts +305 -0
  135. package/src/runtime/read-only-diagnostics-runtime.ts +241 -0
  136. package/src/runtime/resolved-numbering-geometry.ts +293 -0
  137. package/src/runtime/review-runtime.ts +44 -0
  138. package/src/runtime/revision-runtime.ts +107 -0
  139. package/src/runtime/session-capabilities.ts +192 -0
  140. package/src/runtime/story-context.ts +164 -0
  141. package/src/runtime/story-targeting.ts +162 -0
  142. package/src/runtime/suggestions-snapshot.ts +137 -0
  143. package/src/runtime/surface-projection.ts +1553 -0
  144. package/src/runtime/table-commands.ts +173 -0
  145. package/src/runtime/table-schema.ts +309 -0
  146. package/src/runtime/table-style-resolver.ts +409 -0
  147. package/src/runtime/view-state.ts +493 -0
  148. package/src/runtime/virtualized-rendering.ts +258 -0
  149. package/src/runtime/workflow-markup.ts +393 -0
  150. package/src/ui/README.md +30 -0
  151. package/src/ui/WordReviewEditor.tsx +5268 -0
  152. package/src/ui/browser-export.ts +52 -0
  153. package/src/ui/comments/README.md +3 -0
  154. package/src/ui/compatibility/README.md +3 -0
  155. package/src/ui/editor-command-bag.ts +127 -0
  156. package/src/ui/editor-runtime-boundary.ts +1558 -0
  157. package/src/ui/editor-shell-view.tsx +144 -0
  158. package/src/ui/editor-surface/README.md +3 -0
  159. package/src/ui/editor-surface-controller.tsx +66 -0
  160. package/src/ui/headless/comment-decoration-model.ts +124 -0
  161. package/src/ui/headless/preserve-editor-selection.ts +5 -0
  162. package/src/ui/headless/revision-decoration-model.ts +128 -0
  163. package/src/ui/headless/selection-helpers.ts +54 -0
  164. package/src/ui/headless/selection-tool-context.ts +19 -0
  165. package/src/ui/headless/selection-tool-resolver.ts +752 -0
  166. package/src/ui/headless/selection-tool-types.ts +129 -0
  167. package/src/ui/headless/selection-toolbar-model.ts +11 -0
  168. package/src/ui/headless/use-editor-keyboard.ts +103 -0
  169. package/src/ui/review/README.md +3 -0
  170. package/src/ui/runtime-shortcut-dispatch.ts +365 -0
  171. package/src/ui/runtime-snapshot-selectors.ts +197 -0
  172. package/src/ui/shared/revision-filters.ts +31 -0
  173. package/src/ui/status/README.md +3 -0
  174. package/src/ui/theme/README.md +3 -0
  175. package/src/ui/toolbar/README.md +3 -0
  176. package/src/ui/workflow-surface-blocked-rails.ts +94 -0
  177. package/src/ui-tailwind/chrome/chrome-preset-model.ts +107 -0
  178. package/src/ui-tailwind/chrome/chrome-preset-toolbar.tsx +15 -0
  179. package/src/ui-tailwind/chrome/review-queue-bar.tsx +97 -0
  180. package/src/ui-tailwind/chrome/tw-alert-banner.tsx +64 -0
  181. package/src/ui-tailwind/chrome/tw-context-analytics-summary.tsx +122 -0
  182. package/src/ui-tailwind/chrome/tw-image-context-toolbar.tsx +121 -0
  183. package/src/ui-tailwind/chrome/tw-layout-panel.tsx +114 -0
  184. package/src/ui-tailwind/chrome/tw-object-context-toolbar.tsx +30 -0
  185. package/src/ui-tailwind/chrome/tw-page-ruler.tsx +365 -0
  186. package/src/ui-tailwind/chrome/tw-selection-tool-blocked.tsx +23 -0
  187. package/src/ui-tailwind/chrome/tw-selection-tool-comment.tsx +35 -0
  188. package/src/ui-tailwind/chrome/tw-selection-tool-formatting.tsx +37 -0
  189. package/src/ui-tailwind/chrome/tw-selection-tool-host.tsx +298 -0
  190. package/src/ui-tailwind/chrome/tw-selection-tool-structure.tsx +116 -0
  191. package/src/ui-tailwind/chrome/tw-selection-tool-suggestion.tsx +29 -0
  192. package/src/ui-tailwind/chrome/tw-selection-tool-workflow.tsx +27 -0
  193. package/src/ui-tailwind/chrome/tw-selection-toolbar.tsx +186 -0
  194. package/src/ui-tailwind/chrome/tw-suggestion-card.tsx +139 -0
  195. package/src/ui-tailwind/chrome/tw-table-context-toolbar.tsx +200 -0
  196. package/src/ui-tailwind/chrome/tw-unsaved-modal.tsx +58 -0
  197. package/src/ui-tailwind/chrome/use-before-unload.ts +20 -0
  198. package/src/ui-tailwind/editor-surface/perf-probe.ts +179 -0
  199. package/src/ui-tailwind/editor-surface/pm-command-bridge.ts +189 -0
  200. package/src/ui-tailwind/editor-surface/pm-contextual-ui.ts +31 -0
  201. package/src/ui-tailwind/editor-surface/pm-decorations.ts +411 -0
  202. package/src/ui-tailwind/editor-surface/pm-position-map.ts +123 -0
  203. package/src/ui-tailwind/editor-surface/pm-schema.ts +927 -0
  204. package/src/ui-tailwind/editor-surface/pm-state-from-snapshot.ts +567 -0
  205. package/src/ui-tailwind/editor-surface/search-plugin.ts +168 -0
  206. package/src/ui-tailwind/editor-surface/surface-build-keys.ts +65 -0
  207. package/src/ui-tailwind/editor-surface/tw-caret.tsx +12 -0
  208. package/src/ui-tailwind/editor-surface/tw-editor-surface.tsx +150 -0
  209. package/src/ui-tailwind/editor-surface/tw-inline-token.tsx +129 -0
  210. package/src/ui-tailwind/editor-surface/tw-opaque-block.tsx +58 -0
  211. package/src/ui-tailwind/editor-surface/tw-paragraph-block.tsx +151 -0
  212. package/src/ui-tailwind/editor-surface/tw-prosemirror-surface.tsx +1047 -0
  213. package/src/ui-tailwind/editor-surface/tw-segment-view.tsx +111 -0
  214. package/src/ui-tailwind/editor-surface/tw-table-node-view.tsx +503 -0
  215. package/src/ui-tailwind/index.ts +62 -0
  216. package/src/ui-tailwind/page-chrome-model.ts +27 -0
  217. package/src/ui-tailwind/review/tw-comment-sidebar.tsx +406 -0
  218. package/src/ui-tailwind/review/tw-health-panel.tsx +149 -0
  219. package/src/ui-tailwind/review/tw-review-rail.tsx +122 -0
  220. package/src/ui-tailwind/review/tw-revision-sidebar.tsx +164 -0
  221. package/src/ui-tailwind/status/tw-status-bar.tsx +65 -0
  222. package/{dist → src}/ui-tailwind/theme/editor-theme.css +58 -40
  223. package/src/ui-tailwind/toolbar/tw-toolbar-icon-button.tsx +52 -0
  224. package/src/ui-tailwind/toolbar/tw-toolbar.tsx +1133 -0
  225. package/src/ui-tailwind/tw-review-workspace.tsx +1460 -0
  226. package/src/validation/README.md +3 -0
  227. package/src/validation/compatibility-engine.ts +878 -0
  228. package/src/validation/compatibility-report.ts +161 -0
  229. package/src/validation/diagnostics.ts +204 -0
  230. package/src/validation/docx-comment-proof.ts +720 -0
  231. package/src/validation/import-diagnostics.ts +128 -0
  232. package/src/validation/low-priority-word-surfaces.ts +373 -0
  233. package/dist/canonical-document-BLEbzL2J.d.cts +0 -844
  234. package/dist/canonical-document-BLEbzL2J.d.ts +0 -844
  235. package/dist/chunk-2FJS5GZM.js +0 -763
  236. package/dist/chunk-2FJS5GZM.js.map +0 -1
  237. package/dist/chunk-2OQBZS3F.js +0 -446
  238. package/dist/chunk-2OQBZS3F.js.map +0 -1
  239. package/dist/chunk-2S7W4KFO.js +0 -127
  240. package/dist/chunk-2S7W4KFO.js.map +0 -1
  241. package/dist/chunk-2TG72QSW.js +0 -3874
  242. package/dist/chunk-2TG72QSW.js.map +0 -1
  243. package/dist/chunk-36QNIZBO.js +0 -532
  244. package/dist/chunk-36QNIZBO.js.map +0 -1
  245. package/dist/chunk-4AQOYAW4.js +0 -3069
  246. package/dist/chunk-4AQOYAW4.js.map +0 -1
  247. package/dist/chunk-4D5EWJ3P.js +0 -77
  248. package/dist/chunk-4D5EWJ3P.js.map +0 -1
  249. package/dist/chunk-5FN54NDH.js +0 -2257
  250. package/dist/chunk-5FN54NDH.js.map +0 -1
  251. package/dist/chunk-BOYGQYRQ.js +0 -7306
  252. package/dist/chunk-BOYGQYRQ.js.map +0 -1
  253. package/dist/chunk-CN3XMECL.js +0 -212
  254. package/dist/chunk-CN3XMECL.js.map +0 -1
  255. package/dist/chunk-EBI3BX6U.js +0 -164
  256. package/dist/chunk-EBI3BX6U.js.map +0 -1
  257. package/dist/chunk-EILUG3VB.js +0 -1275
  258. package/dist/chunk-EILUG3VB.js.map +0 -1
  259. package/dist/chunk-FUDY333O.js +0 -70
  260. package/dist/chunk-FUDY333O.js.map +0 -1
  261. package/dist/chunk-GBVOWFIK.js +0 -1237
  262. package/dist/chunk-GBVOWFIK.js.map +0 -1
  263. package/dist/chunk-H4TQ3H3Y.js +0 -262
  264. package/dist/chunk-H4TQ3H3Y.js.map +0 -1
  265. package/dist/chunk-JGB3IXZO.js +0 -189
  266. package/dist/chunk-JGB3IXZO.js.map +0 -1
  267. package/dist/chunk-KD2QRQPY.js +0 -4342
  268. package/dist/chunk-KD2QRQPY.js.map +0 -1
  269. package/dist/chunk-KLMXQVYK.js +0 -369
  270. package/dist/chunk-KLMXQVYK.js.map +0 -1
  271. package/dist/chunk-KZUG5KFQ.js +0 -214
  272. package/dist/chunk-KZUG5KFQ.js.map +0 -1
  273. package/dist/chunk-QDAQ4CJU.js +0 -345
  274. package/dist/chunk-QDAQ4CJU.js.map +0 -1
  275. package/dist/chunk-RMH72RZI.js.map +0 -1
  276. package/dist/chunk-SWKWQZXM.js +0 -117
  277. package/dist/chunk-SWKWQZXM.js.map +0 -1
  278. package/dist/chunk-TJBP2K4T.js.map +0 -1
  279. package/dist/chunk-TLCEAQDQ.js +0 -542
  280. package/dist/chunk-TLCEAQDQ.js.map +0 -1
  281. package/dist/chunk-UZXBISGO.js.map +0 -1
  282. package/dist/chunk-WGBAKP3Q.js +0 -3220
  283. package/dist/chunk-WGBAKP3Q.js.map +0 -1
  284. package/dist/compare/index.cjs +0 -5475
  285. package/dist/compare/index.cjs.map +0 -1
  286. package/dist/compare/index.d.cts +0 -114
  287. package/dist/compare/index.d.ts +0 -114
  288. package/dist/compare/index.js +0 -731
  289. package/dist/compare/index.js.map +0 -1
  290. package/dist/core/commands/formatting-commands.cjs +0 -828
  291. package/dist/core/commands/formatting-commands.cjs.map +0 -1
  292. package/dist/core/commands/formatting-commands.d.cts +0 -63
  293. package/dist/core/commands/formatting-commands.d.ts +0 -63
  294. package/dist/core/commands/formatting-commands.js +0 -37
  295. package/dist/core/commands/formatting-commands.js.map +0 -1
  296. package/dist/core/commands/image-commands.cjs +0 -2023
  297. package/dist/core/commands/image-commands.cjs.map +0 -1
  298. package/dist/core/commands/image-commands.d.cts +0 -58
  299. package/dist/core/commands/image-commands.d.ts +0 -58
  300. package/dist/core/commands/image-commands.js +0 -18
  301. package/dist/core/commands/image-commands.js.map +0 -1
  302. package/dist/core/commands/section-layout-commands.cjs.map +0 -1
  303. package/dist/core/commands/section-layout-commands.d.cts +0 -62
  304. package/dist/core/commands/section-layout-commands.d.ts +0 -62
  305. package/dist/core/commands/section-layout-commands.js +0 -21
  306. package/dist/core/commands/section-layout-commands.js.map +0 -1
  307. package/dist/core/commands/style-commands.cjs.map +0 -1
  308. package/dist/core/commands/style-commands.d.cts +0 -13
  309. package/dist/core/commands/style-commands.d.ts +0 -13
  310. package/dist/core/commands/style-commands.js +0 -9
  311. package/dist/core/commands/style-commands.js.map +0 -1
  312. package/dist/core/commands/table-structure-commands.cjs +0 -1883
  313. package/dist/core/commands/table-structure-commands.cjs.map +0 -1
  314. package/dist/core/commands/table-structure-commands.d.cts +0 -59
  315. package/dist/core/commands/table-structure-commands.d.ts +0 -59
  316. package/dist/core/commands/table-structure-commands.js +0 -12
  317. package/dist/core/commands/table-structure-commands.js.map +0 -1
  318. package/dist/core/commands/text-commands.cjs +0 -2391
  319. package/dist/core/commands/text-commands.cjs.map +0 -1
  320. package/dist/core/commands/text-commands.d.cts +0 -24
  321. package/dist/core/commands/text-commands.d.ts +0 -24
  322. package/dist/core/commands/text-commands.js +0 -28
  323. package/dist/core/commands/text-commands.js.map +0 -1
  324. package/dist/core/selection/mapping.cjs +0 -200
  325. package/dist/core/selection/mapping.cjs.map +0 -1
  326. package/dist/core/selection/mapping.d.cts +0 -2
  327. package/dist/core/selection/mapping.d.ts +0 -2
  328. package/dist/core/selection/mapping.js +0 -31
  329. package/dist/core/selection/mapping.js.map +0 -1
  330. package/dist/core/state/editor-state.cjs +0 -2278
  331. package/dist/core/state/editor-state.cjs.map +0 -1
  332. package/dist/core/state/editor-state.d.cts +0 -2
  333. package/dist/core/state/editor-state.d.ts +0 -2
  334. package/dist/core/state/editor-state.js +0 -26
  335. package/dist/core/state/editor-state.js.map +0 -1
  336. package/dist/index.cjs +0 -38553
  337. package/dist/index.cjs.map +0 -1
  338. package/dist/index.d.cts +0 -15
  339. package/dist/index.d.ts +0 -15
  340. package/dist/index.js +0 -7856
  341. package/dist/index.js.map +0 -1
  342. package/dist/io/docx-session.cjs +0 -16236
  343. package/dist/io/docx-session.cjs.map +0 -1
  344. package/dist/io/docx-session.d.cts +0 -21
  345. package/dist/io/docx-session.d.ts +0 -21
  346. package/dist/io/docx-session.js +0 -18
  347. package/dist/io/docx-session.js.map +0 -1
  348. package/dist/legal/index.cjs +0 -3900
  349. package/dist/legal/index.cjs.map +0 -1
  350. package/dist/legal/index.d.cts +0 -86
  351. package/dist/legal/index.d.ts +0 -86
  352. package/dist/legal/index.js +0 -616
  353. package/dist/legal/index.js.map +0 -1
  354. package/dist/public-types-7ZL_94cz.d.ts +0 -1573
  355. package/dist/public-types-CeMaDueh.d.cts +0 -1573
  356. package/dist/public-types.cjs +0 -19
  357. package/dist/public-types.cjs.map +0 -1
  358. package/dist/public-types.d.cts +0 -2
  359. package/dist/public-types.d.ts +0 -2
  360. package/dist/public-types.js +0 -1
  361. package/dist/public-types.js.map +0 -1
  362. package/dist/runtime/document-runtime.cjs +0 -11140
  363. package/dist/runtime/document-runtime.cjs.map +0 -1
  364. package/dist/runtime/document-runtime.d.cts +0 -231
  365. package/dist/runtime/document-runtime.d.ts +0 -231
  366. package/dist/runtime/document-runtime.js +0 -21
  367. package/dist/runtime/document-runtime.js.map +0 -1
  368. package/dist/structural-helpers-CilgOVhh.d.cts +0 -10
  369. package/dist/structural-helpers-q0Gd-eBN.d.ts +0 -10
  370. package/dist/ui-tailwind/editor-surface/search-plugin.cjs +0 -313
  371. package/dist/ui-tailwind/editor-surface/search-plugin.cjs.map +0 -1
  372. package/dist/ui-tailwind/editor-surface/search-plugin.d.cts +0 -67
  373. package/dist/ui-tailwind/editor-surface/search-plugin.d.ts +0 -67
  374. package/dist/ui-tailwind/editor-surface/search-plugin.js +0 -23
  375. package/dist/ui-tailwind/editor-surface/search-plugin.js.map +0 -1
  376. package/dist/ui-tailwind/index.cjs +0 -4833
  377. package/dist/ui-tailwind/index.cjs.map +0 -1
  378. package/dist/ui-tailwind/index.d.cts +0 -617
  379. package/dist/ui-tailwind/index.d.ts +0 -617
  380. package/dist/ui-tailwind/index.js +0 -575
  381. package/dist/ui-tailwind/index.js.map +0 -1
@@ -0,0 +1,189 @@
1
+ import { NodeSelection, Plugin, PluginKey } from "prosemirror-state";
2
+ import { columnResizing, goToNextCell, isInTable, tableEditing } from "prosemirror-tables";
3
+
4
+ import type { SelectionSnapshot } from "../../api/public-types";
5
+ import {
6
+ createNodeSelectionSnapshot,
7
+ createSelectionSnapshot,
8
+ } from "../../ui/headless/selection-helpers";
9
+ import { resolveSurfaceShortcut } from "../../ui/runtime-shortcut-dispatch";
10
+ import type { PositionMap } from "./pm-position-map";
11
+
12
+ export interface CommandBridgeCallbacks {
13
+ onInsertText: (text: string) => void;
14
+ onDeleteBackward: () => void;
15
+ onDeleteForward: () => void;
16
+ onSplitParagraph: () => void;
17
+ onInsertHardBreak: () => void;
18
+ onInsertTab: () => void;
19
+ onOutdentTab?: () => void;
20
+ onUndo: () => void;
21
+ onRedo: () => void;
22
+ onBlockedInput?: (command: "paste" | "drop", message: string) => void;
23
+ onSelectionChange: (selection: SelectionSnapshot) => void;
24
+ getPositionMap: () => PositionMap | null;
25
+ isSelectionSyncSuppressed?: () => boolean;
26
+ }
27
+
28
+ const bridgeKey = new PluginKey("command-bridge");
29
+
30
+ /**
31
+ * Creates ProseMirror plugins that intercept user input and dispatch
32
+ * runtime commands instead of letting PM mutate its own state.
33
+ *
34
+ * All doc-changing transactions are blocked. Only the explicit input
35
+ * hooks below are allowed to trigger runtime commands.
36
+ */
37
+ export function createCommandBridgePlugins(
38
+ callbacks: CommandBridgeCallbacks,
39
+ ): Plugin[] {
40
+ let isComposing = false;
41
+
42
+ // Transaction filter: block ALL doc-changing transactions.
43
+ // The runtime is the sole authority for document mutations.
44
+ const filterPlugin = new Plugin({
45
+ key: bridgeKey,
46
+ filterTransaction(tr) {
47
+ // Allow selection-only and metadata-only transactions
48
+ if (!tr.docChanged) return true;
49
+ // Block doc changes — runtime handles mutations via callbacks
50
+ return false;
51
+ },
52
+ });
53
+
54
+ // Selection sync: when PM selection changes, notify the runtime.
55
+ const selectionPlugin = new Plugin({
56
+ view() {
57
+ return {
58
+ update(view, prevState) {
59
+ if (callbacks.isSelectionSyncSuppressed?.()) {
60
+ return;
61
+ }
62
+ if (isComposing) {
63
+ return;
64
+ }
65
+ if (!view.state.selection.eq(prevState.selection)) {
66
+ const posMap = callbacks.getPositionMap();
67
+ if (!posMap) return;
68
+
69
+ if (view.state.selection instanceof NodeSelection) {
70
+ callbacks.onSelectionChange(
71
+ createNodeSelectionSnapshot(posMap.pmToRuntime(view.state.selection.from), 1),
72
+ );
73
+ return;
74
+ }
75
+
76
+ const { anchor, head } = view.state.selection;
77
+ const runtimeAnchor = posMap.pmToRuntime(anchor);
78
+ const runtimeHead = posMap.pmToRuntime(head);
79
+ callbacks.onSelectionChange(
80
+ createSelectionSnapshot(runtimeAnchor, runtimeHead),
81
+ );
82
+ }
83
+ },
84
+ };
85
+ },
86
+ });
87
+
88
+ // Text input hook: intercept typed characters.
89
+ const inputPlugin = new Plugin({
90
+ props: {
91
+ handleDOMEvents: {
92
+ blur() {
93
+ isComposing = false;
94
+ return false;
95
+ },
96
+ compositionstart() {
97
+ isComposing = true;
98
+ return false;
99
+ },
100
+ compositionend() {
101
+ isComposing = false;
102
+ return false;
103
+ },
104
+ },
105
+ handleTextInput(_view, _from, _to, text) {
106
+ if (isComposing) {
107
+ return true;
108
+ }
109
+ callbacks.onInsertText(text);
110
+ return true; // Block PM from processing
111
+ },
112
+
113
+ // Block paste (rich paste is not safe, plain paste via text.insert is TODO)
114
+ handlePaste() {
115
+ callbacks.onBlockedInput?.("paste", "Paste is not supported in the mounted editor yet.");
116
+ return true; // Block
117
+ },
118
+
119
+ // Block drop
120
+ handleDrop() {
121
+ callbacks.onBlockedInput?.("drop", "Drag and drop is not supported in the mounted editor.");
122
+ return true; // Block
123
+ },
124
+ },
125
+ });
126
+
127
+ // Keydown bridge: normalize mounted editor keys through the shared shortcut
128
+ // dispatcher so the PM layer and shell layer follow the same routing model.
129
+ const keydownPlugin = new Plugin({
130
+ props: {
131
+ handleKeyDown(view, event) {
132
+ if (isComposing) {
133
+ return false;
134
+ }
135
+
136
+ const resolution = resolveSurfaceShortcut(
137
+ {
138
+ key: event.key,
139
+ ctrlKey: event.ctrlKey,
140
+ metaKey: event.metaKey,
141
+ altKey: event.altKey,
142
+ shiftKey: event.shiftKey,
143
+ },
144
+ { inTable: isInTable(view.state) },
145
+ );
146
+
147
+ switch (resolution.kind) {
148
+ case "none":
149
+ return false;
150
+ case "delete-backward":
151
+ callbacks.onDeleteBackward();
152
+ return true;
153
+ case "delete-forward":
154
+ callbacks.onDeleteForward();
155
+ return true;
156
+ case "split-paragraph":
157
+ callbacks.onSplitParagraph();
158
+ return true;
159
+ case "insert-hard-break":
160
+ callbacks.onInsertHardBreak();
161
+ return true;
162
+ case "insert-tab":
163
+ callbacks.onInsertTab();
164
+ return true;
165
+ case "outdent-tab":
166
+ callbacks.onOutdentTab?.();
167
+ return true;
168
+ case "navigate-table-cell":
169
+ return goToNextCell(resolution.direction)(view.state, view.dispatch, view);
170
+ case "history":
171
+ if (resolution.history === "undo") {
172
+ callbacks.onUndo();
173
+ } else {
174
+ callbacks.onRedo();
175
+ }
176
+ return true;
177
+ }
178
+ },
179
+ },
180
+ });
181
+
182
+ // Table editing: provides Tab/Shift-Tab navigation between cells and
183
+ // selection handles. Doc-changing table transactions (new rows, etc.) are
184
+ // filtered by the runtime filter above; navigation-only steps pass through.
185
+ const tablePlugin = tableEditing();
186
+ const columnResizingPlugin = columnResizing();
187
+
188
+ return [filterPlugin, selectionPlugin, inputPlugin, keydownPlugin, tablePlugin, columnResizingPlugin];
189
+ }
@@ -0,0 +1,31 @@
1
+ import { Plugin } from "prosemirror-state";
2
+
3
+ export interface ContextualInteractionCallbacks {
4
+ onCommentActivated?: (commentId: string) => void;
5
+ onRevisionActivated?: (revisionId: string) => void;
6
+ }
7
+
8
+ export function createContextualInteractionPlugin(
9
+ callbacks: ContextualInteractionCallbacks,
10
+ ): Plugin {
11
+ return new Plugin({
12
+ props: {
13
+ handleClick(_view, _pos, event) {
14
+ const target = event.target as HTMLElement | null;
15
+ const commentId = target?.closest?.("[data-comment-id]")?.getAttribute("data-comment-id");
16
+ if (commentId) {
17
+ callbacks.onCommentActivated?.(commentId);
18
+ return true;
19
+ }
20
+
21
+ const revisionId = target?.closest?.("[data-revision-id]")?.getAttribute("data-revision-id");
22
+ if (revisionId) {
23
+ callbacks.onRevisionActivated?.(revisionId);
24
+ return true;
25
+ }
26
+
27
+ return false;
28
+ },
29
+ },
30
+ });
31
+ }
@@ -0,0 +1,411 @@
1
+ import { Decoration, DecorationSet } from "prosemirror-view";
2
+
3
+ import type { CommentDecorationModel } from "../../ui/headless/comment-decoration-model";
4
+ import { getCommentHighlightClass, type MarkupDisplay } from "../../ui/headless/comment-decoration-model";
5
+ import type { RevisionDecorationModel } from "../../ui/headless/revision-decoration-model";
6
+ import { getRevisionHighlightClass } from "../../ui/headless/revision-decoration-model";
7
+ import type {
8
+ EditorAnchorProjection,
9
+ EditorStoryTarget,
10
+ WorkflowBlockedCommandReason,
11
+ WorkflowCandidateRange,
12
+ WorkflowMetadataMarkup,
13
+ WorkflowScope,
14
+ } from "../../api/public-types";
15
+ import { MAIN_STORY_TARGET, storyTargetsEqual } from "../../core/selection/mapping.ts";
16
+ import type { PositionMap } from "./pm-position-map";
17
+ import type { Node as PMNode } from "prosemirror-model";
18
+
19
+ type RailDecorationSpec = {
20
+ railKind: "scope" | "candidate" | "blocked";
21
+ className: string;
22
+ attrs: Record<string, string>;
23
+ };
24
+
25
+ function isSelectionZoneScope(scope: WorkflowScope): boolean {
26
+ return (
27
+ scope.scopeId.startsWith("scope-lab-") ||
28
+ scope.scopeId.startsWith("metadata-lab-") ||
29
+ scope.workItemId?.startsWith("scope-lab-") === true ||
30
+ scope.workItemId?.startsWith("metadata-lab-") === true ||
31
+ scope.label?.toLowerCase().includes("scope lab") === true ||
32
+ scope.label?.toLowerCase().includes("metadata lab") === true
33
+ );
34
+ }
35
+
36
+ function getWorkflowInlineClass(
37
+ scope: WorkflowScope,
38
+ isActiveWorkItem: boolean,
39
+ isSelectionZone: boolean,
40
+ ): string {
41
+ const base =
42
+ scope.mode === "edit"
43
+ ? "wre-workflow-inline wre-workflow-inline-edit"
44
+ : scope.mode === "suggest"
45
+ ? "wre-workflow-inline wre-workflow-inline-suggest"
46
+ : scope.mode === "comment"
47
+ ? "wre-workflow-inline wre-workflow-inline-comment"
48
+ : "wre-workflow-inline wre-workflow-inline-view";
49
+ const withZone = isSelectionZone ? `${base} wre-workflow-inline-zone` : base;
50
+ return isActiveWorkItem ? `${withZone} wre-workflow-inline-active` : withZone;
51
+ }
52
+
53
+ function getWorkflowRailClass(
54
+ scope: WorkflowScope,
55
+ isActiveWorkItem: boolean,
56
+ isSelectionZone: boolean,
57
+ ): string {
58
+ const base =
59
+ scope.mode === "edit"
60
+ ? "wre-workflow-rail wre-workflow-rail-edit"
61
+ : scope.mode === "suggest"
62
+ ? "wre-workflow-rail wre-workflow-rail-suggest"
63
+ : scope.mode === "comment"
64
+ ? "wre-workflow-rail wre-workflow-rail-comment"
65
+ : "wre-workflow-rail wre-workflow-rail-view";
66
+ const withZone = isSelectionZone ? `${base} wre-workflow-rail-selection-zone` : base;
67
+ return isActiveWorkItem ? `${withZone} wre-workflow-rail-active` : withZone;
68
+ }
69
+
70
+ function getWorkflowCandidateInlineClass(): string {
71
+ return "wre-workflow-inline wre-workflow-inline-candidate";
72
+ }
73
+
74
+ function getWorkflowCandidateRailClass(): string {
75
+ return "wre-workflow-rail wre-workflow-rail-candidate";
76
+ }
77
+
78
+ function getWorkflowMetadataInlineClass(): string {
79
+ return "wre-workflow-inline wre-workflow-inline-metadata";
80
+ }
81
+
82
+ function getWorkflowBlockedInlineClass(reason: WorkflowBlockedCommandReason): string {
83
+ if (reason.code === "workflow_blocked_import") {
84
+ return "wre-workflow-inline wre-workflow-inline-blocked-import";
85
+ }
86
+ return "wre-workflow-inline wre-workflow-inline-preserve-only";
87
+ }
88
+
89
+ function getWorkflowBlockedRailClass(reason: WorkflowBlockedCommandReason): string {
90
+ if (reason.code === "workflow_blocked_import") {
91
+ return "wre-workflow-rail wre-workflow-rail-blocked-import";
92
+ }
93
+ return "wre-workflow-rail wre-workflow-rail-preserve-only";
94
+ }
95
+
96
+ function hasBlockChildren(node: PMNode): boolean {
97
+ for (let index = 0; index < node.childCount; index += 1) {
98
+ if (node.child(index).isBlock) {
99
+ return true;
100
+ }
101
+ }
102
+ return false;
103
+ }
104
+
105
+ function collectRailRanges(doc: PMNode, from: number, to: number): Array<{ from: number; to: number }> {
106
+ const effectiveTo = Math.max(to, from + 1);
107
+ const ranges = new Map<string, { from: number; to: number }>();
108
+ let fallbackFrom: number | null = null;
109
+ let fallbackTo: number | null = null;
110
+ let fallbackSize: number | null = null;
111
+
112
+ doc.descendants((node, pos) => {
113
+ if (!node.isBlock || node.type.name === "doc") {
114
+ return true;
115
+ }
116
+
117
+ const nodeFrom = pos;
118
+ const nodeTo = pos + node.nodeSize;
119
+ if (nodeTo <= from || nodeFrom >= effectiveTo) {
120
+ return true;
121
+ }
122
+
123
+ if (!hasBlockChildren(node)) {
124
+ ranges.set(`${nodeFrom}:${nodeTo}`, { from: nodeFrom, to: nodeTo });
125
+ return true;
126
+ }
127
+
128
+ if (nodeFrom <= from && nodeTo >= effectiveTo) {
129
+ const size = nodeTo - nodeFrom;
130
+ if (fallbackSize === null || size < fallbackSize) {
131
+ fallbackFrom = nodeFrom;
132
+ fallbackTo = nodeTo;
133
+ fallbackSize = size;
134
+ }
135
+ }
136
+
137
+ return true;
138
+ });
139
+
140
+ if (ranges.size > 0) {
141
+ return [...ranges.values()];
142
+ }
143
+
144
+ if (fallbackFrom !== null && fallbackTo !== null) {
145
+ return [{ from: fallbackFrom, to: fallbackTo }];
146
+ }
147
+
148
+ return [];
149
+ }
150
+
151
+ function buildAnchorPmRange(
152
+ anchor: EditorAnchorProjection,
153
+ positionMap: PositionMap,
154
+ ): { from: number; to: number; allowInline: boolean } | null {
155
+ if (anchor.kind === "detached") {
156
+ return null;
157
+ }
158
+
159
+ if (anchor.kind === "range") {
160
+ return {
161
+ from: positionMap.runtimeToPm(anchor.from),
162
+ to: positionMap.runtimeToPm(anchor.to),
163
+ allowInline: true,
164
+ };
165
+ }
166
+
167
+ const pmAt = positionMap.runtimeToPm(anchor.at);
168
+ return {
169
+ from: pmAt,
170
+ to: pmAt + 1,
171
+ allowInline: false,
172
+ };
173
+ }
174
+
175
+ function pushRailDecorations(
176
+ decorations: Decoration[],
177
+ doc: PMNode,
178
+ from: number,
179
+ to: number,
180
+ spec: RailDecorationSpec,
181
+ rangeCache: Map<string, Array<{ from: number; to: number }>>,
182
+ ): void {
183
+ const cacheKey = `${from}:${to}`;
184
+ const ranges = rangeCache.get(cacheKey) ?? collectRailRanges(doc, from, to);
185
+ if (!rangeCache.has(cacheKey)) {
186
+ rangeCache.set(cacheKey, ranges);
187
+ }
188
+ for (const range of ranges) {
189
+ decorations.push(
190
+ Decoration.node(range.from, range.to, {
191
+ class: spec.className,
192
+ "data-workflow-rail": spec.railKind,
193
+ ...spec.attrs,
194
+ }),
195
+ );
196
+ }
197
+ }
198
+
199
+ /**
200
+ * Build ProseMirror DecorationSet from runtime comment and revision models.
201
+ *
202
+ * Uses the existing headless decoration models to compute Tailwind class
203
+ * strings, then converts them to PM inline decorations at the correct
204
+ * PM positions via the PositionMap.
205
+ */
206
+ export function buildDecorations(
207
+ doc: PMNode,
208
+ positionMap: PositionMap,
209
+ commentModel: CommentDecorationModel | undefined,
210
+ revisionModel: RevisionDecorationModel | undefined,
211
+ markupDisplay: MarkupDisplay,
212
+ showTrackedChanges = true,
213
+ workflowScopes?: readonly WorkflowScope[],
214
+ activeStory: EditorStoryTarget = MAIN_STORY_TARGET,
215
+ workflowCandidates?: readonly WorkflowCandidateRange[],
216
+ workflowBlockedReasons?: readonly WorkflowBlockedCommandReason[],
217
+ activeWorkflowWorkItemId?: string | null,
218
+ activeWorkflowScopeIds?: readonly string[],
219
+ workflowMetadata?: readonly WorkflowMetadataMarkup[],
220
+ ): DecorationSet {
221
+ const decorations: Decoration[] = [];
222
+ const railRangeCache = new Map<string, Array<{ from: number; to: number }>>();
223
+ const activeScopeIds = new Set(activeWorkflowScopeIds ?? []);
224
+
225
+ // Walk comment threads and create inline decorations
226
+ if (commentModel) {
227
+ for (const thread of commentModel.threads) {
228
+ const cls = getCommentHighlightClass(
229
+ commentModel,
230
+ thread.from,
231
+ thread.to,
232
+ markupDisplay,
233
+ );
234
+ if (!cls) continue;
235
+
236
+ const pmFrom = positionMap.runtimeToPm(thread.from);
237
+ const pmTo = positionMap.runtimeToPm(thread.to);
238
+ if (pmFrom < pmTo) {
239
+ decorations.push(
240
+ Decoration.inline(pmFrom, pmTo, {
241
+ class: cls,
242
+ "data-comment-id": thread.commentId,
243
+ }),
244
+ );
245
+ }
246
+ }
247
+ }
248
+
249
+ // Walk revision entries and create inline decorations.
250
+ // Deletion hiding in clean mode ALWAYS applies, even when showTrackedChanges is off.
251
+ // Visual styling (underlines, colors) only applies when showTrackedChanges is on.
252
+ if (revisionModel) {
253
+ for (const rev of revisionModel.revisions) {
254
+ // Always hide deletions in clean mode (final-text semantics).
255
+ // This is the critical behavior: "hide tracked changes" must show
256
+ // the document as if accepted, not show deleted text as kept text.
257
+ if (markupDisplay === "clean" && rev.kind === "deletion") {
258
+ const pmFrom = positionMap.runtimeToPm(rev.from);
259
+ const pmTo = positionMap.runtimeToPm(rev.to);
260
+ if (pmFrom < pmTo) {
261
+ decorations.push(
262
+ Decoration.inline(pmFrom, pmTo, {
263
+ class: "hidden",
264
+ "data-revision-id": rev.revisionId,
265
+ }),
266
+ );
267
+ }
268
+ continue;
269
+ }
270
+
271
+ // Skip visual styling when tracked changes display is off
272
+ if (!showTrackedChanges) continue;
273
+
274
+ const cls = getRevisionHighlightClass(
275
+ revisionModel,
276
+ rev.from,
277
+ rev.to,
278
+ markupDisplay,
279
+ );
280
+ if (!cls) continue;
281
+
282
+ const pmFrom = positionMap.runtimeToPm(rev.from);
283
+ const pmTo = positionMap.runtimeToPm(rev.to);
284
+ if (pmFrom < pmTo) {
285
+ decorations.push(
286
+ Decoration.inline(pmFrom, pmTo, {
287
+ class: cls,
288
+ "data-revision-id": rev.revisionId,
289
+ }),
290
+ );
291
+ }
292
+ }
293
+ }
294
+
295
+ if (workflowScopes) {
296
+ for (const scope of workflowScopes) {
297
+ const scopeStoryTarget = scope.storyTarget ?? MAIN_STORY_TARGET;
298
+ if (!storyTargetsEqual(scopeStoryTarget, activeStory)) continue;
299
+ const pmRange = buildAnchorPmRange(scope.anchor, positionMap);
300
+ if (!pmRange) continue;
301
+ const isSelectionZone = isSelectionZoneScope(scope);
302
+ const isActiveWorkItem =
303
+ Boolean(activeWorkflowWorkItemId) &&
304
+ (
305
+ scope.workItemId === activeWorkflowWorkItemId ||
306
+ activeScopeIds.has(scope.scopeId)
307
+ );
308
+
309
+ if (pmRange.allowInline && pmRange.from < pmRange.to) {
310
+ decorations.push(
311
+ Decoration.inline(pmRange.from, pmRange.to, {
312
+ class: getWorkflowInlineClass(scope, isActiveWorkItem, isSelectionZone),
313
+ "data-workflow-scope-id": scope.scopeId,
314
+ "data-workflow-scope-mode": scope.mode,
315
+ "data-workflow-active": isActiveWorkItem ? "true" : "false",
316
+ ...(isSelectionZone ? { "data-workflow-zone": "selection" } : {}),
317
+ }),
318
+ );
319
+ }
320
+
321
+ pushRailDecorations(decorations, doc, pmRange.from, pmRange.to, {
322
+ railKind: "scope",
323
+ className: getWorkflowRailClass(scope, isActiveWorkItem, isSelectionZone),
324
+ attrs: {
325
+ "data-workflow-scope-id": scope.scopeId,
326
+ "data-workflow-scope-mode": scope.mode,
327
+ "data-workflow-active": isActiveWorkItem ? "true" : "false",
328
+ ...(isSelectionZone ? { "data-workflow-zone": "selection" } : {}),
329
+ },
330
+ }, railRangeCache);
331
+ }
332
+ }
333
+
334
+ if (workflowMetadata) {
335
+ for (const metadata of workflowMetadata) {
336
+ const metadataStoryTarget = metadata.storyTarget ?? MAIN_STORY_TARGET;
337
+ if (!storyTargetsEqual(metadataStoryTarget, activeStory)) continue;
338
+ const pmRange = buildAnchorPmRange(metadata.anchor, positionMap);
339
+ if (!pmRange || !pmRange.allowInline || pmRange.from >= pmRange.to) continue;
340
+
341
+ decorations.push(
342
+ Decoration.inline(pmRange.from, pmRange.to, {
343
+ class: getWorkflowMetadataInlineClass(),
344
+ ...(metadata.color ? { style: `--wre-workflow-metadata-color: ${metadata.color};` } : {}),
345
+ "data-workflow-entry-id": metadata.entryId,
346
+ "data-workflow-metadata-id": metadata.metadataId,
347
+ }),
348
+ );
349
+ }
350
+ }
351
+
352
+ if (workflowCandidates) {
353
+ for (const candidate of workflowCandidates) {
354
+ const candidateStoryTarget = candidate.storyTarget ?? MAIN_STORY_TARGET;
355
+ if (!storyTargetsEqual(candidateStoryTarget, activeStory)) continue;
356
+ const pmRange = buildAnchorPmRange(candidate.anchor, positionMap);
357
+ if (!pmRange) continue;
358
+
359
+ if (pmRange.allowInline && pmRange.from < pmRange.to) {
360
+ decorations.push(
361
+ Decoration.inline(pmRange.from, pmRange.to, {
362
+ class: getWorkflowCandidateInlineClass(),
363
+ "data-workflow-candidate-id": candidate.candidateId,
364
+ }),
365
+ );
366
+ }
367
+
368
+ pushRailDecorations(decorations, doc, pmRange.from, pmRange.to, {
369
+ railKind: "candidate",
370
+ className: getWorkflowCandidateRailClass(),
371
+ attrs: {
372
+ "data-workflow-candidate-id": candidate.candidateId,
373
+ },
374
+ }, railRangeCache);
375
+ }
376
+ }
377
+
378
+ if (workflowBlockedReasons) {
379
+ for (const reason of workflowBlockedReasons) {
380
+ if (
381
+ reason.code !== "workflow_preserve_only" &&
382
+ reason.code !== "workflow_blocked_import"
383
+ ) {
384
+ continue;
385
+ }
386
+ const reasonStoryTarget = reason.storyTarget ?? MAIN_STORY_TARGET;
387
+ if (!storyTargetsEqual(reasonStoryTarget, activeStory) || !reason.anchor) continue;
388
+ const pmRange = buildAnchorPmRange(reason.anchor, positionMap);
389
+ if (!pmRange) continue;
390
+
391
+ if (pmRange.allowInline && pmRange.from < pmRange.to) {
392
+ decorations.push(
393
+ Decoration.inline(pmRange.from, pmRange.to, {
394
+ class: getWorkflowBlockedInlineClass(reason),
395
+ "data-workflow-blocked-code": reason.code,
396
+ }),
397
+ );
398
+ }
399
+
400
+ pushRailDecorations(decorations, doc, pmRange.from, pmRange.to, {
401
+ railKind: "blocked",
402
+ className: getWorkflowBlockedRailClass(reason),
403
+ attrs: {
404
+ "data-workflow-blocked-code": reason.code,
405
+ },
406
+ }, railRangeCache);
407
+ }
408
+ }
409
+
410
+ return DecorationSet.create(doc, decorations);
411
+ }