@beyondwork/docx-react-component 1.0.0 → 1.0.1
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/dist/chunk-32W6IVQE.js +7725 -0
- package/dist/chunk-32W6IVQE.js.map +1 -0
- package/dist/index.cjs +23722 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +7 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +16011 -0
- package/dist/index.js.map +1 -0
- package/dist/public-types-DqCURAz8.d.cts +1152 -0
- package/dist/public-types-DqCURAz8.d.ts +1152 -0
- package/dist/tailwind.cjs +8295 -0
- package/dist/tailwind.cjs.map +1 -0
- package/dist/tailwind.d.cts +323 -0
- package/dist/tailwind.d.ts +323 -0
- package/dist/tailwind.js +553 -0
- package/dist/tailwind.js.map +1 -0
- package/package.json +52 -31
- package/.codex/config.toml +0 -5
- package/.corepack/v1/pnpm/10.30.3/.corepack +0 -1
- package/.corepack/v1/pnpm/10.30.3/LICENSE +0 -22
- package/.corepack/v1/pnpm/10.30.3/README.md +0 -240
- package/.corepack/v1/pnpm/10.30.3/dist/node-gyp-bin/node-gyp +0 -6
- package/.corepack/v1/pnpm/10.30.3/dist/node-gyp-bin/node-gyp.cmd +0 -5
- package/.corepack/v1/pnpm/10.30.3/dist/pnpm.cjs +0 -195400
- package/.corepack/v1/pnpm/10.30.3/dist/pnpmrc +0 -2
- package/.corepack/v1/pnpm/10.30.3/dist/reflink.darwin-arm64-2HJ4WGO6.node +0 -0
- package/.corepack/v1/pnpm/10.30.3/dist/reflink.darwin-x64-3G3H6IW4.node +0 -0
- package/.corepack/v1/pnpm/10.30.3/dist/reflink.win32-arm64-msvc-Q6BARPPB.node +0 -0
- package/.corepack/v1/pnpm/10.30.3/dist/reflink.win32-x64-msvc-J2TZHRQI.node +0 -0
- package/.corepack/v1/pnpm/10.30.3/dist/templates/completion.bash +0 -31
- package/.corepack/v1/pnpm/10.30.3/dist/templates/completion.fish +0 -22
- package/.corepack/v1/pnpm/10.30.3/dist/templates/completion.ps1 +0 -193
- package/.corepack/v1/pnpm/10.30.3/dist/templates/completion.zsh +0 -27
- package/.corepack/v1/pnpm/10.30.3/dist/vendor/fastlist-0.3.0-x64.exe +0 -0
- package/.corepack/v1/pnpm/10.30.3/dist/vendor/fastlist-0.3.0-x86.exe +0 -0
- package/.corepack/v1/pnpm/10.30.3/dist/worker.js +0 -10119
- package/.corepack/v1/pnpm/10.30.3/package.json +0 -192
- package/.cursor/mcp.json +0 -7
- package/.github/workflows/ci.yml +0 -35
- package/.mcp.json +0 -7
- package/.openclaw/workspace-state.json +0 -4
- package/.pnpmrc.json +0 -1
- package/.wave-launch.sh +0 -7
- package/.workspace-marker +0 -1
- package/AGENTS.md +0 -78
- package/CHANGELOG.md +0 -177
- package/DESIGN.md +0 -929
- package/HEARTBEAT.md +0 -7
- package/IDENTITY.md +0 -23
- package/SOUL.md +0 -36
- package/TOOLS.md +0 -40
- package/USER.md +0 -17
- package/docs/README.md +0 -107
- package/docs/agents/wave-cont-eval-role.md +0 -36
- package/docs/agents/wave-cont-qa-role.md +0 -52
- package/docs/agents/wave-deploy-verifier-role.md +0 -34
- package/docs/agents/wave-design-role.md +0 -47
- package/docs/agents/wave-documentation-role.md +0 -34
- package/docs/agents/wave-infra-role.md +0 -34
- package/docs/agents/wave-integration-role.md +0 -37
- package/docs/agents/wave-launcher-role.md +0 -41
- package/docs/agents/wave-orchestrator-role.md +0 -52
- package/docs/agents/wave-planner-role.md +0 -39
- package/docs/agents/wave-security-role.md +0 -40
- package/docs/architecture/docx/README.md +0 -10
- package/docs/architecture/future/README.md +0 -8
- package/docs/architecture/ooxml-upgrade-analysis.md +0 -134
- package/docs/architecture/platform/shared-openxml-editor-platform.md +0 -153
- package/docs/architecture/xlsx/canonical-workbook-model-and-commands.md +0 -187
- package/docs/architecture/xlsx/spreadsheet-editor-frontend-architecture.md +0 -150
- package/docs/comment-redline-overview.md +0 -350
- package/docs/concepts/context7-vs-skills.md +0 -118
- package/docs/concepts/operating-modes.md +0 -91
- package/docs/concepts/runtime-agnostic-orchestration.md +0 -111
- package/docs/concepts/what-is-a-wave.md +0 -217
- package/docs/context7/bundles.json +0 -222
- package/docs/context7/planner-agent/README.md +0 -28
- package/docs/context7/planner-agent/manifest.json +0 -83
- package/docs/context7/planner-agent/papers/cooperbench-why-coding-agents-cannot-be-your-teammates-yet.md +0 -3283
- package/docs/context7/planner-agent/papers/dova-deliberation-first-multi-agent-orchestration-for-autonomous-research-automation.md +0 -1699
- package/docs/context7/planner-agent/papers/dpbench-large-language-models-struggle-with-simultaneous-coordination.md +0 -2251
- package/docs/context7/planner-agent/papers/incremental-planning-to-control-a-blackboard-based-problem-solver.md +0 -1729
- package/docs/context7/planner-agent/papers/silo-bench-a-scalable-environment-for-evaluating-distributed-coordination-in-multi-agent-llm-systems.md +0 -3747
- package/docs/context7/planner-agent/papers/todoevolve-learning-to-architect-agent-planning-systems.md +0 -1675
- package/docs/context7/planner-agent/papers/verified-multi-agent-orchestration-a-plan-execute-verify-replan-framework-for-complex-query-resolution.md +0 -1173
- package/docs/context7/planner-agent/papers/why-do-multi-agent-llm-systems-fail.md +0 -5211
- package/docs/context7/planner-agent/topics/planning-and-orchestration.md +0 -24
- package/docs/evals/arm-templates/README.md +0 -13
- package/docs/evals/arm-templates/full-wave.json +0 -15
- package/docs/evals/arm-templates/single-agent.json +0 -15
- package/docs/evals/benchmark-catalog.json +0 -670
- package/docs/evals/cases/README.md +0 -47
- package/docs/evals/cases/wave-blackboard-inbox-targeting.json +0 -73
- package/docs/evals/cases/wave-contradiction-conflict.json +0 -104
- package/docs/evals/cases/wave-expert-routing-preservation.json +0 -69
- package/docs/evals/cases/wave-hidden-profile-private-evidence.json +0 -81
- package/docs/evals/cases/wave-premature-closure-guard.json +0 -71
- package/docs/evals/cases/wave-silo-cross-agent-state.json +0 -77
- package/docs/evals/cases/wave-simultaneous-lockstep.json +0 -92
- package/docs/evals/external-benchmarks.json +0 -85
- package/docs/evals/external-command-config.sample.json +0 -9
- package/docs/evals/external-command-config.swe-bench-pro.json +0 -8
- package/docs/evals/pilots/README.md +0 -47
- package/docs/evals/pilots/swe-bench-pro-public-full-wave-review-10.json +0 -64
- package/docs/evals/pilots/swe-bench-pro-public-pilot.json +0 -111
- package/docs/evals/wave-benchmark-program.md +0 -302
- package/docs/guides/planner.md +0 -220
- package/docs/guides/recommendations-0.8.9.md +0 -133
- package/docs/guides/signal-wrappers.md +0 -165
- package/docs/guides/terminal-surfaces.md +0 -96
- package/docs/image copy.png +0 -0
- package/docs/image.png +0 -0
- package/docs/images/image.png +0 -0
- package/docs/legal-feedback-architecture.md +0 -498
- package/docs/plans/component-cutover-matrix.json +0 -1072
- package/docs/plans/component-cutover-matrix.md +0 -307
- package/docs/plans/context7-wave-orchestrator.md +0 -155
- package/docs/plans/current-state.md +0 -198
- package/docs/plans/docx/README.md +0 -9
- package/docs/plans/examples/wave-benchmark-improvement.md +0 -108
- package/docs/plans/examples/wave-example-live-proof.md +0 -435
- package/docs/plans/master-plan.md +0 -224
- package/docs/plans/migration.md +0 -538
- package/docs/plans/operations/README.md +0 -7
- package/docs/plans/operations/wave-10-word-certification.md +0 -87
- package/docs/plans/operations/wave-8-railway-staging.md +0 -153
- package/docs/plans/operations/wave-9-manual-certification.md +0 -73
- package/docs/plans/platform/README.md +0 -9
- package/docs/plans/reference/legal-checklist-coverage.md +0 -258
- package/docs/plans/wave-orchestrator.md +0 -423
- package/docs/plans/waves/README.md +0 -75
- package/docs/plans/waves/completed/wave-0.md +0 -195
- package/docs/plans/waves/completed/wave-1.md +0 -379
- package/docs/plans/waves/completed/wave-10.md +0 -670
- package/docs/plans/waves/completed/wave-11.md +0 -335
- package/docs/plans/waves/completed/wave-12.md +0 -417
- package/docs/plans/waves/completed/wave-13.md +0 -316
- package/docs/plans/waves/completed/wave-14.md +0 -319
- package/docs/plans/waves/completed/wave-15.md +0 -321
- package/docs/plans/waves/completed/wave-16.md +0 -316
- package/docs/plans/waves/completed/wave-17.md +0 -331
- package/docs/plans/waves/completed/wave-18.md +0 -328
- package/docs/plans/waves/completed/wave-2.md +0 -438
- package/docs/plans/waves/completed/wave-3.md +0 -435
- package/docs/plans/waves/completed/wave-4.md +0 -430
- package/docs/plans/waves/completed/wave-5.md +0 -430
- package/docs/plans/waves/completed/wave-6.md +0 -430
- package/docs/plans/waves/completed/wave-7.md +0 -526
- package/docs/plans/waves/completed/wave-8.md +0 -596
- package/docs/plans/waves/completed/wave-9.md +0 -552
- package/docs/plans/waves/deferred/README.md +0 -14
- package/docs/plans/waves/deferred/encrypted-intake-contracts.md +0 -282
- package/docs/plans/waves/deferred/legal-feedback-wave-expansion.md +0 -308
- package/docs/plans/waves/deferred/wave-encrypted-intake.md +0 -451
- package/docs/plans/waves/design/README.md +0 -5
- package/docs/plans/waves/design/wave-1-a1.md +0 -309
- package/docs/plans/waves/reviews/README.md +0 -5
- package/docs/plans/waves/reviews/wave-0-cont-qa.md +0 -151
- package/docs/plans/waves/reviews/wave-1-cont-qa.md +0 -46
- package/docs/plans/waves/reviews/wave-10-accessibility-and-design.md +0 -51
- package/docs/plans/waves/reviews/wave-10-cont-qa.md +0 -24
- package/docs/plans/waves/reviews/wave-10-dashboard-proof.md +0 -46
- package/docs/plans/waves/reviews/wave-10-performance-signoff.md +0 -55
- package/docs/plans/waves/reviews/wave-10-regression-proof.md +0 -23
- package/docs/plans/waves/reviews/wave-10-release-audit.md +0 -31
- package/docs/plans/waves/reviews/wave-10-service-proof.md +0 -83
- package/docs/plans/waves/reviews/wave-10-word-certification.md +0 -31
- package/docs/plans/waves/reviews/wave-18-ai-contract-closure.md +0 -277
- package/docs/plans/waves/reviews/wave-18-cont-qa.md +0 -255
- package/docs/plans/waves/reviews/wave-18-parity-proof.md +0 -271
- package/docs/plans/waves/reviews/wave-19-cont-qa.md +0 -59
- package/docs/plans/waves/reviews/wave-2-cont-qa.md +0 -72
- package/docs/plans/waves/reviews/wave-20-cont-qa.md +0 -60
- package/docs/plans/waves/reviews/wave-25-cont-qa.md +0 -48
- package/docs/plans/waves/reviews/wave-28-cont-qa.md +0 -46
- package/docs/plans/waves/reviews/wave-29-cont-qa.md +0 -53
- package/docs/plans/waves/reviews/wave-3-cont-qa.md +0 -53
- package/docs/plans/waves/reviews/wave-3-core-proof.md +0 -77
- package/docs/plans/waves/reviews/wave-3-validator-proof.md +0 -73
- package/docs/plans/waves/reviews/wave-32-cont-qa.md +0 -43
- package/docs/plans/waves/reviews/wave-33-cont-qa.md +0 -526
- package/docs/plans/waves/reviews/wave-34-cont-qa.md +0 -100
- package/docs/plans/waves/reviews/wave-35-cont-qa.md +0 -145
- package/docs/plans/waves/reviews/wave-4-cont-qa.md +0 -47
- package/docs/plans/waves/reviews/wave-4-structure-proof.md +0 -69
- package/docs/plans/waves/reviews/wave-5-comment-proof.md +0 -158
- package/docs/plans/waves/reviews/wave-5-cont-qa.md +0 -68
- package/docs/plans/waves/reviews/wave-6-cont-qa.md +0 -416
- package/docs/plans/waves/reviews/wave-6-redline-proof.md +0 -130
- package/docs/plans/waves/reviews/wave-7-cont-qa.md +0 -82
- package/docs/plans/waves/reviews/wave-7-ooxml-compliance.md +0 -85
- package/docs/plans/waves/reviews/wave-7-preservation-proof.md +0 -119
- package/docs/plans/waves/reviews/wave-7-trust-ux.md +0 -87
- package/docs/plans/waves/reviews/wave-8-accessibility-and-design.md +0 -128
- package/docs/plans/waves/reviews/wave-8-cont-qa.md +0 -92
- package/docs/plans/waves/reviews/wave-8-live-proof.md +0 -140
- package/docs/plans/waves/reviews/wave-8-security.md +0 -47
- package/docs/plans/waves/reviews/wave-9-editor-embedding.md +0 -39
- package/docs/plans/waves/reviews/wave-9-fixture-runner.md +0 -56
- package/docs/plans/waves/reviews/wave-9-live-proof.md +0 -105
- package/docs/plans/waves/reviews/wave-9-usability-and-performance.md +0 -152
- package/docs/plans/waves/specs/README.md +0 -5
- package/docs/plans/waves/specs/wave-1-component-boundaries.md +0 -322
- package/docs/plans/waves/specs/wave-1-ooxml-contracts.md +0 -323
- package/docs/plans/waves/specs/wave-1-review-and-ui-contracts.md +0 -339
- package/docs/plans/waves/specs/wave-1-runtime-contracts.md +0 -509
- package/docs/plans/waves/wave-19.md +0 -341
- package/docs/plans/waves/wave-20.md +0 -308
- package/docs/plans/waves/wave-21.md +0 -289
- package/docs/plans/waves/wave-22.md +0 -221
- package/docs/plans/waves/wave-23.md +0 -295
- package/docs/plans/waves/wave-24.md +0 -286
- package/docs/plans/waves/wave-25.md +0 -313
- package/docs/plans/waves/wave-26.md +0 -300
- package/docs/plans/waves/wave-27.md +0 -299
- package/docs/plans/waves/wave-28.md +0 -368
- package/docs/plans/waves/wave-29.md +0 -303
- package/docs/plans/waves/wave-30.md +0 -307
- package/docs/plans/waves/wave-31.md +0 -231
- package/docs/plans/waves/wave-32.md +0 -152
- package/docs/plans/waves/wave-33.md +0 -147
- package/docs/plans/waves/wave-34.md +0 -148
- package/docs/plans/waves/wave-35.md +0 -141
- package/docs/plans/waves/wave-36.md +0 -146
- package/docs/plans/xlsx/README.md +0 -14
- package/docs/plans/xlsx/xlsx-fixture-corpus-and-certification-plan.md +0 -126
- package/docs/reference/cli-reference.md +0 -600
- package/docs/reference/coordination-and-closure.md +0 -487
- package/docs/reference/deep-research-report (15).md +0 -25
- package/docs/reference/docx/README.md +0 -10
- package/docs/reference/legal-checklist.md +0 -445
- package/docs/reference/live-proof-waves.md +0 -199
- package/docs/reference/ooxml-compliance.md +0 -129
- package/docs/reference/ooxml-feature-parity-matrix.md +0 -172
- package/docs/reference/platform/shared-ooxml-platform-guidance.md +0 -77
- package/docs/reference/prototype-agent-prompt-legal-fidelity.md +0 -155
- package/docs/reference/public-api.md +0 -456
- package/docs/reference/repository-guidance.md +0 -58
- package/docs/reference/runtime-config/README.md +0 -182
- package/docs/reference/runtime-config/claude.md +0 -110
- package/docs/reference/runtime-config/codex.md +0 -82
- package/docs/reference/runtime-config/opencode.md +0 -93
- package/docs/reference/sample-waves.md +0 -105
- package/docs/reference/skills.md +0 -237
- package/docs/reference/templates/AGENTS.md +0 -78
- package/docs/reference/templates/HEARTBEAT.md +0 -7
- package/docs/reference/templates/IDENTITY.md +0 -23
- package/docs/reference/templates/SOUL.md +0 -36
- package/docs/reference/templates/TOOLS.md +0 -40
- package/docs/reference/templates/USER.md +0 -17
- package/docs/reference/wave-control.md +0 -184
- package/docs/reference/wave-planning-lessons.md +0 -167
- package/docs/reference/word-review-editor-frontend-architecture.md +0 -479
- package/docs/reference/word-review-editor-ux-guide.md +0 -253
- package/docs/reference/xlsx/xlsx-ooxml-compliance.md +0 -137
- package/docs/research/agent-context-sources.md +0 -178
- package/docs/research/coordination-failure-review.md +0 -290
- package/docs/research/docx-react-component/Canonical Document Schema Specification for a React-based Word-compatible Editor.md +0 -2317
- package/docs/research/docx-react-component/Feature Compatibility Matrix for a React Word Compatible Legal Editor v1.md +0 -219
- package/docs/research/docx-react-component/React Component Architecture and Front-End Structure Specification for a Word-Compatible Legal Review Editor.md +0 -1112
- package/docs/research/docx-react-component/document_compatibility_and_testing_spec.md +0 -751
- package/docs/research/xlsx/raw/README.md +0 -13
- package/docs/roadmap.md +0 -174
- package/docs/superpowers/plans/2026-03-28-harness-control-bar.md +0 -677
- package/docs/superpowers/specs/2026-03-28-harness-control-bar-design.md +0 -274
- package/docs/xlsx-react/README.md +0 -38
- package/docs/xlsx-react/agent-llm-interaction-layer-docx-xlsx.md +0 -621
- package/docs/xlsx-react/canonical-workbook-model-and-commands.md +0 -948
- package/docs/xlsx-react/shared-openxml-editor-platform-docx-xlsx.md +0 -228
- package/docs/xlsx-react/spreadsheet-editor-component-architecture.md +0 -809
- package/docs/xlsx-react/spreadsheet-editor-frontend-architecture.md +0 -537
- package/docs/xlsx-react/spreadsheet-editor-ux-guide.md +0 -520
- package/docs/xlsx-react/xlsx-editor-research-pack.md +0 -871
- package/docs/xlsx-react/xlsx-fixture-corpus-and-certification-plan.md +0 -436
- package/docs/xlsx-react/xlsx-ooxml-compliance.md +0 -320
- package/examples/README.md +0 -16
- package/memory/MEMORY.md +0 -24
- package/pnpm-workspace.yaml +0 -4
- package/scripts/check-no-authored-js.sh +0 -13
- package/scripts/context7-api-check.sh +0 -65
- package/scripts/context7-export-env.sh +0 -42
- package/scripts/run-context7-mcp.sh +0 -8
- package/scripts/run-workspace-tests.sh +0 -15
- package/scripts/start-wave-10-local.sh +0 -189
- package/scripts/wave-agent-attach.sh +0 -47
- package/scripts/wave-auto-answer.sh +0 -118
- package/scripts/wave-dashboard-attach.sh +0 -13
- package/scripts/wave-launch.sh +0 -273
- package/scripts/wave-overnight-supervisor.sh +0 -145
- package/scripts/wave-status.sh +0 -379
- package/scripts/wave-watch.sh +0 -231
- package/services/README.md +0 -17
- package/services/openxml-validator/Dockerfile +0 -29
- package/services/openxml-validator/OpenXmlValidator.Api.csproj +0 -12
- package/services/openxml-validator/Program.cs +0 -436
- package/services/openxml-validator/README.md +0 -152
- package/services/openxml-validator/railway.json +0 -16
- package/services/react-word-editor/.tmp-a4/src/api/public-types.ts +0 -318
- package/services/react-word-editor/.tmp-a4/src/ui/WordReviewEditor.tsx +0 -1302
- package/services/react-word-editor/.tmp-a4/src/ui/editor-surface/editor-surface.tsx +0 -546
- package/services/react-word-editor/.tmp-a4/test/ui/word-review-editor.test.tsx +0 -146
- package/services/react-word-editor/.tmp-a4-build/src/api/public-types.js +0 -2
- package/services/react-word-editor/.tmp-a4-build/src/ui/WordReviewEditor.js +0 -818
- package/services/react-word-editor/.tmp-a4-build/src/ui/editor-surface/editor-surface.js +0 -229
- package/services/react-word-editor/.tmp-a4-build/test/ui/word-review-editor.test.js +0 -121
- package/services/react-word-editor/.tmp-wave-4-a3-tsconfig.json +0 -21
- package/services/react-word-editor/.tmp-wave-4-a3-tsconfig.tsbuildinfo +0 -1
- package/services/react-word-editor/Dockerfile +0 -26
- package/services/react-word-editor/README.md +0 -254
- package/services/react-word-editor/app/api/certification/route.ts +0 -79
- package/services/react-word-editor/app/api/demo-sessions/route.ts +0 -109
- package/services/react-word-editor/app/api/deploy-health/route.ts +0 -23
- package/services/react-word-editor/app/api/exports/[exportId]/route.ts +0 -34
- package/services/react-word-editor/app/api/exports/route.ts +0 -81
- package/services/react-word-editor/app/api/fixtures/[fixtureId]/run/route.ts +0 -100
- package/services/react-word-editor/app/api/health/route.ts +0 -70
- package/services/react-word-editor/app/api/runs/[runId]/route.ts +0 -36
- package/services/react-word-editor/app/api/scenarios/[scenarioId]/run/route.ts +0 -85
- package/services/react-word-editor/app/api/sessions/[sessionId]/route.ts +0 -199
- package/services/react-word-editor/app/api/sessions/[sessionId]/source/route.ts +0 -45
- package/services/react-word-editor/app/api/uploads/route.ts +0 -70
- package/services/react-word-editor/app/api/validate/route.ts +0 -310
- package/services/react-word-editor/app/certification/[runId]/page.tsx +0 -14
- package/services/react-word-editor/app/certification/page.tsx +0 -32
- package/services/react-word-editor/app/dashboard/page.tsx +0 -7
- package/services/react-word-editor/app/demo/page.tsx +0 -30
- package/services/react-word-editor/app/demo/prototype-client.tsx +0 -1080
- package/services/react-word-editor/app/editor/[sessionId]/page.tsx +0 -33
- package/services/react-word-editor/app/fixtures/page.tsx +0 -7
- package/services/react-word-editor/app/globals.css +0 -121
- package/services/react-word-editor/app/layout.tsx +0 -32
- package/services/react-word-editor/app/page.tsx +0 -30
- package/services/react-word-editor/app/runs/[runId]/page.tsx +0 -34
- package/services/react-word-editor/app/wave-10-word-review/page.tsx +0 -7
- package/services/react-word-editor/components/harness-control-bar.tsx +0 -289
- package/services/react-word-editor/components/harness-editor-session-client.tsx +0 -1214
- package/services/react-word-editor/components/harness-workspace-page.tsx +0 -715
- package/services/react-word-editor/components/reduced-motion-toggle.tsx +0 -79
- package/services/react-word-editor/components/workspace-certification-panel.tsx +0 -307
- package/services/react-word-editor/lib/certification-bundle.ts +0 -796
- package/services/react-word-editor/lib/certification-store.ts +0 -661
- package/services/react-word-editor/lib/demo-fixtures.test.mjs +0 -195
- package/services/react-word-editor/lib/demo-fixtures.ts +0 -1519
- package/services/react-word-editor/lib/editor-session-summary.test.mjs +0 -68
- package/services/react-word-editor/lib/editor-session-summary.ts +0 -14
- package/services/react-word-editor/lib/editor-session.ts +0 -228
- package/services/react-word-editor/lib/exports-route.test.mjs +0 -32
- package/services/react-word-editor/lib/harness-client.ts +0 -347
- package/services/react-word-editor/lib/harness-config.json +0 -30
- package/services/react-word-editor/lib/harness-config.test.mjs +0 -31
- package/services/react-word-editor/lib/harness-config.ts +0 -21
- package/services/react-word-editor/lib/harness-editor-datastore.test.mjs +0 -220
- package/services/react-word-editor/lib/harness-editor-datastore.ts +0 -161
- package/services/react-word-editor/lib/private-mode.test.mjs +0 -42
- package/services/react-word-editor/lib/private-mode.ts +0 -61
- package/services/react-word-editor/lib/regression-report.test.mjs +0 -352
- package/services/react-word-editor/lib/regression-report.ts +0 -896
- package/services/react-word-editor/lib/run-artifacts.ts +0 -934
- package/services/react-word-editor/lib/run-history.ts +0 -755
- package/services/react-word-editor/lib/scenario-artifacts.test.mjs +0 -41
- package/services/react-word-editor/lib/scenario-artifacts.ts +0 -44
- package/services/react-word-editor/lib/storage.ts +0 -953
- package/services/react-word-editor/lib/validator-client.test.mjs +0 -54
- package/services/react-word-editor/lib/validator-client.ts +0 -95
- package/services/react-word-editor/lib/workspace-navigation.ts +0 -79
- package/services/react-word-editor/middleware.ts +0 -35
- package/services/react-word-editor/next-env.d.ts +0 -6
- package/services/react-word-editor/next.config.mjs +0 -15
- package/services/react-word-editor/package.json +0 -38
- package/services/react-word-editor/postcss.config.mjs +0 -8
- package/services/react-word-editor/railway.json +0 -21
- package/services/react-word-editor/scripts/wave-10-certification.mjs +0 -101
- package/services/react-word-editor/scripts/wave-9-live-usability-pilot.mjs +0 -911
- package/services/react-word-editor/tsconfig.json +0 -39
- package/services/react-word-editor/tsconfig.tsbuildinfo +0 -1
- package/skills/README.md +0 -48
- package/skills/domain-docx-compatibility/SKILL.md +0 -44
- package/skills/domain-docx-compatibility/skill.json +0 -19
- package/skills/domain-editor-architecture/SKILL.md +0 -49
- package/skills/domain-editor-architecture/skill.json +0 -19
- package/skills/domain-legal-review/SKILL.md +0 -39
- package/skills/domain-legal-review/skill.json +0 -19
- package/skills/provider-aws/SKILL.md +0 -117
- package/skills/provider-aws/adapters/claude.md +0 -1
- package/skills/provider-aws/adapters/codex.md +0 -1
- package/skills/provider-aws/references/service-verification.md +0 -39
- package/skills/provider-aws/skill.json +0 -54
- package/skills/provider-custom-deploy/SKILL.md +0 -64
- package/skills/provider-custom-deploy/skill.json +0 -50
- package/skills/provider-docker-compose/SKILL.md +0 -96
- package/skills/provider-docker-compose/adapters/local.md +0 -1
- package/skills/provider-docker-compose/skill.json +0 -53
- package/skills/provider-github-release/SKILL.md +0 -121
- package/skills/provider-github-release/adapters/claude.md +0 -1
- package/skills/provider-github-release/adapters/codex.md +0 -1
- package/skills/provider-github-release/skill.json +0 -55
- package/skills/provider-kubernetes/SKILL.md +0 -143
- package/skills/provider-kubernetes/adapters/claude.md +0 -1
- package/skills/provider-kubernetes/adapters/codex.md +0 -1
- package/skills/provider-kubernetes/references/kubectl-patterns.md +0 -58
- package/skills/provider-kubernetes/skill.json +0 -52
- package/skills/provider-railway/SKILL.md +0 -123
- package/skills/provider-railway/adapters/claude.md +0 -1
- package/skills/provider-railway/adapters/codex.md +0 -1
- package/skills/provider-railway/adapters/local.md +0 -1
- package/skills/provider-railway/adapters/opencode.md +0 -1
- package/skills/provider-railway/references/verification-commands.md +0 -39
- package/skills/provider-railway/skill.json +0 -71
- package/skills/provider-ssh-manual/SKILL.md +0 -97
- package/skills/provider-ssh-manual/skill.json +0 -54
- package/skills/repo-coding-rules/SKILL.md +0 -55
- package/skills/repo-coding-rules/skill.json +0 -34
- package/skills/role-cont-eval/SKILL.md +0 -91
- package/skills/role-cont-eval/adapters/codex.md +0 -1
- package/skills/role-cont-eval/skill.json +0 -36
- package/skills/role-cont-qa/SKILL.md +0 -100
- package/skills/role-cont-qa/adapters/claude.md +0 -1
- package/skills/role-cont-qa/skill.json +0 -36
- package/skills/role-deploy/SKILL.md +0 -97
- package/skills/role-deploy/skill.json +0 -36
- package/skills/role-design/SKILL.md +0 -50
- package/skills/role-design/skill.json +0 -36
- package/skills/role-documentation/SKILL.md +0 -76
- package/skills/role-documentation/skill.json +0 -36
- package/skills/role-implementation/SKILL.md +0 -45
- package/skills/role-implementation/skill.json +0 -36
- package/skills/role-infra/SKILL.md +0 -81
- package/skills/role-infra/skill.json +0 -36
- package/skills/role-integration/SKILL.md +0 -91
- package/skills/role-integration/skill.json +0 -36
- package/skills/role-planner/SKILL.md +0 -39
- package/skills/role-planner/skill.json +0 -21
- package/skills/role-research/SKILL.md +0 -65
- package/skills/role-research/skill.json +0 -36
- package/skills/role-security/SKILL.md +0 -60
- package/skills/role-security/skill.json +0 -36
- package/skills/runtime-claude/SKILL.md +0 -66
- package/skills/runtime-claude/skill.json +0 -36
- package/skills/runtime-codex/SKILL.md +0 -58
- package/skills/runtime-codex/skill.json +0 -36
- package/skills/runtime-local/SKILL.md +0 -46
- package/skills/runtime-local/skill.json +0 -36
- package/skills/runtime-opencode/SKILL.md +0 -58
- package/skills/runtime-opencode/skill.json +0 -36
- package/skills/signal-hygiene/SKILL.md +0 -51
- package/skills/signal-hygiene/skill.json +0 -20
- package/skills/tui-design/SKILL.md +0 -77
- package/skills/tui-design/references/tui-design.md +0 -259
- package/skills/tui-design/skill.json +0 -36
- package/skills/wave-core/SKILL.md +0 -141
- package/skills/wave-core/references/marker-syntax.md +0 -70
- package/skills/wave-core/skill.json +0 -35
- package/src/README.md +0 -85
- package/src/api/README.md +0 -22
- package/src/api/public-types.ts +0 -525
- package/src/component-inventory.md +0 -99
- package/src/core/README.md +0 -10
- package/src/core/commands/README.md +0 -3
- package/src/core/commands/formatting-commands.ts +0 -161
- package/src/core/commands/image-commands.ts +0 -144
- package/src/core/commands/index.ts +0 -1013
- package/src/core/commands/list-commands.ts +0 -370
- package/src/core/commands/review-commands.ts +0 -108
- package/src/core/commands/text-commands.ts +0 -119
- package/src/core/schema/README.md +0 -3
- package/src/core/schema/text-schema.ts +0 -512
- package/src/core/selection/README.md +0 -3
- package/src/core/selection/mapping.ts +0 -238
- package/src/core/selection/review-anchors.ts +0 -94
- package/src/core/state/README.md +0 -3
- package/src/core/state/editor-state.ts +0 -580
- package/src/core/state/text-transaction.ts +0 -276
- package/src/formats/xlsx/io/parse-shared-strings.ts +0 -41
- package/src/formats/xlsx/io/parse-sheet.ts +0 -289
- package/src/formats/xlsx/io/parse-styles.ts +0 -57
- package/src/formats/xlsx/io/parse-workbook.ts +0 -75
- package/src/formats/xlsx/io/xlsx-session.ts +0 -306
- package/src/formats/xlsx/model/cell.ts +0 -189
- package/src/formats/xlsx/model/sheet.ts +0 -244
- package/src/formats/xlsx/model/styles.ts +0 -118
- package/src/formats/xlsx/model/workbook.ts +0 -449
- package/src/io/README.md +0 -10
- package/src/io/docx-session.ts +0 -1763
- package/src/io/export/README.md +0 -3
- package/src/io/export/export-session.ts +0 -165
- package/src/io/export/minimal-docx.ts +0 -115
- package/src/io/export/reattach-preserved-parts.ts +0 -54
- package/src/io/export/serialize-comments.ts +0 -876
- package/src/io/export/serialize-footnotes.ts +0 -217
- package/src/io/export/serialize-headers-footers.ts +0 -200
- package/src/io/export/serialize-main-document.ts +0 -982
- package/src/io/export/serialize-numbering.ts +0 -97
- package/src/io/export/serialize-revisions.ts +0 -389
- package/src/io/export/serialize-runtime-revisions.ts +0 -265
- package/src/io/export/serialize-tables.ts +0 -147
- package/src/io/export/split-review-boundaries.ts +0 -194
- package/src/io/normalize/README.md +0 -3
- package/src/io/normalize/normalize-text.ts +0 -437
- package/src/io/ooxml/README.md +0 -3
- package/src/io/ooxml/parse-comments.ts +0 -779
- package/src/io/ooxml/parse-complex-content.ts +0 -287
- package/src/io/ooxml/parse-fields.ts +0 -438
- package/src/io/ooxml/parse-footnotes.ts +0 -403
- package/src/io/ooxml/parse-headers-footers.ts +0 -483
- package/src/io/ooxml/parse-inline-media.ts +0 -431
- package/src/io/ooxml/parse-main-document.ts +0 -1846
- package/src/io/ooxml/parse-numbering.ts +0 -425
- package/src/io/ooxml/parse-revisions.ts +0 -658
- package/src/io/ooxml/parse-shapes.ts +0 -271
- package/src/io/ooxml/parse-tables.ts +0 -568
- package/src/io/ooxml/parse-theme.ts +0 -314
- package/src/io/ooxml/part-manifest.ts +0 -136
- package/src/io/ooxml/revision-boundaries.ts +0 -351
- package/src/io/opc/README.md +0 -3
- package/src/io/opc/corrupt-package.ts +0 -166
- package/src/io/opc/docx-package.ts +0 -74
- package/src/io/opc/package-reader.ts +0 -320
- package/src/io/opc/package-writer.ts +0 -273
- package/src/model/README.md +0 -3
- package/src/model/canonical-document.ts +0 -1911
- package/src/model/cds-1.0.0.ts +0 -196
- package/src/model/snapshot.ts +0 -393
- package/src/preservation/README.md +0 -3
- package/src/preservation/markup-compatibility.ts +0 -48
- package/src/preservation/opaque-fragment-store.ts +0 -89
- package/src/preservation/opaque-region.ts +0 -233
- package/src/preservation/package-preservation.ts +0 -120
- package/src/preservation/preserved-part-manifest.ts +0 -56
- package/src/preservation/relationship-retention.ts +0 -57
- package/src/preservation/store.ts +0 -185
- package/src/review/README.md +0 -16
- package/src/review/store/README.md +0 -3
- package/src/review/store/comment-anchors.ts +0 -70
- package/src/review/store/comment-remapping.ts +0 -154
- package/src/review/store/comment-store.ts +0 -331
- package/src/review/store/comment-thread.ts +0 -109
- package/src/review/store/revision-actions.ts +0 -394
- package/src/review/store/revision-store.ts +0 -303
- package/src/review/store/revision-types.ts +0 -168
- package/src/review/store/runtime-comment-store.ts +0 -43
- package/src/runtime/README.md +0 -3
- package/src/runtime/ai-action-policy.ts +0 -764
- package/src/runtime/document-runtime.ts +0 -969
- package/src/runtime/read-only-diagnostics-runtime.ts +0 -232
- package/src/runtime/review-runtime.ts +0 -44
- package/src/runtime/revision-runtime.ts +0 -107
- package/src/runtime/session-capabilities.ts +0 -138
- package/src/runtime/surface-projection.ts +0 -570
- package/src/runtime/table-commands.ts +0 -84
- package/src/runtime/table-schema.ts +0 -125
- package/src/ui/README.md +0 -30
- package/src/ui/WordReviewEditor.tsx +0 -1283
- package/src/ui/comments/README.md +0 -3
- package/src/ui/compatibility/README.md +0 -3
- package/src/ui/editor-surface/README.md +0 -3
- package/src/ui/headless/comment-decoration-model.ts +0 -124
- package/src/ui/headless/revision-decoration-model.ts +0 -128
- package/src/ui/headless/selection-helpers.ts +0 -34
- package/src/ui/headless/use-editor-keyboard.ts +0 -98
- package/src/ui/review/README.md +0 -3
- package/src/ui/shared/revision-filters.ts +0 -31
- package/src/ui/status/README.md +0 -3
- package/src/ui/theme/README.md +0 -3
- package/src/ui/toolbar/README.md +0 -3
- package/src/ui-tailwind/chrome/tw-alert-banner.tsx +0 -48
- package/src/ui-tailwind/chrome/tw-selection-toolbar.tsx +0 -44
- package/src/ui-tailwind/chrome/tw-unsaved-modal.tsx +0 -58
- package/src/ui-tailwind/chrome/use-before-unload.ts +0 -20
- package/src/ui-tailwind/editor-surface/pm-command-bridge.ts +0 -139
- package/src/ui-tailwind/editor-surface/pm-decorations.ts +0 -98
- package/src/ui-tailwind/editor-surface/pm-position-map.ts +0 -123
- package/src/ui-tailwind/editor-surface/pm-schema.ts +0 -452
- package/src/ui-tailwind/editor-surface/pm-state-from-snapshot.ts +0 -327
- package/src/ui-tailwind/editor-surface/search-plugin.ts +0 -157
- package/src/ui-tailwind/editor-surface/tw-caret.tsx +0 -12
- package/src/ui-tailwind/editor-surface/tw-editor-surface.tsx +0 -150
- package/src/ui-tailwind/editor-surface/tw-inline-token.tsx +0 -118
- package/src/ui-tailwind/editor-surface/tw-opaque-block.tsx +0 -52
- package/src/ui-tailwind/editor-surface/tw-paragraph-block.tsx +0 -151
- package/src/ui-tailwind/editor-surface/tw-prosemirror-surface.tsx +0 -215
- package/src/ui-tailwind/editor-surface/tw-segment-view.tsx +0 -111
- package/src/ui-tailwind/editor-surface/tw-table-node-view.tsx +0 -108
- package/src/ui-tailwind/index.ts +0 -61
- package/src/ui-tailwind/review/tw-comment-sidebar.tsx +0 -276
- package/src/ui-tailwind/review/tw-health-panel.tsx +0 -120
- package/src/ui-tailwind/review/tw-review-rail.tsx +0 -120
- package/src/ui-tailwind/review/tw-revision-sidebar.tsx +0 -164
- package/src/ui-tailwind/status/tw-status-bar.tsx +0 -58
- package/src/ui-tailwind/theme/editor-theme.css +0 -190
- package/src/ui-tailwind/toolbar/tw-toolbar-icon-button.tsx +0 -48
- package/src/ui-tailwind/toolbar/tw-toolbar.tsx +0 -231
- package/src/ui-tailwind/tw-review-workspace.tsx +0 -140
- package/src/validation/README.md +0 -3
- package/src/validation/compatibility-engine.ts +0 -317
- package/src/validation/compatibility-report.ts +0 -160
- package/src/validation/diagnostics.ts +0 -203
- package/src/validation/import-diagnostics.ts +0 -128
- package/src/validation/low-priority-word-surfaces.ts +0 -373
- package/test/README.md +0 -16
- package/test/core/formatting-commands.test.ts +0 -285
- package/test/core/image-commands.test.ts +0 -298
- package/test/core/mapping.test.ts +0 -186
- package/test/core/text-commands.test.ts +0 -176
- package/test/fixtures/docx/F01-basic-contract.docx +0 -0
- package/test/fixtures/docx/F01-basic-contract.md +0 -33
- package/test/fixtures/docx/F02-headings-styles.docx +0 -0
- package/test/fixtures/docx/F02-headings-styles.md +0 -33
- package/test/fixtures/docx/F03-legal-outline-numbering.docx +0 -0
- package/test/fixtures/docx/F03-legal-outline-numbering.md +0 -34
- package/test/fixtures/docx/F04-restart-numbering-schedules.docx +0 -0
- package/test/fixtures/docx/F04-restart-numbering-schedules.md +0 -33
- package/test/fixtures/docx/F05-table-heavy-agreement.docx +0 -0
- package/test/fixtures/docx/F05-table-heavy-agreement.md +0 -34
- package/test/fixtures/docx/F06-merged-cells-signature-table.docx +0 -0
- package/test/fixtures/docx/F06-merged-cells-signature-table.md +0 -34
- package/test/fixtures/docx/F07-inline-images-exhibit.docx +0 -0
- package/test/fixtures/docx/F07-inline-images-exhibit.md +0 -34
- package/test/fixtures/docx/F08-hyperlinks.docx +0 -0
- package/test/fixtures/docx/F08-hyperlinks.md +0 -33
- package/test/fixtures/docx/F09-comments-single-paragraph.docx +0 -0
- package/test/fixtures/docx/F09-comments-single-paragraph.md +0 -33
- package/test/fixtures/docx/F10-threaded-comments-resolve.docx +0 -0
- package/test/fixtures/docx/F10-threaded-comments-resolve.md +0 -33
- package/test/fixtures/docx/F11-redlines-basic.docx +0 -0
- package/test/fixtures/docx/F11-redlines-basic.md +0 -33
- package/test/fixtures/docx/F12-redlines-paragraph-joins-splits.docx +0 -0
- package/test/fixtures/docx/F12-redlines-paragraph-joins-splits.md +0 -33
- package/test/fixtures/docx/F13-comments-on-deleted-text.docx +0 -0
- package/test/fixtures/docx/F13-comments-on-deleted-text.md +0 -33
- package/test/fixtures/docx/F14-revisions-in-tables-and-lists.docx +0 -0
- package/test/fixtures/docx/F14-revisions-in-tables-and-lists.md +0 -33
- package/test/fixtures/docx/F15-sections-headers-footers.docx +0 -0
- package/test/fixtures/docx/F15-sections-headers-footers.md +0 -33
- package/test/fixtures/docx/F16-footnotes-endnotes.docx +0 -0
- package/test/fixtures/docx/F16-footnotes-endnotes.md +0 -33
- package/test/fixtures/docx/F17-fields-and-toc.docx +0 -0
- package/test/fixtures/docx/F17-fields-and-toc.md +0 -33
- package/test/fixtures/docx/F18-content-controls-template.docx +0 -0
- package/test/fixtures/docx/F18-content-controls-template.md +0 -33
- package/test/fixtures/docx/F19-custom-xml-doc-assembly.docx +0 -0
- package/test/fixtures/docx/F19-custom-xml-doc-assembly.md +0 -35
- package/test/fixtures/docx/F20-unknown-ooxml-and-alternatecontent.docx +0 -0
- package/test/fixtures/docx/F20-unknown-ooxml-and-alternatecontent.md +0 -33
- package/test/fixtures/docx/F21-malformed-broken-docx.docx +0 -0
- package/test/fixtures/docx/F21-malformed-broken-docx.md +0 -33
- package/test/fixtures/docx/README.md +0 -74
- package/test/fixtures/docx/certification-manifest.json +0 -104
- package/test/fixtures/docx/fixtures.manifest.json +0 -196
- package/test/fixtures/encrypted-docx/README.md +0 -27
- package/test/fixtures/encrypted-docx/certification-manifest.json +0 -9
- package/test/fixtures/encrypted-docx/fixtures.manifest.json +0 -47
- package/test/fixtures/scenarios/docx/README.md +0 -25
- package/test/fixtures/scenarios/docx/S01-sow-template.docx +0 -0
- package/test/fixtures/scenarios/docx/S01-sow-template.md +0 -30
- package/test/fixtures/scenarios/docx/S02-bw-partner-user-licence-agreement-redlines.docx +0 -0
- package/test/fixtures/scenarios/docx/S02-bw-partner-user-licence-agreement-redlines.md +0 -32
- package/test/fixtures/scenarios/docx/scenario-manifest.json +0 -53
- package/test/formats/xlsx/io/xlsx-import.test.ts +0 -766
- package/test/formats/xlsx/model/workbook.test.ts +0 -669
- package/test/helpers/dom-setup.ts +0 -124
- package/test/io/comment-roundtrip.test.ts +0 -272
- package/test/io/complex-content-roundtrip.test.ts +0 -632
- package/test/io/docx-compatibility-regression.test.ts +0 -199
- package/test/io/docx-session.test.ts +0 -1495
- package/test/io/footnotes-roundtrip.test.ts +0 -318
- package/test/io/headers-footers-roundtrip.test.ts +0 -547
- package/test/io/numbering-roundtrip.test.ts +0 -234
- package/test/io/package-reader.test.ts +0 -199
- package/test/io/paragraph-properties-roundtrip.test.ts +0 -129
- package/test/io/preserved-package-roundtrip.test.ts +0 -365
- package/test/io/property-completeness.test.ts +0 -292
- package/test/io/revision-roundtrip.test.ts +0 -347
- package/test/io/structural-blocks.test.ts +0 -202
- package/test/io/table-media-roundtrip.test.ts +0 -448
- package/test/io/table-properties-roundtrip.test.ts +0 -569
- package/test/io/table-roundtrip.test.ts +0 -302
- package/test/io/text-roundtrip.test.ts +0 -344
- package/test/model/canonical-document.test.ts +0 -285
- package/test/preservation/opaque-fragment-store.test.ts +0 -121
- package/test/preservation/package-preservation.test.ts +0 -395
- package/test/preservation/store.test.ts +0 -84
- package/test/review/comment-remapping.test.ts +0 -220
- package/test/review/comment-store.test.ts +0 -180
- package/test/review/move-revisions.test.ts +0 -143
- package/test/review/property-change-revisions.test.ts +0 -225
- package/test/review/revision-actions.test.ts +0 -330
- package/test/review/revision-store.test.ts +0 -193
- package/test/runtime/session-capabilities.test.ts +0 -260
- package/test/runtime/table-commands.test.ts +0 -356
- package/test/runtime/table-schema.test.ts +0 -221
- package/test/runtime/tracked-changes-toggle.test.ts +0 -107
- package/test/ui/comment-review-surface.test.tsx +0 -114
- package/test/ui/reduced-motion-toggle.test.tsx +0 -137
- package/test/ui/word-review-editor.imported-scenarios.test.tsx +0 -169
- package/test/ui/word-review-editor.interaction.test.tsx +0 -1198
- package/test/ui/word-review-editor.test.js +0 -188
- package/test/ui/word-review-editor.test.tsx +0 -280
- package/test/ui-tailwind/search-plugin.test.ts +0 -286
- package/test/validation/compatibility-engine.test.ts +0 -336
- package/test/validation/compatibility-report.test.ts +0 -189
- package/test/validation/low-priority-word-surfaces.test.ts +0 -282
- package/test/validation/malformed-doc.test.ts +0 -113
- package/test-results/.last-run.json +0 -4
- package/wave.config.json +0 -406
|
@@ -1,1112 +0,0 @@
|
|
|
1
|
-
# React Component Architecture and Front-End Structure Specification for a Word-Compatible Legal Review Editor
|
|
2
|
-
|
|
3
|
-
## Purpose and architectural goals
|
|
4
|
-
|
|
5
|
-
This specification defines an implementation-ready architecture for a **self-contained, Word-compatible legal review editor** delivered as **one embeddable React component** with a **single runtime on the main thread** (no Web Workers). The product targets the **core legal review workflow**: structured editing (paragraphs, headings, lists, tables), **comments**, **tracked insertions/deletions**, and **safe `.docx` round-tripping** that opens cleanly in modern Word processors.
|
|
6
|
-
|
|
7
|
-
The key architectural tension is: **Word fidelity and round-trip safety** vs. **a clean, lightweight “review editor” UX**. DOCX (OOXML) is designed to capture not only final document content but also review artifacts like tracked revisions and annotations. citeturn0search5turn1search9 A compatibility-first design must therefore treat OOXML as the governing truth for import/export semantics (packaging, relationships, revision/comment markup), even if the editor UI intentionally remains minimal. The underlying standard family (ISO/IEC 29500 / ECMA-376) is explicitly aimed at faithfully representing the existing Word document corpus. citeturn1search13
|
|
8
|
-
|
|
9
|
-
### Architectural goals
|
|
10
|
-
|
|
11
|
-
**Embedding**
|
|
12
|
-
- One public React component (`<WordReviewEditor />`) that can be dropped into any host React app without requiring the host to manage internal document state during editing.
|
|
13
|
-
- Host integrates via typed props, callbacks, and an imperative ref API.
|
|
14
|
-
|
|
15
|
-
**Internal modularity without breaking the “single component” constraint**
|
|
16
|
-
- Package publishes one component entry point, but internally is split into clear modules (schema, commands, import/export, preservation, UI).
|
|
17
|
-
- The editor runtime is framework-agnostic; React subscribes to it (and renders UI) without owning document truth.
|
|
18
|
-
|
|
19
|
-
**Main-thread correctness and responsiveness**
|
|
20
|
-
- No workers means the architecture must avoid main-thread stalls by:
|
|
21
|
-
- incremental transactions (never full reparse/re-export on keystrokes),
|
|
22
|
-
- staged import/export pipelines with explicit yielding,
|
|
23
|
-
- render minimization and virtualization for side panels.
|
|
24
|
-
|
|
25
|
-
**Compatibility-first Word support**
|
|
26
|
-
- Import from `.docx` that is an OPC package: parts, relationships, and content types. citeturn0search4turn0search18
|
|
27
|
-
- Export `.docx` with correct OPC structure and canonical WordprocessingML patterns for comments and tracked changes. citeturn0search4turn5search0turn4search0
|
|
28
|
-
- **Unsupported OOXML is never silently dropped**:
|
|
29
|
-
- preserve whole parts untouched where possible,
|
|
30
|
-
- preserve unknown elements/markup compatibility constructs,
|
|
31
|
-
- lock unsupported regions in the editor and generate explicit warnings.
|
|
32
|
-
|
|
33
|
-
**Maintainability & testability**
|
|
34
|
-
- All edits go through **commands → transactions**.
|
|
35
|
-
- Canonical model updates are deterministic and testable.
|
|
36
|
-
- Import/export, preservation, validation, and command logic are separable from React and can be unit-tested.
|
|
37
|
-
|
|
38
|
-
---
|
|
39
|
-
|
|
40
|
-
## Public component contract
|
|
41
|
-
|
|
42
|
-
### Component name and responsibilities
|
|
43
|
-
|
|
44
|
-
**Public component:** `WordReviewEditor`
|
|
45
|
-
|
|
46
|
-
**Responsibilities owned by the component**
|
|
47
|
-
- Owns the full editing session: runtime, canonical document state, review state, undo/redo, selection model, and view lifecycle.
|
|
48
|
-
- Loads `.docx` or a persisted snapshot, renders the editor UX, accepts user input, and produces:
|
|
49
|
-
- JSON snapshots for persistence,
|
|
50
|
-
- `.docx` exports for Word compatibility.
|
|
51
|
-
- Emits structured events, warnings, and errors.
|
|
52
|
-
- Runs internal autosave using a generic datastore adapter (optional) and/or host-provided callbacks.
|
|
53
|
-
|
|
54
|
-
**Responsibilities owned by the host app**
|
|
55
|
-
- Provides a document identity, initial document source (docx bytes or snapshot), and optionally a persistence adapter.
|
|
56
|
-
- Supplies authentication/authorization, user identity, and any business rules for “can comment / can edit / can accept changes”.
|
|
57
|
-
- Renders surrounding application UI (routing, page chrome).
|
|
58
|
-
- Stores checkpoints/exports (if adapter is provided) and handles backend failures surfaced by the editor.
|
|
59
|
-
|
|
60
|
-
### Controlled vs uncontrolled usage
|
|
61
|
-
|
|
62
|
-
The component is **uncontrolled by default**:
|
|
63
|
-
- Host provides `initialDocx` or `initialSnapshot`.
|
|
64
|
-
- Editor owns working state internally.
|
|
65
|
-
- Host receives change events and snapshots for persistence.
|
|
66
|
-
|
|
67
|
-
A “controlled” mode is supported only as **replace-on-change**:
|
|
68
|
-
- Host may pass `externalDocumentRevision` and `externalDocSource`.
|
|
69
|
-
- When the revision changes, the editor tears down and reloads the new document source.
|
|
70
|
-
- The host does **not** stream keystrokes back into `value` props.
|
|
71
|
-
|
|
72
|
-
### TypeScript public interfaces
|
|
73
|
-
|
|
74
|
-
```ts
|
|
75
|
-
// Public: primary component props
|
|
76
|
-
export interface WordReviewEditorProps {
|
|
77
|
-
// Identity & user
|
|
78
|
-
documentId: string;
|
|
79
|
-
currentUser: EditorUser;
|
|
80
|
-
|
|
81
|
-
// Initial content (exactly one should be provided for first load)
|
|
82
|
-
initialDocx?: Uint8Array | ArrayBuffer; // .docx bytes
|
|
83
|
-
initialSnapshot?: PersistedEditorSnapshot; // canonical JSON resume
|
|
84
|
-
initialSourceLabel?: string; // optional UI label (e.g., "Contract v3")
|
|
85
|
-
|
|
86
|
-
// Permissions & mode
|
|
87
|
-
readOnly?: boolean; // disables editing commands
|
|
88
|
-
reviewMode?: "editing" | "review"; // default "review"
|
|
89
|
-
markupDisplay?: "clean" | "simple" | "all"; // default "simple"
|
|
90
|
-
|
|
91
|
-
// Persistence integration (optional)
|
|
92
|
-
datastore?: EditorDatastoreAdapter;
|
|
93
|
-
autosave?: AutosaveConfig;
|
|
94
|
-
|
|
95
|
-
// Host integration hooks
|
|
96
|
-
onEvent?: (e: WordReviewEditorEvent) => void;
|
|
97
|
-
onWarning?: (w: EditorWarning) => void;
|
|
98
|
-
onError?: (err: EditorError) => void;
|
|
99
|
-
|
|
100
|
-
// Theming & styling
|
|
101
|
-
theme?: Partial<EditorThemeTokens>;
|
|
102
|
-
className?: string;
|
|
103
|
-
style?: React.CSSProperties;
|
|
104
|
-
styleIsolation?: "scoped" | "shadowRoot"; // default "scoped"
|
|
105
|
-
|
|
106
|
-
// Extension slots (strictly UI-level; no arbitrary plugin code in v1)
|
|
107
|
-
slots?: Partial<EditorSlots>;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
// Public: imperative ref API
|
|
111
|
-
export interface WordReviewEditorRef {
|
|
112
|
-
// Lifecycle
|
|
113
|
-
focus(): void;
|
|
114
|
-
blur(): void;
|
|
115
|
-
|
|
116
|
-
// Core editor capabilities
|
|
117
|
-
undo(): void;
|
|
118
|
-
redo(): void;
|
|
119
|
-
|
|
120
|
-
// Comments API
|
|
121
|
-
addComment(params: AddCommentParams): string; // returns commentId
|
|
122
|
-
openComment(commentId: string): void;
|
|
123
|
-
resolveComment(commentId: string): void;
|
|
124
|
-
|
|
125
|
-
// Tracked changes API
|
|
126
|
-
acceptChange(changeId: string): void;
|
|
127
|
-
rejectChange(changeId: string): void;
|
|
128
|
-
acceptAllChanges(): void;
|
|
129
|
-
rejectAllChanges(): void;
|
|
130
|
-
|
|
131
|
-
// Import/export
|
|
132
|
-
exportDocx(options?: ExportDocxOptions): Promise<ExportResult>;
|
|
133
|
-
getSnapshot(): PersistedEditorSnapshot;
|
|
134
|
-
|
|
135
|
-
// Diagnostics
|
|
136
|
-
getCompatibilityReport(): CompatibilityReport;
|
|
137
|
-
getWarnings(): EditorWarning[];
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
// Public: user identity
|
|
141
|
-
export interface EditorUser {
|
|
142
|
-
userId: string;
|
|
143
|
-
displayName: string;
|
|
144
|
-
initials?: string;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
// Public: autosave configuration
|
|
148
|
-
export interface AutosaveConfig {
|
|
149
|
-
enabled: boolean;
|
|
150
|
-
debounceMs: number; // e.g., 1500
|
|
151
|
-
maxIntervalMs: number; // e.g., 15000 (save at least this often if dirty)
|
|
152
|
-
idleOnly?: boolean; // if true, prefer idle periods
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
// Public: datastore adapter (generic persistence API)
|
|
156
|
-
export interface EditorDatastoreAdapter {
|
|
157
|
-
// Load latest persisted state. Used when host renders editor without providing initialDocx/snapshot.
|
|
158
|
-
load(params: { documentId: string }): Promise<LoadResult>;
|
|
159
|
-
|
|
160
|
-
// Save editor snapshot (fast, JSON). Called for autosave checkpoints and explicit saves.
|
|
161
|
-
saveSnapshot(params: SaveSnapshotParams): Promise<SaveSnapshotResult>;
|
|
162
|
-
|
|
163
|
-
// Save/export docx artifact (slower, binary).
|
|
164
|
-
saveExport(params: SaveExportParams): Promise<SaveExportResult>;
|
|
165
|
-
|
|
166
|
-
// Optional: host telemetry sink
|
|
167
|
-
logEvent?(e: EditorTelemetryEvent): void;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
// Public: warning/error payloads
|
|
171
|
-
export interface EditorWarning {
|
|
172
|
-
code:
|
|
173
|
-
| "unsupported_ooxml_preserved"
|
|
174
|
-
| "unsupported_ooxml_locked"
|
|
175
|
-
| "export_roundtrip_risk"
|
|
176
|
-
| "import_normalized"
|
|
177
|
-
| "large_document_degraded"
|
|
178
|
-
| "font_substitution"
|
|
179
|
-
| "image_missing";
|
|
180
|
-
message: string;
|
|
181
|
-
severity: "info" | "warning";
|
|
182
|
-
details?: Record<string, unknown>;
|
|
183
|
-
affectedRange?: EditorRangeRef; // optional anchor into document
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
export interface EditorError {
|
|
187
|
-
code:
|
|
188
|
-
| "import_failed"
|
|
189
|
-
| "export_failed"
|
|
190
|
-
| "package_corrupt"
|
|
191
|
-
| "validation_failed"
|
|
192
|
-
| "datastore_failed"
|
|
193
|
-
| "internal_invariant";
|
|
194
|
-
message: string;
|
|
195
|
-
isFatal: boolean;
|
|
196
|
-
details?: Record<string, unknown>;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
// Public: event stream (single hook, strongly typed union)
|
|
200
|
-
export type WordReviewEditorEvent =
|
|
201
|
-
| { type: "ready"; documentId: string; stats: DocumentStats }
|
|
202
|
-
| { type: "dirty_changed"; dirty: boolean }
|
|
203
|
-
| { type: "selection_changed"; selection: SelectionSnapshot }
|
|
204
|
-
| { type: "comment_added"; commentId: string }
|
|
205
|
-
| { type: "comment_resolved"; commentId: string }
|
|
206
|
-
| { type: "change_accepted"; changeId: string }
|
|
207
|
-
| { type: "change_rejected"; changeId: string }
|
|
208
|
-
| { type: "autosave_state"; state: AutosaveState }
|
|
209
|
-
| { type: "export_completed"; result: ExportResult };
|
|
210
|
-
|
|
211
|
-
export interface SaveSnapshotParams {
|
|
212
|
-
documentId: string;
|
|
213
|
-
snapshot: PersistedEditorSnapshot;
|
|
214
|
-
isAutosave: boolean;
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
export interface SaveExportParams {
|
|
218
|
-
documentId: string;
|
|
219
|
-
docx: Uint8Array;
|
|
220
|
-
compatibilityReport: CompatibilityReport;
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
export interface LoadResult {
|
|
224
|
-
snapshot?: PersistedEditorSnapshot;
|
|
225
|
-
docx?: Uint8Array;
|
|
226
|
-
sourceLabel?: string;
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
export interface ExportDocxOptions {
|
|
230
|
-
// export policy: if unsupported content is preserved but locked, export should still succeed
|
|
231
|
-
// but may include warnings in the compatibility report
|
|
232
|
-
includeCompatibilityReport?: boolean;
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
export interface ExportResult {
|
|
236
|
-
docx: Uint8Array;
|
|
237
|
-
compatibilityReport: CompatibilityReport;
|
|
238
|
-
warnings: EditorWarning[];
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
// Public: snapshot and compatibility report
|
|
242
|
-
export interface PersistedEditorSnapshot {
|
|
243
|
-
snapshotVersion: 1;
|
|
244
|
-
documentId: string;
|
|
245
|
-
createdAtIso: string;
|
|
246
|
-
editorBuild: string;
|
|
247
|
-
|
|
248
|
-
canonical: CanonicalSnapshot;
|
|
249
|
-
review: ReviewSnapshot;
|
|
250
|
-
preservation: PreservationSnapshot;
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
export interface CompatibilityReport {
|
|
254
|
-
reportVersion: 1;
|
|
255
|
-
generatedAtIso: string;
|
|
256
|
-
|
|
257
|
-
// Key invariants and risks
|
|
258
|
-
canRoundTripToWord: boolean;
|
|
259
|
-
riskLevel: "low" | "medium" | "high";
|
|
260
|
-
|
|
261
|
-
// Unsupported or locked features encountered
|
|
262
|
-
preservedParts: Array<{ partName: string; reason: string }>;
|
|
263
|
-
lockedRanges: Array<{ reason: string; range: EditorRangeRef }>;
|
|
264
|
-
notes: string[];
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
// Minimal range anchor reference usable outside runtime
|
|
268
|
-
export interface EditorRangeRef {
|
|
269
|
-
anchorPath: string; // stable anchor token (see internal anchoring spec)
|
|
270
|
-
}
|
|
271
|
-
```
|
|
272
|
-
|
|
273
|
-
**React-to-runtime contract:** The component uses an external store subscription pattern (subscribe/getSnapshot) so the runtime is not React-dependent; React’s official hook for this pattern is `useSyncExternalStore`. citeturn0search3
|
|
274
|
-
|
|
275
|
-
---
|
|
276
|
-
|
|
277
|
-
## Internal runtime and module architecture
|
|
278
|
-
|
|
279
|
-
### Internal layers and boundaries
|
|
280
|
-
|
|
281
|
-
This editor is published as a single component package, but internally built from modular layers. The key is that **the runtime owns the canonical truth**, and the UI is a projection.
|
|
282
|
-
|
|
283
|
-
**Layer overview (single runtime, modular internals)**
|
|
284
|
-
|
|
285
|
-
| Layer | React-bound? | Responsibilities | Must not do |
|
|
286
|
-
|---|---:|---|---|
|
|
287
|
-
| Public React shell (`react/WordEditor`) | Yes | Host integration, layout, toolbars/sidebars, focus orchestration, theming, event wiring | Own canonical truth |
|
|
288
|
-
| Runtime/controller (`runtime/DocumentRuntime`) | No | Orchestrate load/import/export, command dispatch, transaction commit, undo/redo, scheduling, subscriptions | Render UI directly |
|
|
289
|
-
| Canonical state store (`core/state`) | No | Canonical document state, schema, style catalog, numbering, media refs | Touch DOM |
|
|
290
|
-
| Review state store (`core/review`) | No | Comments, threads, anchors, tracked changes metadata, author registry | Store host UI state |
|
|
291
|
-
| Import pipeline (`import/*`) | No | OPC open, OOXML parse, normalization, canonical model build, preservation capture, validation report | Block UI thread without yielding |
|
|
292
|
-
| Export pipeline (`export/*`) | No | Incremental OOXML generation/patching, OPC packaging, relationship & content type updates, validation | Drop unsupported content silently |
|
|
293
|
-
| Preservation layer (`preserve/*`) | No | Store untouched parts, unknown elements, markup-compatibility constructs, opaque blocks | Pretend unsupported is supported |
|
|
294
|
-
| Validation layer (`validate/*`) | No | Structural checks, Word risk detection, compatibility report | Re-parse full doc on keystrokes |
|
|
295
|
-
| UI render layer (`ui/*`) | Yes | Editor surface mount, overlays, sidebars, toolbars, dialogs, virtualization | Mutate canonical state directly |
|
|
296
|
-
| Styling/theme layer (`ui/theme`) | Yes | Token resolution, CSS variables, high-contrast/dark-mode policy | Depend on host global CSS |
|
|
297
|
-
|
|
298
|
-
### Compatibility-first package model (OPC)
|
|
299
|
-
|
|
300
|
-
A `.docx` is an Open Packaging Conventions (OPC) package: a collection of **parts** (XML and binary) with **relationships** and a **content types stream** (commonly `[Content_Types].xml`). citeturn0search4turn0search18
|
|
301
|
-
|
|
302
|
-
**Internal import/export must treat the package as primary**, not just `word/document.xml`. This matters for fidelity-preserving behavior like:
|
|
303
|
-
- preserving untouched parts,
|
|
304
|
-
- keeping relationship IDs stable whenever possible,
|
|
305
|
-
- preserving metadata parts and custom XML,
|
|
306
|
-
- safely adding comments parts or media parts with correct relationships.
|
|
307
|
-
|
|
308
|
-
### Preservation and markup compatibility
|
|
309
|
-
|
|
310
|
-
OOXML includes a markup compatibility mechanism and extensibility patterns (e.g., `AlternateContent`) that enable fallback representations. The Open XML SDK documentation describes markup compatibility processing settings and their role in handling such markup. citeturn2search0
|
|
311
|
-
|
|
312
|
-
**Preservation rule:** if the mapper cannot semantically support some OOXML region, it is **(a)** preserved as an opaque block/part, **(b)** locked in the editor surface, and **(c)** surfaced via warnings.
|
|
313
|
-
|
|
314
|
-
Unknown OOXML elements must be retained as unknown nodes/structures rather than discarded; Open XML SDK exposes unknown elements explicitly (e.g., `OpenXmlUnknownElement`) as part of the model of “recognized vs. unrecognized standard markup.” citeturn2search1turn2search13
|
|
315
|
-
|
|
316
|
-
### Recommended internal module structure
|
|
317
|
-
|
|
318
|
-
The following is the required folder structure. Each module has a strict dependency policy to keep correctness testable and avoid circular UI/runtime coupling.
|
|
319
|
-
|
|
320
|
-
| Module | Responsibility | Public surface | Allowed deps | Forbidden deps |
|
|
321
|
-
|---|---|---|---|---|
|
|
322
|
-
| `react/WordEditor` | Public component, layout, binds ref API, mounts editor surface | `WordReviewEditor` | `runtime/*`, `ui/*`, `api/*` | `import/*`, `export/*` (call via runtime only) |
|
|
323
|
-
| `runtime/DocumentRuntime` | Orchestrator: load, dispatch, commit, subscriptions, scheduling | `DocumentRuntime` | `core/*`, `import/*`, `export/*`, `preserve/*`, `validate/*`, `api/*` | `ui/*` |
|
|
324
|
-
| `core/schema` | Canonical schema (node/mark types, attributes, invariants) | `schema`, `SchemaVersion` | none | `ui/*`, `react/*` |
|
|
325
|
-
| `core/state` | Canonical state container + selectors | `CanonicalState`, selectors | `core/schema`, `preserve/*` | `ui/*` |
|
|
326
|
-
| `core/commands` | Command registry and implementations | `commands`, `CommandId` | `core/*` | `ui/*`, `react/*` |
|
|
327
|
-
| `core/review` | Review model: comments, changes, authors, anchor remap | `ReviewState`, `reviewSelectors` | `core/state`, `core/selection` | `ui/*` |
|
|
328
|
-
| `core/selection` | Selection representation + mapping utilities | `SelectionModel` | `core/schema`, `core/state` | `ui/*` |
|
|
329
|
-
| `import/opc` | Read OPC zip, list parts, resolve relationships | `openPackage()` | `preserve/*` | `ui/*`, `react/*` |
|
|
330
|
-
| `import/ooxml` | Parse OOXML into intermediate AST with preservation hooks | `parseOOXML()` | `import/opc`, `preserve/*` | `ui/*` |
|
|
331
|
-
| `import/normalize` | Normalize OOXML AST into canonical schema | `normalizeToCanonical()` | `core/schema`, `core/state`, `core/review` | `ui/*` |
|
|
332
|
-
| `export/ooxml` | Generate OOXML from canonical + review state | `buildDocumentXml()` | `core/*`, `preserve/*` | `ui/*` |
|
|
333
|
-
| `export/package` | Write OPC package, update relationships/types | `writePackage()` | `export/ooxml`, `import/opc` | `ui/*` |
|
|
334
|
-
| `preserve` | Preservation store & opaque-block encoding | `PreservationStore` | `core/schema` | `ui/*` |
|
|
335
|
-
| `validate` | Structural/compatibility validation | `validatePackage()`, `validateState()` | `core/*`, `import/opc` | `ui/*` |
|
|
336
|
-
| `ui/editor-surface` | Mounts the editable surface and overlays | `EditorSurface` | `runtime/*`, `ui/theme` | `import/*`, `export/*` |
|
|
337
|
-
| `ui/toolbar` | Toolbar UI + command binding | `Toolbar` | `runtime/*`, `ui/theme` | `core/*` (must call runtime) |
|
|
338
|
-
| `ui/comments` | Comments sidebar, thread UI | `CommentsPanel` | `runtime/*` | direct store mutation |
|
|
339
|
-
| `ui/review` | Changes panel, navigation, accept/reject controls | `ReviewPanel` | `runtime/*` | direct store mutation |
|
|
340
|
-
| `ui/theme` | Tokens → CSS variables, theming policy | `ThemeProvider`, tokens | none | runtime logic |
|
|
341
|
-
| `api` | Public type exports, datastore adapter types | types only | none | runtime internals |
|
|
342
|
-
|
|
343
|
-
---
|
|
344
|
-
|
|
345
|
-
## Runtime/controller specification
|
|
346
|
-
|
|
347
|
-
### Runtime as the single orchestrator
|
|
348
|
-
|
|
349
|
-
The runtime is an in-memory engine that:
|
|
350
|
-
- owns the canonical and review state,
|
|
351
|
-
- applies commands as transactions,
|
|
352
|
-
- emits events,
|
|
353
|
-
- coordinates staged import/export and preservation,
|
|
354
|
-
- exposes subscriptions to UI without React dependency.
|
|
355
|
-
|
|
356
|
-
React mounts exactly one runtime instance per editor instance.
|
|
357
|
-
|
|
358
|
-
### Runtime lifecycle: required flows
|
|
359
|
-
|
|
360
|
-
**Initialization flow**
|
|
361
|
-
1. React shell constructs `DocumentRuntime` with:
|
|
362
|
-
- documentId, currentUser, mode flags,
|
|
363
|
-
- datastore adapter (optional),
|
|
364
|
-
- scheduling strategy (yielding, idle callbacks),
|
|
365
|
-
- telemetry sink (optional).
|
|
366
|
-
2. Runtime enters `idle` state and exposes subscription API.
|
|
367
|
-
3. React mounts UI and calls `runtime.init()`.
|
|
368
|
-
|
|
369
|
-
**Document load flow**
|
|
370
|
-
1. Determine source in this precedence order:
|
|
371
|
-
- `initialSnapshot` prop,
|
|
372
|
-
- `initialDocx` prop,
|
|
373
|
-
- `datastore.load(documentId)`.
|
|
374
|
-
2. If snapshot:
|
|
375
|
-
- validate snapshot version,
|
|
376
|
-
- hydrate canonical/review/preservation stores.
|
|
377
|
-
3. If docx:
|
|
378
|
-
- staged import pipeline (OPC → OOXML → normalize → validate → hydrate).
|
|
379
|
-
4. Emit:
|
|
380
|
-
- `ready` event with stats and initial warnings/warnings panel state.
|
|
381
|
-
|
|
382
|
-
**Command dispatch flow**
|
|
383
|
-
1. UI triggers `runtime.exec(commandId, payload, origin)`.
|
|
384
|
-
2. Runtime:
|
|
385
|
-
- resolves command handler,
|
|
386
|
-
- builds one transaction,
|
|
387
|
-
- applies transaction atomically,
|
|
388
|
-
- remaps anchors/review metadata as part of commit,
|
|
389
|
-
- updates undo/redo stacks,
|
|
390
|
-
- notifies subscribers, then emits events.
|
|
391
|
-
|
|
392
|
-
**Save/export flow**
|
|
393
|
-
- **Snapshot save**:
|
|
394
|
-
- serialize the current in-memory state to `PersistedEditorSnapshot`.
|
|
395
|
-
- call datastore `saveSnapshot` (if present) and emit autosave events.
|
|
396
|
-
- **Export `.docx`**:
|
|
397
|
-
- validate state, build compatibility report,
|
|
398
|
-
- staged export pipeline (generate XML parts + patch preserved package),
|
|
399
|
-
- return bytes to host and optionally call datastore `saveExport`.
|
|
400
|
-
|
|
401
|
-
**Autosave flow**
|
|
402
|
-
- Runs only when dirty, and only serializes snapshot (fast path).
|
|
403
|
-
- Uses debouncing plus a max interval, with optional idle scheduling.
|
|
404
|
-
|
|
405
|
-
**Teardown flow**
|
|
406
|
-
- Remove DOM event handlers for the editor surface.
|
|
407
|
-
- Release large buffers (original package, preserved parts) and clear subscriptions.
|
|
408
|
-
|
|
409
|
-
### Runtime interfaces
|
|
410
|
-
|
|
411
|
-
```ts
|
|
412
|
-
export type RuntimePhase =
|
|
413
|
-
| "idle"
|
|
414
|
-
| "loading"
|
|
415
|
-
| "ready"
|
|
416
|
-
| "exporting"
|
|
417
|
-
| "error";
|
|
418
|
-
|
|
419
|
-
export interface RuntimeSnapshot {
|
|
420
|
-
phase: RuntimePhase;
|
|
421
|
-
documentId: string;
|
|
422
|
-
readOnly: boolean;
|
|
423
|
-
reviewMode: "editing" | "review";
|
|
424
|
-
markupDisplay: "clean" | "simple" | "all";
|
|
425
|
-
|
|
426
|
-
dirty: boolean;
|
|
427
|
-
canUndo: boolean;
|
|
428
|
-
canRedo: boolean;
|
|
429
|
-
|
|
430
|
-
// Lightweight UI-facing derived state
|
|
431
|
-
selection: SelectionSnapshot;
|
|
432
|
-
stats: DocumentStats;
|
|
433
|
-
|
|
434
|
-
// Warning/error surfaces
|
|
435
|
-
warnings: EditorWarning[];
|
|
436
|
-
fatalError?: EditorError;
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
export interface RuntimeEventMap {
|
|
440
|
-
ready: { documentId: string; stats: DocumentStats };
|
|
441
|
-
dirty_changed: { dirty: boolean };
|
|
442
|
-
selection_changed: { selection: SelectionSnapshot };
|
|
443
|
-
warning_added: { warning: EditorWarning };
|
|
444
|
-
warning_cleared: { code: EditorWarning["code"] };
|
|
445
|
-
error: { error: EditorError };
|
|
446
|
-
autosave_state: { state: AutosaveState };
|
|
447
|
-
export_completed: { result: ExportResult };
|
|
448
|
-
}
|
|
449
|
-
|
|
450
|
-
export type Unsubscribe = () => void;
|
|
451
|
-
|
|
452
|
-
export interface DocumentRuntime {
|
|
453
|
-
init(): Promise<void>;
|
|
454
|
-
|
|
455
|
-
// Store subscription (React uses useSyncExternalStore against these)
|
|
456
|
-
subscribe(cb: () => void): Unsubscribe;
|
|
457
|
-
getSnapshot(): RuntimeSnapshot;
|
|
458
|
-
|
|
459
|
-
// Event subscription (non-React consumers possible)
|
|
460
|
-
on<K extends keyof RuntimeEventMap>(type: K, cb: (e: RuntimeEventMap[K]) => void): Unsubscribe;
|
|
461
|
-
|
|
462
|
-
// Command dispatch
|
|
463
|
-
exec<TPayload>(commandId: CommandId, payload: TPayload, origin: CommandOrigin): CommandResult;
|
|
464
|
-
|
|
465
|
-
// Export and persistence
|
|
466
|
-
getPersistedSnapshot(): PersistedEditorSnapshot;
|
|
467
|
-
exportDocx(options?: ExportDocxOptions): Promise<ExportResult>;
|
|
468
|
-
|
|
469
|
-
destroy(): void;
|
|
470
|
-
}
|
|
471
|
-
|
|
472
|
-
export interface CommandOrigin {
|
|
473
|
-
source:
|
|
474
|
-
| "keyboard"
|
|
475
|
-
| "toolbar"
|
|
476
|
-
| "context_menu"
|
|
477
|
-
| "comment_panel"
|
|
478
|
-
| "review_panel"
|
|
479
|
-
| "api";
|
|
480
|
-
timestampIso: string;
|
|
481
|
-
}
|
|
482
|
-
```
|
|
483
|
-
|
|
484
|
-
**Why external-store subscription:** React’s `useSyncExternalStore` is designed for safely reading/subscribing to an external (non-React) store using a `subscribe` function and a `getSnapshot` function. citeturn0search3
|
|
485
|
-
|
|
486
|
-
---
|
|
487
|
-
|
|
488
|
-
## State, command, transaction, and event flow
|
|
489
|
-
|
|
490
|
-
This section defines the internal state decomposition and the mandatory rule: **every mutation happens via commands → transactions → commit**, never direct state mutation.
|
|
491
|
-
|
|
492
|
-
### State architecture (four buckets)
|
|
493
|
-
|
|
494
|
-
#### Canonical document state (owned by runtime; participates in undo/redo)
|
|
495
|
-
|
|
496
|
-
**Contents**
|
|
497
|
-
- Canonical content tree (blocks, inlines).
|
|
498
|
-
- Styles catalog (paragraph/run styles) and style application references.
|
|
499
|
-
- Numbering/list definitions (abstract + instance mapping).
|
|
500
|
-
- Media references (images) and relationship IDs for export binding.
|
|
501
|
-
- Preservation bindings (opaque blocks and preserved-part handles).
|
|
502
|
-
|
|
503
|
-
**Rules**
|
|
504
|
-
- Immutable snapshots with structural sharing (transaction produces new state referencing old where unchanged).
|
|
505
|
-
- Serialization required (in `PersistedEditorSnapshot.canonical`).
|
|
506
|
-
- Undo/redo must fully restore canonical state.
|
|
507
|
-
|
|
508
|
-
**OOXML grounding:** WordprocessingML’s core is built from body → paragraphs/runs/text and associated properties. citeturn4search12
|
|
509
|
-
|
|
510
|
-
#### Review state (owned by runtime; participates in undo/redo for content-affecting actions)
|
|
511
|
-
|
|
512
|
-
**Contents**
|
|
513
|
-
- Comments: threads, replies, authors, resolved state.
|
|
514
|
-
- Anchors: range anchoring into canonical content.
|
|
515
|
-
- Tracked changes: insertions/deletions and their metadata (author, date, change id).
|
|
516
|
-
- Author registry.
|
|
517
|
-
|
|
518
|
-
**Rules**
|
|
519
|
-
- Anchors must remap through every transaction.
|
|
520
|
-
- Review state serializes into snapshot `review`.
|
|
521
|
-
- Undo/redo includes:
|
|
522
|
-
- adding/removing comments and replies,
|
|
523
|
-
- accept/reject changes,
|
|
524
|
-
- toggling resolved state,
|
|
525
|
-
- creation of new tracked changes.
|
|
526
|
-
|
|
527
|
-
**OOXML grounding:** DOCX explicitly stores review artifacts like tracked changes and threaded comments. citeturn0search5
|
|
528
|
-
|
|
529
|
-
#### UI/view state (owned by React; does not participate in undo/redo)
|
|
530
|
-
|
|
531
|
-
**Contents**
|
|
532
|
-
- Sidebar open/closed, selected tab.
|
|
533
|
-
- Hovered entities (comment highlight hover).
|
|
534
|
-
- Context menu open state, dialogs/popovers.
|
|
535
|
-
- Transient toolbar state (e.g., “font menu open”).
|
|
536
|
-
|
|
537
|
-
**Rules**
|
|
538
|
-
- Must be reconstructible from runtime snapshot + local UI.
|
|
539
|
-
|
|
540
|
-
#### Persistence/session state (owned by runtime; partially persisted)
|
|
541
|
-
|
|
542
|
-
**Contents**
|
|
543
|
-
- Dirty flag, save status, autosave status.
|
|
544
|
-
- Import/export warnings and last compatibility report.
|
|
545
|
-
|
|
546
|
-
**Rules**
|
|
547
|
-
- Dirty flag not persisted (recomputed on load).
|
|
548
|
-
- Compatibility report persisted optionally (recommended for audit/logging).
|
|
549
|
-
- Autosave state not persisted.
|
|
550
|
-
|
|
551
|
-
### Command and transaction system
|
|
552
|
-
|
|
553
|
-
This architecture adopts a ProseMirror-like model: transactions apply incremental steps and include **mapping** to update positions and selections. Position mapping is a first-class concept used to keep selections/anchors stable when the document changes. citeturn1search3turn1search0
|
|
554
|
-
|
|
555
|
-
#### Command interfaces
|
|
556
|
-
|
|
557
|
-
```ts
|
|
558
|
-
export type CommandId =
|
|
559
|
-
| "text.insert"
|
|
560
|
-
| "text.deleteBackward"
|
|
561
|
-
| "format.toggleBold"
|
|
562
|
-
| "format.toggleItalic"
|
|
563
|
-
| "block.setParagraph"
|
|
564
|
-
| "block.setHeading"
|
|
565
|
-
| "list.toggleOrdered"
|
|
566
|
-
| "table.insertRow"
|
|
567
|
-
| "comment.add"
|
|
568
|
-
| "comment.resolve"
|
|
569
|
-
| "change.accept"
|
|
570
|
-
| "change.reject";
|
|
571
|
-
|
|
572
|
-
export interface EditorCommand<TPayload = unknown> {
|
|
573
|
-
id: CommandId;
|
|
574
|
-
isEnabled(ctx: CommandContext, payload: TPayload): boolean;
|
|
575
|
-
run(ctx: CommandContext, payload: TPayload): Transaction; // no side effects
|
|
576
|
-
}
|
|
577
|
-
|
|
578
|
-
export interface CommandContext {
|
|
579
|
-
canonical: CanonicalState;
|
|
580
|
-
review: ReviewState;
|
|
581
|
-
selection: SelectionModel;
|
|
582
|
-
config: RuntimeConfig;
|
|
583
|
-
user: EditorUser;
|
|
584
|
-
}
|
|
585
|
-
|
|
586
|
-
export interface CommandResult {
|
|
587
|
-
applied: boolean;
|
|
588
|
-
reason?:
|
|
589
|
-
| "disabled"
|
|
590
|
-
| "read_only"
|
|
591
|
-
| "invalid_selection"
|
|
592
|
-
| "unsupported_range_locked";
|
|
593
|
-
transactionId?: string;
|
|
594
|
-
}
|
|
595
|
-
```
|
|
596
|
-
|
|
597
|
-
#### Transaction interfaces and metadata requirements
|
|
598
|
-
|
|
599
|
-
```ts
|
|
600
|
-
export interface Transaction {
|
|
601
|
-
id: string;
|
|
602
|
-
origin: CommandOrigin;
|
|
603
|
-
|
|
604
|
-
// Atomic changes:
|
|
605
|
-
steps: TransactionStep[];
|
|
606
|
-
mapping: PositionMapping; // used to remap anchors and selection
|
|
607
|
-
|
|
608
|
-
// Required metadata:
|
|
609
|
-
createdAtIso: string;
|
|
610
|
-
affectedRanges: Array<{ from: number; to: number }>;
|
|
611
|
-
changesReviewState: boolean;
|
|
612
|
-
|
|
613
|
-
// For review/tracking:
|
|
614
|
-
trackChangesMode: "off" | "on";
|
|
615
|
-
author: EditorUser;
|
|
616
|
-
}
|
|
617
|
-
|
|
618
|
-
export interface TransactionStep {
|
|
619
|
-
type: "replace" | "addMark" | "removeMark" | "setNodeAttr" | "insertNode" | "deleteNode";
|
|
620
|
-
// Step-specific payload omitted here; defined in core/state
|
|
621
|
-
}
|
|
622
|
-
|
|
623
|
-
export interface PositionMapping {
|
|
624
|
-
map(pos: number, assoc?: -1 | 1): number;
|
|
625
|
-
// Optional: mapRange for quick re-anchor of ranges
|
|
626
|
-
mapRange(from: number, to: number): { from: number; to: number };
|
|
627
|
-
}
|
|
628
|
-
```
|
|
629
|
-
|
|
630
|
-
**Invariants**
|
|
631
|
-
- Transactions must be deterministic: same input state + payload yields same output state.
|
|
632
|
-
- Every transaction includes a mapping.
|
|
633
|
-
- Anchor remapping **must** run before subscribers are notified.
|
|
634
|
-
- If mapping cannot safely remap an anchor (e.g., anchor deletes the entire region), the anchor transitions to a “detached” state and produces an explicit warning.
|
|
635
|
-
|
|
636
|
-
### Comments anchoring and compatibility requirements
|
|
637
|
-
|
|
638
|
-
Word comment anchoring commonly uses:
|
|
639
|
-
- `commentRangeStart` / `commentRangeEnd` to mark the commented range boundaries, and
|
|
640
|
-
- `commentReference` to connect inline content to a comment definition in the comments part. citeturn5search1turn0search6turn5search0
|
|
641
|
-
|
|
642
|
-
**Internal anchor model**
|
|
643
|
-
- Each comment has a stable `commentId` and an anchor record:
|
|
644
|
-
- `anchorStart` and `anchorEnd` as positions in the canonical model.
|
|
645
|
-
- The anchor remaps through every transaction mapping.
|
|
646
|
-
- If a user inserts a comment at a caret selection (collapsed), the editor creates a zero-width anchor that expands as text is typed (implementation: range with identical start/end + assoc “stickiness”).
|
|
647
|
-
|
|
648
|
-
### Tracked changes: internal representation and OOXML grounding
|
|
649
|
-
|
|
650
|
-
WordprocessingML represents tracked insertions and deletions using revision elements; Open XML SDK exposes these concepts explicitly (e.g., inserted run content `ins`, deleted run content `del`, and `delText` for deleted literal text). citeturn4search0turn4search1turn4search5
|
|
651
|
-
|
|
652
|
-
**Internal tracked change model**
|
|
653
|
-
- Tracked changes are stored as **marks** (inline) and **node attributes** (block/table row changes):
|
|
654
|
-
- `change.insert` mark wraps inserted content.
|
|
655
|
-
- `change.delete` mark wraps deleted content (content retained in model but rendered conditionally).
|
|
656
|
-
- Each mark carries:
|
|
657
|
-
- `changeId` (stable),
|
|
658
|
-
- `authorId`, `authorName`,
|
|
659
|
-
- `dateIso`,
|
|
660
|
-
- `status: "pending" | "accepted" | "rejected"` (pending is what exports as tracked markup).
|
|
661
|
-
- Document-level tracking is governed by a settings flag; Word defines a `trackRevisions` setting element indicating revisions are tracked. citeturn1search5turn1search21
|
|
662
|
-
|
|
663
|
-
**Accept/reject behavior**
|
|
664
|
-
- Accept insertion: unwrap inserted mark (content stays, mark removed).
|
|
665
|
-
- Reject insertion: delete the content (with history).
|
|
666
|
-
- Accept deletion: delete the content (remove from canonical model).
|
|
667
|
-
- Reject deletion: unwrap deletion mark (content stays, mark removed).
|
|
668
|
-
|
|
669
|
-
Microsoft provides guidance on accepting revisions in Open XML documents, reinforcing that revisions are structured markup not “visual styling.” citeturn4search6turn0search1
|
|
670
|
-
|
|
671
|
-
### Event emission rules
|
|
672
|
-
|
|
673
|
-
**Two channels**
|
|
674
|
-
1. **Store notification**: synchronous `subscribe()` callbacks fire after commit (for React rerender).
|
|
675
|
-
2. **Typed events**: `runtime.on(type, cb)` emissions fire after store subscribers, and may be async-scheduled for heavy payloads (e.g., compatibility report).
|
|
676
|
-
|
|
677
|
-
**Hard rules**
|
|
678
|
-
- Store snapshot must always be internally consistent at notification time.
|
|
679
|
-
- Events must carry transaction IDs when relevant.
|
|
680
|
-
- No direct DOM-derived events are allowed to mutate state; DOM is only an input surface.
|
|
681
|
-
|
|
682
|
-
---
|
|
683
|
-
|
|
684
|
-
## Rendering architecture and front-end UX structure
|
|
685
|
-
|
|
686
|
-
### Core rendering strategy
|
|
687
|
-
|
|
688
|
-
The editor surface is composed as:
|
|
689
|
-
- a single, focusable editable region (contenteditable-based),
|
|
690
|
-
- a projection of canonical content,
|
|
691
|
-
- overlays/“decorations” for comments and tracked changes,
|
|
692
|
-
- side panels for review navigation and thread view.
|
|
693
|
-
|
|
694
|
-
A ProseMirror-style plugin/decorations model is the proven way to represent overlays that remap with document changes, and to keep decoration computation separate from document content. citeturn1search4
|
|
695
|
-
|
|
696
|
-
**What renders from canonical content**
|
|
697
|
-
- Paragraphs/headings
|
|
698
|
-
- Runs/marks (bold/italic/underline)
|
|
699
|
-
- Lists (ordered/bulleted)
|
|
700
|
-
- Tables (with legal-friendly minimal controls)
|
|
701
|
-
- Opaque blocks (unsupported content placeholders)
|
|
702
|
-
|
|
703
|
-
**What renders as overlay/decorations**
|
|
704
|
-
- Comment highlight ranges (background + gutter marker)
|
|
705
|
-
- Tracked change highlights (insertion underline + deletion strike styling)
|
|
706
|
-
- Active selection handles
|
|
707
|
-
- Hovered comment/change emphasis
|
|
708
|
-
|
|
709
|
-
### Editor surface composition (React + non-React boundary)
|
|
710
|
-
|
|
711
|
-
**React owns**
|
|
712
|
-
- Layout (toolbar, columns, status bar).
|
|
713
|
-
- Panels (comments/review).
|
|
714
|
-
- Popovers (inline formatting menu, comment composer).
|
|
715
|
-
- Theme tokens and CSS variables.
|
|
716
|
-
|
|
717
|
-
**Editor surface (imperative view) owns**
|
|
718
|
-
- Input event handling (beforeinput/keydown/composition).
|
|
719
|
-
- Translating events → commands.
|
|
720
|
-
- Applying incremental DOM updates based on transactions (not full React rerender per keystroke).
|
|
721
|
-
|
|
722
|
-
This split is necessary to satisfy:
|
|
723
|
-
- “no full rerender on each keystroke,”
|
|
724
|
-
- correctness for IME/composition,
|
|
725
|
-
- stable selection behavior.
|
|
726
|
-
|
|
727
|
-
### Minimizing rerenders and maintaining stable identity
|
|
728
|
-
|
|
729
|
-
**Stable keys**
|
|
730
|
-
- Every block node has a `nodeId` stable across edits (generated at import or node creation).
|
|
731
|
-
- Block components (paragraph/table/list item) are keyed by `nodeId`.
|
|
732
|
-
|
|
733
|
-
**Subscription granularity**
|
|
734
|
-
- React should subscribe to:
|
|
735
|
-
- lightweight `RuntimeSnapshot` for top-level UI (dirty, canUndo/canRedo, selection summary),
|
|
736
|
-
- separate derived selectors for:
|
|
737
|
-
- comments list,
|
|
738
|
-
- changes list,
|
|
739
|
-
- compatibility warnings.
|
|
740
|
-
|
|
741
|
-
**Memoization rules**
|
|
742
|
-
- Sidebar lists are memoized by item IDs (commentId/changeId).
|
|
743
|
-
- Toolbar state computes from a small selection snapshot, not from full doc.
|
|
744
|
-
|
|
745
|
-
**Virtualization**
|
|
746
|
-
- Comments panel and changes panel must be windowed (virtualized) when lists exceed a threshold (e.g., >200 entries).
|
|
747
|
-
- Document surface virtualization is **not default** in editable mode; instead, degrade overlay complexity for very large documents (see performance section).
|
|
748
|
-
|
|
749
|
-
image_group{"layout":"carousel","aspect_ratio":"16:9","query":["Microsoft Word track changes comments sidebar screenshot","minimal rich text editor toolbar tiptap style","Notion editor typing interface","legal document review software interface comments sidebar"],"num_per_query":1}
|
|
750
|
-
|
|
751
|
-
### UX layout structure
|
|
752
|
-
|
|
753
|
-
**Layout grid**
|
|
754
|
-
- Top: toolbar (fixed height).
|
|
755
|
-
- Center: document canvas (scroll container).
|
|
756
|
-
- Right: sidebar area (tabs: Comments / Changes), collapsible.
|
|
757
|
-
- Bottom (optional): status bar (save state, warnings).
|
|
758
|
-
|
|
759
|
-
**Modes**
|
|
760
|
-
- **Read-only**: disables editing commands; allows comment browsing and change navigation; selection still allowed.
|
|
761
|
-
- **Review mode**: defaults to showing comments/changes; markup display switch visible.
|
|
762
|
-
- **Markup display**
|
|
763
|
-
- `clean`: hide deletions, show accepted content view; comments shown as markers in margin only.
|
|
764
|
-
- `simple`: insertions shown, deletions collapsed with indicator; comment highlights subtle.
|
|
765
|
-
- `all`: full redlines, deletion strikethrough, full highlight overlays.
|
|
766
|
-
|
|
767
|
-
**Unsupported-content states**
|
|
768
|
-
- Opaque blocks display a locked placeholder card:
|
|
769
|
-
- icon, short label (e.g., “Unsupported field code”),
|
|
770
|
-
- “Preserved for Word round-trip” subtext,
|
|
771
|
-
- optional “Show details” popover listing the OOXML element/part and risk level.
|
|
772
|
-
- Editing actions within opaque blocks are blocked with a non-fatal warning.
|
|
773
|
-
|
|
774
|
-
**Loading/error states**
|
|
775
|
-
- Loading: skeleton canvas + “Importing document…” with staged progress labels.
|
|
776
|
-
- Fatal import error: full-page error inside component with “Download original” (if provided) and diagnostics token in details.
|
|
777
|
-
|
|
778
|
-
---
|
|
779
|
-
|
|
780
|
-
## Front-end styling, design system, and accessibility specification
|
|
781
|
-
|
|
782
|
-
### Styling system goals
|
|
783
|
-
|
|
784
|
-
- Polished, modern, restrained; optimized for long review sessions.
|
|
785
|
-
- TipTap/Notion-like calm tooling, not ribbon UI.
|
|
786
|
-
- Host-safe embedding via scoped CSS variables (or optional ShadowRoot).
|
|
787
|
-
|
|
788
|
-
### Theme tokens (required)
|
|
789
|
-
|
|
790
|
-
Tokens are implemented as CSS variables rooted under `.wre-root` (or inside ShadowRoot if enabled). The component exposes `theme` overrides that map 1:1 to tokens.
|
|
791
|
-
|
|
792
|
-
```ts
|
|
793
|
-
export interface EditorThemeTokens {
|
|
794
|
-
// Typography
|
|
795
|
-
fontFamilyUi: string; // e.g., "Inter, system-ui, sans-serif"
|
|
796
|
-
fontFamilyDoc: string; // e.g., "Times New Roman, serif" or host-provided
|
|
797
|
-
fontSizeUiPx: number; // e.g., 13
|
|
798
|
-
fontSizeDocPx: number; // e.g., 12
|
|
799
|
-
lineHeightUi: number; // e.g., 1.35
|
|
800
|
-
lineHeightDoc: number; // e.g., 1.5
|
|
801
|
-
|
|
802
|
-
// Spacing scale
|
|
803
|
-
space1: number; // 4
|
|
804
|
-
space2: number; // 8
|
|
805
|
-
space3: number; // 12
|
|
806
|
-
space4: number; // 16
|
|
807
|
-
space5: number; // 24
|
|
808
|
-
|
|
809
|
-
// Radius & elevation
|
|
810
|
-
radiusSm: number; // 6
|
|
811
|
-
radiusMd: number; // 10
|
|
812
|
-
shadowSm: string;
|
|
813
|
-
shadowMd: string;
|
|
814
|
-
|
|
815
|
-
// Neutral palette
|
|
816
|
-
colorBg: string;
|
|
817
|
-
colorSurface: string;
|
|
818
|
-
colorSurfaceMuted: string;
|
|
819
|
-
colorBorder: string;
|
|
820
|
-
colorText: string;
|
|
821
|
-
colorTextMuted: string;
|
|
822
|
-
|
|
823
|
-
// Accent palette
|
|
824
|
-
colorAccent: string;
|
|
825
|
-
colorAccentHover: string;
|
|
826
|
-
colorAccentTextOn: string;
|
|
827
|
-
|
|
828
|
-
// Review colors (must also have non-color indicators; see a11y)
|
|
829
|
-
colorInsertion: string;
|
|
830
|
-
colorDeletion: string;
|
|
831
|
-
colorComment: string;
|
|
832
|
-
|
|
833
|
-
// Feedback colors
|
|
834
|
-
colorWarning: string;
|
|
835
|
-
colorError: string;
|
|
836
|
-
colorSuccess: string;
|
|
837
|
-
|
|
838
|
-
// Focus ring
|
|
839
|
-
focusRing: string; // e.g., "0 0 0 3px rgba(...)"
|
|
840
|
-
}
|
|
841
|
-
```
|
|
842
|
-
|
|
843
|
-
**Usage guidance**
|
|
844
|
-
- Toolbar background uses `colorSurface`; borders use `colorBorder`.
|
|
845
|
-
- Document canvas uses `colorBg`; the “paper” uses `colorSurface`.
|
|
846
|
-
- Insertion/deletion/comment highlights use the review colors but must not be the only indicator (a11y requirement below).
|
|
847
|
-
|
|
848
|
-
### Dark mode and high contrast policy
|
|
849
|
-
|
|
850
|
-
- Dark mode is supported via token overrides; no separate CSS.
|
|
851
|
-
- High contrast:
|
|
852
|
-
- must meet text contrast expectations and avoid color-only meaning.
|
|
853
|
-
- provide an option `theme.highContrast = true` that increases border and focus visibility and strengthens non-color indicators.
|
|
854
|
-
|
|
855
|
-
Contrast and non-color meaning requirements align with WCAG guidance for contrast and “use of color.” citeturn3search13turn3search1turn3search5
|
|
856
|
-
|
|
857
|
-
### Embedding style isolation strategy
|
|
858
|
-
|
|
859
|
-
**Default (`styleIsolation="scoped"`)**
|
|
860
|
-
- All CSS is scoped beneath `.wre-root`.
|
|
861
|
-
- Document surface uses a controlled subset of CSS reset rules to prevent host CSS leakage.
|
|
862
|
-
|
|
863
|
-
**Optional (`styleIsolation="shadowRoot"`)**
|
|
864
|
-
- Render inside a ShadowRoot to isolate host CSS.
|
|
865
|
-
- Must still expose theme tokens via CSS variables set on the host element and inherited into shadow.
|
|
866
|
-
|
|
867
|
-
### Accessibility specification (WCAG-relevant behaviors)
|
|
868
|
-
|
|
869
|
-
**Keyboard navigation model**
|
|
870
|
-
- **Primary focus order**
|
|
871
|
-
1. Toolbar (single tab stop using roving tabindex)
|
|
872
|
-
2. Document surface
|
|
873
|
-
3. Sidebar tabs
|
|
874
|
-
4. Sidebar list and thread content
|
|
875
|
-
5. Status bar (if interactive)
|
|
876
|
-
- Editor shortcuts:
|
|
877
|
-
- Mod+B/I/U toggles formatting
|
|
878
|
-
- Mod+Z / Mod+Shift+Z undo/redo
|
|
879
|
-
- Alt+Shift+M add comment (configurable)
|
|
880
|
-
- F6 cycles focus between major regions (toolbar ↔ canvas ↔ sidebar)
|
|
881
|
-
|
|
882
|
-
**Toolbar accessibility**
|
|
883
|
-
- Toolbar container uses `role="toolbar"` with `aria-label="Editor toolbar"`.
|
|
884
|
-
- Implements roving tabindex to reduce tab stops (an explicit benefit called out in ARIA toolbar guidance). citeturn3search0turn3search8turn3search4
|
|
885
|
-
|
|
886
|
-
**Document surface semantics**
|
|
887
|
-
- Editable region must be announced as an editable text field; one workable approach is `role="textbox"` with `contenteditable="true"` and appropriate `aria-multiline="true"`. citeturn3search6
|
|
888
|
-
- When read-only, keep `contenteditable="true"` but set `aria-readonly="true"` to indicate editability is conceptually present but disabled. citeturn3search6
|
|
889
|
-
|
|
890
|
-
**Focus management**
|
|
891
|
-
- Must provide a visible focus indicator for all interactive elements and for the editable surface, consistent with Focus Visible expectations. citeturn3search9turn3search5
|
|
892
|
-
- Popovers/dialogs trap focus and restore focus to the invoking control on close.
|
|
893
|
-
|
|
894
|
-
**Comments and revisions accessibility**
|
|
895
|
-
- Comments and changes lists must be navigable by keyboard:
|
|
896
|
-
- Up/Down to move between items,
|
|
897
|
-
- Enter to open/focus thread,
|
|
898
|
-
- Escape to return to list.
|
|
899
|
-
- Each comment highlight in the document must have:
|
|
900
|
-
- a non-color cue (e.g., underline style or gutter icon),
|
|
901
|
-
- an accessible description via `aria-describedby` on the relevant decoration wrapper.
|
|
902
|
-
- Tracked deletions must not rely only on red color; include strikethrough and/or bracket indicators, consistent with “use of color” guidance. citeturn3search1turn3search5
|
|
903
|
-
|
|
904
|
-
**Reduced motion**
|
|
905
|
-
- Respect `prefers-reduced-motion`; disable animated highlight pulses and smooth scrolling.
|
|
906
|
-
|
|
907
|
-
---
|
|
908
|
-
|
|
909
|
-
## Performance strategy without Web Workers and persistence integration
|
|
910
|
-
|
|
911
|
-
### Main-thread performance principles
|
|
912
|
-
|
|
913
|
-
**What must never happen on each keystroke**
|
|
914
|
-
- Re-import `.docx` or parse XML.
|
|
915
|
-
- Rebuild the full OOXML export.
|
|
916
|
-
- Re-render the entire document via React reconciliation.
|
|
917
|
-
- Recompute all comment/change decorations for the full document if only a small region changed.
|
|
918
|
-
|
|
919
|
-
**Scheduling primitives and yielding**
|
|
920
|
-
- Use `scheduler.yield()` where available to split long tasks and allow high-priority work (input, rendering) to proceed; this is explicitly intended to keep the main thread responsive. citeturn1search14turn1search18
|
|
921
|
-
- Use `requestIdleCallback` for low-priority work (e.g., rebuild side-panel indexes, run low-cost validations), with a timeout for required work; MDN describes it as a way to run background/low priority work without impacting input latency, but notes limited availability in some browsers. citeturn1search2turn1search22
|
|
922
|
-
|
|
923
|
-
**Mandatory yielding points**
|
|
924
|
-
- After unzip part listing.
|
|
925
|
-
- After parsing each major XML part (`document.xml`, `styles.xml`, `numbering.xml`, `comments.xml`).
|
|
926
|
-
- After building canonical content for each N paragraphs (chunk size based on file size, e.g., 200–500).
|
|
927
|
-
- During export:
|
|
928
|
-
- after generating `document.xml`,
|
|
929
|
-
- after patching relationships and content types,
|
|
930
|
-
- before final zip compression.
|
|
931
|
-
|
|
932
|
-
### Staged import pipeline (main-thread safe)
|
|
933
|
-
|
|
934
|
-
**Stage A: OPC open (fast, chunked)**
|
|
935
|
-
- Read zip central directory.
|
|
936
|
-
- Parse `[Content_Types].xml` and `_rels/.rels` to locate the main document part and related parts; OPC defines parts, relationships, and a content types stream. citeturn0search4turn0search18
|
|
937
|
-
|
|
938
|
-
**Stage B: OOXML parse to intermediate AST**
|
|
939
|
-
- Build a lightweight AST that:
|
|
940
|
-
- preserves element names/attributes,
|
|
941
|
-
- retains unknown elements as “unknown nodes” tied to preservation store.
|
|
942
|
-
|
|
943
|
-
**Stage C: Normalize to canonical schema**
|
|
944
|
-
- Map supported content:
|
|
945
|
-
- paragraphs, runs, inline properties,
|
|
946
|
-
- lists/numbering references,
|
|
947
|
-
- tables,
|
|
948
|
-
- comments anchors,
|
|
949
|
-
- tracked change wrappers.
|
|
950
|
-
- Map unsupported content:
|
|
951
|
-
- convert to opaque nodes bound to preservation.
|
|
952
|
-
- Emit import warnings for any normalization that changes semantics.
|
|
953
|
-
|
|
954
|
-
**Stage D: Validate + compatibility report**
|
|
955
|
-
- Structural validation:
|
|
956
|
-
- required parts present,
|
|
957
|
-
- basic relationship integrity,
|
|
958
|
-
- comment/change ID consistency.
|
|
959
|
-
- Output a compatibility report attached to runtime state.
|
|
960
|
-
|
|
961
|
-
### Staged export pipeline
|
|
962
|
-
|
|
963
|
-
**Fast path principle:** export only regenerates parts that the editor owns; all other parts are copied verbatim from `PreservedPackage`.
|
|
964
|
-
|
|
965
|
-
- Regenerate:
|
|
966
|
-
- `word/document.xml` (content + revision markup),
|
|
967
|
-
- `word/comments.xml` (if comments exist),
|
|
968
|
-
- relationship parts that must change (if new parts are introduced).
|
|
969
|
-
- Preserve untouched:
|
|
970
|
-
- theme parts, custom XML, unused parts, vendor extension parts.
|
|
971
|
-
|
|
972
|
-
Tracked changes export must use the standard revision markup patterns (inserted/deleted run content and related deletion text conventions). citeturn4search0turn4search1turn4search5
|
|
973
|
-
Comments export must use the anchor + reference linkage model between range markers and comment definitions. citeturn5search0turn5search1turn0search6
|
|
974
|
-
|
|
975
|
-
### Large-document degradation policy
|
|
976
|
-
|
|
977
|
-
**Thresholds (example; must be configurable)**
|
|
978
|
-
- `> 250 pages` or `> 2 MB document.xml`:
|
|
979
|
-
- disable “all markup” by default (offer toggle with warning),
|
|
980
|
-
- simplify decoration rendering (only show active/nearby comment highlights),
|
|
981
|
-
- virtualize sidebar lists aggressively,
|
|
982
|
-
- defer expensive diagnostics.
|
|
983
|
-
|
|
984
|
-
**Safe mode behavior**
|
|
985
|
-
- Show banner warning: “Large document: review overlays simplified to keep typing responsive.”
|
|
986
|
-
- Never drop fidelity; simplification is visual-only.
|
|
987
|
-
|
|
988
|
-
### Performance budgets (legal review acceptable targets)
|
|
989
|
-
|
|
990
|
-
- Typing latency (p50): ≤ 16 ms; (p95): ≤ 50 ms
|
|
991
|
-
- Selection/arrow navigation: ≤ 30 ms (p95)
|
|
992
|
-
- Initial import (common contract 50–150 pages): ≤ 2–5 s (with visible progress)
|
|
993
|
-
- Export docx (common contract): ≤ 3–6 s (with progress + yielding)
|
|
994
|
-
- Sidebar open/scroll (virtualized): ≤ 16 ms per frame during scroll
|
|
995
|
-
|
|
996
|
-
### Persistence and datastore integration
|
|
997
|
-
|
|
998
|
-
**In-memory editing model**
|
|
999
|
-
- Runtime holds the canonical and review state in memory throughout the session.
|
|
1000
|
-
- Persistence uses **checkpoints** (JSON snapshot) + **exports** (docx artifact).
|
|
1001
|
-
|
|
1002
|
-
**What is persisted**
|
|
1003
|
-
- Canonical snapshot (content, styles, numbering, media refs)
|
|
1004
|
-
- Review snapshot (comments, changes, authors)
|
|
1005
|
-
- Preservation snapshot (preserved parts hashes/handles, opaque regions metadata)
|
|
1006
|
-
|
|
1007
|
-
**What is not persisted**
|
|
1008
|
-
- DOM state
|
|
1009
|
-
- Transient UI state (panels open, hover)
|
|
1010
|
-
- Dirty flag (recomputed)
|
|
1011
|
-
|
|
1012
|
-
**Recovery/resume**
|
|
1013
|
-
- On load, prefer latest snapshot checkpoint over docx if both exist, unless host requests “reimport from docx.”
|
|
1014
|
-
|
|
1015
|
-
**Failure behavior**
|
|
1016
|
-
- Autosave failures are non-blocking:
|
|
1017
|
-
- show status indicator + retry with exponential backoff,
|
|
1018
|
-
- emit `datastore_failed` errors (non-fatal).
|
|
1019
|
-
- Explicit “Save” may be blocking depending on host policy (configurable).
|
|
1020
|
-
|
|
1021
|
-
---
|
|
1022
|
-
|
|
1023
|
-
## Error handling, testability, implementation phasing, non-goals, and quality bar
|
|
1024
|
-
|
|
1025
|
-
### Error and warning model (front-end behavior)
|
|
1026
|
-
|
|
1027
|
-
| Condition | Internal representation | User-facing treatment | Blocking? |
|
|
1028
|
-
|---|---|---|---|
|
|
1029
|
-
| Corrupt package / cannot open OPC | `EditorError{code:"package_corrupt", isFatal:true}` | Full error state + allow downloading original bytes if available | Yes |
|
|
1030
|
-
| Recoverable import normalization | `EditorWarning{code:"import_normalized"}` | Non-blocking banner + details in compatibility panel | No |
|
|
1031
|
-
| Unsupported OOXML preserved | `EditorWarning{code:"unsupported_ooxml_preserved"}` | Banner + list of preserved parts/ranges | No |
|
|
1032
|
-
| Unsupported region locked | `EditorWarning{code:"unsupported_ooxml_locked"}` | Inline placeholder + sidebar entry; disallow editing in that region | Partially (range-level) |
|
|
1033
|
-
| Export integrity failure | `EditorError{code:"export_failed", isFatal:false}` | Modal “Export failed” with retry; keep session state | No (unless host requires) |
|
|
1034
|
-
| Validation failure (state invariant) | `EditorError{code:"internal_invariant", isFatal:true}` | Fatal error with diagnostic token | Yes |
|
|
1035
|
-
| Autosave failure | `EditorError{code:"datastore_failed", isFatal:false}` | Status bar error + retry | No |
|
|
1036
|
-
|
|
1037
|
-
### Testability requirements
|
|
1038
|
-
|
|
1039
|
-
**Framework-agnostic unit tests (must not import React)**
|
|
1040
|
-
- `core/schema`: schema invariants, node/mark validation.
|
|
1041
|
-
- `core/commands`: command enablement, transaction outputs.
|
|
1042
|
-
- `core/review`: anchor mapping through synthetic transactions.
|
|
1043
|
-
- `import/*`: fixture-based docx parsing (golden canonical snapshot + preservation snapshot).
|
|
1044
|
-
- `export/*`: golden `.docx` generation tests (byte-level comparisons with normalization for timestamps).
|
|
1045
|
-
|
|
1046
|
-
**Runtime tests**
|
|
1047
|
-
- lifecycle flows (load → edit → autosave → export).
|
|
1048
|
-
- subscription correctness (no missed notifications, snapshot consistency).
|
|
1049
|
-
|
|
1050
|
-
**React integration tests**
|
|
1051
|
-
- keyboard interactions, toolbar and sidebar wiring.
|
|
1052
|
-
- focus management and accessible navigation.
|
|
1053
|
-
|
|
1054
|
-
**Accessibility tests**
|
|
1055
|
-
- automated checks (axe) for role/labeling.
|
|
1056
|
-
- keyboard-only interaction flows for:
|
|
1057
|
-
- toolbar roving tabindex,
|
|
1058
|
-
- entering/leaving canvas,
|
|
1059
|
-
- opening comment dialogs.
|
|
1060
|
-
|
|
1061
|
-
**Performance smoke tests (CI)**
|
|
1062
|
-
- import/export under budget with representative 100+ page fixtures.
|
|
1063
|
-
- typing latency checks via synthetic input event harness (threshold-based fail).
|
|
1064
|
-
|
|
1065
|
-
### Implementation phasing (exit criteria are mandatory)
|
|
1066
|
-
|
|
1067
|
-
**Phase: Shell + runtime skeleton**
|
|
1068
|
-
- Scope: public component, runtime interface, subscription wiring, theme tokens scaffold, status bar skeleton.
|
|
1069
|
-
- Exit: load stub document, basic focus/blur, emits `ready`.
|
|
1070
|
-
|
|
1071
|
-
**Phase: Document surface + basic editing wiring**
|
|
1072
|
-
- Scope: editable surface, text insertion/deletion, paragraph model, selection snapshot, undo/redo.
|
|
1073
|
-
- Exit: typing works without full rerender; undo/redo stable.
|
|
1074
|
-
|
|
1075
|
-
**Phase: Toolbar + comments sidebar**
|
|
1076
|
-
- Scope: formatting toggles, add comment flow, comment anchoring, sidebar list + thread view.
|
|
1077
|
-
- Exit: comments round-trip through snapshot; anchors remap through edits.
|
|
1078
|
-
|
|
1079
|
-
**Phase: Review mode + tracked changes UI**
|
|
1080
|
-
- Scope: track changes on/off, insertion/deletion markup rendering, accept/reject per change, changes panel navigation.
|
|
1081
|
-
- Exit: exports open in Word with visible tracked changes and comments.
|
|
1082
|
-
|
|
1083
|
-
**Phase: Persistence integration**
|
|
1084
|
-
- Scope: datastore adapter wiring, autosave, recovery.
|
|
1085
|
-
- Exit: autosave checkpoint + explicit export save, robust failure UI.
|
|
1086
|
-
|
|
1087
|
-
**Phase: Performance hardening**
|
|
1088
|
-
- Scope: staged import/export yielding, sidebar virtualization, large-doc safe mode.
|
|
1089
|
-
- Exit: meets performance budgets for representative fixtures.
|
|
1090
|
-
|
|
1091
|
-
**Phase: Theming + accessibility polish**
|
|
1092
|
-
- Scope: high contrast, dark mode tokens, focus-visible polish, ARIA correctness.
|
|
1093
|
-
- Exit: a11y test suite passes; design tokens documented and stable.
|
|
1094
|
-
|
|
1095
|
-
### Non-goals
|
|
1096
|
-
|
|
1097
|
-
This architecture explicitly does **not** attempt:
|
|
1098
|
-
- Full Word ribbon parity or Word layout/pagination parity.
|
|
1099
|
-
- Unlimited plugin ecosystem in v1 (extensions are UI slots only).
|
|
1100
|
-
- Real-time collaborative editing in v1.
|
|
1101
|
-
- Native rendering/editing support for every OOXML feature; unsupported constructs must be preserved/locked/warned, not “best-effort silently flattened.”
|
|
1102
|
-
- Macro-enabled documents (`.docm`) support in v1.
|
|
1103
|
-
|
|
1104
|
-
### Output quality bar (acceptance criteria)
|
|
1105
|
-
|
|
1106
|
-
A build is considered “spec-complete” only if:
|
|
1107
|
-
- Every user-visible edit path goes through commands and transactions.
|
|
1108
|
-
- Import/export supports `.docx` packaging and produces Word-opening documents without repair warnings for supported feature sets (comments + tracked changes + tables/lists).
|
|
1109
|
-
- Unsupported content is preserved and surfaced (never silently dropped).
|
|
1110
|
-
- Large documents stay usable on the main thread with documented degradation modes.
|
|
1111
|
-
- The public API is stable, typed, and sufficient for host integration and persistence.
|
|
1112
|
-
- Core modules are testable without React; React tests cover UX, a11y, and key interaction flows.
|