@beyondwork/docx-react-component 1.0.66 → 1.0.69
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/README.md +75 -931
- package/package.json +26 -27
- package/src/api/anchor-conversion.ts +43 -0
- package/src/api/editor-state-types.ts +2 -1
- package/src/api/public-types.ts +504 -101
- package/src/api/session-state.ts +4 -0
- package/src/api/v3/README.md +91 -0
- package/src/api/v3/_create.ts +146 -0
- package/src/api/v3/_layer-metadata.ts +362 -0
- package/src/api/v3/_mocks.ts +84 -0
- package/src/api/v3/_runtime-handle.ts +162 -0
- package/src/api/v3/_ux-response.ts +73 -0
- package/src/api/v3/ai/_metadata-audit.ts +225 -0
- package/src/api/v3/ai/attach.ts +235 -0
- package/src/api/v3/ai/bundle.ts +132 -0
- package/src/api/v3/ai/explain.ts +144 -0
- package/src/api/v3/ai/export.ts +54 -0
- package/src/api/v3/ai/inspect.ts +118 -0
- package/src/api/v3/ai/policy.ts +77 -0
- package/src/api/v3/ai/replacement.ts +341 -0
- package/src/api/v3/ai/resolve.ts +133 -0
- package/src/api/v3/index.ts +79 -0
- package/src/api/v3/runtime/chart.ts +310 -0
- package/src/api/v3/runtime/clipboard.ts +81 -0
- package/src/api/v3/runtime/collab.ts +331 -0
- package/src/api/v3/runtime/content.ts +236 -0
- package/src/api/v3/runtime/document.ts +282 -0
- package/src/api/v3/runtime/formatting.ts +186 -0
- package/src/api/v3/runtime/geometry.ts +349 -0
- package/src/api/v3/runtime/layout.ts +108 -0
- package/src/api/v3/runtime/review.ts +129 -0
- package/src/api/v3/runtime/search.ts +74 -0
- package/src/api/v3/runtime/table.ts +63 -0
- package/src/api/v3/runtime/workflow.ts +434 -0
- package/src/api/v3/ui/_context.ts +86 -0
- package/src/api/v3/ui/_create.ts +65 -0
- package/src/api/v3/ui/_types.ts +520 -0
- package/src/api/v3/ui/chrome-composition.ts +342 -0
- package/src/{ui-tailwind/chrome → api/v3/ui}/chrome-preset-model.ts +11 -1
- package/src/api/v3/ui/chrome.ts +476 -0
- package/src/api/v3/ui/debug.ts +124 -0
- package/src/api/v3/ui/index.ts +64 -0
- package/src/api/v3/ui/overlays-visibility.ts +170 -0
- package/src/api/v3/ui/overlays.ts +427 -0
- package/src/api/v3/ui/scope.ts +71 -0
- package/src/api/v3/ui/session.ts +100 -0
- package/src/api/v3/ui/surface.ts +170 -0
- package/src/api/v3/ui/viewport.ts +303 -0
- package/src/core/commands/index.ts +28 -6
- package/src/core/commands/list-commands.ts +3 -2
- package/src/core/commands/section-layout-commands.ts +9 -8
- package/src/core/schema/text-schema.ts +16 -0
- package/src/core/selection/mapping.ts +33 -72
- package/src/core/state/editor-state.ts +96 -189
- package/src/index.ts +23 -4
- package/src/io/chart-preview-resolver.ts +1 -1
- package/src/io/docx-session.ts +36 -4795
- package/src/io/export/build-app-properties-xml.ts +1 -1
- package/src/io/export/serialize-comments.ts +1 -1
- package/src/io/export/serialize-headers-footers.ts +6 -1
- package/src/io/export/serialize-main-document.ts +45 -0
- package/src/io/export/serialize-run-formatting.ts +17 -2
- package/src/io/export/twip.ts +1 -1
- package/src/io/normalize/normalize-text.ts +27 -20
- package/src/io/ooxml/chart/parse-series.ts +1 -1
- package/src/io/ooxml/chart/resolve-color.ts +2 -2
- package/src/io/ooxml/chart/types.ts +1 -1
- package/src/io/ooxml/classify-embedding.ts +83 -33
- package/src/io/ooxml/parse-fill.ts +1 -1
- package/src/io/ooxml/parse-main-document.ts +71 -1
- package/src/io/ooxml/parse-object.ts +14 -10
- package/src/io/ooxml/parse-run-formatting.ts +47 -1
- package/src/io/ooxml/property-grab-bag.ts +2 -2
- package/src/io/ooxml/units.ts +11 -0
- package/src/io/ooxml/workflow-payload.ts +282 -7
- package/src/model/anchor.ts +85 -0
- package/src/model/canonical-document.ts +351 -15
- package/src/model/chart-types.ts +1 -1
- package/src/model/layout/index.ts +83 -0
- package/src/model/layout/page-graph-types.ts +181 -0
- package/src/model/layout/page-layout-snapshot.ts +105 -0
- package/src/model/layout/resolved-layout-types.ts +47 -0
- package/src/model/layout/runtime-page-graph-types.ts +102 -0
- package/src/model/paragraph-scope-ids.ts +72 -0
- package/src/model/review/comment-types.ts +112 -0
- package/src/model/review/index.ts +2 -0
- package/src/model/review/revision-types.ts +215 -0
- package/src/model/snapshot.ts +32 -0
- package/src/review/store/comment-store.ts +21 -47
- package/src/review/store/revision-types.ts +40 -198
- package/src/runtime/collab/base-doc-fingerprint.ts +6 -1
- package/src/runtime/collab/runtime-collab-sync.ts +13 -3
- package/src/runtime/collab-session.ts +1 -1
- package/src/runtime/debug/build-debug-inspector-snapshot.ts +686 -0
- package/src/runtime/debug/event-ring-buffer.ts +64 -0
- package/src/runtime/debug/probability-sampler.ts +18 -0
- package/src/runtime/debug/runtime-debug-facet.ts +67 -0
- package/src/runtime/debug/stage-tokens.ts +31 -0
- package/src/runtime/debug/telemetry-bus.ts +271 -0
- package/src/runtime/debug/types.ts +275 -0
- package/src/runtime/debug/wrap-ref-for-telemetry.ts +118 -0
- package/src/runtime/document-layout.ts +8 -6
- package/src/runtime/document-runtime.ts +843 -1141
- package/src/runtime/document-search.ts +1 -1
- package/src/runtime/edit-ops/index.ts +1 -1
- package/src/runtime/external-send-runtime.ts +1 -1
- package/src/runtime/formatting/document-lookup.ts +235 -0
- package/src/runtime/formatting/field/registry.ts +41 -0
- package/src/runtime/{field-resolver.ts → formatting/field/resolver.ts} +27 -2
- package/src/runtime/formatting/font-resolution.ts +83 -0
- package/src/runtime/formatting/formatting-context.ts +903 -0
- package/src/runtime/formatting/formatting-types.ts +157 -0
- package/src/runtime/{hyperlink-color-resolver.ts → formatting/hyperlink-color.ts} +2 -2
- package/src/runtime/formatting/index.ts +125 -0
- package/src/runtime/{resolved-numbering-geometry.ts → formatting/numbering/geometry.ts} +1 -1
- package/src/runtime/{numbering-prefix.ts → formatting/numbering/prefix.ts} +170 -3
- package/src/runtime/formatting/paragraph-style-resolver.ts +92 -0
- package/src/runtime/formatting/projector.ts +75 -0
- package/src/runtime/formatting/resolve-effective.ts +407 -0
- package/src/runtime/formatting/revision-display.ts +105 -0
- package/src/runtime/{paragraph-style-resolver.ts → formatting/style-cascade.ts} +84 -141
- package/src/runtime/{table-style-resolver.ts → formatting/table-style-resolver.ts} +1 -1
- package/src/runtime/formatting/telemetry-bridge.ts +106 -0
- package/src/runtime/{theme-color-resolver.ts → formatting/theme-color.ts} +2 -30
- package/src/runtime/geometry/caret-geometry.ts +164 -0
- package/src/runtime/geometry/geometry-facet.ts +364 -0
- package/src/runtime/geometry/geometry-types.ts +256 -0
- package/src/runtime/geometry/hit-test.ts +125 -0
- package/src/runtime/geometry/index.ts +71 -0
- package/src/runtime/geometry/inert-geometry-facet.ts +43 -0
- package/src/runtime/geometry/invalidation.ts +35 -0
- package/src/runtime/geometry/object-handles.ts +77 -0
- package/src/runtime/geometry/overlay-rects.ts +85 -0
- package/src/runtime/geometry/project-anchors.ts +100 -0
- package/src/runtime/geometry/project-fragments.ts +216 -0
- package/src/runtime/geometry/projector.ts +129 -0
- package/src/runtime/geometry/replacement-envelope.ts +130 -0
- package/src/runtime/geometry/viewport.ts +218 -0
- package/src/runtime/layout/compat-input-ledger.ts +211 -0
- package/src/runtime/layout/index.ts +6 -1
- package/src/runtime/layout/inert-layout-facet.ts +12 -7
- package/src/runtime/layout/layout-engine-instance.ts +189 -11
- package/src/runtime/layout/layout-engine-version.ts +450 -1
- package/src/runtime/layout/layout-facet-types.ts +60 -0
- package/src/runtime/layout/layout-measurement-provider.ts +13 -0
- package/src/runtime/layout/measurement-backend-canvas.ts +14 -2
- package/src/runtime/layout/measurement-backend-empirical.ts +23 -4
- package/src/runtime/layout/page-graph.ts +62 -209
- package/src/runtime/layout/page-story-resolver.ts +7 -12
- package/src/runtime/layout/paginated-layout-engine.ts +186 -11
- package/src/runtime/layout/project-block-fragments.ts +11 -0
- package/src/runtime/layout/projector.ts +90 -0
- package/src/runtime/layout/public-facet.ts +187 -442
- package/src/runtime/layout/resolved-formatting-state.ts +158 -26
- package/src/runtime/layout/table-render-plan.ts +1 -1
- package/src/runtime/prerender/cache-envelope.ts +6 -1
- package/src/runtime/prerender/prerender-document.ts +18 -23
- package/src/runtime/render/decoration-resolver.ts +1 -1
- package/src/runtime/render/render-frame-types.ts +20 -0
- package/src/runtime/render/render-kernel.ts +94 -25
- package/src/runtime/scopes/_formatting-seam.ts +262 -0
- package/src/runtime/scopes/_scope-dependencies.ts +49 -0
- package/src/runtime/scopes/action-validation.ts +356 -0
- package/src/runtime/scopes/attach-explanation.ts +102 -0
- package/src/runtime/scopes/audit-bundle.ts +71 -0
- package/src/runtime/scopes/compile-scope-bundle.ts +163 -0
- package/src/runtime/scopes/compile-scope.ts +262 -0
- package/src/runtime/scopes/compiler-service.ts +431 -0
- package/src/runtime/scopes/create-issue.ts +107 -0
- package/src/runtime/scopes/enumerate-scopes.ts +543 -0
- package/src/runtime/scopes/evidence.ts +233 -0
- package/src/runtime/scopes/index.ts +150 -0
- package/src/runtime/scopes/position-map.ts +214 -0
- package/src/runtime/scopes/preservation-boundary.ts +91 -0
- package/src/runtime/scopes/projector.ts +49 -0
- package/src/runtime/scopes/replaceability.ts +87 -0
- package/src/runtime/scopes/replacement/apply.ts +228 -0
- package/src/runtime/scopes/replacement/compile.ts +59 -0
- package/src/runtime/scopes/replacement/propose.ts +42 -0
- package/src/runtime/scopes/resolve-reference.ts +347 -0
- package/src/runtime/scopes/review-bundle.ts +141 -0
- package/src/runtime/scopes/scope-kinds/_paragraph-text.ts +57 -0
- package/src/runtime/scopes/scope-kinds/_table-text.ts +42 -0
- package/src/runtime/scopes/scope-kinds/comment-thread.ts +59 -0
- package/src/runtime/scopes/scope-kinds/field.ts +65 -0
- package/src/runtime/scopes/scope-kinds/heading.ts +84 -0
- package/src/runtime/scopes/scope-kinds/list-item.ts +77 -0
- package/src/runtime/scopes/scope-kinds/paragraph.ts +182 -0
- package/src/runtime/scopes/scope-kinds/revision.ts +62 -0
- package/src/runtime/scopes/scope-kinds/table-cell.ts +57 -0
- package/src/runtime/scopes/scope-kinds/table-row.ts +61 -0
- package/src/runtime/scopes/scope-kinds/table.ts +55 -0
- package/src/runtime/scopes/scope-range.ts +208 -0
- package/src/runtime/scopes/semantic-scope-types.ts +454 -0
- package/src/runtime/scopes/workflow-overlap.ts +92 -0
- package/src/runtime/selection/index.ts +1 -1
- package/src/runtime/structure-ops/fragment-insert.ts +1 -1
- package/src/runtime/structure-ops/index.ts +1 -1
- package/src/runtime/surface-projection.ts +232 -262
- package/src/runtime/units.ts +4 -2
- package/src/runtime/workflow/coordinator.ts +1348 -0
- package/src/runtime/workflow/derived-scope-resolver.ts +125 -0
- package/src/runtime/workflow/index.ts +25 -0
- package/src/runtime/workflow/markup-mode-policy.ts +98 -0
- package/src/runtime/{workflow-markup.ts → workflow/markup.ts} +6 -6
- package/src/runtime/workflow/metadata-persistence.ts +306 -0
- package/src/runtime/workflow/metadata-writer.ts +123 -0
- package/src/runtime/workflow/overlay-store.ts +690 -0
- package/src/runtime/workflow/projector.ts +127 -0
- package/src/runtime/{query-scopes.ts → workflow/query-scopes.ts} +3 -3
- package/src/runtime/{workflow-rail-segments.ts → workflow/rail/compose.ts} +60 -165
- package/src/runtime/workflow/rail/types.ts +198 -0
- package/src/runtime/workflow/scope-rail-composer.ts +39 -0
- package/src/runtime/{scope-resolver.ts → workflow/scope-resolver.ts} +3 -3
- package/src/runtime/workflow/scope-writer.ts +188 -0
- package/src/runtime/{tamper-gate.ts → workflow/tamper-gate.ts} +1 -1
- package/src/runtime/workflow/visibility-policy.ts +129 -0
- package/src/session/_sync-legacy.ts +66 -0
- package/src/session/export/embedded-reconstitute.ts +104 -0
- package/src/session/export/export-diagnostics.ts +85 -0
- package/src/session/export/export-validation.ts +110 -0
- package/src/session/export/index.ts +34 -0
- package/src/session/export/preservation-reattach.ts +30 -0
- package/src/session/export/serialize-dispatch.ts +165 -0
- package/src/session/export/stateful-export-pipeline.ts +432 -0
- package/src/session/export/stateful-export.ts +684 -0
- package/src/session/import/canonical-assembly.ts +227 -0
- package/src/session/import/diagnostics-session.ts +54 -0
- package/src/session/import/embedded-discovery.ts +225 -0
- package/src/session/import/embedded-offload.ts +337 -0
- package/src/session/import/import-diagnostics.ts +69 -0
- package/src/session/import/loader-types.ts +313 -0
- package/src/session/import/loader.ts +1834 -0
- package/src/session/import/normalize.ts +195 -0
- package/src/session/import/package-parts.ts +217 -0
- package/src/session/import/package-read.ts +195 -0
- package/src/session/import/parse-orchestration.ts +105 -0
- package/src/session/import/part-constants.ts +70 -0
- package/src/session/import/part-discovery.ts +94 -0
- package/src/session/import/preservation-index.ts +46 -0
- package/src/{runtime/read-only-diagnostics-runtime.ts → session/import/read-only-diagnostics.ts} +24 -3
- package/src/session/import/review-import.ts +508 -0
- package/src/session/import/styles-consolidation.ts +281 -0
- package/src/session/import/workflow-scope-import.ts +256 -0
- package/src/session/index.ts +37 -0
- package/src/session/session-state.ts +69 -0
- package/src/session/session.ts +532 -0
- package/src/session/shared/protection.ts +228 -0
- package/src/session/shared/session-utils.ts +82 -0
- package/src/session/types.ts +499 -0
- package/src/shell/chart-snapshots.ts +96 -0
- package/src/shell/media-previews.ts +85 -0
- package/src/shell/overlay-anchor-bridge.ts +53 -0
- package/src/shell/paste-adapter.ts +23 -0
- package/src/shell/ref-commands.ts +1697 -0
- package/src/shell/ref-utilities.ts +48 -0
- package/src/shell/search.ts +51 -0
- package/src/{ui/editor-runtime-boundary.ts → shell/session-bootstrap.ts} +243 -67
- package/src/shell/ui-subscriber-channels.ts +81 -0
- package/src/shell/use-collab-sync.ts +116 -0
- package/src/ui/WordReviewEditor.tsx +496 -2051
- package/src/ui/editor-shell-view.tsx +30 -1
- package/src/ui/editor-surface-controller.tsx +49 -1
- package/src/ui/headless/revision-decoration-model.ts +83 -0
- package/src/{ui-tailwind/chrome → ui/headless}/role-action-sets.ts +1 -1
- package/src/ui/headless/scoped-chrome-policy.ts +2 -2
- package/src/ui/headless/selection-tool-context.ts +1 -1
- package/src/ui/headless/selection-tool-resolver.ts +1 -1
- package/src/ui/runtime-shortcut-dispatch.ts +46 -1
- package/src/ui/ui-controller-factory.ts +221 -0
- package/src/ui-tailwind/chart/ChartSurface.tsx +2 -2
- package/src/ui-tailwind/chart/layout/legend-layout.ts +1 -1
- package/src/ui-tailwind/chart/layout/plot-area.ts +2 -2
- package/src/ui-tailwind/chart/layout/title-layout.ts +1 -1
- package/src/ui-tailwind/chart/render/area.tsx +3 -3
- package/src/ui-tailwind/chart/render/bar-column.tsx +3 -3
- package/src/ui-tailwind/chart/render/bubble.tsx +3 -3
- package/src/ui-tailwind/chart/render/combo.tsx +2 -2
- package/src/ui-tailwind/chart/render/data-labels.tsx +2 -2
- package/src/ui-tailwind/chart/render/font-metrics.ts +2 -2
- package/src/ui-tailwind/chart/render/line.tsx +3 -3
- package/src/ui-tailwind/chart/render/pie.tsx +6 -6
- package/src/ui-tailwind/chart/render/scatter.tsx +3 -3
- package/src/ui-tailwind/chart/render/svg-primitives.ts +3 -3
- package/src/ui-tailwind/chart/render/unsupported.tsx +2 -2
- package/src/ui-tailwind/chrome/build-context-menu-entries.ts +88 -0
- package/src/ui-tailwind/chrome/chrome-preset-toolbar.tsx +1 -1
- package/src/ui-tailwind/chrome/collab-send-to-supplier-button.tsx +1 -1
- package/src/ui-tailwind/chrome/collab-tamper-banner.tsx +1 -1
- package/src/ui-tailwind/chrome/collab-top-nav-container.tsx +1 -1
- package/src/ui-tailwind/chrome/editor-action-registry.ts +553 -0
- package/src/ui-tailwind/chrome/editor-actions-to-palette.ts +182 -0
- package/src/ui-tailwind/chrome/local-surface-arbiter.ts +534 -0
- package/src/ui-tailwind/chrome/resolve-target-kind.ts +226 -0
- package/src/ui-tailwind/chrome/tw-alert-banner.tsx +38 -4
- package/src/ui-tailwind/chrome/tw-context-band.tsx +125 -0
- package/src/ui-tailwind/chrome/tw-context-menu-portal.tsx +248 -0
- package/src/ui-tailwind/chrome/tw-image-context-toolbar.tsx +42 -1
- package/src/ui-tailwind/chrome/tw-selection-anchor-resolver.ts +8 -7
- package/src/ui-tailwind/chrome/tw-selection-tool-blocked.tsx +38 -4
- package/src/ui-tailwind/chrome/tw-selection-tool-comment.tsx +104 -6
- package/src/ui-tailwind/chrome/tw-selection-tool-host.tsx +66 -7
- package/src/ui-tailwind/chrome/tw-selection-tool-workflow.tsx +54 -8
- package/src/ui-tailwind/chrome/tw-shortcut-hint.tsx +7 -1
- package/src/ui-tailwind/chrome/tw-suggestion-card.tsx +33 -0
- package/src/ui-tailwind/chrome/tw-table-context-toolbar.tsx +78 -1
- package/src/ui-tailwind/chrome/tw-table-grip-layer.tsx +16 -8
- package/src/ui-tailwind/chrome/tw-workspace-chrome-host.tsx +276 -0
- package/src/ui-tailwind/chrome/use-context-menu-controller.ts +201 -0
- package/src/ui-tailwind/chrome-overlay/chrome-overlay-projector.ts +1 -1
- package/src/ui-tailwind/chrome-overlay/tw-chrome-overlay.tsx +22 -4
- package/src/ui-tailwind/chrome-overlay/tw-comment-balloon-layer.tsx +1 -1
- package/src/ui-tailwind/chrome-overlay/tw-locked-block-layer.tsx +1 -1
- package/src/ui-tailwind/chrome-overlay/tw-object-selection-overlay.tsx +11 -5
- package/src/ui-tailwind/chrome-overlay/tw-page-stack-overlay-layer.tsx +197 -3
- package/src/ui-tailwind/chrome-overlay/tw-revision-margin-bar-layer.tsx +1 -1
- package/src/ui-tailwind/chrome-overlay/tw-scope-card-layer.tsx +35 -6
- package/src/ui-tailwind/chrome-overlay/tw-scope-rail-layer.tsx +24 -16
- package/src/ui-tailwind/chrome-overlay/tw-table-continuation-header.tsx +1 -1
- package/src/ui-tailwind/debug/README.md +57 -0
- package/src/ui-tailwind/debug/index.ts +3 -0
- package/src/ui-tailwind/debug/tw-debug-overlay.tsx +186 -0
- package/src/ui-tailwind/debug/tw-debug-presentation.tsx +80 -0
- package/src/ui-tailwind/debug/tw-debug-top-bar.tsx +83 -0
- package/src/ui-tailwind/editor-surface/chart-node-view.tsx +2 -2
- package/src/ui-tailwind/editor-surface/float-wrap-resolver.ts +1 -1
- package/src/ui-tailwind/editor-surface/pm-command-bridge.ts +135 -10
- package/src/ui-tailwind/editor-surface/pm-decorations.ts +40 -13
- package/src/ui-tailwind/editor-surface/pm-page-break-decorations.ts +1 -1
- package/src/ui-tailwind/editor-surface/pm-schema.ts +1 -1
- package/src/ui-tailwind/editor-surface/pm-state-from-snapshot.ts +3 -3
- package/src/ui-tailwind/editor-surface/predicted-tag-preflight.ts +1 -1
- package/src/ui-tailwind/editor-surface/remote-cursor-plugin.ts +2 -2
- package/src/ui-tailwind/editor-surface/scroll-anchor.ts +91 -9
- package/src/ui-tailwind/editor-surface/shape-renderer.ts +1 -1
- package/src/ui-tailwind/editor-surface/surface-layer.ts +1 -1
- package/src/ui-tailwind/editor-surface/tw-opaque-block.tsx +1 -1
- package/src/ui-tailwind/editor-surface/tw-page-block-view.helpers.ts +23 -6
- package/src/ui-tailwind/editor-surface/tw-prosemirror-surface.tsx +132 -22
- package/src/ui-tailwind/editor-surface/tw-table-node-view.tsx +1 -1
- package/src/ui-tailwind/index.ts +0 -5
- package/src/ui-tailwind/overlay-anchor-bridge-context.tsx +33 -0
- package/src/ui-tailwind/page-stack/floating-image-overlay-model.ts +66 -29
- package/src/ui-tailwind/page-stack/tw-floating-image-layer.tsx +25 -2
- package/src/ui-tailwind/review/comment-markdown-renderer.tsx +15 -0
- package/src/ui-tailwind/review/tw-review-rail.tsx +92 -4
- package/src/ui-tailwind/review/tw-workflow-tab.tsx +1 -1
- package/src/ui-tailwind/review-workspace/page-chrome.ts +210 -0
- package/src/ui-tailwind/review-workspace/page-shell-metrics.ts +101 -0
- package/src/ui-tailwind/review-workspace/paragraph-layout.ts +115 -0
- package/src/ui-tailwind/review-workspace/selection-toolbar-placement.ts +97 -0
- package/src/ui-tailwind/review-workspace/tw-review-workspace-navigator.tsx +130 -0
- package/src/ui-tailwind/review-workspace/tw-review-workspace-page-toolbar.tsx +240 -0
- package/src/ui-tailwind/review-workspace/tw-review-workspace-rail.tsx +59 -0
- package/src/ui-tailwind/review-workspace/types.ts +408 -0
- package/src/ui-tailwind/review-workspace/use-chrome-policy.ts +104 -0
- package/src/ui-tailwind/review-workspace/use-derived-view-state.ts +151 -0
- package/src/ui-tailwind/review-workspace/use-diagnostics-signal.ts +70 -0
- package/src/ui-tailwind/review-workspace/use-grabbed-segment-offsets.ts +40 -0
- package/src/ui-tailwind/review-workspace/use-layout-facet-render-signal.ts +55 -0
- package/src/ui-tailwind/review-workspace/use-page-markers.ts +130 -0
- package/src/ui-tailwind/review-workspace/use-pm-surface-capture.ts +60 -0
- package/src/ui-tailwind/review-workspace/use-review-rail-state.ts +63 -0
- package/src/ui-tailwind/review-workspace/use-scope-card-state.ts +170 -0
- package/src/ui-tailwind/review-workspace/use-scroll-root-capture.ts +28 -0
- package/src/ui-tailwind/review-workspace/use-selection-toolbar-placement.ts +113 -0
- package/src/ui-tailwind/review-workspace/use-shell-selection-anchor-bridge.ts +120 -0
- package/src/ui-tailwind/review-workspace/use-status-bar-page-facts.ts +55 -0
- package/src/ui-tailwind/review-workspace/use-viewport-dimensions.ts +43 -0
- package/src/ui-tailwind/review-workspace/use-workspace-arbiter.ts +25 -0
- package/src/ui-tailwind/review-workspace/use-workspace-composition.ts +86 -0
- package/src/ui-tailwind/review-workspace/use-workspace-side-effects.ts +150 -0
- package/src/ui-tailwind/theme/editor-theme.css +25 -0
- package/src/ui-tailwind/toolbar/tw-role-action-region.tsx +2 -2
- package/src/ui-tailwind/toolbar/tw-toolbar.tsx +61 -98
- package/src/ui-tailwind/tw-review-workspace.tsx +521 -1802
- package/src/ui-tailwind/ui-api-context.tsx +43 -0
- package/src/ui-tailwind/ui-shell-channels-context.tsx +49 -0
- package/src/validation/compatibility-engine.ts +6 -6
- package/src/runtime/styles-cascade.ts +0 -33
- package/src/ui-tailwind/chrome/tw-mode-dock.tsx +0 -85
- /package/src/runtime/{page-number-format.ts → formatting/field/page-number-format.ts} +0 -0
- /package/src/runtime/{ai-action-policy.ts → workflow/ai-action-policy.ts} +0 -0
- /package/src/runtime/{scope-tag-registry.ts → workflow/scope-tag-registry.ts} +0 -0
package/src/model/snapshot.ts
CHANGED
|
@@ -159,6 +159,34 @@ export interface PersistedWorkflowOverlay {
|
|
|
159
159
|
activeWorkItemId?: string | null;
|
|
160
160
|
}
|
|
161
161
|
|
|
162
|
+
/**
|
|
163
|
+
* W10 — class-A overlay-visibility policies persisted alongside the
|
|
164
|
+
* session state. Optional; absent arrays on older documents read as
|
|
165
|
+
* "no authored policy."
|
|
166
|
+
*/
|
|
167
|
+
export interface PersistedOverlayVisibilityPolicy {
|
|
168
|
+
readonly kind:
|
|
169
|
+
| "scope-rail"
|
|
170
|
+
| "comments"
|
|
171
|
+
| "tracked-changes"
|
|
172
|
+
| "suggestions"
|
|
173
|
+
| "debug-panel"
|
|
174
|
+
| "presence";
|
|
175
|
+
readonly enforcement: "authored-default" | "always" | "never";
|
|
176
|
+
readonly defaultOn: boolean;
|
|
177
|
+
readonly authoredBy?: { readonly actorId: string; readonly at: string };
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* X5 — class-A markup-mode policy (single record). Mirrors
|
|
182
|
+
* `PersistedOverlayVisibilityPolicy` shape but single-value.
|
|
183
|
+
*/
|
|
184
|
+
export interface PersistedMarkupModePolicy {
|
|
185
|
+
readonly mode: "clean" | "simple" | "all";
|
|
186
|
+
readonly enforcement: "authored-default" | "always";
|
|
187
|
+
readonly authoredBy?: { readonly actorId: string; readonly at: string };
|
|
188
|
+
}
|
|
189
|
+
|
|
162
190
|
export interface PersistedEditorSnapshot {
|
|
163
191
|
snapshotVersion: PersistedEditorSnapshotVersion;
|
|
164
192
|
schemaVersion: typeof CDS_SCHEMA_VERSION;
|
|
@@ -175,6 +203,8 @@ export interface PersistedEditorSnapshot {
|
|
|
175
203
|
sourcePackage?: PersistedSourcePackage;
|
|
176
204
|
workflowOverlay?: PersistedWorkflowOverlay;
|
|
177
205
|
workflowMetadata?: PersistedWorkflowMetadataSnapshot;
|
|
206
|
+
visibilityPolicies?: readonly PersistedOverlayVisibilityPolicy[];
|
|
207
|
+
markupModePolicy?: PersistedMarkupModePolicy;
|
|
178
208
|
}
|
|
179
209
|
|
|
180
210
|
const SNAPSHOT_REQUIRED_TOP_LEVEL_KEYS = [
|
|
@@ -196,6 +226,8 @@ const SNAPSHOT_OPTIONAL_TOP_LEVEL_KEYS = [
|
|
|
196
226
|
"protectionSnapshot",
|
|
197
227
|
"workflowOverlay",
|
|
198
228
|
"workflowMetadata",
|
|
229
|
+
"visibilityPolicies",
|
|
230
|
+
"markupModePolicy",
|
|
199
231
|
] as const;
|
|
200
232
|
|
|
201
233
|
export interface ProtectionRangeRecord {
|
|
@@ -6,53 +6,27 @@ import {
|
|
|
6
6
|
type CommentAnchor,
|
|
7
7
|
} from "./comment-anchors.ts";
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
export type CommentThreadStatus = "open" | "resolved" | "detached";
|
|
31
|
-
|
|
32
|
-
export interface CommentThread {
|
|
33
|
-
commentId: string;
|
|
34
|
-
anchor: CommentAnchor;
|
|
35
|
-
status: CommentThreadStatus;
|
|
36
|
-
entries: CommentEntry[];
|
|
37
|
-
createdBy: string;
|
|
38
|
-
createdAt: string;
|
|
39
|
-
resolution?: CommentResolution;
|
|
40
|
-
warningIds: string[];
|
|
41
|
-
metadata?: CommentThreadMetadata;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export interface CommentThreadMetadata {
|
|
45
|
-
source?: "runtime" | "import";
|
|
46
|
-
rootOoxmlCommentId?: string;
|
|
47
|
-
rootParaId?: string;
|
|
48
|
-
detachedReason?: "incomplete-markers" | "multi-paragraph" | "opaque-region" | "revision-overlap";
|
|
49
|
-
actionabilityNote?: string;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export interface CommentStore {
|
|
53
|
-
version: "comment-store/1";
|
|
54
|
-
threads: Record<string, CommentThread>;
|
|
55
|
-
}
|
|
9
|
+
// Type definitions now live at src/model/review/comment-types.ts so the
|
|
10
|
+
// session layer can consume them without importing from src/review/**.
|
|
11
|
+
// Store operations (construct/upsert/resolve/remap/project) remain here
|
|
12
|
+
// — those are runtime-state concerns, not model shapes.
|
|
13
|
+
export type {
|
|
14
|
+
CommentEntry,
|
|
15
|
+
CommentEntryMetadata,
|
|
16
|
+
CommentResolution,
|
|
17
|
+
CommentStore,
|
|
18
|
+
CommentThread,
|
|
19
|
+
CommentThreadMetadata,
|
|
20
|
+
CommentThreadStatus,
|
|
21
|
+
} from "../../model/review/comment-types.ts";
|
|
22
|
+
|
|
23
|
+
import type {
|
|
24
|
+
CommentEntry,
|
|
25
|
+
CommentStore,
|
|
26
|
+
CommentThread,
|
|
27
|
+
CommentThreadMetadata,
|
|
28
|
+
CommentThreadStatus,
|
|
29
|
+
} from "../../model/review/comment-types.ts";
|
|
56
30
|
|
|
57
31
|
export interface CreateCommentThreadParams {
|
|
58
32
|
commentId: string;
|
|
@@ -1,3 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Back-compat shim — every type that used to live here has moved to
|
|
3
|
+
* `src/model/review/revision-types.ts` so the session layer can consume
|
|
4
|
+
* revision records without importing from `src/review/**`. Existing
|
|
5
|
+
* call-sites (~25 in-tree) continue to work via the re-exports below.
|
|
6
|
+
*
|
|
7
|
+
* The anchor-constructor / remap helpers stay here: they depend on the
|
|
8
|
+
* mapping machinery in `src/core/selection/mapping.ts` and are not pure
|
|
9
|
+
* data concerns.
|
|
10
|
+
*/
|
|
11
|
+
|
|
1
12
|
import {
|
|
2
13
|
createNodeAnchor,
|
|
3
14
|
createRangeAnchor,
|
|
@@ -5,134 +16,38 @@ import {
|
|
|
5
16
|
normalizeRange,
|
|
6
17
|
type Assoc,
|
|
7
18
|
type BoundaryAssoc,
|
|
8
|
-
type DocRange,
|
|
9
|
-
type EditorAnchorProjection,
|
|
10
19
|
type TransactionMapping,
|
|
11
20
|
} from "../../core/selection/mapping.ts";
|
|
12
|
-
import type { RevisionStoryTargetRecord } from "../../model/canonical-document.ts";
|
|
13
|
-
|
|
14
|
-
export type RevisionAnchor = EditorAnchorProjection;
|
|
15
|
-
|
|
16
|
-
export type SupportedRevisionKind = "insertion" | "deletion" | "property-change";
|
|
17
|
-
export type PreserveOnlyRevisionKind = "formatting" | "move";
|
|
18
|
-
export type RevisionKind = SupportedRevisionKind | PreserveOnlyRevisionKind;
|
|
19
|
-
|
|
20
|
-
export type RevisionStatus = "active" | "accepted" | "rejected" | "detached";
|
|
21
|
-
export type RevisionActionability = "actionable" | "preserve-only";
|
|
22
|
-
export type RevisionAnchorState = "active" | "detached";
|
|
23
|
-
|
|
24
|
-
export interface PropertyChangeData {
|
|
25
|
-
xmlTag: "pPrChange" | "sectPrChange" | "tblPrChange" | "rPrChange";
|
|
26
|
-
beforeXml: string;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export interface MoveData {
|
|
30
|
-
moveId: string;
|
|
31
|
-
direction: "from" | "to";
|
|
32
|
-
linkedRevisionId?: string;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Payload for `w:cellMerge` revisions. `direction` is the `w:vMerge`
|
|
37
|
-
* attribute on the marker:
|
|
38
|
-
* `"rest"` — this cell begins a vertical merge span (restart cell).
|
|
39
|
-
* `"cont"` — this cell continues a vertical merge span.
|
|
40
|
-
*
|
|
41
|
-
* Accept commits `TableCellNode.verticalMerge` to the matching state;
|
|
42
|
-
* reject clears `verticalMerge` to undefined. No row topology changes
|
|
43
|
-
* (mirrors LibreOffice's treatment — vMerge is a rendering property, not
|
|
44
|
-
* a structural mutation).
|
|
45
|
-
*/
|
|
46
|
-
export interface CellMergeData {
|
|
47
|
-
direction: "rest" | "cont";
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Ordinal coordinates of a structural table revision within the canonical
|
|
52
|
-
* document tree.
|
|
53
|
-
*
|
|
54
|
-
* Lane 7b row-insertion revisions (`<w:trPr><w:ins/></w:trPr>`) point at an
|
|
55
|
-
* entire row, not a text range — the runtime anchor position alone can't
|
|
56
|
-
* identify which row to remove on reject. This envelope carries the table's
|
|
57
|
-
* ordinal (the Nth `<w:tbl>` in the body) and the row's index within that
|
|
58
|
-
* table, both fixed at parse time. Accept/reject resolves these to a
|
|
59
|
-
* canonical-document `tableBlockIndex` by walking `doc.content.children[]`
|
|
60
|
-
* at action time.
|
|
61
|
-
*/
|
|
62
|
-
export interface TableRevisionCoordinates {
|
|
63
|
-
tableOrdinal: number;
|
|
64
|
-
rowIndex: number;
|
|
65
|
-
/**
|
|
66
|
-
* Cell index within `row.cells[]`. Present on cell-level structural
|
|
67
|
-
* revisions (`cellIns` / `cellDel` / `cellMerge`); `undefined` on
|
|
68
|
-
* row-level records (`row-ins` / `row-del`).
|
|
69
|
-
*/
|
|
70
|
-
cellIndex?: number;
|
|
71
|
-
/**
|
|
72
|
-
* For revisions inside nested tables (a `<w:tbl>` inside a cell), this
|
|
73
|
-
* carries the full ordinal path so `resolveCanonicalTableRow` can
|
|
74
|
-
* tree-walk the canonical document:
|
|
75
|
-
* `[bodyTableOrdinal, nestedTableIndex, ...]`
|
|
76
|
-
* Body-level revisions omit this field and use the flat `tableOrdinal`.
|
|
77
|
-
* Lane 7b Phase Q.
|
|
78
|
-
*/
|
|
79
|
-
tableOrdinalPath?: readonly number[];
|
|
80
|
-
}
|
|
81
21
|
|
|
82
|
-
export
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
kind: "property-change";
|
|
112
|
-
metadata: RevisionMetadataEnvelope & { propertyChangeData: PropertyChangeData };
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
export type MoveRevision = RevisionRecord & {
|
|
116
|
-
kind: "move";
|
|
117
|
-
metadata: RevisionMetadataEnvelope & { moveData: MoveData };
|
|
118
|
-
};
|
|
119
|
-
|
|
120
|
-
export interface RevisionRecord {
|
|
121
|
-
revisionId: string;
|
|
122
|
-
kind: RevisionKind;
|
|
123
|
-
anchor: RevisionAnchor;
|
|
124
|
-
authorId: string;
|
|
125
|
-
createdAt: string;
|
|
126
|
-
status: RevisionStatus;
|
|
127
|
-
warningIds: string[];
|
|
128
|
-
metadata: RevisionMetadataEnvelope;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
export interface RevisionAnchorSummary {
|
|
132
|
-
anchor: RevisionAnchor;
|
|
133
|
-
state: RevisionAnchorState;
|
|
134
|
-
range: DocRange;
|
|
135
|
-
}
|
|
22
|
+
export type {
|
|
23
|
+
CellMergeData,
|
|
24
|
+
MoveData,
|
|
25
|
+
MoveRevision,
|
|
26
|
+
PreserveOnlyRevisionKind,
|
|
27
|
+
PropertyChangeData,
|
|
28
|
+
PropertyChangeRevision,
|
|
29
|
+
RevisionActionability,
|
|
30
|
+
RevisionAnchor,
|
|
31
|
+
RevisionAnchorState,
|
|
32
|
+
RevisionAnchorSummary,
|
|
33
|
+
RevisionKind,
|
|
34
|
+
RevisionMetadataEnvelope,
|
|
35
|
+
RevisionRecord,
|
|
36
|
+
RevisionStatus,
|
|
37
|
+
SupportedRevisionKind,
|
|
38
|
+
TableRevisionCoordinates,
|
|
39
|
+
} from "../../model/review/revision-types.ts";
|
|
40
|
+
|
|
41
|
+
export {
|
|
42
|
+
describeRevisionKind,
|
|
43
|
+
getRevisionActionability,
|
|
44
|
+
isRevisionActionable,
|
|
45
|
+
} from "../../model/review/revision-types.ts";
|
|
46
|
+
|
|
47
|
+
import type {
|
|
48
|
+
RevisionAnchor,
|
|
49
|
+
RevisionAnchorSummary,
|
|
50
|
+
} from "../../model/review/revision-types.ts";
|
|
136
51
|
|
|
137
52
|
export function createRevisionRangeAnchor(
|
|
138
53
|
from: number,
|
|
@@ -183,76 +98,3 @@ export function summarizeRevisionAnchor(anchor: RevisionAnchor): RevisionAnchorS
|
|
|
183
98
|
range: normalizeRange(anchor.lastKnownRange),
|
|
184
99
|
};
|
|
185
100
|
}
|
|
186
|
-
|
|
187
|
-
export function getRevisionActionability(
|
|
188
|
-
revision:
|
|
189
|
-
| RevisionKind
|
|
190
|
-
| Pick<RevisionRecord, "kind" | "metadata">,
|
|
191
|
-
): RevisionActionability {
|
|
192
|
-
// Lane 7b promotions run BEFORE the preserveOnlyReason check on purpose:
|
|
193
|
-
// `createRevisionRecord` injects a default "Imported preserve-only revision."
|
|
194
|
-
// reason for any kind that `getRevisionActionability(kind)` returns as
|
|
195
|
-
// preserve-only (see revision-store.ts), which covers both `kind: "move"`
|
|
196
|
-
// and `kind: "formatting"`. The overrides below flip the default back to
|
|
197
|
-
// actionable for the specific shapes that Lane 7b promoted: cellIns
|
|
198
|
-
// structural-table revisions, and linked-pair move revisions. Do not add a
|
|
199
|
-
// `&& !preserveOnlyReason` guard here — that would re-lock these shapes
|
|
200
|
-
// against the injected default and regress 7b.
|
|
201
|
-
if (
|
|
202
|
-
typeof revision !== "string" &&
|
|
203
|
-
(revision.metadata.originalRevisionType === "cellIns" ||
|
|
204
|
-
revision.metadata.originalRevisionType === "cellDel" ||
|
|
205
|
-
revision.metadata.originalRevisionType === "cellMerge")
|
|
206
|
-
) {
|
|
207
|
-
return "actionable";
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
if (
|
|
211
|
-
typeof revision !== "string" &&
|
|
212
|
-
revision.kind === "move" &&
|
|
213
|
-
typeof revision.metadata.moveData?.linkedRevisionId === "string" &&
|
|
214
|
-
revision.metadata.moveData.linkedRevisionId.length > 0
|
|
215
|
-
) {
|
|
216
|
-
return "actionable";
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
if (
|
|
220
|
-
typeof revision !== "string" &&
|
|
221
|
-
typeof revision.metadata.preserveOnlyReason === "string" &&
|
|
222
|
-
revision.metadata.preserveOnlyReason.length > 0
|
|
223
|
-
) {
|
|
224
|
-
return "preserve-only";
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
const kind = typeof revision === "string" ? revision : revision.kind;
|
|
228
|
-
switch (kind) {
|
|
229
|
-
case "insertion":
|
|
230
|
-
case "deletion":
|
|
231
|
-
case "property-change":
|
|
232
|
-
return "actionable";
|
|
233
|
-
case "formatting":
|
|
234
|
-
case "move":
|
|
235
|
-
return "preserve-only";
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
export function isRevisionActionable(
|
|
240
|
-
record: Pick<RevisionRecord, "kind" | "metadata" | "status">,
|
|
241
|
-
): boolean {
|
|
242
|
-
return getRevisionActionability(record) === "actionable" && record.status === "active";
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
export function describeRevisionKind(kind: RevisionKind): string {
|
|
246
|
-
switch (kind) {
|
|
247
|
-
case "insertion":
|
|
248
|
-
return "Insertion";
|
|
249
|
-
case "deletion":
|
|
250
|
-
return "Deletion";
|
|
251
|
-
case "formatting":
|
|
252
|
-
return "Formatting change";
|
|
253
|
-
case "move":
|
|
254
|
-
return "Move";
|
|
255
|
-
case "property-change":
|
|
256
|
-
return "Property change";
|
|
257
|
-
}
|
|
258
|
-
}
|
|
@@ -20,11 +20,13 @@ import { sha256Hex } from "../../io/source-package-provenance.ts";
|
|
|
20
20
|
* | `media` | yes | embedded media are base content |
|
|
21
21
|
* | `content` | yes | the editable body tree |
|
|
22
22
|
* | `preservation` | yes | opaque fragments round-trip identically from the source |
|
|
23
|
+
* | `subParts` | yes | headers/footers/footnotes/theme are base content |
|
|
24
|
+
* | `fieldRegistry` | yes | deterministic from `{content, styles, subParts}` — see `buildFieldRegistry` |
|
|
25
|
+
* | `fontTable` | yes | fontTable.xml is base content |
|
|
23
26
|
* | `docId` | **no** | session-local |
|
|
24
27
|
* | `createdAt` / `updatedAt` | **no** | session-local timestamps |
|
|
25
28
|
* | `review` | **no** | tracked changes are session state |
|
|
26
29
|
* | `diagnostics` | **no** | validator output is session state |
|
|
27
|
-
* | `subParts` / `fieldRegistry` | **no** | may be partially session-computed |
|
|
28
30
|
*
|
|
29
31
|
* Hash pipeline: the subset is serialized via {@link stableStringify}
|
|
30
32
|
* (sorts object keys recursively, preserves array order, follows
|
|
@@ -44,6 +46,9 @@ export function computeBaseDocFingerprint(envelope: CanonicalDocumentEnvelope):
|
|
|
44
46
|
media: envelope.media,
|
|
45
47
|
content: envelope.content,
|
|
46
48
|
preservation: envelope.preservation,
|
|
49
|
+
subParts: envelope.subParts,
|
|
50
|
+
fieldRegistry: envelope.fieldRegistry,
|
|
51
|
+
fontTable: envelope.fontTable,
|
|
47
52
|
};
|
|
48
53
|
const serialized = stableStringify(subset);
|
|
49
54
|
const bytes = new TextEncoder().encode(serialized);
|
|
@@ -7,7 +7,10 @@ import type {
|
|
|
7
7
|
EditorTransaction,
|
|
8
8
|
} from "../../core/commands/index.ts";
|
|
9
9
|
import type { CanonicalDocumentEnvelope } from "../../core/state/editor-state.ts";
|
|
10
|
-
import type {
|
|
10
|
+
import type {
|
|
11
|
+
BlockNode,
|
|
12
|
+
MutableCanonicalDocument,
|
|
13
|
+
} from "../../model/canonical-document.ts";
|
|
11
14
|
import type {
|
|
12
15
|
CommandAppliedMeta,
|
|
13
16
|
DocumentRuntime,
|
|
@@ -82,12 +85,19 @@ export function compressDocumentReplaceForBroadcast(
|
|
|
82
85
|
return command;
|
|
83
86
|
}
|
|
84
87
|
|
|
85
|
-
const patch: Partial<
|
|
88
|
+
const patch: Partial<MutableCanonicalDocument> = {};
|
|
86
89
|
let anyTopLevelChange = false;
|
|
90
|
+
const assignPatch = <K extends keyof MutableCanonicalDocument>(
|
|
91
|
+
target: Partial<MutableCanonicalDocument>,
|
|
92
|
+
key: K,
|
|
93
|
+
value: MutableCanonicalDocument[K],
|
|
94
|
+
): void => {
|
|
95
|
+
target[key] = value;
|
|
96
|
+
};
|
|
87
97
|
for (const key of PATCHABLE_TOP_LEVEL_KEYS) {
|
|
88
98
|
if (key === "content") continue;
|
|
89
99
|
if (next[key] !== priorDocument[key]) {
|
|
90
|
-
(patch
|
|
100
|
+
assignPatch(patch, key, next[key] as MutableCanonicalDocument[typeof key]);
|
|
91
101
|
anyTopLevelChange = true;
|
|
92
102
|
}
|
|
93
103
|
}
|