@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.
Files changed (704) hide show
  1. package/dist/chunk-32W6IVQE.js +7725 -0
  2. package/dist/chunk-32W6IVQE.js.map +1 -0
  3. package/dist/index.cjs +23722 -0
  4. package/dist/index.cjs.map +1 -0
  5. package/dist/index.d.cts +7 -0
  6. package/dist/index.d.ts +7 -0
  7. package/dist/index.js +16011 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/public-types-DqCURAz8.d.cts +1152 -0
  10. package/dist/public-types-DqCURAz8.d.ts +1152 -0
  11. package/dist/tailwind.cjs +8295 -0
  12. package/dist/tailwind.cjs.map +1 -0
  13. package/dist/tailwind.d.cts +323 -0
  14. package/dist/tailwind.d.ts +323 -0
  15. package/dist/tailwind.js +553 -0
  16. package/dist/tailwind.js.map +1 -0
  17. package/package.json +52 -31
  18. package/.codex/config.toml +0 -5
  19. package/.corepack/v1/pnpm/10.30.3/.corepack +0 -1
  20. package/.corepack/v1/pnpm/10.30.3/LICENSE +0 -22
  21. package/.corepack/v1/pnpm/10.30.3/README.md +0 -240
  22. package/.corepack/v1/pnpm/10.30.3/dist/node-gyp-bin/node-gyp +0 -6
  23. package/.corepack/v1/pnpm/10.30.3/dist/node-gyp-bin/node-gyp.cmd +0 -5
  24. package/.corepack/v1/pnpm/10.30.3/dist/pnpm.cjs +0 -195400
  25. package/.corepack/v1/pnpm/10.30.3/dist/pnpmrc +0 -2
  26. package/.corepack/v1/pnpm/10.30.3/dist/reflink.darwin-arm64-2HJ4WGO6.node +0 -0
  27. package/.corepack/v1/pnpm/10.30.3/dist/reflink.darwin-x64-3G3H6IW4.node +0 -0
  28. package/.corepack/v1/pnpm/10.30.3/dist/reflink.win32-arm64-msvc-Q6BARPPB.node +0 -0
  29. package/.corepack/v1/pnpm/10.30.3/dist/reflink.win32-x64-msvc-J2TZHRQI.node +0 -0
  30. package/.corepack/v1/pnpm/10.30.3/dist/templates/completion.bash +0 -31
  31. package/.corepack/v1/pnpm/10.30.3/dist/templates/completion.fish +0 -22
  32. package/.corepack/v1/pnpm/10.30.3/dist/templates/completion.ps1 +0 -193
  33. package/.corepack/v1/pnpm/10.30.3/dist/templates/completion.zsh +0 -27
  34. package/.corepack/v1/pnpm/10.30.3/dist/vendor/fastlist-0.3.0-x64.exe +0 -0
  35. package/.corepack/v1/pnpm/10.30.3/dist/vendor/fastlist-0.3.0-x86.exe +0 -0
  36. package/.corepack/v1/pnpm/10.30.3/dist/worker.js +0 -10119
  37. package/.corepack/v1/pnpm/10.30.3/package.json +0 -192
  38. package/.cursor/mcp.json +0 -7
  39. package/.github/workflows/ci.yml +0 -35
  40. package/.mcp.json +0 -7
  41. package/.openclaw/workspace-state.json +0 -4
  42. package/.pnpmrc.json +0 -1
  43. package/.wave-launch.sh +0 -7
  44. package/.workspace-marker +0 -1
  45. package/AGENTS.md +0 -78
  46. package/CHANGELOG.md +0 -177
  47. package/DESIGN.md +0 -929
  48. package/HEARTBEAT.md +0 -7
  49. package/IDENTITY.md +0 -23
  50. package/SOUL.md +0 -36
  51. package/TOOLS.md +0 -40
  52. package/USER.md +0 -17
  53. package/docs/README.md +0 -107
  54. package/docs/agents/wave-cont-eval-role.md +0 -36
  55. package/docs/agents/wave-cont-qa-role.md +0 -52
  56. package/docs/agents/wave-deploy-verifier-role.md +0 -34
  57. package/docs/agents/wave-design-role.md +0 -47
  58. package/docs/agents/wave-documentation-role.md +0 -34
  59. package/docs/agents/wave-infra-role.md +0 -34
  60. package/docs/agents/wave-integration-role.md +0 -37
  61. package/docs/agents/wave-launcher-role.md +0 -41
  62. package/docs/agents/wave-orchestrator-role.md +0 -52
  63. package/docs/agents/wave-planner-role.md +0 -39
  64. package/docs/agents/wave-security-role.md +0 -40
  65. package/docs/architecture/docx/README.md +0 -10
  66. package/docs/architecture/future/README.md +0 -8
  67. package/docs/architecture/ooxml-upgrade-analysis.md +0 -134
  68. package/docs/architecture/platform/shared-openxml-editor-platform.md +0 -153
  69. package/docs/architecture/xlsx/canonical-workbook-model-and-commands.md +0 -187
  70. package/docs/architecture/xlsx/spreadsheet-editor-frontend-architecture.md +0 -150
  71. package/docs/comment-redline-overview.md +0 -350
  72. package/docs/concepts/context7-vs-skills.md +0 -118
  73. package/docs/concepts/operating-modes.md +0 -91
  74. package/docs/concepts/runtime-agnostic-orchestration.md +0 -111
  75. package/docs/concepts/what-is-a-wave.md +0 -217
  76. package/docs/context7/bundles.json +0 -222
  77. package/docs/context7/planner-agent/README.md +0 -28
  78. package/docs/context7/planner-agent/manifest.json +0 -83
  79. package/docs/context7/planner-agent/papers/cooperbench-why-coding-agents-cannot-be-your-teammates-yet.md +0 -3283
  80. package/docs/context7/planner-agent/papers/dova-deliberation-first-multi-agent-orchestration-for-autonomous-research-automation.md +0 -1699
  81. package/docs/context7/planner-agent/papers/dpbench-large-language-models-struggle-with-simultaneous-coordination.md +0 -2251
  82. package/docs/context7/planner-agent/papers/incremental-planning-to-control-a-blackboard-based-problem-solver.md +0 -1729
  83. package/docs/context7/planner-agent/papers/silo-bench-a-scalable-environment-for-evaluating-distributed-coordination-in-multi-agent-llm-systems.md +0 -3747
  84. package/docs/context7/planner-agent/papers/todoevolve-learning-to-architect-agent-planning-systems.md +0 -1675
  85. package/docs/context7/planner-agent/papers/verified-multi-agent-orchestration-a-plan-execute-verify-replan-framework-for-complex-query-resolution.md +0 -1173
  86. package/docs/context7/planner-agent/papers/why-do-multi-agent-llm-systems-fail.md +0 -5211
  87. package/docs/context7/planner-agent/topics/planning-and-orchestration.md +0 -24
  88. package/docs/evals/arm-templates/README.md +0 -13
  89. package/docs/evals/arm-templates/full-wave.json +0 -15
  90. package/docs/evals/arm-templates/single-agent.json +0 -15
  91. package/docs/evals/benchmark-catalog.json +0 -670
  92. package/docs/evals/cases/README.md +0 -47
  93. package/docs/evals/cases/wave-blackboard-inbox-targeting.json +0 -73
  94. package/docs/evals/cases/wave-contradiction-conflict.json +0 -104
  95. package/docs/evals/cases/wave-expert-routing-preservation.json +0 -69
  96. package/docs/evals/cases/wave-hidden-profile-private-evidence.json +0 -81
  97. package/docs/evals/cases/wave-premature-closure-guard.json +0 -71
  98. package/docs/evals/cases/wave-silo-cross-agent-state.json +0 -77
  99. package/docs/evals/cases/wave-simultaneous-lockstep.json +0 -92
  100. package/docs/evals/external-benchmarks.json +0 -85
  101. package/docs/evals/external-command-config.sample.json +0 -9
  102. package/docs/evals/external-command-config.swe-bench-pro.json +0 -8
  103. package/docs/evals/pilots/README.md +0 -47
  104. package/docs/evals/pilots/swe-bench-pro-public-full-wave-review-10.json +0 -64
  105. package/docs/evals/pilots/swe-bench-pro-public-pilot.json +0 -111
  106. package/docs/evals/wave-benchmark-program.md +0 -302
  107. package/docs/guides/planner.md +0 -220
  108. package/docs/guides/recommendations-0.8.9.md +0 -133
  109. package/docs/guides/signal-wrappers.md +0 -165
  110. package/docs/guides/terminal-surfaces.md +0 -96
  111. package/docs/image copy.png +0 -0
  112. package/docs/image.png +0 -0
  113. package/docs/images/image.png +0 -0
  114. package/docs/legal-feedback-architecture.md +0 -498
  115. package/docs/plans/component-cutover-matrix.json +0 -1072
  116. package/docs/plans/component-cutover-matrix.md +0 -307
  117. package/docs/plans/context7-wave-orchestrator.md +0 -155
  118. package/docs/plans/current-state.md +0 -198
  119. package/docs/plans/docx/README.md +0 -9
  120. package/docs/plans/examples/wave-benchmark-improvement.md +0 -108
  121. package/docs/plans/examples/wave-example-live-proof.md +0 -435
  122. package/docs/plans/master-plan.md +0 -224
  123. package/docs/plans/migration.md +0 -538
  124. package/docs/plans/operations/README.md +0 -7
  125. package/docs/plans/operations/wave-10-word-certification.md +0 -87
  126. package/docs/plans/operations/wave-8-railway-staging.md +0 -153
  127. package/docs/plans/operations/wave-9-manual-certification.md +0 -73
  128. package/docs/plans/platform/README.md +0 -9
  129. package/docs/plans/reference/legal-checklist-coverage.md +0 -258
  130. package/docs/plans/wave-orchestrator.md +0 -423
  131. package/docs/plans/waves/README.md +0 -75
  132. package/docs/plans/waves/completed/wave-0.md +0 -195
  133. package/docs/plans/waves/completed/wave-1.md +0 -379
  134. package/docs/plans/waves/completed/wave-10.md +0 -670
  135. package/docs/plans/waves/completed/wave-11.md +0 -335
  136. package/docs/plans/waves/completed/wave-12.md +0 -417
  137. package/docs/plans/waves/completed/wave-13.md +0 -316
  138. package/docs/plans/waves/completed/wave-14.md +0 -319
  139. package/docs/plans/waves/completed/wave-15.md +0 -321
  140. package/docs/plans/waves/completed/wave-16.md +0 -316
  141. package/docs/plans/waves/completed/wave-17.md +0 -331
  142. package/docs/plans/waves/completed/wave-18.md +0 -328
  143. package/docs/plans/waves/completed/wave-2.md +0 -438
  144. package/docs/plans/waves/completed/wave-3.md +0 -435
  145. package/docs/plans/waves/completed/wave-4.md +0 -430
  146. package/docs/plans/waves/completed/wave-5.md +0 -430
  147. package/docs/plans/waves/completed/wave-6.md +0 -430
  148. package/docs/plans/waves/completed/wave-7.md +0 -526
  149. package/docs/plans/waves/completed/wave-8.md +0 -596
  150. package/docs/plans/waves/completed/wave-9.md +0 -552
  151. package/docs/plans/waves/deferred/README.md +0 -14
  152. package/docs/plans/waves/deferred/encrypted-intake-contracts.md +0 -282
  153. package/docs/plans/waves/deferred/legal-feedback-wave-expansion.md +0 -308
  154. package/docs/plans/waves/deferred/wave-encrypted-intake.md +0 -451
  155. package/docs/plans/waves/design/README.md +0 -5
  156. package/docs/plans/waves/design/wave-1-a1.md +0 -309
  157. package/docs/plans/waves/reviews/README.md +0 -5
  158. package/docs/plans/waves/reviews/wave-0-cont-qa.md +0 -151
  159. package/docs/plans/waves/reviews/wave-1-cont-qa.md +0 -46
  160. package/docs/plans/waves/reviews/wave-10-accessibility-and-design.md +0 -51
  161. package/docs/plans/waves/reviews/wave-10-cont-qa.md +0 -24
  162. package/docs/plans/waves/reviews/wave-10-dashboard-proof.md +0 -46
  163. package/docs/plans/waves/reviews/wave-10-performance-signoff.md +0 -55
  164. package/docs/plans/waves/reviews/wave-10-regression-proof.md +0 -23
  165. package/docs/plans/waves/reviews/wave-10-release-audit.md +0 -31
  166. package/docs/plans/waves/reviews/wave-10-service-proof.md +0 -83
  167. package/docs/plans/waves/reviews/wave-10-word-certification.md +0 -31
  168. package/docs/plans/waves/reviews/wave-18-ai-contract-closure.md +0 -277
  169. package/docs/plans/waves/reviews/wave-18-cont-qa.md +0 -255
  170. package/docs/plans/waves/reviews/wave-18-parity-proof.md +0 -271
  171. package/docs/plans/waves/reviews/wave-19-cont-qa.md +0 -59
  172. package/docs/plans/waves/reviews/wave-2-cont-qa.md +0 -72
  173. package/docs/plans/waves/reviews/wave-20-cont-qa.md +0 -60
  174. package/docs/plans/waves/reviews/wave-25-cont-qa.md +0 -48
  175. package/docs/plans/waves/reviews/wave-28-cont-qa.md +0 -46
  176. package/docs/plans/waves/reviews/wave-29-cont-qa.md +0 -53
  177. package/docs/plans/waves/reviews/wave-3-cont-qa.md +0 -53
  178. package/docs/plans/waves/reviews/wave-3-core-proof.md +0 -77
  179. package/docs/plans/waves/reviews/wave-3-validator-proof.md +0 -73
  180. package/docs/plans/waves/reviews/wave-32-cont-qa.md +0 -43
  181. package/docs/plans/waves/reviews/wave-33-cont-qa.md +0 -526
  182. package/docs/plans/waves/reviews/wave-34-cont-qa.md +0 -100
  183. package/docs/plans/waves/reviews/wave-35-cont-qa.md +0 -145
  184. package/docs/plans/waves/reviews/wave-4-cont-qa.md +0 -47
  185. package/docs/plans/waves/reviews/wave-4-structure-proof.md +0 -69
  186. package/docs/plans/waves/reviews/wave-5-comment-proof.md +0 -158
  187. package/docs/plans/waves/reviews/wave-5-cont-qa.md +0 -68
  188. package/docs/plans/waves/reviews/wave-6-cont-qa.md +0 -416
  189. package/docs/plans/waves/reviews/wave-6-redline-proof.md +0 -130
  190. package/docs/plans/waves/reviews/wave-7-cont-qa.md +0 -82
  191. package/docs/plans/waves/reviews/wave-7-ooxml-compliance.md +0 -85
  192. package/docs/plans/waves/reviews/wave-7-preservation-proof.md +0 -119
  193. package/docs/plans/waves/reviews/wave-7-trust-ux.md +0 -87
  194. package/docs/plans/waves/reviews/wave-8-accessibility-and-design.md +0 -128
  195. package/docs/plans/waves/reviews/wave-8-cont-qa.md +0 -92
  196. package/docs/plans/waves/reviews/wave-8-live-proof.md +0 -140
  197. package/docs/plans/waves/reviews/wave-8-security.md +0 -47
  198. package/docs/plans/waves/reviews/wave-9-editor-embedding.md +0 -39
  199. package/docs/plans/waves/reviews/wave-9-fixture-runner.md +0 -56
  200. package/docs/plans/waves/reviews/wave-9-live-proof.md +0 -105
  201. package/docs/plans/waves/reviews/wave-9-usability-and-performance.md +0 -152
  202. package/docs/plans/waves/specs/README.md +0 -5
  203. package/docs/plans/waves/specs/wave-1-component-boundaries.md +0 -322
  204. package/docs/plans/waves/specs/wave-1-ooxml-contracts.md +0 -323
  205. package/docs/plans/waves/specs/wave-1-review-and-ui-contracts.md +0 -339
  206. package/docs/plans/waves/specs/wave-1-runtime-contracts.md +0 -509
  207. package/docs/plans/waves/wave-19.md +0 -341
  208. package/docs/plans/waves/wave-20.md +0 -308
  209. package/docs/plans/waves/wave-21.md +0 -289
  210. package/docs/plans/waves/wave-22.md +0 -221
  211. package/docs/plans/waves/wave-23.md +0 -295
  212. package/docs/plans/waves/wave-24.md +0 -286
  213. package/docs/plans/waves/wave-25.md +0 -313
  214. package/docs/plans/waves/wave-26.md +0 -300
  215. package/docs/plans/waves/wave-27.md +0 -299
  216. package/docs/plans/waves/wave-28.md +0 -368
  217. package/docs/plans/waves/wave-29.md +0 -303
  218. package/docs/plans/waves/wave-30.md +0 -307
  219. package/docs/plans/waves/wave-31.md +0 -231
  220. package/docs/plans/waves/wave-32.md +0 -152
  221. package/docs/plans/waves/wave-33.md +0 -147
  222. package/docs/plans/waves/wave-34.md +0 -148
  223. package/docs/plans/waves/wave-35.md +0 -141
  224. package/docs/plans/waves/wave-36.md +0 -146
  225. package/docs/plans/xlsx/README.md +0 -14
  226. package/docs/plans/xlsx/xlsx-fixture-corpus-and-certification-plan.md +0 -126
  227. package/docs/reference/cli-reference.md +0 -600
  228. package/docs/reference/coordination-and-closure.md +0 -487
  229. package/docs/reference/deep-research-report (15).md +0 -25
  230. package/docs/reference/docx/README.md +0 -10
  231. package/docs/reference/legal-checklist.md +0 -445
  232. package/docs/reference/live-proof-waves.md +0 -199
  233. package/docs/reference/ooxml-compliance.md +0 -129
  234. package/docs/reference/ooxml-feature-parity-matrix.md +0 -172
  235. package/docs/reference/platform/shared-ooxml-platform-guidance.md +0 -77
  236. package/docs/reference/prototype-agent-prompt-legal-fidelity.md +0 -155
  237. package/docs/reference/public-api.md +0 -456
  238. package/docs/reference/repository-guidance.md +0 -58
  239. package/docs/reference/runtime-config/README.md +0 -182
  240. package/docs/reference/runtime-config/claude.md +0 -110
  241. package/docs/reference/runtime-config/codex.md +0 -82
  242. package/docs/reference/runtime-config/opencode.md +0 -93
  243. package/docs/reference/sample-waves.md +0 -105
  244. package/docs/reference/skills.md +0 -237
  245. package/docs/reference/templates/AGENTS.md +0 -78
  246. package/docs/reference/templates/HEARTBEAT.md +0 -7
  247. package/docs/reference/templates/IDENTITY.md +0 -23
  248. package/docs/reference/templates/SOUL.md +0 -36
  249. package/docs/reference/templates/TOOLS.md +0 -40
  250. package/docs/reference/templates/USER.md +0 -17
  251. package/docs/reference/wave-control.md +0 -184
  252. package/docs/reference/wave-planning-lessons.md +0 -167
  253. package/docs/reference/word-review-editor-frontend-architecture.md +0 -479
  254. package/docs/reference/word-review-editor-ux-guide.md +0 -253
  255. package/docs/reference/xlsx/xlsx-ooxml-compliance.md +0 -137
  256. package/docs/research/agent-context-sources.md +0 -178
  257. package/docs/research/coordination-failure-review.md +0 -290
  258. package/docs/research/docx-react-component/Canonical Document Schema Specification for a React-based Word-compatible Editor.md +0 -2317
  259. package/docs/research/docx-react-component/Feature Compatibility Matrix for a React Word Compatible Legal Editor v1.md +0 -219
  260. package/docs/research/docx-react-component/React Component Architecture and Front-End Structure Specification for a Word-Compatible Legal Review Editor.md +0 -1112
  261. package/docs/research/docx-react-component/document_compatibility_and_testing_spec.md +0 -751
  262. package/docs/research/xlsx/raw/README.md +0 -13
  263. package/docs/roadmap.md +0 -174
  264. package/docs/superpowers/plans/2026-03-28-harness-control-bar.md +0 -677
  265. package/docs/superpowers/specs/2026-03-28-harness-control-bar-design.md +0 -274
  266. package/docs/xlsx-react/README.md +0 -38
  267. package/docs/xlsx-react/agent-llm-interaction-layer-docx-xlsx.md +0 -621
  268. package/docs/xlsx-react/canonical-workbook-model-and-commands.md +0 -948
  269. package/docs/xlsx-react/shared-openxml-editor-platform-docx-xlsx.md +0 -228
  270. package/docs/xlsx-react/spreadsheet-editor-component-architecture.md +0 -809
  271. package/docs/xlsx-react/spreadsheet-editor-frontend-architecture.md +0 -537
  272. package/docs/xlsx-react/spreadsheet-editor-ux-guide.md +0 -520
  273. package/docs/xlsx-react/xlsx-editor-research-pack.md +0 -871
  274. package/docs/xlsx-react/xlsx-fixture-corpus-and-certification-plan.md +0 -436
  275. package/docs/xlsx-react/xlsx-ooxml-compliance.md +0 -320
  276. package/examples/README.md +0 -16
  277. package/memory/MEMORY.md +0 -24
  278. package/pnpm-workspace.yaml +0 -4
  279. package/scripts/check-no-authored-js.sh +0 -13
  280. package/scripts/context7-api-check.sh +0 -65
  281. package/scripts/context7-export-env.sh +0 -42
  282. package/scripts/run-context7-mcp.sh +0 -8
  283. package/scripts/run-workspace-tests.sh +0 -15
  284. package/scripts/start-wave-10-local.sh +0 -189
  285. package/scripts/wave-agent-attach.sh +0 -47
  286. package/scripts/wave-auto-answer.sh +0 -118
  287. package/scripts/wave-dashboard-attach.sh +0 -13
  288. package/scripts/wave-launch.sh +0 -273
  289. package/scripts/wave-overnight-supervisor.sh +0 -145
  290. package/scripts/wave-status.sh +0 -379
  291. package/scripts/wave-watch.sh +0 -231
  292. package/services/README.md +0 -17
  293. package/services/openxml-validator/Dockerfile +0 -29
  294. package/services/openxml-validator/OpenXmlValidator.Api.csproj +0 -12
  295. package/services/openxml-validator/Program.cs +0 -436
  296. package/services/openxml-validator/README.md +0 -152
  297. package/services/openxml-validator/railway.json +0 -16
  298. package/services/react-word-editor/.tmp-a4/src/api/public-types.ts +0 -318
  299. package/services/react-word-editor/.tmp-a4/src/ui/WordReviewEditor.tsx +0 -1302
  300. package/services/react-word-editor/.tmp-a4/src/ui/editor-surface/editor-surface.tsx +0 -546
  301. package/services/react-word-editor/.tmp-a4/test/ui/word-review-editor.test.tsx +0 -146
  302. package/services/react-word-editor/.tmp-a4-build/src/api/public-types.js +0 -2
  303. package/services/react-word-editor/.tmp-a4-build/src/ui/WordReviewEditor.js +0 -818
  304. package/services/react-word-editor/.tmp-a4-build/src/ui/editor-surface/editor-surface.js +0 -229
  305. package/services/react-word-editor/.tmp-a4-build/test/ui/word-review-editor.test.js +0 -121
  306. package/services/react-word-editor/.tmp-wave-4-a3-tsconfig.json +0 -21
  307. package/services/react-word-editor/.tmp-wave-4-a3-tsconfig.tsbuildinfo +0 -1
  308. package/services/react-word-editor/Dockerfile +0 -26
  309. package/services/react-word-editor/README.md +0 -254
  310. package/services/react-word-editor/app/api/certification/route.ts +0 -79
  311. package/services/react-word-editor/app/api/demo-sessions/route.ts +0 -109
  312. package/services/react-word-editor/app/api/deploy-health/route.ts +0 -23
  313. package/services/react-word-editor/app/api/exports/[exportId]/route.ts +0 -34
  314. package/services/react-word-editor/app/api/exports/route.ts +0 -81
  315. package/services/react-word-editor/app/api/fixtures/[fixtureId]/run/route.ts +0 -100
  316. package/services/react-word-editor/app/api/health/route.ts +0 -70
  317. package/services/react-word-editor/app/api/runs/[runId]/route.ts +0 -36
  318. package/services/react-word-editor/app/api/scenarios/[scenarioId]/run/route.ts +0 -85
  319. package/services/react-word-editor/app/api/sessions/[sessionId]/route.ts +0 -199
  320. package/services/react-word-editor/app/api/sessions/[sessionId]/source/route.ts +0 -45
  321. package/services/react-word-editor/app/api/uploads/route.ts +0 -70
  322. package/services/react-word-editor/app/api/validate/route.ts +0 -310
  323. package/services/react-word-editor/app/certification/[runId]/page.tsx +0 -14
  324. package/services/react-word-editor/app/certification/page.tsx +0 -32
  325. package/services/react-word-editor/app/dashboard/page.tsx +0 -7
  326. package/services/react-word-editor/app/demo/page.tsx +0 -30
  327. package/services/react-word-editor/app/demo/prototype-client.tsx +0 -1080
  328. package/services/react-word-editor/app/editor/[sessionId]/page.tsx +0 -33
  329. package/services/react-word-editor/app/fixtures/page.tsx +0 -7
  330. package/services/react-word-editor/app/globals.css +0 -121
  331. package/services/react-word-editor/app/layout.tsx +0 -32
  332. package/services/react-word-editor/app/page.tsx +0 -30
  333. package/services/react-word-editor/app/runs/[runId]/page.tsx +0 -34
  334. package/services/react-word-editor/app/wave-10-word-review/page.tsx +0 -7
  335. package/services/react-word-editor/components/harness-control-bar.tsx +0 -289
  336. package/services/react-word-editor/components/harness-editor-session-client.tsx +0 -1214
  337. package/services/react-word-editor/components/harness-workspace-page.tsx +0 -715
  338. package/services/react-word-editor/components/reduced-motion-toggle.tsx +0 -79
  339. package/services/react-word-editor/components/workspace-certification-panel.tsx +0 -307
  340. package/services/react-word-editor/lib/certification-bundle.ts +0 -796
  341. package/services/react-word-editor/lib/certification-store.ts +0 -661
  342. package/services/react-word-editor/lib/demo-fixtures.test.mjs +0 -195
  343. package/services/react-word-editor/lib/demo-fixtures.ts +0 -1519
  344. package/services/react-word-editor/lib/editor-session-summary.test.mjs +0 -68
  345. package/services/react-word-editor/lib/editor-session-summary.ts +0 -14
  346. package/services/react-word-editor/lib/editor-session.ts +0 -228
  347. package/services/react-word-editor/lib/exports-route.test.mjs +0 -32
  348. package/services/react-word-editor/lib/harness-client.ts +0 -347
  349. package/services/react-word-editor/lib/harness-config.json +0 -30
  350. package/services/react-word-editor/lib/harness-config.test.mjs +0 -31
  351. package/services/react-word-editor/lib/harness-config.ts +0 -21
  352. package/services/react-word-editor/lib/harness-editor-datastore.test.mjs +0 -220
  353. package/services/react-word-editor/lib/harness-editor-datastore.ts +0 -161
  354. package/services/react-word-editor/lib/private-mode.test.mjs +0 -42
  355. package/services/react-word-editor/lib/private-mode.ts +0 -61
  356. package/services/react-word-editor/lib/regression-report.test.mjs +0 -352
  357. package/services/react-word-editor/lib/regression-report.ts +0 -896
  358. package/services/react-word-editor/lib/run-artifacts.ts +0 -934
  359. package/services/react-word-editor/lib/run-history.ts +0 -755
  360. package/services/react-word-editor/lib/scenario-artifacts.test.mjs +0 -41
  361. package/services/react-word-editor/lib/scenario-artifacts.ts +0 -44
  362. package/services/react-word-editor/lib/storage.ts +0 -953
  363. package/services/react-word-editor/lib/validator-client.test.mjs +0 -54
  364. package/services/react-word-editor/lib/validator-client.ts +0 -95
  365. package/services/react-word-editor/lib/workspace-navigation.ts +0 -79
  366. package/services/react-word-editor/middleware.ts +0 -35
  367. package/services/react-word-editor/next-env.d.ts +0 -6
  368. package/services/react-word-editor/next.config.mjs +0 -15
  369. package/services/react-word-editor/package.json +0 -38
  370. package/services/react-word-editor/postcss.config.mjs +0 -8
  371. package/services/react-word-editor/railway.json +0 -21
  372. package/services/react-word-editor/scripts/wave-10-certification.mjs +0 -101
  373. package/services/react-word-editor/scripts/wave-9-live-usability-pilot.mjs +0 -911
  374. package/services/react-word-editor/tsconfig.json +0 -39
  375. package/services/react-word-editor/tsconfig.tsbuildinfo +0 -1
  376. package/skills/README.md +0 -48
  377. package/skills/domain-docx-compatibility/SKILL.md +0 -44
  378. package/skills/domain-docx-compatibility/skill.json +0 -19
  379. package/skills/domain-editor-architecture/SKILL.md +0 -49
  380. package/skills/domain-editor-architecture/skill.json +0 -19
  381. package/skills/domain-legal-review/SKILL.md +0 -39
  382. package/skills/domain-legal-review/skill.json +0 -19
  383. package/skills/provider-aws/SKILL.md +0 -117
  384. package/skills/provider-aws/adapters/claude.md +0 -1
  385. package/skills/provider-aws/adapters/codex.md +0 -1
  386. package/skills/provider-aws/references/service-verification.md +0 -39
  387. package/skills/provider-aws/skill.json +0 -54
  388. package/skills/provider-custom-deploy/SKILL.md +0 -64
  389. package/skills/provider-custom-deploy/skill.json +0 -50
  390. package/skills/provider-docker-compose/SKILL.md +0 -96
  391. package/skills/provider-docker-compose/adapters/local.md +0 -1
  392. package/skills/provider-docker-compose/skill.json +0 -53
  393. package/skills/provider-github-release/SKILL.md +0 -121
  394. package/skills/provider-github-release/adapters/claude.md +0 -1
  395. package/skills/provider-github-release/adapters/codex.md +0 -1
  396. package/skills/provider-github-release/skill.json +0 -55
  397. package/skills/provider-kubernetes/SKILL.md +0 -143
  398. package/skills/provider-kubernetes/adapters/claude.md +0 -1
  399. package/skills/provider-kubernetes/adapters/codex.md +0 -1
  400. package/skills/provider-kubernetes/references/kubectl-patterns.md +0 -58
  401. package/skills/provider-kubernetes/skill.json +0 -52
  402. package/skills/provider-railway/SKILL.md +0 -123
  403. package/skills/provider-railway/adapters/claude.md +0 -1
  404. package/skills/provider-railway/adapters/codex.md +0 -1
  405. package/skills/provider-railway/adapters/local.md +0 -1
  406. package/skills/provider-railway/adapters/opencode.md +0 -1
  407. package/skills/provider-railway/references/verification-commands.md +0 -39
  408. package/skills/provider-railway/skill.json +0 -71
  409. package/skills/provider-ssh-manual/SKILL.md +0 -97
  410. package/skills/provider-ssh-manual/skill.json +0 -54
  411. package/skills/repo-coding-rules/SKILL.md +0 -55
  412. package/skills/repo-coding-rules/skill.json +0 -34
  413. package/skills/role-cont-eval/SKILL.md +0 -91
  414. package/skills/role-cont-eval/adapters/codex.md +0 -1
  415. package/skills/role-cont-eval/skill.json +0 -36
  416. package/skills/role-cont-qa/SKILL.md +0 -100
  417. package/skills/role-cont-qa/adapters/claude.md +0 -1
  418. package/skills/role-cont-qa/skill.json +0 -36
  419. package/skills/role-deploy/SKILL.md +0 -97
  420. package/skills/role-deploy/skill.json +0 -36
  421. package/skills/role-design/SKILL.md +0 -50
  422. package/skills/role-design/skill.json +0 -36
  423. package/skills/role-documentation/SKILL.md +0 -76
  424. package/skills/role-documentation/skill.json +0 -36
  425. package/skills/role-implementation/SKILL.md +0 -45
  426. package/skills/role-implementation/skill.json +0 -36
  427. package/skills/role-infra/SKILL.md +0 -81
  428. package/skills/role-infra/skill.json +0 -36
  429. package/skills/role-integration/SKILL.md +0 -91
  430. package/skills/role-integration/skill.json +0 -36
  431. package/skills/role-planner/SKILL.md +0 -39
  432. package/skills/role-planner/skill.json +0 -21
  433. package/skills/role-research/SKILL.md +0 -65
  434. package/skills/role-research/skill.json +0 -36
  435. package/skills/role-security/SKILL.md +0 -60
  436. package/skills/role-security/skill.json +0 -36
  437. package/skills/runtime-claude/SKILL.md +0 -66
  438. package/skills/runtime-claude/skill.json +0 -36
  439. package/skills/runtime-codex/SKILL.md +0 -58
  440. package/skills/runtime-codex/skill.json +0 -36
  441. package/skills/runtime-local/SKILL.md +0 -46
  442. package/skills/runtime-local/skill.json +0 -36
  443. package/skills/runtime-opencode/SKILL.md +0 -58
  444. package/skills/runtime-opencode/skill.json +0 -36
  445. package/skills/signal-hygiene/SKILL.md +0 -51
  446. package/skills/signal-hygiene/skill.json +0 -20
  447. package/skills/tui-design/SKILL.md +0 -77
  448. package/skills/tui-design/references/tui-design.md +0 -259
  449. package/skills/tui-design/skill.json +0 -36
  450. package/skills/wave-core/SKILL.md +0 -141
  451. package/skills/wave-core/references/marker-syntax.md +0 -70
  452. package/skills/wave-core/skill.json +0 -35
  453. package/src/README.md +0 -85
  454. package/src/api/README.md +0 -22
  455. package/src/api/public-types.ts +0 -525
  456. package/src/component-inventory.md +0 -99
  457. package/src/core/README.md +0 -10
  458. package/src/core/commands/README.md +0 -3
  459. package/src/core/commands/formatting-commands.ts +0 -161
  460. package/src/core/commands/image-commands.ts +0 -144
  461. package/src/core/commands/index.ts +0 -1013
  462. package/src/core/commands/list-commands.ts +0 -370
  463. package/src/core/commands/review-commands.ts +0 -108
  464. package/src/core/commands/text-commands.ts +0 -119
  465. package/src/core/schema/README.md +0 -3
  466. package/src/core/schema/text-schema.ts +0 -512
  467. package/src/core/selection/README.md +0 -3
  468. package/src/core/selection/mapping.ts +0 -238
  469. package/src/core/selection/review-anchors.ts +0 -94
  470. package/src/core/state/README.md +0 -3
  471. package/src/core/state/editor-state.ts +0 -580
  472. package/src/core/state/text-transaction.ts +0 -276
  473. package/src/formats/xlsx/io/parse-shared-strings.ts +0 -41
  474. package/src/formats/xlsx/io/parse-sheet.ts +0 -289
  475. package/src/formats/xlsx/io/parse-styles.ts +0 -57
  476. package/src/formats/xlsx/io/parse-workbook.ts +0 -75
  477. package/src/formats/xlsx/io/xlsx-session.ts +0 -306
  478. package/src/formats/xlsx/model/cell.ts +0 -189
  479. package/src/formats/xlsx/model/sheet.ts +0 -244
  480. package/src/formats/xlsx/model/styles.ts +0 -118
  481. package/src/formats/xlsx/model/workbook.ts +0 -449
  482. package/src/io/README.md +0 -10
  483. package/src/io/docx-session.ts +0 -1763
  484. package/src/io/export/README.md +0 -3
  485. package/src/io/export/export-session.ts +0 -165
  486. package/src/io/export/minimal-docx.ts +0 -115
  487. package/src/io/export/reattach-preserved-parts.ts +0 -54
  488. package/src/io/export/serialize-comments.ts +0 -876
  489. package/src/io/export/serialize-footnotes.ts +0 -217
  490. package/src/io/export/serialize-headers-footers.ts +0 -200
  491. package/src/io/export/serialize-main-document.ts +0 -982
  492. package/src/io/export/serialize-numbering.ts +0 -97
  493. package/src/io/export/serialize-revisions.ts +0 -389
  494. package/src/io/export/serialize-runtime-revisions.ts +0 -265
  495. package/src/io/export/serialize-tables.ts +0 -147
  496. package/src/io/export/split-review-boundaries.ts +0 -194
  497. package/src/io/normalize/README.md +0 -3
  498. package/src/io/normalize/normalize-text.ts +0 -437
  499. package/src/io/ooxml/README.md +0 -3
  500. package/src/io/ooxml/parse-comments.ts +0 -779
  501. package/src/io/ooxml/parse-complex-content.ts +0 -287
  502. package/src/io/ooxml/parse-fields.ts +0 -438
  503. package/src/io/ooxml/parse-footnotes.ts +0 -403
  504. package/src/io/ooxml/parse-headers-footers.ts +0 -483
  505. package/src/io/ooxml/parse-inline-media.ts +0 -431
  506. package/src/io/ooxml/parse-main-document.ts +0 -1846
  507. package/src/io/ooxml/parse-numbering.ts +0 -425
  508. package/src/io/ooxml/parse-revisions.ts +0 -658
  509. package/src/io/ooxml/parse-shapes.ts +0 -271
  510. package/src/io/ooxml/parse-tables.ts +0 -568
  511. package/src/io/ooxml/parse-theme.ts +0 -314
  512. package/src/io/ooxml/part-manifest.ts +0 -136
  513. package/src/io/ooxml/revision-boundaries.ts +0 -351
  514. package/src/io/opc/README.md +0 -3
  515. package/src/io/opc/corrupt-package.ts +0 -166
  516. package/src/io/opc/docx-package.ts +0 -74
  517. package/src/io/opc/package-reader.ts +0 -320
  518. package/src/io/opc/package-writer.ts +0 -273
  519. package/src/model/README.md +0 -3
  520. package/src/model/canonical-document.ts +0 -1911
  521. package/src/model/cds-1.0.0.ts +0 -196
  522. package/src/model/snapshot.ts +0 -393
  523. package/src/preservation/README.md +0 -3
  524. package/src/preservation/markup-compatibility.ts +0 -48
  525. package/src/preservation/opaque-fragment-store.ts +0 -89
  526. package/src/preservation/opaque-region.ts +0 -233
  527. package/src/preservation/package-preservation.ts +0 -120
  528. package/src/preservation/preserved-part-manifest.ts +0 -56
  529. package/src/preservation/relationship-retention.ts +0 -57
  530. package/src/preservation/store.ts +0 -185
  531. package/src/review/README.md +0 -16
  532. package/src/review/store/README.md +0 -3
  533. package/src/review/store/comment-anchors.ts +0 -70
  534. package/src/review/store/comment-remapping.ts +0 -154
  535. package/src/review/store/comment-store.ts +0 -331
  536. package/src/review/store/comment-thread.ts +0 -109
  537. package/src/review/store/revision-actions.ts +0 -394
  538. package/src/review/store/revision-store.ts +0 -303
  539. package/src/review/store/revision-types.ts +0 -168
  540. package/src/review/store/runtime-comment-store.ts +0 -43
  541. package/src/runtime/README.md +0 -3
  542. package/src/runtime/ai-action-policy.ts +0 -764
  543. package/src/runtime/document-runtime.ts +0 -969
  544. package/src/runtime/read-only-diagnostics-runtime.ts +0 -232
  545. package/src/runtime/review-runtime.ts +0 -44
  546. package/src/runtime/revision-runtime.ts +0 -107
  547. package/src/runtime/session-capabilities.ts +0 -138
  548. package/src/runtime/surface-projection.ts +0 -570
  549. package/src/runtime/table-commands.ts +0 -84
  550. package/src/runtime/table-schema.ts +0 -125
  551. package/src/ui/README.md +0 -30
  552. package/src/ui/WordReviewEditor.tsx +0 -1283
  553. package/src/ui/comments/README.md +0 -3
  554. package/src/ui/compatibility/README.md +0 -3
  555. package/src/ui/editor-surface/README.md +0 -3
  556. package/src/ui/headless/comment-decoration-model.ts +0 -124
  557. package/src/ui/headless/revision-decoration-model.ts +0 -128
  558. package/src/ui/headless/selection-helpers.ts +0 -34
  559. package/src/ui/headless/use-editor-keyboard.ts +0 -98
  560. package/src/ui/review/README.md +0 -3
  561. package/src/ui/shared/revision-filters.ts +0 -31
  562. package/src/ui/status/README.md +0 -3
  563. package/src/ui/theme/README.md +0 -3
  564. package/src/ui/toolbar/README.md +0 -3
  565. package/src/ui-tailwind/chrome/tw-alert-banner.tsx +0 -48
  566. package/src/ui-tailwind/chrome/tw-selection-toolbar.tsx +0 -44
  567. package/src/ui-tailwind/chrome/tw-unsaved-modal.tsx +0 -58
  568. package/src/ui-tailwind/chrome/use-before-unload.ts +0 -20
  569. package/src/ui-tailwind/editor-surface/pm-command-bridge.ts +0 -139
  570. package/src/ui-tailwind/editor-surface/pm-decorations.ts +0 -98
  571. package/src/ui-tailwind/editor-surface/pm-position-map.ts +0 -123
  572. package/src/ui-tailwind/editor-surface/pm-schema.ts +0 -452
  573. package/src/ui-tailwind/editor-surface/pm-state-from-snapshot.ts +0 -327
  574. package/src/ui-tailwind/editor-surface/search-plugin.ts +0 -157
  575. package/src/ui-tailwind/editor-surface/tw-caret.tsx +0 -12
  576. package/src/ui-tailwind/editor-surface/tw-editor-surface.tsx +0 -150
  577. package/src/ui-tailwind/editor-surface/tw-inline-token.tsx +0 -118
  578. package/src/ui-tailwind/editor-surface/tw-opaque-block.tsx +0 -52
  579. package/src/ui-tailwind/editor-surface/tw-paragraph-block.tsx +0 -151
  580. package/src/ui-tailwind/editor-surface/tw-prosemirror-surface.tsx +0 -215
  581. package/src/ui-tailwind/editor-surface/tw-segment-view.tsx +0 -111
  582. package/src/ui-tailwind/editor-surface/tw-table-node-view.tsx +0 -108
  583. package/src/ui-tailwind/index.ts +0 -61
  584. package/src/ui-tailwind/review/tw-comment-sidebar.tsx +0 -276
  585. package/src/ui-tailwind/review/tw-health-panel.tsx +0 -120
  586. package/src/ui-tailwind/review/tw-review-rail.tsx +0 -120
  587. package/src/ui-tailwind/review/tw-revision-sidebar.tsx +0 -164
  588. package/src/ui-tailwind/status/tw-status-bar.tsx +0 -58
  589. package/src/ui-tailwind/theme/editor-theme.css +0 -190
  590. package/src/ui-tailwind/toolbar/tw-toolbar-icon-button.tsx +0 -48
  591. package/src/ui-tailwind/toolbar/tw-toolbar.tsx +0 -231
  592. package/src/ui-tailwind/tw-review-workspace.tsx +0 -140
  593. package/src/validation/README.md +0 -3
  594. package/src/validation/compatibility-engine.ts +0 -317
  595. package/src/validation/compatibility-report.ts +0 -160
  596. package/src/validation/diagnostics.ts +0 -203
  597. package/src/validation/import-diagnostics.ts +0 -128
  598. package/src/validation/low-priority-word-surfaces.ts +0 -373
  599. package/test/README.md +0 -16
  600. package/test/core/formatting-commands.test.ts +0 -285
  601. package/test/core/image-commands.test.ts +0 -298
  602. package/test/core/mapping.test.ts +0 -186
  603. package/test/core/text-commands.test.ts +0 -176
  604. package/test/fixtures/docx/F01-basic-contract.docx +0 -0
  605. package/test/fixtures/docx/F01-basic-contract.md +0 -33
  606. package/test/fixtures/docx/F02-headings-styles.docx +0 -0
  607. package/test/fixtures/docx/F02-headings-styles.md +0 -33
  608. package/test/fixtures/docx/F03-legal-outline-numbering.docx +0 -0
  609. package/test/fixtures/docx/F03-legal-outline-numbering.md +0 -34
  610. package/test/fixtures/docx/F04-restart-numbering-schedules.docx +0 -0
  611. package/test/fixtures/docx/F04-restart-numbering-schedules.md +0 -33
  612. package/test/fixtures/docx/F05-table-heavy-agreement.docx +0 -0
  613. package/test/fixtures/docx/F05-table-heavy-agreement.md +0 -34
  614. package/test/fixtures/docx/F06-merged-cells-signature-table.docx +0 -0
  615. package/test/fixtures/docx/F06-merged-cells-signature-table.md +0 -34
  616. package/test/fixtures/docx/F07-inline-images-exhibit.docx +0 -0
  617. package/test/fixtures/docx/F07-inline-images-exhibit.md +0 -34
  618. package/test/fixtures/docx/F08-hyperlinks.docx +0 -0
  619. package/test/fixtures/docx/F08-hyperlinks.md +0 -33
  620. package/test/fixtures/docx/F09-comments-single-paragraph.docx +0 -0
  621. package/test/fixtures/docx/F09-comments-single-paragraph.md +0 -33
  622. package/test/fixtures/docx/F10-threaded-comments-resolve.docx +0 -0
  623. package/test/fixtures/docx/F10-threaded-comments-resolve.md +0 -33
  624. package/test/fixtures/docx/F11-redlines-basic.docx +0 -0
  625. package/test/fixtures/docx/F11-redlines-basic.md +0 -33
  626. package/test/fixtures/docx/F12-redlines-paragraph-joins-splits.docx +0 -0
  627. package/test/fixtures/docx/F12-redlines-paragraph-joins-splits.md +0 -33
  628. package/test/fixtures/docx/F13-comments-on-deleted-text.docx +0 -0
  629. package/test/fixtures/docx/F13-comments-on-deleted-text.md +0 -33
  630. package/test/fixtures/docx/F14-revisions-in-tables-and-lists.docx +0 -0
  631. package/test/fixtures/docx/F14-revisions-in-tables-and-lists.md +0 -33
  632. package/test/fixtures/docx/F15-sections-headers-footers.docx +0 -0
  633. package/test/fixtures/docx/F15-sections-headers-footers.md +0 -33
  634. package/test/fixtures/docx/F16-footnotes-endnotes.docx +0 -0
  635. package/test/fixtures/docx/F16-footnotes-endnotes.md +0 -33
  636. package/test/fixtures/docx/F17-fields-and-toc.docx +0 -0
  637. package/test/fixtures/docx/F17-fields-and-toc.md +0 -33
  638. package/test/fixtures/docx/F18-content-controls-template.docx +0 -0
  639. package/test/fixtures/docx/F18-content-controls-template.md +0 -33
  640. package/test/fixtures/docx/F19-custom-xml-doc-assembly.docx +0 -0
  641. package/test/fixtures/docx/F19-custom-xml-doc-assembly.md +0 -35
  642. package/test/fixtures/docx/F20-unknown-ooxml-and-alternatecontent.docx +0 -0
  643. package/test/fixtures/docx/F20-unknown-ooxml-and-alternatecontent.md +0 -33
  644. package/test/fixtures/docx/F21-malformed-broken-docx.docx +0 -0
  645. package/test/fixtures/docx/F21-malformed-broken-docx.md +0 -33
  646. package/test/fixtures/docx/README.md +0 -74
  647. package/test/fixtures/docx/certification-manifest.json +0 -104
  648. package/test/fixtures/docx/fixtures.manifest.json +0 -196
  649. package/test/fixtures/encrypted-docx/README.md +0 -27
  650. package/test/fixtures/encrypted-docx/certification-manifest.json +0 -9
  651. package/test/fixtures/encrypted-docx/fixtures.manifest.json +0 -47
  652. package/test/fixtures/scenarios/docx/README.md +0 -25
  653. package/test/fixtures/scenarios/docx/S01-sow-template.docx +0 -0
  654. package/test/fixtures/scenarios/docx/S01-sow-template.md +0 -30
  655. package/test/fixtures/scenarios/docx/S02-bw-partner-user-licence-agreement-redlines.docx +0 -0
  656. package/test/fixtures/scenarios/docx/S02-bw-partner-user-licence-agreement-redlines.md +0 -32
  657. package/test/fixtures/scenarios/docx/scenario-manifest.json +0 -53
  658. package/test/formats/xlsx/io/xlsx-import.test.ts +0 -766
  659. package/test/formats/xlsx/model/workbook.test.ts +0 -669
  660. package/test/helpers/dom-setup.ts +0 -124
  661. package/test/io/comment-roundtrip.test.ts +0 -272
  662. package/test/io/complex-content-roundtrip.test.ts +0 -632
  663. package/test/io/docx-compatibility-regression.test.ts +0 -199
  664. package/test/io/docx-session.test.ts +0 -1495
  665. package/test/io/footnotes-roundtrip.test.ts +0 -318
  666. package/test/io/headers-footers-roundtrip.test.ts +0 -547
  667. package/test/io/numbering-roundtrip.test.ts +0 -234
  668. package/test/io/package-reader.test.ts +0 -199
  669. package/test/io/paragraph-properties-roundtrip.test.ts +0 -129
  670. package/test/io/preserved-package-roundtrip.test.ts +0 -365
  671. package/test/io/property-completeness.test.ts +0 -292
  672. package/test/io/revision-roundtrip.test.ts +0 -347
  673. package/test/io/structural-blocks.test.ts +0 -202
  674. package/test/io/table-media-roundtrip.test.ts +0 -448
  675. package/test/io/table-properties-roundtrip.test.ts +0 -569
  676. package/test/io/table-roundtrip.test.ts +0 -302
  677. package/test/io/text-roundtrip.test.ts +0 -344
  678. package/test/model/canonical-document.test.ts +0 -285
  679. package/test/preservation/opaque-fragment-store.test.ts +0 -121
  680. package/test/preservation/package-preservation.test.ts +0 -395
  681. package/test/preservation/store.test.ts +0 -84
  682. package/test/review/comment-remapping.test.ts +0 -220
  683. package/test/review/comment-store.test.ts +0 -180
  684. package/test/review/move-revisions.test.ts +0 -143
  685. package/test/review/property-change-revisions.test.ts +0 -225
  686. package/test/review/revision-actions.test.ts +0 -330
  687. package/test/review/revision-store.test.ts +0 -193
  688. package/test/runtime/session-capabilities.test.ts +0 -260
  689. package/test/runtime/table-commands.test.ts +0 -356
  690. package/test/runtime/table-schema.test.ts +0 -221
  691. package/test/runtime/tracked-changes-toggle.test.ts +0 -107
  692. package/test/ui/comment-review-surface.test.tsx +0 -114
  693. package/test/ui/reduced-motion-toggle.test.tsx +0 -137
  694. package/test/ui/word-review-editor.imported-scenarios.test.tsx +0 -169
  695. package/test/ui/word-review-editor.interaction.test.tsx +0 -1198
  696. package/test/ui/word-review-editor.test.js +0 -188
  697. package/test/ui/word-review-editor.test.tsx +0 -280
  698. package/test/ui-tailwind/search-plugin.test.ts +0 -286
  699. package/test/validation/compatibility-engine.test.ts +0 -336
  700. package/test/validation/compatibility-report.test.ts +0 -189
  701. package/test/validation/low-priority-word-surfaces.test.ts +0 -282
  702. package/test/validation/malformed-doc.test.ts +0 -113
  703. package/test-results/.last-run.json +0 -4
  704. 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. citeturn0search5turn1search9 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. citeturn1search13
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. citeturn0search4turn0search18
27
- - Export `.docx` with correct OPC structure and canonical WordprocessingML patterns for comments and tracked changes. citeturn0search4turn5search0turn4search0
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`. citeturn0search3
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`). citeturn0search4turn0search18
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. citeturn2search0
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.” citeturn2search1turn2search13
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. citeturn0search3
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. citeturn4search12
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. citeturn0search5
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. citeturn1search3turn1search0
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. citeturn5search1turn0search6turn5search0
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). citeturn4search0turn4search1turn4search5
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. citeturn1search5turn1search21
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.” citeturn4search6turn0search1
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. citeturn1search4
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.” citeturn3search13turn3search1turn3search5
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). citeturn3search0turn3search8turn3search4
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"`. citeturn3search6
888
- - When read-only, keep `contenteditable="true"` but set `aria-readonly="true"` to indicate editability is conceptually present but disabled. citeturn3search6
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. citeturn3search9turn3search5
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. citeturn3search1turn3search5
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. citeturn1search14turn1search18
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. citeturn1search2turn1search22
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. citeturn0search4turn0search18
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). citeturn4search0turn4search1turn4search5
973
- Comments export must use the anchor + reference linkage model between range markers and comment definitions. citeturn5search0turn5search1turn0search6
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.