@beyondwork/docx-react-component 1.0.67 → 1.0.70
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 -932
- 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 -4797
- 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
|
@@ -27,180 +27,52 @@ import type {
|
|
|
27
27
|
import type { ResolvedDocumentSection } from "../document-layout.ts";
|
|
28
28
|
|
|
29
29
|
// ---------------------------------------------------------------------------
|
|
30
|
-
//
|
|
30
|
+
// Types — all pure data shapes relocated to `src/model/layout/`
|
|
31
|
+
// per `docs/plans/cross-layer-coord-04.md §1.12`.
|
|
32
|
+
//
|
|
33
|
+
// Pass 1 (2026-04-22): pure page-region / fragment / line-box / note /
|
|
34
|
+
// anchor types moved to `page-graph-types.ts`.
|
|
35
|
+
// Pass 2 (2026-04-22): `RuntimePageGraph`, `RuntimePageNode`, and
|
|
36
|
+
// `BuildPageGraphInput` moved to `runtime-page-graph-types.ts`
|
|
37
|
+
// (after `ResolvedPageStories` + `ResolvedDocumentSection` +
|
|
38
|
+
// `PageLayoutSnapshot` + `DocumentPageSnapshot` were also
|
|
39
|
+
// relocated to the model tree). This cuts Layer 01's
|
|
40
|
+
// `CacheEnvelope → RuntimePageGraph → runtime/**` transit.
|
|
41
|
+
//
|
|
42
|
+
// Re-exported here so every existing consumer import of these types
|
|
43
|
+
// from this file continues working unchanged. Graph construction
|
|
44
|
+
// functions (`buildPageGraph`, `spliceGraph`) and the `graphRevision`
|
|
45
|
+
// counter stay in this file — only the type shapes moved.
|
|
31
46
|
// ---------------------------------------------------------------------------
|
|
32
47
|
|
|
33
|
-
export
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export interface RuntimePageNode {
|
|
49
|
-
pageId: string;
|
|
50
|
-
pageIndex: number;
|
|
51
|
-
sectionIndex: number;
|
|
52
|
-
pageInSection: number;
|
|
53
|
-
startOffset: number;
|
|
54
|
-
endOffset: number;
|
|
55
|
-
layout: PageLayoutSnapshot;
|
|
56
|
-
stories: ResolvedPageStories;
|
|
57
|
-
/** Sub-regions on the page. */
|
|
58
|
-
regions: RuntimePageRegions;
|
|
59
|
-
/** Line boxes rendered in the body region. */
|
|
60
|
-
lineBoxes: RuntimeLineBox[];
|
|
61
|
-
/** Footnote allocations reserved at the bottom of the page. */
|
|
62
|
-
noteAllocations: RuntimeNoteAllocation[];
|
|
63
|
-
/** Whether this page is a blank filler (from even/odd page breaks). */
|
|
64
|
-
isBlankFiller: boolean;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
export interface RuntimePageRegions {
|
|
68
|
-
body: RuntimePageRegion;
|
|
69
|
-
header?: RuntimePageRegion;
|
|
70
|
-
footer?: RuntimePageRegion;
|
|
71
|
-
/**
|
|
72
|
-
* For multi-column bodies, `body.columns` is populated. For single-column
|
|
73
|
-
* pages, the top-level body is used and `columns` is undefined.
|
|
74
|
-
*/
|
|
75
|
-
columns?: RuntimePageRegion[];
|
|
76
|
-
/**
|
|
77
|
-
* P4 — footnote regions reserved at the bottom of the page (above
|
|
78
|
-
* the footer band) when `noteAllocations` reserved space for one or
|
|
79
|
-
* more footnote bodies. Empty until the page-graph builder
|
|
80
|
-
* populates them, which lands alongside the P8 per-page region
|
|
81
|
-
* rendering work. The shape exists now so consumers
|
|
82
|
-
* (`getStoryRegionsOnPage` / `getLineBoxesForRegion("footnote-area")`)
|
|
83
|
-
* have a stable seam to read from when the builder catches up —
|
|
84
|
-
* pre-P8 reads return `[]` because no entries are populated.
|
|
85
|
-
*/
|
|
86
|
-
footnotes?: RuntimePageRegion[];
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
export interface RuntimePageRegion {
|
|
90
|
-
kind: "body" | "header" | "footer" | "column" | "footnote-area";
|
|
91
|
-
/** Twips offset from page top (header) or similar region-specific origin. */
|
|
92
|
-
originTwips: number;
|
|
93
|
-
/** Width in twips. */
|
|
94
|
-
widthTwips: number;
|
|
95
|
-
/** Height in twips. */
|
|
96
|
-
heightTwips: number;
|
|
97
|
-
/** IDs of block fragments rendered in this region, in order. */
|
|
98
|
-
fragmentIds: string[];
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
export interface RuntimeBlockFragment {
|
|
102
|
-
fragmentId: string;
|
|
103
|
-
/** Canonical block id the fragment slices. */
|
|
104
|
-
blockId: string;
|
|
105
|
-
/** Page this fragment lives on. */
|
|
106
|
-
pageId: string;
|
|
107
|
-
/** Zero-based order within the page region. */
|
|
108
|
-
orderInRegion: number;
|
|
109
|
-
/** Region id the fragment sits in (matches RuntimePageRegion.kind). */
|
|
110
|
-
regionKind: RuntimePageRegion["kind"];
|
|
111
|
-
/** Inclusive from / exclusive to offsets within the main story. */
|
|
112
|
-
from: number;
|
|
113
|
-
to: number;
|
|
114
|
-
/** Height consumed on this page (twips). */
|
|
115
|
-
heightTwips: number;
|
|
116
|
-
/**
|
|
117
|
-
* Fragment classification.
|
|
118
|
-
* - `"whole"` (default): the fragment represents the entire block; no slicing.
|
|
119
|
-
* - `"paragraph-slice"`: one of several fragments produced by intra-paragraph
|
|
120
|
-
* line-box splitting. `paragraphLineRange` identifies which lines this
|
|
121
|
-
* slice renders.
|
|
122
|
-
* - `"table-slice"`: one of several fragments produced by row-boundary table
|
|
123
|
-
* splitting (emitted by the table-fidelity workstream).
|
|
124
|
-
* `tableRowRange` identifies which canonical rows this slice renders.
|
|
125
|
-
* Consumers that predate multi-fragment blocks may treat an absent `kind`
|
|
126
|
-
* as `"whole"`.
|
|
127
|
-
*/
|
|
128
|
-
kind?: "whole" | "paragraph-slice" | "table-slice";
|
|
129
|
-
/**
|
|
130
|
-
* For `kind === "paragraph-slice"`, the inclusive-exclusive line-box index
|
|
131
|
-
* range rendered by this slice plus the total line count for the source
|
|
132
|
-
* paragraph. `from`/`to` still span the full paragraph offset range on
|
|
133
|
-
* every slice — only the visible lines differ.
|
|
134
|
-
*/
|
|
135
|
-
paragraphLineRange?: {
|
|
136
|
-
from: number;
|
|
137
|
-
to: number;
|
|
138
|
-
totalLines: number;
|
|
139
|
-
};
|
|
140
|
-
/**
|
|
141
|
-
* For `kind === "table-slice"`, the inclusive-exclusive row-index range
|
|
142
|
-
* rendered by this slice. Repeated header rows (when the table has
|
|
143
|
-
* `isHeader` rows and `continuation` pages) are implied by the owning
|
|
144
|
-
* table's canonical row list — consumers prepend header rows for slices
|
|
145
|
-
* whose `from > 0`.
|
|
146
|
-
*/
|
|
147
|
-
tableRowRange?: {
|
|
148
|
-
from: number;
|
|
149
|
-
to: number;
|
|
150
|
-
totalRows: number;
|
|
151
|
-
};
|
|
152
|
-
/**
|
|
153
|
-
* Slice 5 — opaque style-chain ref derived from the block's `styleId`.
|
|
154
|
-
* Used by `analyzeStylesChange` to bound invalidation to the first page
|
|
155
|
-
* that carries a fragment referencing a dirty style.
|
|
156
|
-
*/
|
|
157
|
-
resolvedStyleChainRef?: string;
|
|
158
|
-
/**
|
|
159
|
-
* Slice 5 — numbering instance id copied from the block's `numbering`
|
|
160
|
-
* field. Used by `analyzeNumberingChange` to bound invalidation to the
|
|
161
|
-
* first page that carries a fragment from the affected list instance.
|
|
162
|
-
*/
|
|
163
|
-
numberingInstanceId?: string;
|
|
164
|
-
}
|
|
48
|
+
export type {
|
|
49
|
+
RuntimePageRegions,
|
|
50
|
+
RuntimePageRegion,
|
|
51
|
+
RuntimeBlockFragment,
|
|
52
|
+
RuntimeLineBox,
|
|
53
|
+
RuntimeNoteAllocation,
|
|
54
|
+
RuntimePageAnchor,
|
|
55
|
+
} from "../../model/layout/page-graph-types.ts";
|
|
56
|
+
|
|
57
|
+
export type {
|
|
58
|
+
RuntimePageGraph,
|
|
59
|
+
RuntimePageNode,
|
|
60
|
+
BuildPageGraphInput,
|
|
61
|
+
} from "../../model/layout/runtime-page-graph-types.ts";
|
|
165
62
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
export interface RuntimeNoteAllocation {
|
|
180
|
-
noteKind: "footnote" | "endnote";
|
|
181
|
-
noteId: string;
|
|
182
|
-
/** Twips reserved at the bottom of the page for this note's content. */
|
|
183
|
-
reservedHeightTwips: number;
|
|
184
|
-
/**
|
|
185
|
-
* P8 — fragment ID of this note's body. The corresponding
|
|
186
|
-
* `RuntimeBlockFragment` lives in `RuntimePageGraph.fragments` with
|
|
187
|
-
* `regionKind: "footnote-area"`. Undefined when the engine hasn't
|
|
188
|
-
* yet emitted a fragment for the allocation (back-compat for pre-P8
|
|
189
|
-
* callers).
|
|
190
|
-
*/
|
|
191
|
-
fragmentId?: string;
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
export interface RuntimePageAnchor {
|
|
195
|
-
/** Story target the anchor is for. Main story is the common case. */
|
|
196
|
-
storyKey: string;
|
|
197
|
-
/** Offset the anchor represents. */
|
|
198
|
-
offset: number;
|
|
199
|
-
/** Page id resolved for this offset. */
|
|
200
|
-
pageId: string;
|
|
201
|
-
/** Fragment id resolved for this offset, if available. */
|
|
202
|
-
fragmentId?: string;
|
|
203
|
-
}
|
|
63
|
+
import type {
|
|
64
|
+
RuntimeBlockFragment,
|
|
65
|
+
RuntimeLineBox,
|
|
66
|
+
RuntimeNoteAllocation,
|
|
67
|
+
RuntimePageAnchor,
|
|
68
|
+
RuntimePageRegion,
|
|
69
|
+
RuntimePageRegions,
|
|
70
|
+
} from "../../model/layout/page-graph-types.ts";
|
|
71
|
+
import type {
|
|
72
|
+
RuntimePageGraph,
|
|
73
|
+
RuntimePageNode,
|
|
74
|
+
BuildPageGraphInput,
|
|
75
|
+
} from "../../model/layout/runtime-page-graph-types.ts";
|
|
204
76
|
|
|
205
77
|
// ---------------------------------------------------------------------------
|
|
206
78
|
// Graph construction
|
|
@@ -208,36 +80,6 @@ export interface RuntimePageAnchor {
|
|
|
208
80
|
|
|
209
81
|
let graphRevision = 0;
|
|
210
82
|
|
|
211
|
-
export interface BuildPageGraphInput {
|
|
212
|
-
pages: readonly DocumentPageSnapshot[];
|
|
213
|
-
sections: readonly ResolvedDocumentSection[];
|
|
214
|
-
stories: readonly ResolvedPageStories[];
|
|
215
|
-
/** Optional block fragments pre-computed by pagination; when omitted the
|
|
216
|
-
* graph produces one fragment per page spanning its entire offset range. */
|
|
217
|
-
fragments?: readonly RuntimeBlockFragment[];
|
|
218
|
-
/**
|
|
219
|
-
* Optional block fragments keyed by pageIndex with the `pageId` omitted.
|
|
220
|
-
* `buildPageGraph` fills in the pageId using the graph's fresh revision
|
|
221
|
-
* stamp. Use this when the caller wants to emit per-block fragments but
|
|
222
|
-
* cannot know the pageId in advance.
|
|
223
|
-
*/
|
|
224
|
-
fragmentsByPageIndex?: ReadonlyMap<
|
|
225
|
-
number,
|
|
226
|
-
ReadonlyArray<Omit<RuntimeBlockFragment, "pageId">>
|
|
227
|
-
>;
|
|
228
|
-
/** Optional per-page line boxes. */
|
|
229
|
-
lineBoxes?: ReadonlyMap<string, RuntimeLineBox[]>;
|
|
230
|
-
/** Optional per-page note allocations keyed by graph-assigned pageId. */
|
|
231
|
-
noteAllocations?: ReadonlyMap<string, RuntimeNoteAllocation[]>;
|
|
232
|
-
/**
|
|
233
|
-
* P8 — per-page note allocations keyed by pageIndex (0-based).
|
|
234
|
-
* Parallel to `fragmentsByPageIndex`; `buildPageGraph` uses the index to
|
|
235
|
-
* look up allocations without requiring callers to know the graph-internal
|
|
236
|
-
* `page-${revision}-${index}` pageId in advance.
|
|
237
|
-
*/
|
|
238
|
-
noteAllocationsByPageIndex?: ReadonlyMap<number, RuntimeNoteAllocation[]>;
|
|
239
|
-
}
|
|
240
|
-
|
|
241
83
|
export function buildPageGraph(input: BuildPageGraphInput): RuntimePageGraph;
|
|
242
84
|
export function buildPageGraph(
|
|
243
85
|
pages: readonly DocumentPageSnapshot[],
|
|
@@ -284,15 +126,13 @@ export function buildPageGraph(
|
|
|
284
126
|
const pageFragments = aggregatedFragments.filter((f) => f.pageId === pageId);
|
|
285
127
|
// Split fragments into body-region ones (for the body fragmentIds list)
|
|
286
128
|
// and footnote-area ones (handled by buildRegions via noteAllocations).
|
|
287
|
-
|
|
129
|
+
let bodyPageFragments = pageFragments.filter(
|
|
288
130
|
(f) => f.regionKind !== "footnote-area",
|
|
289
131
|
);
|
|
290
|
-
const fragmentIds = bodyPageFragments.map((f) => f.fragmentId);
|
|
291
132
|
|
|
292
133
|
// If no body fragments were supplied, synthesize a coarse body fragment so
|
|
293
134
|
// the graph is still internally consistent.
|
|
294
|
-
|
|
295
|
-
if (fragmentIds.length === 0 && page.endOffset > page.startOffset) {
|
|
135
|
+
if (bodyPageFragments.length === 0 && page.endOffset > page.startOffset) {
|
|
296
136
|
const coarse: RuntimeBlockFragment = {
|
|
297
137
|
fragmentId: `${pageId}-body-0`,
|
|
298
138
|
blockId: "synthetic",
|
|
@@ -304,8 +144,9 @@ export function buildPageGraph(
|
|
|
304
144
|
heightTwips: 0,
|
|
305
145
|
};
|
|
306
146
|
aggregatedFragments.push(coarse);
|
|
307
|
-
|
|
147
|
+
bodyPageFragments = [coarse];
|
|
308
148
|
}
|
|
149
|
+
const bodyFragmentIds = bodyPageFragments.map((f) => f.fragmentId);
|
|
309
150
|
|
|
310
151
|
// Resolve per-page note allocations: prefer noteAllocationsByPageIndex
|
|
311
152
|
// (index-based, suitable when the caller doesn't know the graph-internal
|
|
@@ -325,7 +166,7 @@ export function buildPageGraph(
|
|
|
325
166
|
endOffset: page.endOffset,
|
|
326
167
|
layout: page.layout,
|
|
327
168
|
stories,
|
|
328
|
-
regions: buildRegions(page.layout,
|
|
169
|
+
regions: buildRegions(page.layout, bodyPageFragments, stories, pageNoteAllocations),
|
|
329
170
|
lineBoxes: input.lineBoxes?.get(pageId) ?? [],
|
|
330
171
|
noteAllocations: pageNoteAllocations,
|
|
331
172
|
isBlankFiller: page.pageInSection === -1,
|
|
@@ -352,10 +193,11 @@ export function buildPageGraph(
|
|
|
352
193
|
|
|
353
194
|
function buildRegions(
|
|
354
195
|
layout: PageLayoutSnapshot,
|
|
355
|
-
|
|
196
|
+
bodyFragments: readonly RuntimeBlockFragment[],
|
|
356
197
|
stories: ResolvedPageStories,
|
|
357
198
|
noteAllocations: readonly RuntimeNoteAllocation[] = [],
|
|
358
199
|
): RuntimePageRegions {
|
|
200
|
+
const bodyFragmentIds = bodyFragments.map((f) => f.fragmentId);
|
|
359
201
|
// Gutter (w:gutter / pgMar @gutter) reduces usable body width on the bound
|
|
360
202
|
// edge. Parity fix with `src/runtime/page-layout-estimation.ts:153`, which
|
|
361
203
|
// already subtracts `layout.gutter`; prior to this edit the graph path
|
|
@@ -428,6 +270,17 @@ function buildRegions(
|
|
|
428
270
|
1,
|
|
429
271
|
Math.floor((bodyWidth - gap * (layout.columns - 1)) / layout.columns),
|
|
430
272
|
);
|
|
273
|
+
// Refactor/04 Slice 4 — partition body fragments into per-column
|
|
274
|
+
// fragment-id lists. Fragments without `columnIndex` (e.g. blocks
|
|
275
|
+
// from a pre-Slice-4 call path, or single-column pages rendered on a
|
|
276
|
+
// multi-column layout revision) fall through to column 0 so the
|
|
277
|
+
// union of `columns[*].fragmentIds` still covers every body fragment.
|
|
278
|
+
const perColumnIds: string[][] = Array.from({ length: layout.columns }, () => []);
|
|
279
|
+
for (const frag of bodyFragments) {
|
|
280
|
+
const raw = frag.columnIndex;
|
|
281
|
+
const idx = raw !== undefined && raw >= 0 && raw < layout.columns ? raw : 0;
|
|
282
|
+
perColumnIds[idx]!.push(frag.fragmentId);
|
|
283
|
+
}
|
|
431
284
|
const columns: RuntimePageRegion[] = [];
|
|
432
285
|
for (let i = 0; i < layout.columns; i += 1) {
|
|
433
286
|
columns.push({
|
|
@@ -435,7 +288,7 @@ function buildRegions(
|
|
|
435
288
|
originTwips: layout.marginTop,
|
|
436
289
|
widthTwips: perColumnWidth,
|
|
437
290
|
heightTwips: Math.max(0, bodyHeight),
|
|
438
|
-
fragmentIds: []
|
|
291
|
+
fragmentIds: perColumnIds[i]!,
|
|
439
292
|
});
|
|
440
293
|
}
|
|
441
294
|
regions.columns = columns;
|
|
@@ -16,23 +16,18 @@ import type {
|
|
|
16
16
|
EditorStoryTarget,
|
|
17
17
|
PageLayoutSnapshot,
|
|
18
18
|
} from "../../api/public-types";
|
|
19
|
+
import type { ResolvedPageStories } from "../../model/layout/resolved-layout-types.ts";
|
|
19
20
|
|
|
20
21
|
// ---------------------------------------------------------------------------
|
|
21
22
|
// Types
|
|
22
23
|
// ---------------------------------------------------------------------------
|
|
23
24
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
isFirstPage: boolean;
|
|
31
|
-
/** Whether this is an even-numbered page (1-indexed for display). */
|
|
32
|
-
isEvenPage: boolean;
|
|
33
|
-
/** The effective page number for display (accounting for page numbering settings). */
|
|
34
|
-
displayPageNumber: number;
|
|
35
|
-
}
|
|
25
|
+
/**
|
|
26
|
+
* Pass 2 (2026-04-22) — relocated to
|
|
27
|
+
* `src/model/layout/resolved-layout-types.ts`. Re-exported here so
|
|
28
|
+
* existing consumers of `ResolvedPageStories` keep working unchanged.
|
|
29
|
+
*/
|
|
30
|
+
export type { ResolvedPageStories } from "../../model/layout/resolved-layout-types.ts";
|
|
36
31
|
|
|
37
32
|
// ---------------------------------------------------------------------------
|
|
38
33
|
// Resolver
|