@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.
- package/package.json +65 -96
- package/src/README.md +85 -0
- package/src/api/README.md +26 -0
- package/src/api/public-types.ts +1952 -0
- package/src/api/session-state.ts +62 -0
- package/src/compare/diff-engine.ts +623 -0
- package/src/compare/export-redlines.ts +280 -0
- package/src/compare/index.ts +25 -0
- package/src/compare/snapshot.ts +97 -0
- package/src/component-inventory.md +99 -0
- package/src/core/README.md +10 -0
- package/src/core/commands/README.md +3 -0
- package/{dist/chunk-TJBP2K4T.js → src/core/commands/formatting-commands.ts} +536 -196
- package/src/core/commands/image-commands.ts +373 -0
- package/src/core/commands/index.ts +1879 -0
- package/src/core/commands/list-commands.ts +565 -0
- package/src/core/commands/paragraph-layout-commands.ts +339 -0
- package/src/core/commands/review-commands.ts +108 -0
- package/{dist/core/commands/section-layout-commands.cjs → src/core/commands/section-layout-commands.ts} +340 -137
- package/src/core/commands/structural-helpers.ts +309 -0
- package/{dist/core/commands/style-commands.cjs → src/core/commands/style-commands.ts} +113 -65
- package/src/core/commands/table-structure-commands.ts +854 -0
- package/{dist/chunk-UZXBISGO.js → src/core/commands/text-commands.ts} +142 -86
- package/src/core/schema/README.md +3 -0
- package/src/core/schema/text-schema.ts +516 -0
- package/src/core/search/search-text.ts +357 -0
- package/src/core/selection/README.md +3 -0
- package/src/core/selection/mapping.ts +289 -0
- package/src/core/selection/review-anchors.ts +183 -0
- package/src/core/state/README.md +3 -0
- package/src/core/state/editor-state.ts +892 -0
- package/src/core/state/text-transaction.ts +869 -0
- package/src/formats/xlsx/io/parse-shared-strings.ts +41 -0
- package/src/formats/xlsx/io/parse-sheet.ts +459 -0
- package/src/formats/xlsx/io/parse-styles.ts +59 -0
- package/src/formats/xlsx/io/parse-workbook.ts +75 -0
- package/src/formats/xlsx/io/serialize-shared-strings.ts +72 -0
- package/src/formats/xlsx/io/serialize-sheet.ts +333 -0
- package/src/formats/xlsx/io/serialize-styles.ts +98 -0
- package/src/formats/xlsx/io/serialize-workbook.ts +429 -0
- package/src/formats/xlsx/io/xlsx-session.ts +314 -0
- package/src/formats/xlsx/model/cell.ts +189 -0
- package/src/formats/xlsx/model/sheet.ts +326 -0
- package/src/formats/xlsx/model/styles.ts +118 -0
- package/src/formats/xlsx/model/workbook.ts +453 -0
- package/src/formats/xlsx/runtime/cell-commands.ts +567 -0
- package/src/formats/xlsx/runtime/sheet-commands.ts +206 -0
- package/src/formats/xlsx/runtime/workbook-runtime.ts +177 -0
- package/src/formats/xlsx/runtime/workbook-transaction.ts +822 -0
- package/src/index.ts +142 -0
- package/src/io/README.md +10 -0
- package/src/io/docx-session.ts +3175 -0
- package/src/io/export/README.md +3 -0
- package/src/io/export/export-session.ts +220 -0
- package/src/io/export/minimal-docx.ts +115 -0
- package/src/io/export/reattach-preserved-parts.ts +54 -0
- package/src/io/export/serialize-comments.ts +947 -0
- package/src/io/export/serialize-footnotes.ts +394 -0
- package/src/io/export/serialize-headers-footers.ts +368 -0
- package/src/io/export/serialize-main-document.ts +1342 -0
- package/src/io/export/serialize-numbering.ts +218 -0
- package/src/io/export/serialize-revisions.ts +389 -0
- package/src/io/export/serialize-runtime-revisions.ts +463 -0
- package/src/io/export/serialize-tables.ts +174 -0
- package/src/io/export/split-review-boundaries.ts +356 -0
- package/src/io/export/split-story-blocks-for-runtime-revisions.ts +252 -0
- package/src/io/export/table-properties-xml.ts +318 -0
- package/src/io/normalize/README.md +3 -0
- package/src/io/normalize/normalize-text.ts +670 -0
- package/src/io/ooxml/README.md +3 -0
- package/src/io/ooxml/highlight-colors.ts +39 -0
- package/src/io/ooxml/numbering-sentinels.ts +44 -0
- package/src/io/ooxml/parse-comments.ts +852 -0
- package/src/io/ooxml/parse-complex-content.ts +287 -0
- package/src/io/ooxml/parse-fields.ts +834 -0
- package/src/io/ooxml/parse-footnotes.ts +952 -0
- package/src/io/ooxml/parse-headers-footers.ts +1212 -0
- package/src/io/ooxml/parse-inline-media.ts +461 -0
- package/src/io/ooxml/parse-main-document.ts +2947 -0
- package/src/io/ooxml/parse-numbering.ts +747 -0
- package/src/io/ooxml/parse-revisions.ts +1045 -0
- package/src/io/ooxml/parse-settings.ts +184 -0
- package/src/io/ooxml/parse-shapes.ts +296 -0
- package/src/io/ooxml/parse-styles.ts +639 -0
- package/src/io/ooxml/parse-tables.ts +627 -0
- package/src/io/ooxml/parse-theme.ts +346 -0
- package/src/io/ooxml/part-manifest.ts +136 -0
- package/src/io/ooxml/revision-boundaries.ts +475 -0
- package/src/io/ooxml/workflow-payload.ts +544 -0
- package/src/io/opc/README.md +3 -0
- package/src/io/opc/corrupt-package.ts +166 -0
- package/src/io/opc/docx-package.ts +74 -0
- package/src/io/opc/package-reader.ts +325 -0
- package/src/io/opc/package-writer.ts +273 -0
- package/src/io/source-package-provenance.ts +241 -0
- package/{dist/chunk-RMH72RZI.js → src/legal/bookmarks.ts} +130 -44
- package/src/legal/cross-references.ts +414 -0
- package/src/legal/defined-terms.ts +203 -0
- package/src/legal/index.ts +32 -0
- package/src/legal/signature-blocks.ts +259 -0
- package/src/model/README.md +3 -0
- package/src/model/canonical-document.ts +2722 -0
- package/src/model/cds-1.0.0.ts +212 -0
- package/src/model/snapshot.ts +760 -0
- package/src/preservation/README.md +3 -0
- package/src/preservation/markup-compatibility.ts +48 -0
- package/src/preservation/opaque-fragment-store.ts +89 -0
- package/src/preservation/opaque-region.ts +233 -0
- package/src/preservation/package-preservation.ts +113 -0
- package/src/preservation/preserved-part-manifest.ts +56 -0
- package/src/preservation/relationship-retention.ts +57 -0
- package/src/preservation/store.ts +255 -0
- package/src/review/README.md +16 -0
- package/src/review/store/README.md +3 -0
- package/src/review/store/comment-anchors.ts +70 -0
- package/src/review/store/comment-remapping.ts +154 -0
- package/src/review/store/comment-store.ts +349 -0
- package/src/review/store/comment-thread.ts +109 -0
- package/src/review/store/revision-actions.ts +423 -0
- package/src/review/store/revision-store.ts +323 -0
- package/src/review/store/revision-types.ts +182 -0
- package/src/review/store/runtime-comment-store.ts +43 -0
- package/src/runtime/README.md +3 -0
- package/src/runtime/ai-action-policy.ts +764 -0
- package/src/runtime/context-analytics.ts +824 -0
- package/src/runtime/document-layout.ts +332 -0
- package/src/runtime/document-locations.ts +521 -0
- package/src/runtime/document-navigation.ts +616 -0
- package/src/runtime/document-outline.ts +440 -0
- package/src/runtime/document-runtime.ts +4055 -0
- package/src/runtime/document-search.ts +145 -0
- package/src/runtime/event-refresh-hints.ts +137 -0
- package/src/runtime/numbering-prefix.ts +244 -0
- package/src/runtime/page-layout-estimation.ts +305 -0
- package/src/runtime/read-only-diagnostics-runtime.ts +241 -0
- package/src/runtime/resolved-numbering-geometry.ts +293 -0
- package/src/runtime/review-runtime.ts +44 -0
- package/src/runtime/revision-runtime.ts +107 -0
- package/src/runtime/session-capabilities.ts +192 -0
- package/src/runtime/story-context.ts +164 -0
- package/src/runtime/story-targeting.ts +162 -0
- package/src/runtime/suggestions-snapshot.ts +137 -0
- package/src/runtime/surface-projection.ts +1553 -0
- package/src/runtime/table-commands.ts +173 -0
- package/src/runtime/table-schema.ts +309 -0
- package/src/runtime/table-style-resolver.ts +409 -0
- package/src/runtime/view-state.ts +493 -0
- package/src/runtime/virtualized-rendering.ts +258 -0
- package/src/runtime/workflow-markup.ts +393 -0
- package/src/ui/README.md +30 -0
- package/src/ui/WordReviewEditor.tsx +5268 -0
- package/src/ui/browser-export.ts +52 -0
- package/src/ui/comments/README.md +3 -0
- package/src/ui/compatibility/README.md +3 -0
- package/src/ui/editor-command-bag.ts +127 -0
- package/src/ui/editor-runtime-boundary.ts +1558 -0
- package/src/ui/editor-shell-view.tsx +144 -0
- package/src/ui/editor-surface/README.md +3 -0
- package/src/ui/editor-surface-controller.tsx +66 -0
- package/src/ui/headless/comment-decoration-model.ts +124 -0
- package/src/ui/headless/preserve-editor-selection.ts +5 -0
- package/src/ui/headless/revision-decoration-model.ts +128 -0
- package/src/ui/headless/selection-helpers.ts +54 -0
- package/src/ui/headless/selection-tool-context.ts +19 -0
- package/src/ui/headless/selection-tool-resolver.ts +752 -0
- package/src/ui/headless/selection-tool-types.ts +129 -0
- package/src/ui/headless/selection-toolbar-model.ts +11 -0
- package/src/ui/headless/use-editor-keyboard.ts +103 -0
- package/src/ui/review/README.md +3 -0
- package/src/ui/runtime-shortcut-dispatch.ts +365 -0
- package/src/ui/runtime-snapshot-selectors.ts +197 -0
- package/src/ui/shared/revision-filters.ts +31 -0
- package/src/ui/status/README.md +3 -0
- package/src/ui/theme/README.md +3 -0
- package/src/ui/toolbar/README.md +3 -0
- package/src/ui/workflow-surface-blocked-rails.ts +94 -0
- package/src/ui-tailwind/chrome/chrome-preset-model.ts +107 -0
- package/src/ui-tailwind/chrome/chrome-preset-toolbar.tsx +15 -0
- package/src/ui-tailwind/chrome/responsive-chrome.ts +46 -0
- package/src/ui-tailwind/chrome/review-queue-bar.tsx +97 -0
- package/src/ui-tailwind/chrome/tw-alert-banner.tsx +64 -0
- package/src/ui-tailwind/chrome/tw-context-analytics-summary.tsx +122 -0
- package/src/ui-tailwind/chrome/tw-image-context-toolbar.tsx +121 -0
- package/src/ui-tailwind/chrome/tw-layout-panel.tsx +114 -0
- package/src/ui-tailwind/chrome/tw-object-context-toolbar.tsx +30 -0
- package/src/ui-tailwind/chrome/tw-page-ruler.tsx +365 -0
- package/src/ui-tailwind/chrome/tw-selection-tool-blocked.tsx +23 -0
- package/src/ui-tailwind/chrome/tw-selection-tool-comment.tsx +35 -0
- package/src/ui-tailwind/chrome/tw-selection-tool-formatting.tsx +37 -0
- package/src/ui-tailwind/chrome/tw-selection-tool-host.tsx +303 -0
- package/src/ui-tailwind/chrome/tw-selection-tool-structure.tsx +116 -0
- package/src/ui-tailwind/chrome/tw-selection-tool-suggestion.tsx +29 -0
- package/src/ui-tailwind/chrome/tw-selection-tool-workflow.tsx +27 -0
- package/src/ui-tailwind/chrome/tw-selection-toolbar.tsx +186 -0
- package/src/ui-tailwind/chrome/tw-suggestion-card.tsx +139 -0
- package/src/ui-tailwind/chrome/tw-table-context-toolbar.tsx +250 -0
- package/src/ui-tailwind/chrome/tw-unsaved-modal.tsx +58 -0
- package/src/ui-tailwind/chrome/use-before-unload.ts +20 -0
- package/src/ui-tailwind/editor-surface/perf-probe.ts +179 -0
- package/src/ui-tailwind/editor-surface/pm-command-bridge.ts +189 -0
- package/src/ui-tailwind/editor-surface/pm-contextual-ui.ts +31 -0
- package/src/ui-tailwind/editor-surface/pm-decorations.ts +411 -0
- package/src/ui-tailwind/editor-surface/pm-position-map.ts +123 -0
- package/src/ui-tailwind/editor-surface/pm-schema.ts +927 -0
- package/src/ui-tailwind/editor-surface/pm-state-from-snapshot.ts +567 -0
- package/src/ui-tailwind/editor-surface/search-plugin.ts +168 -0
- package/src/ui-tailwind/editor-surface/surface-build-keys.ts +63 -0
- package/src/ui-tailwind/editor-surface/tw-caret.tsx +12 -0
- package/src/ui-tailwind/editor-surface/tw-editor-surface.tsx +150 -0
- package/src/ui-tailwind/editor-surface/tw-inline-token.tsx +129 -0
- package/src/ui-tailwind/editor-surface/tw-opaque-block.tsx +58 -0
- package/src/ui-tailwind/editor-surface/tw-paragraph-block.tsx +151 -0
- package/src/ui-tailwind/editor-surface/tw-prosemirror-surface.tsx +1047 -0
- package/src/ui-tailwind/editor-surface/tw-segment-view.tsx +111 -0
- package/src/ui-tailwind/editor-surface/tw-table-node-view.tsx +503 -0
- package/src/ui-tailwind/index.ts +62 -0
- package/src/ui-tailwind/page-chrome-model.ts +27 -0
- package/src/ui-tailwind/review/tw-comment-sidebar.tsx +406 -0
- package/src/ui-tailwind/review/tw-health-panel.tsx +149 -0
- package/src/ui-tailwind/review/tw-review-rail.tsx +130 -0
- package/src/ui-tailwind/review/tw-revision-sidebar.tsx +164 -0
- package/src/ui-tailwind/status/tw-status-bar.tsx +65 -0
- package/{dist → src}/ui-tailwind/theme/editor-theme.css +58 -40
- package/src/ui-tailwind/toolbar/toolbar-layout.ts +47 -0
- package/src/ui-tailwind/toolbar/tw-toolbar-icon-button.tsx +52 -0
- package/src/ui-tailwind/toolbar/tw-toolbar.tsx +1478 -0
- package/src/ui-tailwind/tw-review-workspace.tsx +1587 -0
- package/src/validation/README.md +3 -0
- package/src/validation/compatibility-engine.ts +878 -0
- package/src/validation/compatibility-report.ts +161 -0
- package/src/validation/diagnostics.ts +204 -0
- package/src/validation/docx-comment-proof.ts +720 -0
- package/src/validation/import-diagnostics.ts +128 -0
- package/src/validation/low-priority-word-surfaces.ts +373 -0
- package/dist/canonical-document-BLEbzL2J.d.cts +0 -844
- package/dist/canonical-document-BLEbzL2J.d.ts +0 -844
- package/dist/chunk-2FJS5GZM.js +0 -763
- package/dist/chunk-2FJS5GZM.js.map +0 -1
- package/dist/chunk-2OQBZS3F.js +0 -446
- package/dist/chunk-2OQBZS3F.js.map +0 -1
- package/dist/chunk-2S7W4KFO.js +0 -127
- package/dist/chunk-2S7W4KFO.js.map +0 -1
- package/dist/chunk-2TG72QSW.js +0 -3874
- package/dist/chunk-2TG72QSW.js.map +0 -1
- package/dist/chunk-36QNIZBO.js +0 -532
- package/dist/chunk-36QNIZBO.js.map +0 -1
- package/dist/chunk-4AQOYAW4.js +0 -3069
- package/dist/chunk-4AQOYAW4.js.map +0 -1
- package/dist/chunk-4D5EWJ3P.js +0 -77
- package/dist/chunk-4D5EWJ3P.js.map +0 -1
- package/dist/chunk-5FN54NDH.js +0 -2257
- package/dist/chunk-5FN54NDH.js.map +0 -1
- package/dist/chunk-BOYGQYRQ.js +0 -7306
- package/dist/chunk-BOYGQYRQ.js.map +0 -1
- package/dist/chunk-CN3XMECL.js +0 -212
- package/dist/chunk-CN3XMECL.js.map +0 -1
- package/dist/chunk-EBI3BX6U.js +0 -164
- package/dist/chunk-EBI3BX6U.js.map +0 -1
- package/dist/chunk-EILUG3VB.js +0 -1275
- package/dist/chunk-EILUG3VB.js.map +0 -1
- package/dist/chunk-FUDY333O.js +0 -70
- package/dist/chunk-FUDY333O.js.map +0 -1
- package/dist/chunk-GBVOWFIK.js +0 -1237
- package/dist/chunk-GBVOWFIK.js.map +0 -1
- package/dist/chunk-H4TQ3H3Y.js +0 -262
- package/dist/chunk-H4TQ3H3Y.js.map +0 -1
- package/dist/chunk-JGB3IXZO.js +0 -189
- package/dist/chunk-JGB3IXZO.js.map +0 -1
- package/dist/chunk-KD2QRQPY.js +0 -4342
- package/dist/chunk-KD2QRQPY.js.map +0 -1
- package/dist/chunk-KLMXQVYK.js +0 -369
- package/dist/chunk-KLMXQVYK.js.map +0 -1
- package/dist/chunk-KZUG5KFQ.js +0 -214
- package/dist/chunk-KZUG5KFQ.js.map +0 -1
- package/dist/chunk-QDAQ4CJU.js +0 -345
- package/dist/chunk-QDAQ4CJU.js.map +0 -1
- package/dist/chunk-RMH72RZI.js.map +0 -1
- package/dist/chunk-SWKWQZXM.js +0 -117
- package/dist/chunk-SWKWQZXM.js.map +0 -1
- package/dist/chunk-TJBP2K4T.js.map +0 -1
- package/dist/chunk-TLCEAQDQ.js +0 -542
- package/dist/chunk-TLCEAQDQ.js.map +0 -1
- package/dist/chunk-UZXBISGO.js.map +0 -1
- package/dist/chunk-WGBAKP3Q.js +0 -3220
- package/dist/chunk-WGBAKP3Q.js.map +0 -1
- package/dist/compare/index.cjs +0 -5475
- package/dist/compare/index.cjs.map +0 -1
- package/dist/compare/index.d.cts +0 -114
- package/dist/compare/index.d.ts +0 -114
- package/dist/compare/index.js +0 -731
- package/dist/compare/index.js.map +0 -1
- package/dist/core/commands/formatting-commands.cjs +0 -828
- package/dist/core/commands/formatting-commands.cjs.map +0 -1
- package/dist/core/commands/formatting-commands.d.cts +0 -63
- package/dist/core/commands/formatting-commands.d.ts +0 -63
- package/dist/core/commands/formatting-commands.js +0 -37
- package/dist/core/commands/formatting-commands.js.map +0 -1
- package/dist/core/commands/image-commands.cjs +0 -2023
- package/dist/core/commands/image-commands.cjs.map +0 -1
- package/dist/core/commands/image-commands.d.cts +0 -58
- package/dist/core/commands/image-commands.d.ts +0 -58
- package/dist/core/commands/image-commands.js +0 -18
- package/dist/core/commands/image-commands.js.map +0 -1
- package/dist/core/commands/section-layout-commands.cjs.map +0 -1
- package/dist/core/commands/section-layout-commands.d.cts +0 -62
- package/dist/core/commands/section-layout-commands.d.ts +0 -62
- package/dist/core/commands/section-layout-commands.js +0 -21
- package/dist/core/commands/section-layout-commands.js.map +0 -1
- package/dist/core/commands/style-commands.cjs.map +0 -1
- package/dist/core/commands/style-commands.d.cts +0 -13
- package/dist/core/commands/style-commands.d.ts +0 -13
- package/dist/core/commands/style-commands.js +0 -9
- package/dist/core/commands/style-commands.js.map +0 -1
- package/dist/core/commands/table-structure-commands.cjs +0 -1883
- package/dist/core/commands/table-structure-commands.cjs.map +0 -1
- package/dist/core/commands/table-structure-commands.d.cts +0 -59
- package/dist/core/commands/table-structure-commands.d.ts +0 -59
- package/dist/core/commands/table-structure-commands.js +0 -12
- package/dist/core/commands/table-structure-commands.js.map +0 -1
- package/dist/core/commands/text-commands.cjs +0 -2391
- package/dist/core/commands/text-commands.cjs.map +0 -1
- package/dist/core/commands/text-commands.d.cts +0 -24
- package/dist/core/commands/text-commands.d.ts +0 -24
- package/dist/core/commands/text-commands.js +0 -28
- package/dist/core/commands/text-commands.js.map +0 -1
- package/dist/core/selection/mapping.cjs +0 -200
- package/dist/core/selection/mapping.cjs.map +0 -1
- package/dist/core/selection/mapping.d.cts +0 -2
- package/dist/core/selection/mapping.d.ts +0 -2
- package/dist/core/selection/mapping.js +0 -31
- package/dist/core/selection/mapping.js.map +0 -1
- package/dist/core/state/editor-state.cjs +0 -2278
- package/dist/core/state/editor-state.cjs.map +0 -1
- package/dist/core/state/editor-state.d.cts +0 -2
- package/dist/core/state/editor-state.d.ts +0 -2
- package/dist/core/state/editor-state.js +0 -26
- package/dist/core/state/editor-state.js.map +0 -1
- package/dist/index.cjs +0 -38553
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -15
- package/dist/index.d.ts +0 -15
- package/dist/index.js +0 -7856
- package/dist/index.js.map +0 -1
- package/dist/io/docx-session.cjs +0 -16236
- package/dist/io/docx-session.cjs.map +0 -1
- package/dist/io/docx-session.d.cts +0 -21
- package/dist/io/docx-session.d.ts +0 -21
- package/dist/io/docx-session.js +0 -18
- package/dist/io/docx-session.js.map +0 -1
- package/dist/legal/index.cjs +0 -3900
- package/dist/legal/index.cjs.map +0 -1
- package/dist/legal/index.d.cts +0 -86
- package/dist/legal/index.d.ts +0 -86
- package/dist/legal/index.js +0 -616
- package/dist/legal/index.js.map +0 -1
- package/dist/public-types-7ZL_94cz.d.ts +0 -1573
- package/dist/public-types-CeMaDueh.d.cts +0 -1573
- package/dist/public-types.cjs +0 -19
- package/dist/public-types.cjs.map +0 -1
- package/dist/public-types.d.cts +0 -2
- package/dist/public-types.d.ts +0 -2
- package/dist/public-types.js +0 -1
- package/dist/public-types.js.map +0 -1
- package/dist/runtime/document-runtime.cjs +0 -11140
- package/dist/runtime/document-runtime.cjs.map +0 -1
- package/dist/runtime/document-runtime.d.cts +0 -231
- package/dist/runtime/document-runtime.d.ts +0 -231
- package/dist/runtime/document-runtime.js +0 -21
- package/dist/runtime/document-runtime.js.map +0 -1
- package/dist/structural-helpers-CilgOVhh.d.cts +0 -10
- package/dist/structural-helpers-q0Gd-eBN.d.ts +0 -10
- package/dist/ui-tailwind/editor-surface/search-plugin.cjs +0 -313
- package/dist/ui-tailwind/editor-surface/search-plugin.cjs.map +0 -1
- package/dist/ui-tailwind/editor-surface/search-plugin.d.cts +0 -67
- package/dist/ui-tailwind/editor-surface/search-plugin.d.ts +0 -67
- package/dist/ui-tailwind/editor-surface/search-plugin.js +0 -23
- package/dist/ui-tailwind/editor-surface/search-plugin.js.map +0 -1
- package/dist/ui-tailwind/index.cjs +0 -4833
- package/dist/ui-tailwind/index.cjs.map +0 -1
- package/dist/ui-tailwind/index.d.cts +0 -617
- package/dist/ui-tailwind/index.d.ts +0 -617
- package/dist/ui-tailwind/index.js +0 -575
- 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
|
+
}
|