@beyondwork/docx-react-component 1.0.67 → 1.0.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (384) hide show
  1. package/README.md +75 -932
  2. package/package.json +26 -27
  3. package/src/api/anchor-conversion.ts +43 -0
  4. package/src/api/editor-state-types.ts +2 -1
  5. package/src/api/public-types.ts +504 -101
  6. package/src/api/session-state.ts +4 -0
  7. package/src/api/v3/README.md +91 -0
  8. package/src/api/v3/_create.ts +146 -0
  9. package/src/api/v3/_layer-metadata.ts +362 -0
  10. package/src/api/v3/_mocks.ts +84 -0
  11. package/src/api/v3/_runtime-handle.ts +162 -0
  12. package/src/api/v3/_ux-response.ts +73 -0
  13. package/src/api/v3/ai/_metadata-audit.ts +225 -0
  14. package/src/api/v3/ai/attach.ts +235 -0
  15. package/src/api/v3/ai/bundle.ts +132 -0
  16. package/src/api/v3/ai/explain.ts +144 -0
  17. package/src/api/v3/ai/export.ts +54 -0
  18. package/src/api/v3/ai/inspect.ts +118 -0
  19. package/src/api/v3/ai/policy.ts +77 -0
  20. package/src/api/v3/ai/replacement.ts +341 -0
  21. package/src/api/v3/ai/resolve.ts +133 -0
  22. package/src/api/v3/index.ts +79 -0
  23. package/src/api/v3/runtime/chart.ts +310 -0
  24. package/src/api/v3/runtime/clipboard.ts +81 -0
  25. package/src/api/v3/runtime/collab.ts +331 -0
  26. package/src/api/v3/runtime/content.ts +236 -0
  27. package/src/api/v3/runtime/document.ts +282 -0
  28. package/src/api/v3/runtime/formatting.ts +186 -0
  29. package/src/api/v3/runtime/geometry.ts +349 -0
  30. package/src/api/v3/runtime/layout.ts +108 -0
  31. package/src/api/v3/runtime/review.ts +129 -0
  32. package/src/api/v3/runtime/search.ts +74 -0
  33. package/src/api/v3/runtime/table.ts +63 -0
  34. package/src/api/v3/runtime/workflow.ts +434 -0
  35. package/src/api/v3/ui/_context.ts +86 -0
  36. package/src/api/v3/ui/_create.ts +65 -0
  37. package/src/api/v3/ui/_types.ts +520 -0
  38. package/src/api/v3/ui/chrome-composition.ts +342 -0
  39. package/src/{ui-tailwind/chrome → api/v3/ui}/chrome-preset-model.ts +11 -1
  40. package/src/api/v3/ui/chrome.ts +476 -0
  41. package/src/api/v3/ui/debug.ts +124 -0
  42. package/src/api/v3/ui/index.ts +64 -0
  43. package/src/api/v3/ui/overlays-visibility.ts +170 -0
  44. package/src/api/v3/ui/overlays.ts +427 -0
  45. package/src/api/v3/ui/scope.ts +71 -0
  46. package/src/api/v3/ui/session.ts +100 -0
  47. package/src/api/v3/ui/surface.ts +170 -0
  48. package/src/api/v3/ui/viewport.ts +303 -0
  49. package/src/core/commands/index.ts +28 -6
  50. package/src/core/commands/list-commands.ts +3 -2
  51. package/src/core/commands/section-layout-commands.ts +9 -8
  52. package/src/core/schema/text-schema.ts +16 -0
  53. package/src/core/selection/mapping.ts +33 -72
  54. package/src/core/state/editor-state.ts +96 -189
  55. package/src/index.ts +23 -4
  56. package/src/io/chart-preview-resolver.ts +1 -1
  57. package/src/io/docx-session.ts +36 -4797
  58. package/src/io/export/build-app-properties-xml.ts +1 -1
  59. package/src/io/export/serialize-comments.ts +1 -1
  60. package/src/io/export/serialize-headers-footers.ts +6 -1
  61. package/src/io/export/serialize-main-document.ts +45 -0
  62. package/src/io/export/serialize-run-formatting.ts +17 -2
  63. package/src/io/export/twip.ts +1 -1
  64. package/src/io/normalize/normalize-text.ts +27 -20
  65. package/src/io/ooxml/chart/parse-series.ts +1 -1
  66. package/src/io/ooxml/chart/resolve-color.ts +2 -2
  67. package/src/io/ooxml/chart/types.ts +1 -1
  68. package/src/io/ooxml/classify-embedding.ts +83 -33
  69. package/src/io/ooxml/parse-fill.ts +1 -1
  70. package/src/io/ooxml/parse-main-document.ts +71 -1
  71. package/src/io/ooxml/parse-object.ts +14 -10
  72. package/src/io/ooxml/parse-run-formatting.ts +47 -1
  73. package/src/io/ooxml/property-grab-bag.ts +2 -2
  74. package/src/io/ooxml/units.ts +11 -0
  75. package/src/io/ooxml/workflow-payload.ts +282 -7
  76. package/src/model/anchor.ts +85 -0
  77. package/src/model/canonical-document.ts +351 -15
  78. package/src/model/chart-types.ts +1 -1
  79. package/src/model/layout/index.ts +83 -0
  80. package/src/model/layout/page-graph-types.ts +181 -0
  81. package/src/model/layout/page-layout-snapshot.ts +105 -0
  82. package/src/model/layout/resolved-layout-types.ts +47 -0
  83. package/src/model/layout/runtime-page-graph-types.ts +102 -0
  84. package/src/model/paragraph-scope-ids.ts +72 -0
  85. package/src/model/review/comment-types.ts +112 -0
  86. package/src/model/review/index.ts +2 -0
  87. package/src/model/review/revision-types.ts +215 -0
  88. package/src/model/snapshot.ts +32 -0
  89. package/src/review/store/comment-store.ts +21 -47
  90. package/src/review/store/revision-types.ts +40 -198
  91. package/src/runtime/collab/base-doc-fingerprint.ts +6 -1
  92. package/src/runtime/collab/runtime-collab-sync.ts +13 -3
  93. package/src/runtime/collab-session.ts +1 -1
  94. package/src/runtime/debug/build-debug-inspector-snapshot.ts +686 -0
  95. package/src/runtime/debug/event-ring-buffer.ts +64 -0
  96. package/src/runtime/debug/probability-sampler.ts +18 -0
  97. package/src/runtime/debug/runtime-debug-facet.ts +67 -0
  98. package/src/runtime/debug/stage-tokens.ts +31 -0
  99. package/src/runtime/debug/telemetry-bus.ts +271 -0
  100. package/src/runtime/debug/types.ts +275 -0
  101. package/src/runtime/debug/wrap-ref-for-telemetry.ts +118 -0
  102. package/src/runtime/document-layout.ts +8 -6
  103. package/src/runtime/document-runtime.ts +843 -1141
  104. package/src/runtime/document-search.ts +1 -1
  105. package/src/runtime/edit-ops/index.ts +1 -1
  106. package/src/runtime/external-send-runtime.ts +1 -1
  107. package/src/runtime/formatting/document-lookup.ts +235 -0
  108. package/src/runtime/formatting/field/registry.ts +41 -0
  109. package/src/runtime/{field-resolver.ts → formatting/field/resolver.ts} +27 -2
  110. package/src/runtime/formatting/font-resolution.ts +83 -0
  111. package/src/runtime/formatting/formatting-context.ts +903 -0
  112. package/src/runtime/formatting/formatting-types.ts +157 -0
  113. package/src/runtime/{hyperlink-color-resolver.ts → formatting/hyperlink-color.ts} +2 -2
  114. package/src/runtime/formatting/index.ts +125 -0
  115. package/src/runtime/{resolved-numbering-geometry.ts → formatting/numbering/geometry.ts} +1 -1
  116. package/src/runtime/{numbering-prefix.ts → formatting/numbering/prefix.ts} +170 -3
  117. package/src/runtime/formatting/paragraph-style-resolver.ts +92 -0
  118. package/src/runtime/formatting/projector.ts +75 -0
  119. package/src/runtime/formatting/resolve-effective.ts +407 -0
  120. package/src/runtime/formatting/revision-display.ts +105 -0
  121. package/src/runtime/{paragraph-style-resolver.ts → formatting/style-cascade.ts} +84 -141
  122. package/src/runtime/{table-style-resolver.ts → formatting/table-style-resolver.ts} +1 -1
  123. package/src/runtime/formatting/telemetry-bridge.ts +106 -0
  124. package/src/runtime/{theme-color-resolver.ts → formatting/theme-color.ts} +2 -30
  125. package/src/runtime/geometry/caret-geometry.ts +164 -0
  126. package/src/runtime/geometry/geometry-facet.ts +364 -0
  127. package/src/runtime/geometry/geometry-types.ts +256 -0
  128. package/src/runtime/geometry/hit-test.ts +125 -0
  129. package/src/runtime/geometry/index.ts +71 -0
  130. package/src/runtime/geometry/inert-geometry-facet.ts +43 -0
  131. package/src/runtime/geometry/invalidation.ts +35 -0
  132. package/src/runtime/geometry/object-handles.ts +77 -0
  133. package/src/runtime/geometry/overlay-rects.ts +85 -0
  134. package/src/runtime/geometry/project-anchors.ts +100 -0
  135. package/src/runtime/geometry/project-fragments.ts +216 -0
  136. package/src/runtime/geometry/projector.ts +129 -0
  137. package/src/runtime/geometry/replacement-envelope.ts +130 -0
  138. package/src/runtime/geometry/viewport.ts +218 -0
  139. package/src/runtime/layout/compat-input-ledger.ts +211 -0
  140. package/src/runtime/layout/index.ts +6 -1
  141. package/src/runtime/layout/inert-layout-facet.ts +12 -7
  142. package/src/runtime/layout/layout-engine-instance.ts +189 -11
  143. package/src/runtime/layout/layout-engine-version.ts +450 -1
  144. package/src/runtime/layout/layout-facet-types.ts +60 -0
  145. package/src/runtime/layout/layout-measurement-provider.ts +13 -0
  146. package/src/runtime/layout/measurement-backend-canvas.ts +14 -2
  147. package/src/runtime/layout/measurement-backend-empirical.ts +23 -4
  148. package/src/runtime/layout/page-graph.ts +62 -209
  149. package/src/runtime/layout/page-story-resolver.ts +7 -12
  150. package/src/runtime/layout/paginated-layout-engine.ts +186 -11
  151. package/src/runtime/layout/project-block-fragments.ts +11 -0
  152. package/src/runtime/layout/projector.ts +90 -0
  153. package/src/runtime/layout/public-facet.ts +187 -442
  154. package/src/runtime/layout/resolved-formatting-state.ts +158 -26
  155. package/src/runtime/layout/table-render-plan.ts +1 -1
  156. package/src/runtime/prerender/cache-envelope.ts +6 -1
  157. package/src/runtime/prerender/prerender-document.ts +18 -23
  158. package/src/runtime/render/decoration-resolver.ts +1 -1
  159. package/src/runtime/render/render-frame-types.ts +20 -0
  160. package/src/runtime/render/render-kernel.ts +94 -25
  161. package/src/runtime/scopes/_formatting-seam.ts +262 -0
  162. package/src/runtime/scopes/_scope-dependencies.ts +49 -0
  163. package/src/runtime/scopes/action-validation.ts +356 -0
  164. package/src/runtime/scopes/attach-explanation.ts +102 -0
  165. package/src/runtime/scopes/audit-bundle.ts +71 -0
  166. package/src/runtime/scopes/compile-scope-bundle.ts +163 -0
  167. package/src/runtime/scopes/compile-scope.ts +262 -0
  168. package/src/runtime/scopes/compiler-service.ts +431 -0
  169. package/src/runtime/scopes/create-issue.ts +107 -0
  170. package/src/runtime/scopes/enumerate-scopes.ts +543 -0
  171. package/src/runtime/scopes/evidence.ts +233 -0
  172. package/src/runtime/scopes/index.ts +150 -0
  173. package/src/runtime/scopes/position-map.ts +214 -0
  174. package/src/runtime/scopes/preservation-boundary.ts +91 -0
  175. package/src/runtime/scopes/projector.ts +49 -0
  176. package/src/runtime/scopes/replaceability.ts +87 -0
  177. package/src/runtime/scopes/replacement/apply.ts +228 -0
  178. package/src/runtime/scopes/replacement/compile.ts +59 -0
  179. package/src/runtime/scopes/replacement/propose.ts +42 -0
  180. package/src/runtime/scopes/resolve-reference.ts +347 -0
  181. package/src/runtime/scopes/review-bundle.ts +141 -0
  182. package/src/runtime/scopes/scope-kinds/_paragraph-text.ts +57 -0
  183. package/src/runtime/scopes/scope-kinds/_table-text.ts +42 -0
  184. package/src/runtime/scopes/scope-kinds/comment-thread.ts +59 -0
  185. package/src/runtime/scopes/scope-kinds/field.ts +65 -0
  186. package/src/runtime/scopes/scope-kinds/heading.ts +84 -0
  187. package/src/runtime/scopes/scope-kinds/list-item.ts +77 -0
  188. package/src/runtime/scopes/scope-kinds/paragraph.ts +182 -0
  189. package/src/runtime/scopes/scope-kinds/revision.ts +62 -0
  190. package/src/runtime/scopes/scope-kinds/table-cell.ts +57 -0
  191. package/src/runtime/scopes/scope-kinds/table-row.ts +61 -0
  192. package/src/runtime/scopes/scope-kinds/table.ts +55 -0
  193. package/src/runtime/scopes/scope-range.ts +208 -0
  194. package/src/runtime/scopes/semantic-scope-types.ts +454 -0
  195. package/src/runtime/scopes/workflow-overlap.ts +92 -0
  196. package/src/runtime/selection/index.ts +1 -1
  197. package/src/runtime/structure-ops/fragment-insert.ts +1 -1
  198. package/src/runtime/structure-ops/index.ts +1 -1
  199. package/src/runtime/surface-projection.ts +232 -262
  200. package/src/runtime/units.ts +4 -2
  201. package/src/runtime/workflow/coordinator.ts +1348 -0
  202. package/src/runtime/workflow/derived-scope-resolver.ts +125 -0
  203. package/src/runtime/workflow/index.ts +25 -0
  204. package/src/runtime/workflow/markup-mode-policy.ts +98 -0
  205. package/src/runtime/{workflow-markup.ts → workflow/markup.ts} +6 -6
  206. package/src/runtime/workflow/metadata-persistence.ts +306 -0
  207. package/src/runtime/workflow/metadata-writer.ts +123 -0
  208. package/src/runtime/workflow/overlay-store.ts +690 -0
  209. package/src/runtime/workflow/projector.ts +127 -0
  210. package/src/runtime/{query-scopes.ts → workflow/query-scopes.ts} +3 -3
  211. package/src/runtime/{workflow-rail-segments.ts → workflow/rail/compose.ts} +60 -165
  212. package/src/runtime/workflow/rail/types.ts +198 -0
  213. package/src/runtime/workflow/scope-rail-composer.ts +39 -0
  214. package/src/runtime/{scope-resolver.ts → workflow/scope-resolver.ts} +3 -3
  215. package/src/runtime/workflow/scope-writer.ts +188 -0
  216. package/src/runtime/{tamper-gate.ts → workflow/tamper-gate.ts} +1 -1
  217. package/src/runtime/workflow/visibility-policy.ts +129 -0
  218. package/src/session/_sync-legacy.ts +66 -0
  219. package/src/session/export/embedded-reconstitute.ts +104 -0
  220. package/src/session/export/export-diagnostics.ts +85 -0
  221. package/src/session/export/export-validation.ts +110 -0
  222. package/src/session/export/index.ts +34 -0
  223. package/src/session/export/preservation-reattach.ts +30 -0
  224. package/src/session/export/serialize-dispatch.ts +165 -0
  225. package/src/session/export/stateful-export-pipeline.ts +432 -0
  226. package/src/session/export/stateful-export.ts +684 -0
  227. package/src/session/import/canonical-assembly.ts +227 -0
  228. package/src/session/import/diagnostics-session.ts +54 -0
  229. package/src/session/import/embedded-discovery.ts +225 -0
  230. package/src/session/import/embedded-offload.ts +337 -0
  231. package/src/session/import/import-diagnostics.ts +69 -0
  232. package/src/session/import/loader-types.ts +313 -0
  233. package/src/session/import/loader.ts +1834 -0
  234. package/src/session/import/normalize.ts +195 -0
  235. package/src/session/import/package-parts.ts +217 -0
  236. package/src/session/import/package-read.ts +195 -0
  237. package/src/session/import/parse-orchestration.ts +105 -0
  238. package/src/session/import/part-constants.ts +70 -0
  239. package/src/session/import/part-discovery.ts +94 -0
  240. package/src/session/import/preservation-index.ts +46 -0
  241. package/src/{runtime/read-only-diagnostics-runtime.ts → session/import/read-only-diagnostics.ts} +24 -3
  242. package/src/session/import/review-import.ts +508 -0
  243. package/src/session/import/styles-consolidation.ts +281 -0
  244. package/src/session/import/workflow-scope-import.ts +256 -0
  245. package/src/session/index.ts +37 -0
  246. package/src/session/session-state.ts +69 -0
  247. package/src/session/session.ts +532 -0
  248. package/src/session/shared/protection.ts +228 -0
  249. package/src/session/shared/session-utils.ts +82 -0
  250. package/src/session/types.ts +499 -0
  251. package/src/shell/chart-snapshots.ts +96 -0
  252. package/src/shell/media-previews.ts +85 -0
  253. package/src/shell/overlay-anchor-bridge.ts +53 -0
  254. package/src/shell/paste-adapter.ts +23 -0
  255. package/src/shell/ref-commands.ts +1697 -0
  256. package/src/shell/ref-utilities.ts +48 -0
  257. package/src/shell/search.ts +51 -0
  258. package/src/{ui/editor-runtime-boundary.ts → shell/session-bootstrap.ts} +243 -67
  259. package/src/shell/ui-subscriber-channels.ts +81 -0
  260. package/src/shell/use-collab-sync.ts +116 -0
  261. package/src/ui/WordReviewEditor.tsx +496 -2051
  262. package/src/ui/editor-shell-view.tsx +30 -1
  263. package/src/ui/editor-surface-controller.tsx +49 -1
  264. package/src/ui/headless/revision-decoration-model.ts +83 -0
  265. package/src/{ui-tailwind/chrome → ui/headless}/role-action-sets.ts +1 -1
  266. package/src/ui/headless/scoped-chrome-policy.ts +2 -2
  267. package/src/ui/headless/selection-tool-context.ts +1 -1
  268. package/src/ui/headless/selection-tool-resolver.ts +1 -1
  269. package/src/ui/runtime-shortcut-dispatch.ts +46 -1
  270. package/src/ui/ui-controller-factory.ts +221 -0
  271. package/src/ui-tailwind/chart/ChartSurface.tsx +2 -2
  272. package/src/ui-tailwind/chart/layout/legend-layout.ts +1 -1
  273. package/src/ui-tailwind/chart/layout/plot-area.ts +2 -2
  274. package/src/ui-tailwind/chart/layout/title-layout.ts +1 -1
  275. package/src/ui-tailwind/chart/render/area.tsx +3 -3
  276. package/src/ui-tailwind/chart/render/bar-column.tsx +3 -3
  277. package/src/ui-tailwind/chart/render/bubble.tsx +3 -3
  278. package/src/ui-tailwind/chart/render/combo.tsx +2 -2
  279. package/src/ui-tailwind/chart/render/data-labels.tsx +2 -2
  280. package/src/ui-tailwind/chart/render/font-metrics.ts +2 -2
  281. package/src/ui-tailwind/chart/render/line.tsx +3 -3
  282. package/src/ui-tailwind/chart/render/pie.tsx +6 -6
  283. package/src/ui-tailwind/chart/render/scatter.tsx +3 -3
  284. package/src/ui-tailwind/chart/render/svg-primitives.ts +3 -3
  285. package/src/ui-tailwind/chart/render/unsupported.tsx +2 -2
  286. package/src/ui-tailwind/chrome/build-context-menu-entries.ts +88 -0
  287. package/src/ui-tailwind/chrome/chrome-preset-toolbar.tsx +1 -1
  288. package/src/ui-tailwind/chrome/collab-send-to-supplier-button.tsx +1 -1
  289. package/src/ui-tailwind/chrome/collab-tamper-banner.tsx +1 -1
  290. package/src/ui-tailwind/chrome/collab-top-nav-container.tsx +1 -1
  291. package/src/ui-tailwind/chrome/editor-action-registry.ts +553 -0
  292. package/src/ui-tailwind/chrome/editor-actions-to-palette.ts +182 -0
  293. package/src/ui-tailwind/chrome/local-surface-arbiter.ts +534 -0
  294. package/src/ui-tailwind/chrome/resolve-target-kind.ts +226 -0
  295. package/src/ui-tailwind/chrome/tw-alert-banner.tsx +38 -4
  296. package/src/ui-tailwind/chrome/tw-context-band.tsx +125 -0
  297. package/src/ui-tailwind/chrome/tw-context-menu-portal.tsx +248 -0
  298. package/src/ui-tailwind/chrome/tw-image-context-toolbar.tsx +42 -1
  299. package/src/ui-tailwind/chrome/tw-selection-anchor-resolver.ts +8 -7
  300. package/src/ui-tailwind/chrome/tw-selection-tool-blocked.tsx +38 -4
  301. package/src/ui-tailwind/chrome/tw-selection-tool-comment.tsx +104 -6
  302. package/src/ui-tailwind/chrome/tw-selection-tool-host.tsx +66 -7
  303. package/src/ui-tailwind/chrome/tw-selection-tool-workflow.tsx +54 -8
  304. package/src/ui-tailwind/chrome/tw-shortcut-hint.tsx +7 -1
  305. package/src/ui-tailwind/chrome/tw-suggestion-card.tsx +33 -0
  306. package/src/ui-tailwind/chrome/tw-table-context-toolbar.tsx +78 -1
  307. package/src/ui-tailwind/chrome/tw-table-grip-layer.tsx +16 -8
  308. package/src/ui-tailwind/chrome/tw-workspace-chrome-host.tsx +276 -0
  309. package/src/ui-tailwind/chrome/use-context-menu-controller.ts +201 -0
  310. package/src/ui-tailwind/chrome-overlay/chrome-overlay-projector.ts +1 -1
  311. package/src/ui-tailwind/chrome-overlay/tw-chrome-overlay.tsx +22 -4
  312. package/src/ui-tailwind/chrome-overlay/tw-comment-balloon-layer.tsx +1 -1
  313. package/src/ui-tailwind/chrome-overlay/tw-locked-block-layer.tsx +1 -1
  314. package/src/ui-tailwind/chrome-overlay/tw-object-selection-overlay.tsx +11 -5
  315. package/src/ui-tailwind/chrome-overlay/tw-page-stack-overlay-layer.tsx +197 -3
  316. package/src/ui-tailwind/chrome-overlay/tw-revision-margin-bar-layer.tsx +1 -1
  317. package/src/ui-tailwind/chrome-overlay/tw-scope-card-layer.tsx +35 -6
  318. package/src/ui-tailwind/chrome-overlay/tw-scope-rail-layer.tsx +24 -16
  319. package/src/ui-tailwind/chrome-overlay/tw-table-continuation-header.tsx +1 -1
  320. package/src/ui-tailwind/debug/README.md +57 -0
  321. package/src/ui-tailwind/debug/index.ts +3 -0
  322. package/src/ui-tailwind/debug/tw-debug-overlay.tsx +186 -0
  323. package/src/ui-tailwind/debug/tw-debug-presentation.tsx +80 -0
  324. package/src/ui-tailwind/debug/tw-debug-top-bar.tsx +83 -0
  325. package/src/ui-tailwind/editor-surface/chart-node-view.tsx +2 -2
  326. package/src/ui-tailwind/editor-surface/float-wrap-resolver.ts +1 -1
  327. package/src/ui-tailwind/editor-surface/pm-command-bridge.ts +135 -10
  328. package/src/ui-tailwind/editor-surface/pm-decorations.ts +40 -13
  329. package/src/ui-tailwind/editor-surface/pm-page-break-decorations.ts +1 -1
  330. package/src/ui-tailwind/editor-surface/pm-schema.ts +1 -1
  331. package/src/ui-tailwind/editor-surface/pm-state-from-snapshot.ts +3 -3
  332. package/src/ui-tailwind/editor-surface/predicted-tag-preflight.ts +1 -1
  333. package/src/ui-tailwind/editor-surface/remote-cursor-plugin.ts +2 -2
  334. package/src/ui-tailwind/editor-surface/scroll-anchor.ts +91 -9
  335. package/src/ui-tailwind/editor-surface/shape-renderer.ts +1 -1
  336. package/src/ui-tailwind/editor-surface/surface-layer.ts +1 -1
  337. package/src/ui-tailwind/editor-surface/tw-opaque-block.tsx +1 -1
  338. package/src/ui-tailwind/editor-surface/tw-page-block-view.helpers.ts +23 -6
  339. package/src/ui-tailwind/editor-surface/tw-prosemirror-surface.tsx +132 -22
  340. package/src/ui-tailwind/editor-surface/tw-table-node-view.tsx +1 -1
  341. package/src/ui-tailwind/index.ts +0 -5
  342. package/src/ui-tailwind/overlay-anchor-bridge-context.tsx +33 -0
  343. package/src/ui-tailwind/page-stack/floating-image-overlay-model.ts +66 -29
  344. package/src/ui-tailwind/page-stack/tw-floating-image-layer.tsx +25 -2
  345. package/src/ui-tailwind/review/comment-markdown-renderer.tsx +15 -0
  346. package/src/ui-tailwind/review/tw-review-rail.tsx +92 -4
  347. package/src/ui-tailwind/review/tw-workflow-tab.tsx +1 -1
  348. package/src/ui-tailwind/review-workspace/page-chrome.ts +210 -0
  349. package/src/ui-tailwind/review-workspace/page-shell-metrics.ts +101 -0
  350. package/src/ui-tailwind/review-workspace/paragraph-layout.ts +115 -0
  351. package/src/ui-tailwind/review-workspace/selection-toolbar-placement.ts +97 -0
  352. package/src/ui-tailwind/review-workspace/tw-review-workspace-navigator.tsx +130 -0
  353. package/src/ui-tailwind/review-workspace/tw-review-workspace-page-toolbar.tsx +240 -0
  354. package/src/ui-tailwind/review-workspace/tw-review-workspace-rail.tsx +59 -0
  355. package/src/ui-tailwind/review-workspace/types.ts +408 -0
  356. package/src/ui-tailwind/review-workspace/use-chrome-policy.ts +104 -0
  357. package/src/ui-tailwind/review-workspace/use-derived-view-state.ts +151 -0
  358. package/src/ui-tailwind/review-workspace/use-diagnostics-signal.ts +70 -0
  359. package/src/ui-tailwind/review-workspace/use-grabbed-segment-offsets.ts +40 -0
  360. package/src/ui-tailwind/review-workspace/use-layout-facet-render-signal.ts +55 -0
  361. package/src/ui-tailwind/review-workspace/use-page-markers.ts +130 -0
  362. package/src/ui-tailwind/review-workspace/use-pm-surface-capture.ts +60 -0
  363. package/src/ui-tailwind/review-workspace/use-review-rail-state.ts +63 -0
  364. package/src/ui-tailwind/review-workspace/use-scope-card-state.ts +170 -0
  365. package/src/ui-tailwind/review-workspace/use-scroll-root-capture.ts +28 -0
  366. package/src/ui-tailwind/review-workspace/use-selection-toolbar-placement.ts +113 -0
  367. package/src/ui-tailwind/review-workspace/use-shell-selection-anchor-bridge.ts +120 -0
  368. package/src/ui-tailwind/review-workspace/use-status-bar-page-facts.ts +55 -0
  369. package/src/ui-tailwind/review-workspace/use-viewport-dimensions.ts +43 -0
  370. package/src/ui-tailwind/review-workspace/use-workspace-arbiter.ts +25 -0
  371. package/src/ui-tailwind/review-workspace/use-workspace-composition.ts +86 -0
  372. package/src/ui-tailwind/review-workspace/use-workspace-side-effects.ts +150 -0
  373. package/src/ui-tailwind/theme/editor-theme.css +25 -0
  374. package/src/ui-tailwind/toolbar/tw-role-action-region.tsx +2 -2
  375. package/src/ui-tailwind/toolbar/tw-toolbar.tsx +61 -98
  376. package/src/ui-tailwind/tw-review-workspace.tsx +521 -1802
  377. package/src/ui-tailwind/ui-api-context.tsx +43 -0
  378. package/src/ui-tailwind/ui-shell-channels-context.tsx +49 -0
  379. package/src/validation/compatibility-engine.ts +6 -6
  380. package/src/runtime/styles-cascade.ts +0 -33
  381. package/src/ui-tailwind/chrome/tw-mode-dock.tsx +0 -85
  382. /package/src/runtime/{page-number-format.ts → formatting/field/page-number-format.ts} +0 -0
  383. /package/src/runtime/{ai-action-policy.ts → workflow/ai-action-policy.ts} +0 -0
  384. /package/src/runtime/{scope-tag-registry.ts → workflow/scope-tag-registry.ts} +0 -0
@@ -159,6 +159,34 @@ export interface PersistedWorkflowOverlay {
159
159
  activeWorkItemId?: string | null;
160
160
  }
161
161
 
162
+ /**
163
+ * W10 — class-A overlay-visibility policies persisted alongside the
164
+ * session state. Optional; absent arrays on older documents read as
165
+ * "no authored policy."
166
+ */
167
+ export interface PersistedOverlayVisibilityPolicy {
168
+ readonly kind:
169
+ | "scope-rail"
170
+ | "comments"
171
+ | "tracked-changes"
172
+ | "suggestions"
173
+ | "debug-panel"
174
+ | "presence";
175
+ readonly enforcement: "authored-default" | "always" | "never";
176
+ readonly defaultOn: boolean;
177
+ readonly authoredBy?: { readonly actorId: string; readonly at: string };
178
+ }
179
+
180
+ /**
181
+ * X5 — class-A markup-mode policy (single record). Mirrors
182
+ * `PersistedOverlayVisibilityPolicy` shape but single-value.
183
+ */
184
+ export interface PersistedMarkupModePolicy {
185
+ readonly mode: "clean" | "simple" | "all";
186
+ readonly enforcement: "authored-default" | "always";
187
+ readonly authoredBy?: { readonly actorId: string; readonly at: string };
188
+ }
189
+
162
190
  export interface PersistedEditorSnapshot {
163
191
  snapshotVersion: PersistedEditorSnapshotVersion;
164
192
  schemaVersion: typeof CDS_SCHEMA_VERSION;
@@ -175,6 +203,8 @@ export interface PersistedEditorSnapshot {
175
203
  sourcePackage?: PersistedSourcePackage;
176
204
  workflowOverlay?: PersistedWorkflowOverlay;
177
205
  workflowMetadata?: PersistedWorkflowMetadataSnapshot;
206
+ visibilityPolicies?: readonly PersistedOverlayVisibilityPolicy[];
207
+ markupModePolicy?: PersistedMarkupModePolicy;
178
208
  }
179
209
 
180
210
  const SNAPSHOT_REQUIRED_TOP_LEVEL_KEYS = [
@@ -196,6 +226,8 @@ const SNAPSHOT_OPTIONAL_TOP_LEVEL_KEYS = [
196
226
  "protectionSnapshot",
197
227
  "workflowOverlay",
198
228
  "workflowMetadata",
229
+ "visibilityPolicies",
230
+ "markupModePolicy",
199
231
  ] as const;
200
232
 
201
233
  export interface ProtectionRangeRecord {
@@ -6,53 +6,27 @@ import {
6
6
  type CommentAnchor,
7
7
  } from "./comment-anchors.ts";
8
8
 
9
- export interface CommentEntry {
10
- entryId: string;
11
- authorId: string;
12
- body: string;
13
- createdAt: string;
14
- metadata?: CommentEntryMetadata;
15
- }
16
-
17
- export interface CommentEntryMetadata {
18
- ooxmlCommentId?: string;
19
- paraId?: string;
20
- parentParaId?: string;
21
- durableId?: string;
22
- initials?: string;
23
- }
24
-
25
- export interface CommentResolution {
26
- resolvedAt: string;
27
- resolvedBy: string;
28
- }
29
-
30
- export type CommentThreadStatus = "open" | "resolved" | "detached";
31
-
32
- export interface CommentThread {
33
- commentId: string;
34
- anchor: CommentAnchor;
35
- status: CommentThreadStatus;
36
- entries: CommentEntry[];
37
- createdBy: string;
38
- createdAt: string;
39
- resolution?: CommentResolution;
40
- warningIds: string[];
41
- metadata?: CommentThreadMetadata;
42
- }
43
-
44
- export interface CommentThreadMetadata {
45
- source?: "runtime" | "import";
46
- rootOoxmlCommentId?: string;
47
- rootParaId?: string;
48
- detachedReason?: "incomplete-markers" | "multi-paragraph" | "opaque-region" | "revision-overlap";
49
- actionabilityNote?: string;
50
- }
51
-
52
- export interface CommentStore {
53
- version: "comment-store/1";
54
- threads: Record<string, CommentThread>;
55
- }
9
+ // Type definitions now live at src/model/review/comment-types.ts so the
10
+ // session layer can consume them without importing from src/review/**.
11
+ // Store operations (construct/upsert/resolve/remap/project) remain here
12
+ // — those are runtime-state concerns, not model shapes.
13
+ export type {
14
+ CommentEntry,
15
+ CommentEntryMetadata,
16
+ CommentResolution,
17
+ CommentStore,
18
+ CommentThread,
19
+ CommentThreadMetadata,
20
+ CommentThreadStatus,
21
+ } from "../../model/review/comment-types.ts";
22
+
23
+ import type {
24
+ CommentEntry,
25
+ CommentStore,
26
+ CommentThread,
27
+ CommentThreadMetadata,
28
+ CommentThreadStatus,
29
+ } from "../../model/review/comment-types.ts";
56
30
 
57
31
  export interface CreateCommentThreadParams {
58
32
  commentId: string;
@@ -1,3 +1,14 @@
1
+ /**
2
+ * Back-compat shim — every type that used to live here has moved to
3
+ * `src/model/review/revision-types.ts` so the session layer can consume
4
+ * revision records without importing from `src/review/**`. Existing
5
+ * call-sites (~25 in-tree) continue to work via the re-exports below.
6
+ *
7
+ * The anchor-constructor / remap helpers stay here: they depend on the
8
+ * mapping machinery in `src/core/selection/mapping.ts` and are not pure
9
+ * data concerns.
10
+ */
11
+
1
12
  import {
2
13
  createNodeAnchor,
3
14
  createRangeAnchor,
@@ -5,134 +16,38 @@ import {
5
16
  normalizeRange,
6
17
  type Assoc,
7
18
  type BoundaryAssoc,
8
- type DocRange,
9
- type EditorAnchorProjection,
10
19
  type TransactionMapping,
11
20
  } from "../../core/selection/mapping.ts";
12
- import type { RevisionStoryTargetRecord } from "../../model/canonical-document.ts";
13
-
14
- export type RevisionAnchor = EditorAnchorProjection;
15
-
16
- export type SupportedRevisionKind = "insertion" | "deletion" | "property-change";
17
- export type PreserveOnlyRevisionKind = "formatting" | "move";
18
- export type RevisionKind = SupportedRevisionKind | PreserveOnlyRevisionKind;
19
-
20
- export type RevisionStatus = "active" | "accepted" | "rejected" | "detached";
21
- export type RevisionActionability = "actionable" | "preserve-only";
22
- export type RevisionAnchorState = "active" | "detached";
23
-
24
- export interface PropertyChangeData {
25
- xmlTag: "pPrChange" | "sectPrChange" | "tblPrChange" | "rPrChange";
26
- beforeXml: string;
27
- }
28
-
29
- export interface MoveData {
30
- moveId: string;
31
- direction: "from" | "to";
32
- linkedRevisionId?: string;
33
- }
34
-
35
- /**
36
- * Payload for `w:cellMerge` revisions. `direction` is the `w:vMerge`
37
- * attribute on the marker:
38
- * `"rest"` — this cell begins a vertical merge span (restart cell).
39
- * `"cont"` — this cell continues a vertical merge span.
40
- *
41
- * Accept commits `TableCellNode.verticalMerge` to the matching state;
42
- * reject clears `verticalMerge` to undefined. No row topology changes
43
- * (mirrors LibreOffice's treatment — vMerge is a rendering property, not
44
- * a structural mutation).
45
- */
46
- export interface CellMergeData {
47
- direction: "rest" | "cont";
48
- }
49
-
50
- /**
51
- * Ordinal coordinates of a structural table revision within the canonical
52
- * document tree.
53
- *
54
- * Lane 7b row-insertion revisions (`<w:trPr><w:ins/></w:trPr>`) point at an
55
- * entire row, not a text range — the runtime anchor position alone can't
56
- * identify which row to remove on reject. This envelope carries the table's
57
- * ordinal (the Nth `<w:tbl>` in the body) and the row's index within that
58
- * table, both fixed at parse time. Accept/reject resolves these to a
59
- * canonical-document `tableBlockIndex` by walking `doc.content.children[]`
60
- * at action time.
61
- */
62
- export interface TableRevisionCoordinates {
63
- tableOrdinal: number;
64
- rowIndex: number;
65
- /**
66
- * Cell index within `row.cells[]`. Present on cell-level structural
67
- * revisions (`cellIns` / `cellDel` / `cellMerge`); `undefined` on
68
- * row-level records (`row-ins` / `row-del`).
69
- */
70
- cellIndex?: number;
71
- /**
72
- * For revisions inside nested tables (a `<w:tbl>` inside a cell), this
73
- * carries the full ordinal path so `resolveCanonicalTableRow` can
74
- * tree-walk the canonical document:
75
- * `[bodyTableOrdinal, nestedTableIndex, ...]`
76
- * Body-level revisions omit this field and use the flat `tableOrdinal`.
77
- * Lane 7b Phase Q.
78
- */
79
- tableOrdinalPath?: readonly number[];
80
- }
81
21
 
82
- export interface RevisionMetadataEnvelope {
83
- source: "runtime" | "import";
84
- storyTarget?: RevisionStoryTargetRecord;
85
- preserveOnlyReason?: string;
86
- suggestionId?: string;
87
- semanticKind?:
88
- | "insertion"
89
- | "deletion"
90
- | "replacement"
91
- | "formatting-change"
92
- | "paragraph-property-change"
93
- | "structural-change"
94
- | "object-change";
95
- linkedRevisionIds?: string[];
96
- predecessorSuggestionId?: string;
97
- importedRevisionForm?:
98
- | "run-insertion"
99
- | "run-deletion"
100
- | "paragraph-insertion"
101
- | "paragraph-deletion";
102
- originalRevisionType?: string;
103
- ooxmlRevisionId?: string;
104
- propertyChangeData?: PropertyChangeData;
105
- moveData?: MoveData;
106
- cellMergeData?: CellMergeData;
107
- tableRevisionCoordinates?: TableRevisionCoordinates;
108
- }
109
-
110
- export type PropertyChangeRevision = RevisionRecord & {
111
- kind: "property-change";
112
- metadata: RevisionMetadataEnvelope & { propertyChangeData: PropertyChangeData };
113
- };
114
-
115
- export type MoveRevision = RevisionRecord & {
116
- kind: "move";
117
- metadata: RevisionMetadataEnvelope & { moveData: MoveData };
118
- };
119
-
120
- export interface RevisionRecord {
121
- revisionId: string;
122
- kind: RevisionKind;
123
- anchor: RevisionAnchor;
124
- authorId: string;
125
- createdAt: string;
126
- status: RevisionStatus;
127
- warningIds: string[];
128
- metadata: RevisionMetadataEnvelope;
129
- }
130
-
131
- export interface RevisionAnchorSummary {
132
- anchor: RevisionAnchor;
133
- state: RevisionAnchorState;
134
- range: DocRange;
135
- }
22
+ export type {
23
+ CellMergeData,
24
+ MoveData,
25
+ MoveRevision,
26
+ PreserveOnlyRevisionKind,
27
+ PropertyChangeData,
28
+ PropertyChangeRevision,
29
+ RevisionActionability,
30
+ RevisionAnchor,
31
+ RevisionAnchorState,
32
+ RevisionAnchorSummary,
33
+ RevisionKind,
34
+ RevisionMetadataEnvelope,
35
+ RevisionRecord,
36
+ RevisionStatus,
37
+ SupportedRevisionKind,
38
+ TableRevisionCoordinates,
39
+ } from "../../model/review/revision-types.ts";
40
+
41
+ export {
42
+ describeRevisionKind,
43
+ getRevisionActionability,
44
+ isRevisionActionable,
45
+ } from "../../model/review/revision-types.ts";
46
+
47
+ import type {
48
+ RevisionAnchor,
49
+ RevisionAnchorSummary,
50
+ } from "../../model/review/revision-types.ts";
136
51
 
137
52
  export function createRevisionRangeAnchor(
138
53
  from: number,
@@ -183,76 +98,3 @@ export function summarizeRevisionAnchor(anchor: RevisionAnchor): RevisionAnchorS
183
98
  range: normalizeRange(anchor.lastKnownRange),
184
99
  };
185
100
  }
186
-
187
- export function getRevisionActionability(
188
- revision:
189
- | RevisionKind
190
- | Pick<RevisionRecord, "kind" | "metadata">,
191
- ): RevisionActionability {
192
- // Lane 7b promotions run BEFORE the preserveOnlyReason check on purpose:
193
- // `createRevisionRecord` injects a default "Imported preserve-only revision."
194
- // reason for any kind that `getRevisionActionability(kind)` returns as
195
- // preserve-only (see revision-store.ts), which covers both `kind: "move"`
196
- // and `kind: "formatting"`. The overrides below flip the default back to
197
- // actionable for the specific shapes that Lane 7b promoted: cellIns
198
- // structural-table revisions, and linked-pair move revisions. Do not add a
199
- // `&& !preserveOnlyReason` guard here — that would re-lock these shapes
200
- // against the injected default and regress 7b.
201
- if (
202
- typeof revision !== "string" &&
203
- (revision.metadata.originalRevisionType === "cellIns" ||
204
- revision.metadata.originalRevisionType === "cellDel" ||
205
- revision.metadata.originalRevisionType === "cellMerge")
206
- ) {
207
- return "actionable";
208
- }
209
-
210
- if (
211
- typeof revision !== "string" &&
212
- revision.kind === "move" &&
213
- typeof revision.metadata.moveData?.linkedRevisionId === "string" &&
214
- revision.metadata.moveData.linkedRevisionId.length > 0
215
- ) {
216
- return "actionable";
217
- }
218
-
219
- if (
220
- typeof revision !== "string" &&
221
- typeof revision.metadata.preserveOnlyReason === "string" &&
222
- revision.metadata.preserveOnlyReason.length > 0
223
- ) {
224
- return "preserve-only";
225
- }
226
-
227
- const kind = typeof revision === "string" ? revision : revision.kind;
228
- switch (kind) {
229
- case "insertion":
230
- case "deletion":
231
- case "property-change":
232
- return "actionable";
233
- case "formatting":
234
- case "move":
235
- return "preserve-only";
236
- }
237
- }
238
-
239
- export function isRevisionActionable(
240
- record: Pick<RevisionRecord, "kind" | "metadata" | "status">,
241
- ): boolean {
242
- return getRevisionActionability(record) === "actionable" && record.status === "active";
243
- }
244
-
245
- export function describeRevisionKind(kind: RevisionKind): string {
246
- switch (kind) {
247
- case "insertion":
248
- return "Insertion";
249
- case "deletion":
250
- return "Deletion";
251
- case "formatting":
252
- return "Formatting change";
253
- case "move":
254
- return "Move";
255
- case "property-change":
256
- return "Property change";
257
- }
258
- }
@@ -20,11 +20,13 @@ import { sha256Hex } from "../../io/source-package-provenance.ts";
20
20
  * | `media` | yes | embedded media are base content |
21
21
  * | `content` | yes | the editable body tree |
22
22
  * | `preservation` | yes | opaque fragments round-trip identically from the source |
23
+ * | `subParts` | yes | headers/footers/footnotes/theme are base content |
24
+ * | `fieldRegistry` | yes | deterministic from `{content, styles, subParts}` — see `buildFieldRegistry` |
25
+ * | `fontTable` | yes | fontTable.xml is base content |
23
26
  * | `docId` | **no** | session-local |
24
27
  * | `createdAt` / `updatedAt` | **no** | session-local timestamps |
25
28
  * | `review` | **no** | tracked changes are session state |
26
29
  * | `diagnostics` | **no** | validator output is session state |
27
- * | `subParts` / `fieldRegistry` | **no** | may be partially session-computed |
28
30
  *
29
31
  * Hash pipeline: the subset is serialized via {@link stableStringify}
30
32
  * (sorts object keys recursively, preserves array order, follows
@@ -44,6 +46,9 @@ export function computeBaseDocFingerprint(envelope: CanonicalDocumentEnvelope):
44
46
  media: envelope.media,
45
47
  content: envelope.content,
46
48
  preservation: envelope.preservation,
49
+ subParts: envelope.subParts,
50
+ fieldRegistry: envelope.fieldRegistry,
51
+ fontTable: envelope.fontTable,
47
52
  };
48
53
  const serialized = stableStringify(subset);
49
54
  const bytes = new TextEncoder().encode(serialized);
@@ -7,7 +7,10 @@ import type {
7
7
  EditorTransaction,
8
8
  } from "../../core/commands/index.ts";
9
9
  import type { CanonicalDocumentEnvelope } from "../../core/state/editor-state.ts";
10
- import type { BlockNode } from "../../model/canonical-document.ts";
10
+ import type {
11
+ BlockNode,
12
+ MutableCanonicalDocument,
13
+ } from "../../model/canonical-document.ts";
11
14
  import type {
12
15
  CommandAppliedMeta,
13
16
  DocumentRuntime,
@@ -82,12 +85,19 @@ export function compressDocumentReplaceForBroadcast(
82
85
  return command;
83
86
  }
84
87
 
85
- const patch: Partial<CanonicalDocumentEnvelope> = {};
88
+ const patch: Partial<MutableCanonicalDocument> = {};
86
89
  let anyTopLevelChange = false;
90
+ const assignPatch = <K extends keyof MutableCanonicalDocument>(
91
+ target: Partial<MutableCanonicalDocument>,
92
+ key: K,
93
+ value: MutableCanonicalDocument[K],
94
+ ): void => {
95
+ target[key] = value;
96
+ };
87
97
  for (const key of PATCHABLE_TOP_LEVEL_KEYS) {
88
98
  if (key === "content") continue;
89
99
  if (next[key] !== priorDocument[key]) {
90
- (patch as Record<string, unknown>)[key] = next[key];
100
+ assignPatch(patch, key, next[key] as MutableCanonicalDocument[typeof key]);
91
101
  anyTopLevelChange = true;
92
102
  }
93
103
  }
@@ -38,7 +38,7 @@ import {
38
38
  type MetadataIntegrity,
39
39
  type TamperGate,
40
40
  type TamperGateEvent,
41
- } from "./tamper-gate.ts";
41
+ } from "./workflow/tamper-gate.ts";
42
42
 
43
43
  /**
44
44
  * Event union emitted by the session. Merges the bridge's event