@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,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Protection-range extraction helpers shared by the import (load) and
|
|
3
|
+
* export paths inside the session layer. These walk parsed OOXML to
|
|
4
|
+
* discover `w:permStart` / `w:permEnd` markers, measure canonical
|
|
5
|
+
* positions along the way, and compose a `ProtectionSnapshot` that
|
|
6
|
+
* encodes whether the runtime will enforce or only preserve each
|
|
7
|
+
* range.
|
|
8
|
+
*
|
|
9
|
+
* Slice 5e-7.a — relocated from `src/io/docx-session.ts` (was the 5e-6f.2
|
|
10
|
+
* deferral: these helpers are load-and-export shared, so they couldn't
|
|
11
|
+
* live under `src/session/export/` with the other stateful-export helpers
|
|
12
|
+
* from 5e-6f.1). `src/session/shared/` is the co-scope home — load path
|
|
13
|
+
* and export path both reach here without crossing each other's boundary.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import type {
|
|
17
|
+
ProtectionRange,
|
|
18
|
+
ProtectionSnapshot,
|
|
19
|
+
} from "../../api/public-types.ts";
|
|
20
|
+
import {
|
|
21
|
+
parseMainDocumentXml,
|
|
22
|
+
type ParsedBlockNode,
|
|
23
|
+
type ParsedInlineNode,
|
|
24
|
+
} from "../../io/ooxml/parse-main-document.ts";
|
|
25
|
+
|
|
26
|
+
export interface DocumentProtectionMeta {
|
|
27
|
+
editType?: string;
|
|
28
|
+
enforcement: boolean;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export const EMPTY_PROTECTION_SNAPSHOT: ProtectionSnapshot = {
|
|
32
|
+
hasDocumentProtection: false,
|
|
33
|
+
enforcementActive: false,
|
|
34
|
+
ranges: [],
|
|
35
|
+
enforcedRangeCount: 0,
|
|
36
|
+
preservedRangeCount: 0,
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export function extractDocumentProtection(
|
|
40
|
+
settingsXml: string,
|
|
41
|
+
): DocumentProtectionMeta {
|
|
42
|
+
if (!settingsXml) return { enforcement: false };
|
|
43
|
+
const match = settingsXml.match(/<w:documentProtection\b([^/>]*)\/?>/);
|
|
44
|
+
if (!match) return { enforcement: false };
|
|
45
|
+
const attrs = match[1];
|
|
46
|
+
const editTypeMatch = attrs.match(/w:edit="([^"]*)"/);
|
|
47
|
+
const enforcementMatch = attrs.match(/w:enforcement="([^"]*)"/);
|
|
48
|
+
const editType = editTypeMatch?.[1];
|
|
49
|
+
const enforcement =
|
|
50
|
+
enforcementMatch?.[1] === "1" || enforcementMatch?.[1] === "true";
|
|
51
|
+
return { editType, enforcement };
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function extractProtectionRanges(
|
|
55
|
+
blocks: readonly ParsedBlockNode[],
|
|
56
|
+
): ProtectionRange[] {
|
|
57
|
+
const ranges: ProtectionRange[] = [];
|
|
58
|
+
const openRanges = new Map<string, Omit<ProtectionRange, "end">>();
|
|
59
|
+
collectProtectionRangesFromBlocks(blocks, ranges, openRanges, 0);
|
|
60
|
+
return ranges;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function collectProtectionRangesFromBlocks(
|
|
64
|
+
blocks: readonly ParsedBlockNode[],
|
|
65
|
+
ranges: ProtectionRange[],
|
|
66
|
+
openRanges: Map<string, Omit<ProtectionRange, "end">>,
|
|
67
|
+
cursor: number,
|
|
68
|
+
): number {
|
|
69
|
+
let nextCursor = cursor;
|
|
70
|
+
let previousParagraph = false;
|
|
71
|
+
|
|
72
|
+
for (const block of blocks) {
|
|
73
|
+
if (block.type === "paragraph") {
|
|
74
|
+
if (previousParagraph) {
|
|
75
|
+
nextCursor += 1;
|
|
76
|
+
}
|
|
77
|
+
nextCursor = collectProtectionRangesFromInlines(
|
|
78
|
+
block.children,
|
|
79
|
+
ranges,
|
|
80
|
+
openRanges,
|
|
81
|
+
nextCursor,
|
|
82
|
+
);
|
|
83
|
+
previousParagraph = true;
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (block.type === "table") {
|
|
88
|
+
nextCursor += 1;
|
|
89
|
+
previousParagraph = false;
|
|
90
|
+
for (const row of block.rows) {
|
|
91
|
+
for (const cell of row.cells) {
|
|
92
|
+
nextCursor = collectProtectionRangesFromBlocks(
|
|
93
|
+
cell.children,
|
|
94
|
+
ranges,
|
|
95
|
+
openRanges,
|
|
96
|
+
nextCursor,
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (block.type === "sdt" || block.type === "custom_xml") {
|
|
104
|
+
nextCursor = collectProtectionRangesFromBlocks(
|
|
105
|
+
block.children,
|
|
106
|
+
ranges,
|
|
107
|
+
openRanges,
|
|
108
|
+
nextCursor,
|
|
109
|
+
);
|
|
110
|
+
previousParagraph = false;
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
nextCursor += 1;
|
|
115
|
+
previousParagraph = false;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return nextCursor;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export function collectProtectionRangesFromInlines(
|
|
122
|
+
nodes: readonly ParsedInlineNode[],
|
|
123
|
+
ranges: ProtectionRange[],
|
|
124
|
+
openRanges: Map<string, Omit<ProtectionRange, "end">>,
|
|
125
|
+
cursor: number,
|
|
126
|
+
): number {
|
|
127
|
+
let nextCursor = cursor;
|
|
128
|
+
|
|
129
|
+
for (const node of nodes) {
|
|
130
|
+
if (node.type === "perm_start") {
|
|
131
|
+
openRanges.set(node.rangeId, {
|
|
132
|
+
rangeId: node.rangeId,
|
|
133
|
+
start: nextCursor,
|
|
134
|
+
...(node.editorGroup ? { editorGroup: node.editorGroup } : {}),
|
|
135
|
+
...(node.editor ? { editor: node.editor } : {}),
|
|
136
|
+
enforced: false,
|
|
137
|
+
enforcementReason:
|
|
138
|
+
"preserve-only: runtime does not yet enforce permission range boundaries",
|
|
139
|
+
});
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
if (node.type === "perm_end") {
|
|
144
|
+
const openRange = openRanges.get(node.rangeId);
|
|
145
|
+
if (openRange) {
|
|
146
|
+
ranges.push({
|
|
147
|
+
...openRange,
|
|
148
|
+
end: nextCursor,
|
|
149
|
+
});
|
|
150
|
+
openRanges.delete(node.rangeId);
|
|
151
|
+
}
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
nextCursor += measureParsedInlineNode(node);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return nextCursor;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export function measureParsedInlineNode(node: ParsedInlineNode): number {
|
|
162
|
+
switch (node.type) {
|
|
163
|
+
case "text":
|
|
164
|
+
return Array.from(node.text).length;
|
|
165
|
+
case "tab":
|
|
166
|
+
case "hard_break":
|
|
167
|
+
case "column_break":
|
|
168
|
+
case "footnote_ref":
|
|
169
|
+
case "image":
|
|
170
|
+
case "bookmark_start":
|
|
171
|
+
case "bookmark_end":
|
|
172
|
+
return 1;
|
|
173
|
+
case "hyperlink":
|
|
174
|
+
return node.children.reduce(
|
|
175
|
+
(size, child) => size + measureParsedInlineNode(child),
|
|
176
|
+
0,
|
|
177
|
+
);
|
|
178
|
+
case "field": {
|
|
179
|
+
const content = parseMainDocumentXml(
|
|
180
|
+
`<?xml version="1.0" encoding="UTF-8" standalone="yes"?><w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"><w:body><w:p>${node.contentXml}</w:p></w:body></w:document>`,
|
|
181
|
+
);
|
|
182
|
+
if (content.blocks[0]?.type === "paragraph") {
|
|
183
|
+
return content.blocks[0].children.reduce(
|
|
184
|
+
(size, child) => size + measureParsedInlineNode(child),
|
|
185
|
+
0,
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
return 1;
|
|
189
|
+
}
|
|
190
|
+
default:
|
|
191
|
+
return 1;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
export function buildProtectionSnapshot(
|
|
196
|
+
documentProtection: DocumentProtectionMeta,
|
|
197
|
+
ranges: ProtectionRange[],
|
|
198
|
+
): ProtectionSnapshot {
|
|
199
|
+
const hasDocumentProtection =
|
|
200
|
+
documentProtection.editType !== undefined || documentProtection.enforcement;
|
|
201
|
+
const enforceRanges =
|
|
202
|
+
documentProtection.editType === "readOnly" ||
|
|
203
|
+
documentProtection.editType === "comments";
|
|
204
|
+
const normalizedRanges = ranges.map((range) => {
|
|
205
|
+
const canEnforce =
|
|
206
|
+
hasDocumentProtection &&
|
|
207
|
+
documentProtection.enforcement &&
|
|
208
|
+
enforceRanges &&
|
|
209
|
+
typeof range.start === "number" &&
|
|
210
|
+
typeof range.end === "number" &&
|
|
211
|
+
range.end >= range.start;
|
|
212
|
+
return {
|
|
213
|
+
...range,
|
|
214
|
+
enforced: canEnforce,
|
|
215
|
+
enforcementReason: canEnforce
|
|
216
|
+
? "runtime-enforced: permission range is mapped to canonical positions"
|
|
217
|
+
: "preserve-only: runtime does not yet enforce permission range boundaries",
|
|
218
|
+
};
|
|
219
|
+
});
|
|
220
|
+
return {
|
|
221
|
+
hasDocumentProtection,
|
|
222
|
+
editType: documentProtection.editType,
|
|
223
|
+
enforcementActive: documentProtection.enforcement,
|
|
224
|
+
ranges: normalizedRanges,
|
|
225
|
+
enforcedRangeCount: normalizedRanges.filter((r) => r.enforced).length,
|
|
226
|
+
preservedRangeCount: normalizedRanges.filter((r) => !r.enforced).length,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tiny pure helpers shared by the session load and export paths.
|
|
3
|
+
*
|
|
4
|
+
* Slice 5e-7.d-prep — relocated from `src/io/docx-session.ts` so the
|
|
5
|
+
* loader-body extraction in 5e-7.d doesn't also need to carry the
|
|
6
|
+
* utilities with it. Each helper has a small, well-defined scope:
|
|
7
|
+
*
|
|
8
|
+
* - `toUint8Array` / `decodeUtf8` — byte conversions used by every
|
|
9
|
+
* parse-dispatch stage that reads OPC part bytes.
|
|
10
|
+
* - `createEmptyNumberingCatalog` — sentinel used on the error path
|
|
11
|
+
* when a canonical document has no numbering.
|
|
12
|
+
* - `extractDocumentRootAttributes` — one-off regex scan for the
|
|
13
|
+
* `<w:document>` element's attribute bag (preserved at export time
|
|
14
|
+
* for opaque-attribute fidelity).
|
|
15
|
+
* - `serializeCanonicalDocumentForExport` — canonical-document
|
|
16
|
+
* signature wrapper that zeroes out `docId` / `createdAt` /
|
|
17
|
+
* `updatedAt` so structural comparison doesn't falsely register
|
|
18
|
+
* semantic drift.
|
|
19
|
+
*
|
|
20
|
+
* P6-clean: imports only from `src/model/**` + `src/api/**`.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import {
|
|
24
|
+
createCanonicalDocumentSignature,
|
|
25
|
+
type CanonicalDocument,
|
|
26
|
+
type NumberingCatalog,
|
|
27
|
+
} from "../../model/canonical-document.ts";
|
|
28
|
+
|
|
29
|
+
const UTF8_DECODER = new TextDecoder("utf-8");
|
|
30
|
+
|
|
31
|
+
export function decodeUtf8(bytes: Uint8Array | undefined): string {
|
|
32
|
+
if (!bytes) {
|
|
33
|
+
return "";
|
|
34
|
+
}
|
|
35
|
+
return UTF8_DECODER.decode(bytes);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function toUint8Array(bytes: Uint8Array | ArrayBuffer): Uint8Array {
|
|
39
|
+
return bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function createEmptyNumberingCatalog(): NumberingCatalog {
|
|
43
|
+
return {
|
|
44
|
+
abstractDefinitions: {},
|
|
45
|
+
instances: {},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function extractDocumentRootAttributes(
|
|
50
|
+
documentXml: string,
|
|
51
|
+
): Record<string, string> {
|
|
52
|
+
const match = documentXml.match(
|
|
53
|
+
/<(?:[A-Za-z_][A-Za-z0-9:._-]*:)?document\b([^>]*)>/u,
|
|
54
|
+
);
|
|
55
|
+
if (!match) {
|
|
56
|
+
return {};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const attributes: Record<string, string> = {};
|
|
60
|
+
const pattern = /([A-Za-z_][A-Za-z0-9:._-]*)\s*=\s*("([^"]*)"|'([^']*)')/gu;
|
|
61
|
+
for (const attributeMatch of (match[1] ?? "").matchAll(pattern)) {
|
|
62
|
+
const name = attributeMatch[1];
|
|
63
|
+
const value = attributeMatch[3] ?? attributeMatch[4] ?? "";
|
|
64
|
+
if (!name) {
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
attributes[name] = value;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return attributes;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export function serializeCanonicalDocumentForExport(
|
|
74
|
+
document: CanonicalDocument,
|
|
75
|
+
): string {
|
|
76
|
+
return createCanonicalDocumentSignature({
|
|
77
|
+
...document,
|
|
78
|
+
docId: "__export__",
|
|
79
|
+
createdAt: "__export__",
|
|
80
|
+
updatedAt: "__export__",
|
|
81
|
+
});
|
|
82
|
+
}
|