@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
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* resolveChromeComposition — canonical chrome-composition seam (layer 10, §U5.b).
|
|
3
|
+
*
|
|
4
|
+
* Relocated from `src/ui-tailwind/chrome/chrome-composition-model.ts` by
|
|
5
|
+
* refactor/10 Slice 8 so the UI API owns chrome composition end-to-end
|
|
6
|
+
* (architecture 10 §U5). `ui.chrome.getComposition(input)` wraps this
|
|
7
|
+
* function in refactor/10 Slice 9. A re-export shim remains at the old
|
|
8
|
+
* path during consumer migration.
|
|
9
|
+
*
|
|
10
|
+
* Normative references:
|
|
11
|
+
* - docs/reference/designsystem.md §2.3 (chrome hierarchy: Shell / Workspace /
|
|
12
|
+
* Local context / Management rail)
|
|
13
|
+
* - docs/reference/designsystem.md §8.3 (three-axis rule — runtime/surface/chrome)
|
|
14
|
+
* - docs/architecture/10-ui-api.md §U5.b (ChromeComposition target shape)
|
|
15
|
+
*
|
|
16
|
+
* Perf discipline (CLAUDE.md §Performance Invariants #4 + #7):
|
|
17
|
+
* - Pure function. No DOM reads, no runtime calls, no observers.
|
|
18
|
+
* - Structurally equal on equal inputs, but each call allocates a NEW
|
|
19
|
+
* outer object + NEW Sets + NEW arrays. Callers that want referential
|
|
20
|
+
* stability MUST wrap the call in `useMemo` with an explicit
|
|
21
|
+
* dependency list. The memoization hook at
|
|
22
|
+
* `src/ui-tailwind/review-workspace/use-workspace-composition.ts`
|
|
23
|
+
* handles this for the mounted workspace consumer.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
import type {
|
|
27
|
+
EditorRole,
|
|
28
|
+
WordReviewEditorChromeOptions,
|
|
29
|
+
WordReviewEditorChromePreset,
|
|
30
|
+
WordReviewEditorChromeVisibility,
|
|
31
|
+
} from "../../public-types";
|
|
32
|
+
import {
|
|
33
|
+
resolveChromePresetOptions,
|
|
34
|
+
resolveChromeVisibilityForPreset,
|
|
35
|
+
} from "./chrome-preset-model";
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Pure breakpoint resolver — inlined at layer 10 so chrome composition does
|
|
39
|
+
* not reach into layer 11 for presentation helpers. The React hook
|
|
40
|
+
* `useContainerBreakpoint` (layer 11, `src/ui-tailwind/chrome/use-container-breakpoint.ts`)
|
|
41
|
+
* carries its own copy for its ResizeObserver wiring. Keeping them in sync
|
|
42
|
+
* is trivial — this is a 5-line mapping over a threshold record.
|
|
43
|
+
*/
|
|
44
|
+
type BreakpointMap = Readonly<Record<string, number>>;
|
|
45
|
+
function resolveBreakpoint<T extends BreakpointMap>(
|
|
46
|
+
width: number,
|
|
47
|
+
thresholds: T,
|
|
48
|
+
): keyof T | null {
|
|
49
|
+
let best: keyof T | null = null;
|
|
50
|
+
let bestThreshold = -Infinity;
|
|
51
|
+
for (const name of Object.keys(thresholds) as (keyof T)[]) {
|
|
52
|
+
const t = thresholds[name] as number;
|
|
53
|
+
if (width >= t && t > bestThreshold) {
|
|
54
|
+
best = name;
|
|
55
|
+
bestThreshold = t;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return best;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export type EditorChromeMode = "edit" | "review" | "workflow" | "more";
|
|
62
|
+
export type EditorRailTab = "comments" | "changes" | "workflow" | "health";
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* LocalSurfaceKind enumerates every surface type the global local-surface
|
|
66
|
+
* arbiter (Phase F) knows about. Phase A ships the enum so consumers can
|
|
67
|
+
* begin typing against it; Phase F wires the arbiter that consumes it.
|
|
68
|
+
*/
|
|
69
|
+
export type LocalSurfaceKind =
|
|
70
|
+
| "none"
|
|
71
|
+
| "selection-format"
|
|
72
|
+
| "comment-preview"
|
|
73
|
+
| "suggestion-card"
|
|
74
|
+
| "workflow-card"
|
|
75
|
+
| "blocked-card"
|
|
76
|
+
| "scope-card"
|
|
77
|
+
| "context-menu";
|
|
78
|
+
|
|
79
|
+
export type DiagnosticsSeverity = "none" | "info" | "warning" | "blocked";
|
|
80
|
+
export type ChromeDensity = "compact" | "standard" | "comfortable";
|
|
81
|
+
export type ChromeResponsiveTier = "compact" | "standard" | "wide";
|
|
82
|
+
|
|
83
|
+
export interface DiagnosticsSignal {
|
|
84
|
+
readonly severity: DiagnosticsSeverity;
|
|
85
|
+
readonly count: number;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export interface WorkspaceRowComposition {
|
|
89
|
+
readonly left: readonly string[];
|
|
90
|
+
readonly contextBand: {
|
|
91
|
+
readonly owner: EditorChromeMode;
|
|
92
|
+
readonly items: readonly string[];
|
|
93
|
+
};
|
|
94
|
+
readonly right: readonly string[];
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export interface RailComposition {
|
|
98
|
+
readonly open: boolean;
|
|
99
|
+
readonly activeTab: EditorRailTab | null;
|
|
100
|
+
readonly visibleTabs: ReadonlySet<EditorRailTab>;
|
|
101
|
+
readonly pinnedTabs: ReadonlySet<EditorRailTab>;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export interface ChromeComposition {
|
|
105
|
+
readonly mode: EditorChromeMode;
|
|
106
|
+
readonly shell: {
|
|
107
|
+
readonly visible: true;
|
|
108
|
+
readonly modeSwitcher: "always";
|
|
109
|
+
};
|
|
110
|
+
readonly workspaceRow: WorkspaceRowComposition;
|
|
111
|
+
readonly rail: RailComposition;
|
|
112
|
+
readonly diagnostics: DiagnosticsSignal;
|
|
113
|
+
readonly density: ChromeDensity;
|
|
114
|
+
readonly responsiveTier: ChromeResponsiveTier;
|
|
115
|
+
readonly visibility: WordReviewEditorChromeVisibility;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export interface ChromeCompositionInput {
|
|
119
|
+
readonly chromePreset: WordReviewEditorChromePreset;
|
|
120
|
+
readonly chromeOptions?: Partial<WordReviewEditorChromeOptions>;
|
|
121
|
+
readonly chromeVisibility?: Partial<WordReviewEditorChromeVisibility>;
|
|
122
|
+
readonly reviewMode?: "editing" | "review";
|
|
123
|
+
readonly role?: EditorRole;
|
|
124
|
+
readonly readOnly?: boolean;
|
|
125
|
+
readonly markupDisplay?:
|
|
126
|
+
| "all-markup"
|
|
127
|
+
| "simple-markup"
|
|
128
|
+
| "no-markup"
|
|
129
|
+
| "original"
|
|
130
|
+
| "clean"
|
|
131
|
+
| "simple"
|
|
132
|
+
| "all";
|
|
133
|
+
readonly activeRailTab?: EditorRailTab | null;
|
|
134
|
+
readonly pinnedRailTabs?: ReadonlySet<EditorRailTab>;
|
|
135
|
+
readonly density?: ChromeDensity;
|
|
136
|
+
readonly containerWidth?: number;
|
|
137
|
+
readonly diagnosticsSignal?: DiagnosticsSignal;
|
|
138
|
+
/**
|
|
139
|
+
* Shell-owned mode override. The shell passes `"more"` here when it
|
|
140
|
+
* opens the diagnostics / search surface. All other modes are derived
|
|
141
|
+
* from runtime signals (role, reviewMode); this field exists so
|
|
142
|
+
* `resolveChromeComposition` can produce `mode: "more"` without
|
|
143
|
+
* conflating it with the other three runtime-derived modes.
|
|
144
|
+
* Layer 10 (`src/api/v3/ui/chrome.ts`) will wrap this seam.
|
|
145
|
+
*/
|
|
146
|
+
readonly modeOverride?: EditorChromeMode;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Container-driven responsive tier thresholds (per designsystem.md §2.13:
|
|
151
|
+
* "Responsive rules are container-driven, not viewport-only"). The named
|
|
152
|
+
* set mirrors the `compact | standard | wide` triple used across shell,
|
|
153
|
+
* workspace row, and rail.
|
|
154
|
+
*/
|
|
155
|
+
export const CHROME_RESPONSIVE_THRESHOLDS = {
|
|
156
|
+
compact: 0,
|
|
157
|
+
standard: 720,
|
|
158
|
+
wide: 1200,
|
|
159
|
+
} as const;
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Derive the `mode` field from the richest posture signal available:
|
|
163
|
+
* - explicit shell override (`modeOverride`) wins — used for "more"
|
|
164
|
+
* - explicit workflow role (runtime authority) comes next
|
|
165
|
+
* - reviewMode="review" (session signal) comes next
|
|
166
|
+
* - default is "edit"
|
|
167
|
+
*/
|
|
168
|
+
function deriveMode(input: ChromeCompositionInput): EditorChromeMode {
|
|
169
|
+
if (input.modeOverride) return input.modeOverride;
|
|
170
|
+
if (input.role === "workflow") return "workflow";
|
|
171
|
+
if (input.reviewMode === "review") return "review";
|
|
172
|
+
return "edit";
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Context-band item tables per audit §2.5. Each table names the item ids
|
|
177
|
+
* that the band exposes in that mode; ordering is the render order.
|
|
178
|
+
*
|
|
179
|
+
* These are contract with Phase B (TwContextBand). The band reads this
|
|
180
|
+
* array and renders a button per id through a shared registry.
|
|
181
|
+
*/
|
|
182
|
+
const CONTEXT_BAND_ITEMS_BY_MODE: Record<EditorChromeMode, readonly string[]> = {
|
|
183
|
+
edit: [
|
|
184
|
+
"paragraph-style",
|
|
185
|
+
"bold",
|
|
186
|
+
"italic",
|
|
187
|
+
"underline",
|
|
188
|
+
"list-bullet",
|
|
189
|
+
"list-numbered",
|
|
190
|
+
"insert-menu",
|
|
191
|
+
],
|
|
192
|
+
review: [
|
|
193
|
+
"review-current-label",
|
|
194
|
+
"review-prev",
|
|
195
|
+
"review-next",
|
|
196
|
+
"review-accept",
|
|
197
|
+
"review-reject",
|
|
198
|
+
"markup-display",
|
|
199
|
+
],
|
|
200
|
+
workflow: [
|
|
201
|
+
"scope-current-label",
|
|
202
|
+
"scope-prev",
|
|
203
|
+
"scope-next",
|
|
204
|
+
"workflow-claim",
|
|
205
|
+
"workflow-skip",
|
|
206
|
+
"workflow-complete",
|
|
207
|
+
"workflow-blocked-explanation",
|
|
208
|
+
],
|
|
209
|
+
more: [
|
|
210
|
+
"diagnostics-link",
|
|
211
|
+
"compatibility-link",
|
|
212
|
+
"outline-link",
|
|
213
|
+
"search-link",
|
|
214
|
+
],
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Left edge is the stable-utility cluster per audit §2.3. "Stable" means
|
|
219
|
+
* the same actions repeat across modes; paragraph style is edit-only since
|
|
220
|
+
* review/workflow modes do not expose structural formatting here.
|
|
221
|
+
*/
|
|
222
|
+
function resolveLeftEdge(mode: EditorChromeMode): readonly string[] {
|
|
223
|
+
if (mode === "edit") return ["undo", "redo", "paragraph-style"];
|
|
224
|
+
return ["undo", "redo"];
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Right edge per audit §2.3: rail toggle + diagnostics signal (severity +
|
|
229
|
+
* count, not detail) + zoom + overflow.
|
|
230
|
+
*
|
|
231
|
+
* The right cluster is intentionally mode-agnostic today — "more" mode's
|
|
232
|
+
* command / search affordance lives in the shell header (§6.1), not in
|
|
233
|
+
* the workspace row's right edge. If Phase D or later finds mode-
|
|
234
|
+
* dependent right-cluster items, add a `mode` parameter.
|
|
235
|
+
*/
|
|
236
|
+
function resolveRightEdge(
|
|
237
|
+
diagnosticsSignal: DiagnosticsSignal,
|
|
238
|
+
): readonly string[] {
|
|
239
|
+
const items: string[] = ["rail-toggle"];
|
|
240
|
+
if (diagnosticsSignal.severity !== "none" || diagnosticsSignal.count > 0) {
|
|
241
|
+
items.push("diagnostics-signal");
|
|
242
|
+
}
|
|
243
|
+
items.push("zoom", "overflow");
|
|
244
|
+
return items;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Rail visibility rules per audit §2.9 and designsystem.md §6.11:
|
|
249
|
+
* - comments/changes/workflow visible when rail is open
|
|
250
|
+
* - health visible when diagnostics signal present
|
|
251
|
+
* - empty tabs hide unless pinned
|
|
252
|
+
* - pinned tabs always visible
|
|
253
|
+
*/
|
|
254
|
+
function resolveVisibleRailTabs(
|
|
255
|
+
railOpen: boolean,
|
|
256
|
+
diagnosticsSignal: DiagnosticsSignal,
|
|
257
|
+
pinned: ReadonlySet<EditorRailTab>,
|
|
258
|
+
): ReadonlySet<EditorRailTab> {
|
|
259
|
+
const visible = new Set<EditorRailTab>();
|
|
260
|
+
if (railOpen) {
|
|
261
|
+
visible.add("comments");
|
|
262
|
+
visible.add("changes");
|
|
263
|
+
visible.add("workflow");
|
|
264
|
+
if (diagnosticsSignal.severity !== "none" || diagnosticsSignal.count > 0) {
|
|
265
|
+
visible.add("health");
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
// Pinned tabs survive even when the rail is closed or when the tab is empty.
|
|
269
|
+
for (const tab of pinned) {
|
|
270
|
+
visible.add(tab);
|
|
271
|
+
}
|
|
272
|
+
return visible;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Main entry. Pure, referentially stable for equal inputs.
|
|
277
|
+
*/
|
|
278
|
+
export function resolveChromeComposition(
|
|
279
|
+
input: ChromeCompositionInput,
|
|
280
|
+
): ChromeComposition {
|
|
281
|
+
const mode = deriveMode(input);
|
|
282
|
+
const options = resolveChromePresetOptions(
|
|
283
|
+
input.chromePreset,
|
|
284
|
+
input.chromeOptions,
|
|
285
|
+
input.role,
|
|
286
|
+
);
|
|
287
|
+
const visibility = resolveChromeVisibilityForPreset({
|
|
288
|
+
chromePreset: input.chromePreset,
|
|
289
|
+
chromeOptions: input.chromeOptions,
|
|
290
|
+
chromeVisibility: input.chromeVisibility,
|
|
291
|
+
});
|
|
292
|
+
const diagnosticsSignal: DiagnosticsSignal =
|
|
293
|
+
input.diagnosticsSignal ?? { severity: "none", count: 0 };
|
|
294
|
+
const density: ChromeDensity = input.density ?? "standard";
|
|
295
|
+
const pinnedRailTabs: ReadonlySet<EditorRailTab> =
|
|
296
|
+
input.pinnedRailTabs ?? new Set<EditorRailTab>();
|
|
297
|
+
const railOpen = options.showReviewRail && visibility.reviewRail;
|
|
298
|
+
const visibleTabs = resolveVisibleRailTabs(
|
|
299
|
+
railOpen,
|
|
300
|
+
diagnosticsSignal,
|
|
301
|
+
pinnedRailTabs,
|
|
302
|
+
);
|
|
303
|
+
|
|
304
|
+
// Default active tab: honor caller; otherwise land on the mode-appropriate tab.
|
|
305
|
+
const defaultActive: EditorRailTab =
|
|
306
|
+
mode === "workflow" ? "workflow" : mode === "review" ? "changes" : "comments";
|
|
307
|
+
const activeTab: EditorRailTab | null =
|
|
308
|
+
input.activeRailTab !== undefined
|
|
309
|
+
? input.activeRailTab
|
|
310
|
+
: railOpen
|
|
311
|
+
? defaultActive
|
|
312
|
+
: null;
|
|
313
|
+
|
|
314
|
+
const responsiveTier: ChromeResponsiveTier =
|
|
315
|
+
(resolveBreakpoint(
|
|
316
|
+
input.containerWidth ?? CHROME_RESPONSIVE_THRESHOLDS.standard,
|
|
317
|
+
CHROME_RESPONSIVE_THRESHOLDS,
|
|
318
|
+
) as ChromeResponsiveTier | null) ?? "standard";
|
|
319
|
+
|
|
320
|
+
return {
|
|
321
|
+
mode,
|
|
322
|
+
shell: { visible: true, modeSwitcher: "always" },
|
|
323
|
+
workspaceRow: {
|
|
324
|
+
left: resolveLeftEdge(mode),
|
|
325
|
+
contextBand: {
|
|
326
|
+
owner: mode,
|
|
327
|
+
items: CONTEXT_BAND_ITEMS_BY_MODE[mode],
|
|
328
|
+
},
|
|
329
|
+
right: resolveRightEdge(diagnosticsSignal),
|
|
330
|
+
},
|
|
331
|
+
rail: {
|
|
332
|
+
open: railOpen,
|
|
333
|
+
activeTab,
|
|
334
|
+
visibleTabs,
|
|
335
|
+
pinnedTabs: pinnedRailTabs,
|
|
336
|
+
},
|
|
337
|
+
diagnostics: diagnosticsSignal,
|
|
338
|
+
density,
|
|
339
|
+
responsiveTier,
|
|
340
|
+
visibility,
|
|
341
|
+
};
|
|
342
|
+
}
|
|
@@ -1,10 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chrome preset + visibility composition — layer 10.
|
|
3
|
+
*
|
|
4
|
+
* Relocated from `src/ui-tailwind/chrome/chrome-preset-model.ts` by
|
|
5
|
+
* refactor/10 Slice 8 so the UI API owns the chrome-composition seam
|
|
6
|
+
* end-to-end (architecture 10 §U5). Pure type-shape logic, no DOM, no
|
|
7
|
+
* React. Consumed by `chrome-composition.ts` (also layer 10) to compose
|
|
8
|
+
* `ChromeComposition`. A re-export shim remains at the old path during
|
|
9
|
+
* consumer migration.
|
|
10
|
+
*/
|
|
1
11
|
import type {
|
|
2
12
|
EditorRole,
|
|
3
13
|
WordReviewEditorChromeOptions,
|
|
4
14
|
WordReviewEditorChromePreset,
|
|
5
15
|
WordReviewEditorChromeVisibility,
|
|
6
16
|
WordReviewEditorProps,
|
|
7
|
-
} from "../../
|
|
17
|
+
} from "../../public-types";
|
|
8
18
|
|
|
9
19
|
export function resolveChromePreset(
|
|
10
20
|
chromePreset: WordReviewEditorProps["chromePreset"],
|