@beyondwork/docx-react-component 1.0.29 → 1.0.31

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