@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
@@ -1,10 +1,19 @@
1
1
  import type { ReactNode } from "react";
2
- import type { PersistedEditorSnapshot as RuntimePersistedEditorSnapshot } from "../core/state/editor-state.ts";
2
+ import type { ApiV3 } from "./v3/_create.ts";
3
+ import type {
4
+ DocumentPageSnapshot,
5
+ EditorStoryTarget,
6
+ PageLayoutSnapshot,
7
+ } from "../model/layout/page-layout-snapshot.ts";
8
+ import type {
9
+ CanonicalDocumentEnvelope,
10
+ PersistedEditorSnapshot as RuntimePersistedEditorSnapshot,
11
+ } from "../core/state/editor-state.ts";
3
12
  import type { HarnessDebugPorts } from "../internal/harness-debug-ports.ts";
4
13
  import type { BlockNode, CanonicalParagraphFormatting, CanonicalRunFormatting, TextMark } from "../model/canonical-document.ts";
5
14
  import type { WordReviewEditorLayoutFacet } from "../runtime/layout/public-facet.ts";
6
15
  import type { RenderFrameRect } from "../runtime/render/index.ts";
7
- import type { ScopeRailPosture } from "../runtime/workflow-rail-segments.ts";
16
+ import type { ScopeRailPosture } from "../runtime/workflow/rail/compose.ts";
8
17
  import type { SharedWorkflowState } from "../runtime/collab/workflow-shared.ts";
9
18
  import type {
10
19
  MetadataPersistenceMode,
@@ -50,6 +59,66 @@ export type {
50
59
 
51
60
  export type { CanonicalParagraphFormatting, CanonicalRunFormatting };
52
61
  export type { SharedWorkflowState };
62
+ /**
63
+ * Re-exported for Layer-11 presentation surfaces (refactor/11 Slice 5
64
+ * retirement) so the PM mount + surrounding surfaces consume the
65
+ * canonical-envelope type through the public API seam instead of
66
+ * reaching into `src/core/state/editor-state.ts`.
67
+ */
68
+ export type { CanonicalDocumentEnvelope };
69
+
70
+ /**
71
+ * Chart types re-exported for Layer-11 chart renderers (refactor/11
72
+ * Slice 6 retirement). The chart-family presentation (area / bar /
73
+ * bubble / line / pie / scatter / combo / unsupported / svg-primitives)
74
+ * consumes the shape definitions through the public API seam instead
75
+ * of reaching into `src/model/chart-types.ts` or
76
+ * `src/io/ooxml/chart/types.ts`. Value imports (color resolution,
77
+ * palette, style-table builders) are out of scope — those remain under
78
+ * `src/io/ooxml/chart/**` and their Layer-11 usages stay in the
79
+ * exception register until a dedicated chart API is introduced.
80
+ */
81
+ export type * from "../model/chart-types.ts";
82
+ export type { ResolvedTheme } from "../model/canonical-document.ts";
83
+
84
+ /**
85
+ * Workflow-rail types re-exported for the Layer-11 scope-rail + scope-
86
+ * card overlays (refactor/11 Slice 6 retirement). `WorkflowFacet` +
87
+ * `ScopeRailSegment` are the canonical types the overlays consume;
88
+ * `ScopeRailPosture` is already re-exported above.
89
+ */
90
+ export type {
91
+ WorkflowFacet,
92
+ ScopeRailSegment,
93
+ } from "../runtime/workflow/rail/types.ts";
94
+
95
+ /**
96
+ * Substrate-type re-exports consumed by Layer-11 overlay + chrome
97
+ * surfaces (refactor/11 type-only retirement sweep). Every entry below
98
+ * exists because a presentation file previously imported it directly
99
+ * from `src/runtime/**` or `src/model/**`; routing through the public-
100
+ * types choke point (per the L08 adversarial-close pattern) preserves
101
+ * the type seam without the boundary-guard reach-through.
102
+ */
103
+ export type { CollabSession } from "../runtime/collab-session.ts";
104
+ export type { MetadataIntegrity } from "../runtime/workflow/tamper-gate.ts";
105
+ export type { ScopeTagRegistry } from "../runtime/workflow/scope-tag-registry.ts";
106
+ // Semantic-scope shapes — re-exported so L10 (ui.scope.*) + L09
107
+ // (ai.getScopeBundle) + L11 (scope-card consumers) can import the
108
+ // canonical types from the public-types choke point instead of
109
+ // reaching into `src/runtime/scopes/**` (blocked by L10's layer-purity
110
+ // CI guard). Authoritative definitions live at
111
+ // `src/runtime/scopes/semantic-scope-types.ts`.
112
+ export type {
113
+ ScopeBundle,
114
+ ScopeBundleEvidence,
115
+ ScopeBundleNeighborhood,
116
+ ScopeHandle,
117
+ SemanticScope,
118
+ SemanticScopeKind,
119
+ } from "../runtime/scopes/semantic-scope-types.ts";
120
+ export type { GeometryFacet } from "../runtime/geometry/index.ts";
121
+ export type { RuntimePageGraph } from "../runtime/layout/page-graph.ts";
53
122
 
54
123
  export type {
55
124
  WordReviewEditorLayoutFacet,
@@ -106,7 +175,12 @@ export type {
106
175
 
107
176
  // R0: scope-rail posture vocabulary and chrome pin state — exposed so
108
177
  // host apps can drive the editor role and render custom posture menus.
109
- export type { ScopeRailPosture } from "../runtime/workflow-rail-segments.ts";
178
+ export type { ScopeRailPosture } from "../runtime/workflow/rail/compose.ts";
179
+
180
+ // refactor/11 Track G — re-export SessionCapabilities so presentation
181
+ // code can consume the runtime-derived capability shape without
182
+ // reaching into `src/runtime/**` directly (P3).
183
+ export type { SessionCapabilities } from "../runtime/session-capabilities.ts";
110
184
 
111
185
  export type FieldFamily = import("../model/canonical-document.ts").FieldFamily;
112
186
  export type FieldRefreshStatus = import("../model/canonical-document.ts").FieldRefreshStatus;
@@ -168,22 +242,43 @@ export type EditorAnchorProjection =
168
242
  reason: "deleted" | "invalidatedByStructureChange" | "importAmbiguity";
169
243
  };
170
244
 
171
- export type EditorStoryTarget =
172
- | { kind: "main" }
173
- | {
174
- kind: "header";
175
- relationshipId: string;
176
- variant: "default" | "first" | "even";
177
- sectionIndex?: number;
178
- }
179
- | {
180
- kind: "footer";
181
- relationshipId: string;
182
- variant: "default" | "first" | "even";
183
- sectionIndex?: number;
184
- }
185
- | { kind: "footnote"; noteId: string }
186
- | { kind: "endnote"; noteId: string };
245
+ /**
246
+ * Re-exported from `src/model/layout/page-layout-snapshot.ts`. The
247
+ * canonical declaration moved there in refactor/04 cross-layer-coord
248
+ * §1.12 Pass 2 so `RuntimePageGraph` can live in a layer reachable from
249
+ * session / stateless services without transiting `src/runtime/**`.
250
+ */
251
+ export type { EditorStoryTarget } from "../model/layout/page-layout-snapshot.ts";
252
+
253
+ /**
254
+ * Story-target equality helper — re-exported at the public-types boundary
255
+ * so Layer-11 presentation consumers (e.g. `remote-cursor-plugin.ts`) can
256
+ * compare `EditorStoryTarget` values without reaching into
257
+ * `src/core/selection/mapping.ts` directly. Pure function over public
258
+ * types; canonical implementation lives on the core selection module.
259
+ * Shipped 2026-04-23 via coord-07 §2.1 collab-expansion remainder.
260
+ */
261
+ export { storyTargetsEqual, MAIN_STORY_TARGET } from "../core/selection/mapping.ts";
262
+
263
+ /**
264
+ * OOXML unit-conversion constants shared with presentation-layer
265
+ * renderers. EMU (English Metric Units) is the OOXML measurement
266
+ * unit; `EMU_PER_PX` converts to CSS pixels at 96 dpi;
267
+ * `ROTATION_UNITS_PER_DEGREE` is the c:rot scaling factor;
268
+ * `PERCENTAGE_PARTS` is the OOXML st:ST_Percentage base (1 / 100000).
269
+ * Pure constant re-exports of the canonical values on
270
+ * `src/runtime/units.ts` so shape renderers + PM schema can convert
271
+ * document-space units without reaching into `src/runtime/**`.
272
+ * Re-exported 2026-04-23 per coord-11 §4 register cleanup.
273
+ */
274
+ export {
275
+ EMU_PER_PX,
276
+ EMU_PER_INCH,
277
+ TWIPS_PER_PX,
278
+ ROTATION_UNITS_PER_DEGREE,
279
+ PERCENTAGE_PARTS,
280
+ SRCRECT_UNITS_PER_PERCENT,
281
+ } from "../runtime/units.ts";
187
282
 
188
283
  export interface SelectionSnapshot {
189
284
  anchor: number;
@@ -193,54 +288,11 @@ export interface SelectionSnapshot {
193
288
  storyTarget?: EditorStoryTarget;
194
289
  }
195
290
 
196
- export interface PageLayoutSnapshot {
197
- sectionIndex: number;
198
- sectionType?: "continuous" | "nextPage" | "evenPage" | "oddPage" | "nextColumn";
199
- pageWidth: number;
200
- pageHeight: number;
201
- marginTop: number;
202
- marginBottom: number;
203
- marginLeft: number;
204
- marginRight: number;
205
- headerMargin: number;
206
- footerMargin: number;
207
- gutter: number;
208
- orientation: "portrait" | "landscape";
209
- columns: number;
210
- differentFirstPage: boolean;
211
- differentOddEvenPages: boolean;
212
- pageNumbering?: {
213
- format?: string;
214
- start?: number;
215
- chapterStyle?: string;
216
- chapterSeparator?: string;
217
- };
218
- lineNumbering?: {
219
- countBy?: number;
220
- start?: number;
221
- distance?: number;
222
- restart?: "newPage" | "newSection" | "continuous";
223
- };
224
- pageBorders?: {
225
- top?: { value?: string; size?: number; space?: number; color?: string };
226
- left?: { value?: string; size?: number; space?: number; color?: string };
227
- bottom?: { value?: string; size?: number; space?: number; color?: string };
228
- right?: { value?: string; size?: number; space?: number; color?: string };
229
- offsetFrom?: "page" | "text";
230
- display?: "allPages" | "firstPage" | "notFirstPage";
231
- zOrder?: "front" | "back";
232
- };
233
- documentGrid?: {
234
- type?: "default" | "lines" | "linesAndChars" | "snapToChars";
235
- linePitch?: number;
236
- charSpace?: number;
237
- };
238
- columnDefinitions: Array<{ width: number; space?: number }>;
239
- equalWidthColumns: boolean;
240
- columnSeparator: boolean;
241
- headerVariants: Array<{ variant: "default" | "first" | "even"; relationshipId: string }>;
242
- footerVariants: Array<{ variant: "default" | "first" | "even"; relationshipId: string }>;
243
- }
291
+ /**
292
+ * Re-exported from `src/model/layout/page-layout-snapshot.ts`. See the
293
+ * `EditorStoryTarget` re-export above for the relocation rationale.
294
+ */
295
+ export type { PageLayoutSnapshot } from "../model/layout/page-layout-snapshot.ts";
244
296
 
245
297
  export type WorkspaceMode = "canvas" | "page";
246
298
 
@@ -576,21 +628,11 @@ export interface DocumentNavigationSnapshot {
576
628
  activeSectionIndex: number;
577
629
  }
578
630
 
579
- /** Runtime-derived descriptor for a single logical page. */
580
- export interface DocumentPageSnapshot {
581
- /** Zero-based page index within the whole document. */
582
- pageIndex: number;
583
- /** Section that owns this page (zero-based). */
584
- sectionIndex: number;
585
- /** Zero-based page index within its owning section. */
586
- pageInSection: number;
587
- /** Estimated character offset where the page begins in the main story. */
588
- startOffset: number;
589
- /** Estimated character offset where the page ends in the main story. */
590
- endOffset: number;
591
- /** Page layout properties inherited from the section. */
592
- layout: PageLayoutSnapshot;
593
- }
631
+ /**
632
+ * Re-exported from `src/model/layout/page-layout-snapshot.ts`. See the
633
+ * `EditorStoryTarget` re-export above for the relocation rationale.
634
+ */
635
+ export type { DocumentPageSnapshot } from "../model/layout/page-layout-snapshot.ts";
594
636
 
595
637
  /** A heading entry in the document outline. */
596
638
  export interface DocumentHeadingSnapshot {
@@ -931,6 +973,29 @@ export type SurfaceInlineSegment =
931
973
  hyperlinkHref?: string;
932
974
  /** Cascaded run formatting for this text segment (docDefaults → paragraph style chain → character style → direct). Populated in `src/runtime/surface-projection.ts` via `resolveEffectiveRunFormatting`. Present only when the resolved cascade has at least one field. */
933
975
  resolvedRunFormatting?: CanonicalRunFormatting;
976
+ /**
977
+ * Layer-03 F6 revision-display posture flags. Populated when
978
+ * `createEditorSurfaceSnapshot` is called with
979
+ * `{ revisionMarkupMode }` and the segment's offset falls inside
980
+ * an attached `RevisionRecord.anchor` range in
981
+ * `document.review.revisions`. Consumers (pm-state-from-snapshot,
982
+ * render decorations) read these flags as the authoritative
983
+ * revision-display source of truth — no consumer should compute
984
+ * its own tracked-change posture from raw revisions.
985
+ *
986
+ * Shape mirrors `src/runtime/formatting/formatting-types.ts ::
987
+ * RevisionDisplayFlags`. Shape is duplicated here (not imported)
988
+ * because this is the public-types surface; the structural identity
989
+ * is enforced by `test/runtime/formatting/production-boundary.test.ts`.
990
+ */
991
+ revisionDisplay?: {
992
+ markupMode: "clean" | "simple" | "all";
993
+ hidden?: boolean;
994
+ strikethrough?: boolean;
995
+ insertionUnderline?: boolean;
996
+ deemphasize?: boolean;
997
+ authorColor?: string;
998
+ };
934
999
  }
935
1000
  | {
936
1001
  segmentId: string;
@@ -1248,7 +1313,7 @@ export type SurfaceBlockSnapshot =
1248
1313
  * this to claim the original block's position span without rendering
1249
1314
  * content.
1250
1315
  *
1251
- * See docs/plans/lane-2-render-performance.md.
1316
+ * See CLAUDE.md (lane status table)
1252
1317
  */
1253
1318
  placeholderSize?: number;
1254
1319
  state: "locked-preserve-only" | "placeholder-culled";
@@ -1273,7 +1338,7 @@ export interface EditorSurfaceSnapshot {
1273
1338
  * original position range but no content. `null` (default) = all blocks
1274
1339
  * are real (legacy behavior).
1275
1340
  *
1276
- * See docs/plans/lane-2-render-performance.md.
1341
+ * See CLAUDE.md (lane status table)
1277
1342
  */
1278
1343
  viewportBlockRange: { start: number; end: number } | null;
1279
1344
  }
@@ -2062,22 +2127,15 @@ export interface RuntimeRenderSnapshot {
2062
2127
  grabbedObjectId?: string | null;
2063
2128
  }
2064
2129
 
2065
- export interface EditorSessionState {
2066
- sessionVersion: "editor-session-state/1";
2067
- schemaVersion: RuntimePersistedEditorSnapshot["schemaVersion"];
2068
- documentId: string;
2069
- docId: string;
2070
- createdAt: string;
2071
- updatedAt: string;
2072
- editorBuild: string;
2073
- canonicalDocument: RuntimePersistedEditorSnapshot["canonicalDocument"];
2074
- compatibility: CompatibilityReport;
2075
- warningLog: EditorWarning[];
2076
- protectionSnapshot?: ProtectionSnapshot;
2077
- sourcePackage?: RuntimePersistedEditorSnapshot["sourcePackage"];
2078
- workflowOverlay?: WorkflowOverlay;
2079
- workflowMetadata?: WorkflowMetadataSnapshot;
2080
- }
2130
+ /**
2131
+ * Back-compat re-export. The canonical definition lives in
2132
+ * `src/session/session-state.ts` (Layer 01 owns the session-state
2133
+ * contract per docs/architecture/01-package-session.md). Kept here so
2134
+ * existing consumers that import `EditorSessionState` from the public
2135
+ * types barrel continue to compile.
2136
+ */
2137
+ import type { EditorSessionState } from "../session/session-state.ts";
2138
+ export type { EditorSessionState };
2081
2139
 
2082
2140
  export interface PersistedEditorSnapshot {
2083
2141
  snapshotVersion: RuntimePersistedEditorSnapshot["snapshotVersion"];
@@ -2095,6 +2153,10 @@ export interface PersistedEditorSnapshot {
2095
2153
  sourcePackage?: RuntimePersistedEditorSnapshot["sourcePackage"];
2096
2154
  workflowOverlay?: WorkflowOverlay;
2097
2155
  workflowMetadata?: WorkflowMetadataSnapshot;
2156
+ /** W10 — class-A overlay-visibility policies (see `OverlayVisibilityPolicy`). */
2157
+ visibilityPolicies?: readonly OverlayVisibilityPolicy[];
2158
+ /** X5 — class-A markup-mode policy (see `WorkflowMarkupModePolicy`). */
2159
+ markupModePolicy?: WorkflowMarkupModePolicy;
2098
2160
  }
2099
2161
 
2100
2162
  export interface AddCommentParams {
@@ -2299,6 +2361,85 @@ export interface WorkflowOverlay {
2299
2361
  metadataPersistence?: MetadataPersistenceMode;
2300
2362
  }
2301
2363
 
2364
+ // ---------------------------------------------------------------------------
2365
+ // W10 · Overlay-visibility policy (class-A canonical state)
2366
+ //
2367
+ // Spec: `docs/architecture/06-workflow-review.md` §W10 +
2368
+ // `docs/plans/refactor/state-classes-cross-cutting.md` §X1. Layer 06 owns
2369
+ // the storage + serialization; Layer 10 composes with the class-C local
2370
+ // preference in a single composition site (`ui.overlays.getVisibility`).
2371
+ // Consumers should read through `handle.workflow.getVisibilityPolicy(kind)`
2372
+ // rather than the overlay store directly.
2373
+ // ---------------------------------------------------------------------------
2374
+
2375
+ /** Closed union of overlay kinds whose visibility is policy-gated. */
2376
+ export type OverlayKind =
2377
+ | "scope-rail"
2378
+ | "comments"
2379
+ | "tracked-changes"
2380
+ | "suggestions"
2381
+ | "debug-panel"
2382
+ | "presence";
2383
+
2384
+ /**
2385
+ * Enforcement mode. `"authored-default"` defers to the user's local
2386
+ * preference (class C); `"always"` / `"never"` are hard overrides.
2387
+ */
2388
+ export type OverlayVisibilityEnforcement =
2389
+ | "authored-default"
2390
+ | "always"
2391
+ | "never";
2392
+
2393
+ /** Audit stamp for a policy change. */
2394
+ export interface OverlayVisibilityAuthorship {
2395
+ readonly actorId: string;
2396
+ readonly at: string;
2397
+ }
2398
+
2399
+ /** Class-A visibility policy for a single overlay kind. */
2400
+ export interface OverlayVisibilityPolicy {
2401
+ readonly kind: OverlayKind;
2402
+ readonly enforcement: OverlayVisibilityEnforcement;
2403
+ /** Only consulted when `enforcement === "authored-default"`. */
2404
+ readonly defaultOn: boolean;
2405
+ readonly authoredBy?: OverlayVisibilityAuthorship;
2406
+ }
2407
+
2408
+ // ---------------------------------------------------------------------------
2409
+ // X5 · Workflow markup-mode policy (class-A canonical state)
2410
+ //
2411
+ // Spec: `docs/plans/refactor/state-classes-cross-cutting.md` §"Slice X5 ·
2412
+ // markup-mode retrofit". Parallels the OverlayVisibilityPolicy shape but
2413
+ // is single-value (not per-kind) since there is exactly one active markup
2414
+ // mode at a time. Composed with the class-C local preference in L10
2415
+ // (`ui.viewport.getEffectiveMarkupMode`).
2416
+ //
2417
+ // Values mirror the existing `revisionMarkupMode` in
2418
+ // `src/runtime/formatting/formatting-context.ts` — `"clean" | "simple" |
2419
+ // "all"` — so the composed value flows straight into
2420
+ // `applyRevisionDisplay(run, revision, markupMode)` without conversion.
2421
+ // ---------------------------------------------------------------------------
2422
+
2423
+ export type WorkflowMarkupMode = "clean" | "simple" | "all";
2424
+
2425
+ /**
2426
+ * Policy enforcement. `"authored-default"` defers to the user's local
2427
+ * preference (class C); `"always"` hard-locks to the authored mode.
2428
+ *
2429
+ * Note: unlike `OverlayVisibilityEnforcement` there is no `"never"`
2430
+ * variant — a markup mode is always one of the three values; "never"
2431
+ * would be non-sensical ("never be in any markup mode" — no value to
2432
+ * pick). The two-value enforcement is sufficient.
2433
+ */
2434
+ export type WorkflowMarkupModeEnforcement = "authored-default" | "always";
2435
+
2436
+ /** Class-A markup-mode policy. Single record per document. */
2437
+ export interface WorkflowMarkupModePolicy {
2438
+ readonly mode: WorkflowMarkupMode;
2439
+ readonly enforcement: WorkflowMarkupModeEnforcement;
2440
+ readonly authoredBy?: OverlayVisibilityAuthorship;
2441
+ }
2442
+
2302
2443
  export type WorkflowMetadataPersistence =
2303
2444
  | "runtime-only"
2304
2445
  | "session"
@@ -3452,6 +3593,86 @@ export interface ChartPreviewResolveParams {
3452
3593
  heightEmu: number;
3453
3594
  }
3454
3595
 
3596
+ /**
3597
+ * P8 Step 7 — opaque reference the host returns after storing an
3598
+ * embedded-document payload to its own storage. Persisted inside
3599
+ * `customXml/item1.xml` under the `bw:embeddings` namespace so the
3600
+ * session can hand it back to `loadEmbeddedDocument` at export time.
3601
+ *
3602
+ * Field stability: additive only; no field is renamed or removed
3603
+ * across minor versions. Hosts should use structural narrowing to
3604
+ * ignore unknown fields.
3605
+ */
3606
+ export interface StorageReference {
3607
+ /**
3608
+ * Host-defined identifier for the storage provider (e.g. `"s3"`,
3609
+ * `"railway-blob"`). Opaque to the editor; the session just
3610
+ * round-trips it.
3611
+ */
3612
+ providerId: string;
3613
+ /**
3614
+ * Opaque handle used by the host to look up the payload. The
3615
+ * session never parses this — it reads, stores, and hands it back
3616
+ * unchanged.
3617
+ */
3618
+ handle: string;
3619
+ /**
3620
+ * SHA-256 hex digest of the original embedded-document bytes.
3621
+ * Computed by the session before calling `storeEmbeddedDocument`
3622
+ * so hosts can detect tampering when rehydrating via
3623
+ * `loadEmbeddedDocument`.
3624
+ */
3625
+ sha256: string;
3626
+ }
3627
+
3628
+ /**
3629
+ * P8 Step 7 — parameters passed to `EditorHostAdapter.storeEmbeddedDocument`
3630
+ * for every `offloadable` embedding the session encounters at load
3631
+ * time. The host extracts the payload to its storage and returns a
3632
+ * `StorageReference` the session persists into the `bw:embeddings`
3633
+ * customXml namespace.
3634
+ *
3635
+ * Field stability: additive only (same rules as
3636
+ * `ChartPreviewResolveParams`).
3637
+ */
3638
+ export interface StoreEmbeddedDocParams {
3639
+ /** Stable identifier of the parent document (the one being opened). */
3640
+ parentDocumentId: string;
3641
+ /**
3642
+ * Manifest entry describing the embedded object. Metadata-only —
3643
+ * the bytes ship separately via the `bytes` field so implementations
3644
+ * can stream them without re-reading through the manifest's lazy
3645
+ * `bytes()` accessor.
3646
+ */
3647
+ embedded: EmbeddedDocumentManifestLike;
3648
+ /**
3649
+ * Materialised bytes of the embedded document. Already extracted
3650
+ * from the OPC package; hosts do not need to call `embedded.bytes()`.
3651
+ */
3652
+ bytes: Uint8Array;
3653
+ }
3654
+
3655
+ /**
3656
+ * P8 Step 7 — structural subset of `EmbeddedDocumentManifest` (from
3657
+ * `src/session/types.ts`) exposed through the public host-adapter
3658
+ * surface. Avoids forcing the session-layer `EmbeddedDocumentManifest`
3659
+ * symbol to be re-exported from `public-types.ts` while still giving
3660
+ * hosts the metadata fields they need to drive the offload path.
3661
+ *
3662
+ * Field stability: additive only.
3663
+ */
3664
+ export interface EmbeddedDocumentManifestLike {
3665
+ /** Stable id across open/export (content-fingerprint derived). */
3666
+ readonly id: string;
3667
+ /** Three-way classification from `classifyEmbedding`. */
3668
+ readonly kind: "digestible" | "offloadable" | "store-only";
3669
+ readonly progId?: string;
3670
+ readonly mimeType?: string;
3671
+ readonly filename?: string;
3672
+ readonly size: number;
3673
+ readonly relationshipId: string;
3674
+ }
3675
+
3455
3676
  export interface EditorHostAdapter {
3456
3677
  /**
3457
3678
  * Called once at load time to retrieve a previously-saved session
@@ -3492,6 +3713,42 @@ export interface EditorHostAdapter {
3492
3713
  * activates and the error is logged non-fatally.
3493
3714
  */
3494
3715
  renderChartPreview?(params: ChartPreviewResolveParams): Promise<Uint8Array | null>;
3716
+ /**
3717
+ * P8 Step 7 — store an `offloadable` embedded document out of the
3718
+ * parent OPC package and return a `StorageReference` the session
3719
+ * persists into `customXml/item1.xml` under the `bw:embeddings`
3720
+ * namespace. Called exactly once per `offloadable` manifest entry
3721
+ * at load time, AND only when this method is implemented.
3722
+ *
3723
+ * When this method is absent (or when it throws / rejects), the
3724
+ * session falls back to `store-only` semantics for the entry —
3725
+ * bytes stay on the parent package through the opaque-preservation
3726
+ * path, same as today. Round-trip is byte-identical either way.
3727
+ *
3728
+ * `loadEmbeddedDocument` must round-trip any `StorageReference`
3729
+ * this method returns: calling `loadEmbeddedDocument(ref)` must
3730
+ * yield the same bytes (matching `ref.sha256`) the host received
3731
+ * in `params.bytes`.
3732
+ */
3733
+ storeEmbeddedDocument?(params: StoreEmbeddedDocParams): Promise<StorageReference>;
3734
+ /**
3735
+ * P8 Step 7 — rehydrate an `offloadable` embedded document by its
3736
+ * `StorageReference`. Called at export time for every entry the
3737
+ * session previously persisted into the `bw:embeddings` customXml
3738
+ * namespace via `storeEmbeddedDocument`.
3739
+ *
3740
+ * Return `Uint8Array` — the bytes are written back into the OPC
3741
+ * package at the original relationship target.
3742
+ * Return `null` — the session uses the `inlineBytes` fallback it
3743
+ * persisted alongside the reference at offload time. Round-trip
3744
+ * is preserved; the host-storage layer is effectively bypassed
3745
+ * for this specific entry.
3746
+ *
3747
+ * Rejections and thrown exceptions are caught and treated
3748
+ * identically to a `null` return. Export never fails on storage
3749
+ * unavailability (P3 guarantee).
3750
+ */
3751
+ loadEmbeddedDocument?(ref: StorageReference): Promise<Uint8Array | null>;
3495
3752
  }
3496
3753
 
3497
3754
  export interface EditorDatastoreAdapter {
@@ -3508,7 +3765,7 @@ export interface EditorDatastoreAdapter {
3508
3765
  // `snapshot_to_projection`, back-to-front anchor-sorted field fill,
3509
3766
  // `change_id → range` walking, and read-merge-write workflow-overlay
3510
3767
  // annotation. See `docs/wiki/agent-helpers.md` for the narrative and
3511
- // `docs/plans/lane-8-api-ergonomics.md` § Track H for the phased plan.
3768
+ // `CLAUDE.md (lane status table)` § Track H for the phased plan.
3512
3769
  //
3513
3770
  // Phase 1 ships type declarations and optional method signatures on
3514
3771
  // `WordReviewEditorRef`; runtime wiring lands in Phase 2, Python parity
@@ -3900,6 +4157,23 @@ export interface WordReviewEditorDiagnosticsFacet {
3900
4157
  }
3901
4158
 
3902
4159
  export interface WordReviewEditorRef {
4160
+ /**
4161
+ * L07 closure pass — opt into the V3 public API from a consumer holding
4162
+ * this ref. Returns the frozen `ApiV3` surface (`{ runtime, ai }`) bound
4163
+ * to the same `DocumentRuntime` this ref proxies. The result is cached
4164
+ * per-ref, so repeated calls return the same object reference.
4165
+ *
4166
+ * V3 is strictly additive — all existing V1/V2 ref methods remain. This
4167
+ * method exists so the mounted editor's own host code (and Storybook
4168
+ * consumers, and the probe script) can route through V3 without
4169
+ * standing up a second runtime. Before this method shipped, the only
4170
+ * production `createApiV3()` consumer was `services/debug/` plus test
4171
+ * scripts; this lands V3 as a real production-consumable seam at the
4172
+ * ref boundary.
4173
+ *
4174
+ * See `docs/architecture/07-runtime-api.md` §Seam-reality disclosure.
4175
+ */
4176
+ getApiV3(): ApiV3;
3903
4177
  focus(): void;
3904
4178
  blur(): void;
3905
4179
  undo(): void;
@@ -4006,6 +4280,34 @@ export interface WordReviewEditorRef {
4006
4280
  isDirty(): boolean;
4007
4281
  getFormattingState(): FormattingStateSnapshot;
4008
4282
  getStyleCatalog(): StyleCatalogSnapshot;
4283
+ /**
4284
+ * Replace text at an anchor (or the current selection when omitted).
4285
+ *
4286
+ * **Deprecated for agent / API consumers (refactor/08 Slice-7 plan
4287
+ * §"Retire legacy paths"):** this raw-anchor shape bypasses the
4288
+ * Layer-08 scope compiler's replacement lifecycle (validate →
4289
+ * compile → apply → audit). Agents + platform workblocks must use
4290
+ * the scope-scoped path:
4291
+ *
4292
+ * - `api.ai.applyReplacementScope({targetScopeId, proposedText})`
4293
+ * — AI-action-policy + telemetry-audit-backed path.
4294
+ * - `api.runtime.content.replaceText({scopeId, replacement})` —
4295
+ * host/UI path without the AI-action-policy composer.
4296
+ *
4297
+ * This ref method stays for UI consumers that dispatch replacements
4298
+ * by live selection position (not by scope id). It emits no
4299
+ * `ScopeActionAudit`; agent paths that call it silently bypass the
4300
+ * audit invariant (S5).
4301
+ *
4302
+ * CI guard: `scripts/ci-check-no-raw-offset-replacetext-on-v3.mjs`
4303
+ * rejects any raw-anchor `replaceText(text, anchor)` shape from the
4304
+ * `src/api/v3/**` surface.
4305
+ *
4306
+ * @deprecated for agent/API callers — use {@link api.ai.applyReplacementScope}
4307
+ * or {@link api.runtime.content.replaceText} (scope-scoped shapes). Ref
4308
+ * retained for live-selection UI drivers only.
4309
+ * @see api.ai.applyReplacementScope
4310
+ */
4009
4311
  replaceText(
4010
4312
  text: string,
4011
4313
  target?: EditorAnchorProjection,
@@ -4196,6 +4498,56 @@ export interface WordReviewEditorRef {
4196
4498
  setWorkflowMetadataEntries(entries: WorkflowMetadataEntry[]): void;
4197
4499
  clearWorkflowMetadataEntries(): void;
4198
4500
  getWorkflowMetadataSnapshot(): WorkflowMetadataSnapshot;
4501
+ /**
4502
+ * W10 — read the class-A overlay-visibility policy for a single
4503
+ * overlay kind. Returns `null` when the document has not authored a
4504
+ * policy for that kind (consumers fall back to class-C defaults).
4505
+ * Composition with the class-C local preference lives in Layer 10
4506
+ * (`ui.overlays.getVisibility`); this method is the class-A read only.
4507
+ */
4508
+ getVisibilityPolicy(kind: OverlayKind): OverlayVisibilityPolicy | null;
4509
+ /**
4510
+ * W10 — read the full class-A policy set. Returns an empty array for
4511
+ * documents that predate the schema.
4512
+ */
4513
+ getVisibilityPolicies(): readonly OverlayVisibilityPolicy[];
4514
+ /**
4515
+ * W10 — author a class-A policy. Persists via `customXml/item1.xml`
4516
+ * on next export + broadcasts via CRDT. Returns `true` when the call
4517
+ * actually changed state; callers can use the boolean to dedupe
4518
+ * subscriber wakeups.
4519
+ */
4520
+ setVisibilityPolicy(policy: OverlayVisibilityPolicy): boolean;
4521
+ /**
4522
+ * W10 — clear a class-A policy (document-predating-schema state).
4523
+ * Returns `true` on actual delete, `false` when no policy was set.
4524
+ */
4525
+ clearVisibilityPolicy(kind: OverlayKind): boolean;
4526
+ /**
4527
+ * W10 — subscribe to class-A policy-set changes (any kind). Fires
4528
+ * after a successful `setVisibilityPolicy` / `clearVisibilityPolicy`
4529
+ * call. Returns an unsubscribe function. Consumed by L10 X3's
4530
+ * `ui.overlays.subscribeVisibility` composition so UI subscribers
4531
+ * re-fire when an authoring tool mutates policy mid-session.
4532
+ */
4533
+ subscribeVisibilityPolicy(listener: () => void): () => void;
4534
+ /**
4535
+ * X5 — read the class-A markup-mode policy (single record). Returns
4536
+ * `null` when the document predates the schema. Composition with the
4537
+ * class-C local preference lives in L10 (`ui.viewport.getEffectiveMarkupMode`).
4538
+ */
4539
+ getMarkupModePolicy(): WorkflowMarkupModePolicy | null;
4540
+ /**
4541
+ * X5 — author the class-A markup-mode policy, or clear with `null`.
4542
+ * Persists via `customXml/item1.xml` on next export + broadcasts via
4543
+ * CRDT when collab is attached. Returns `true` when state changed.
4544
+ */
4545
+ setMarkupModePolicy(policy: WorkflowMarkupModePolicy | null): boolean;
4546
+ /**
4547
+ * X5 — subscribe to markup-mode policy changes. Returns unsubscribe.
4548
+ * Consumed by L10's X5 composition site.
4549
+ */
4550
+ subscribeMarkupModePolicy(listener: () => void): () => void;
4199
4551
  /**
4200
4552
  * Phase C §C1 — filter + project the current workflow overlay into a
4201
4553
  * scope-joined view. Reads a snapshot of the current overlay + metadata
@@ -4902,8 +5254,59 @@ export interface WordReviewEditorProps {
4902
5254
  customSelectionTools?: ReadonlyArray<
4903
5255
  import("../ui/headless/chrome-registry").SelectionToolRegistryEntry
4904
5256
  >;
5257
+ /**
5258
+ * Phase C.γ host-callback bag. When supplied, the workspace mounts
5259
+ * `TwWorkspaceChromeHost` which in turn mounts the right-click
5260
+ * context menu (`TwContextMenuPortal`) and the Ctrl/Cmd+K command
5261
+ * palette (`TwCommandPaletteMount`), dispatching through the shared
5262
+ * `editorActionRegistry`. Actions without a wired callback are
5263
+ * hidden from every surface — progressive disclosure per
5264
+ * `designsystem.md §2.1 principle 4`.
5265
+ *
5266
+ * Omit to preserve pre-Phase-C behavior (no right-click menu, no
5267
+ * palette). Required for the default editor to expose the
5268
+ * Phase C.γ surfaces shipped in `5fce913a`.
5269
+ */
5270
+ editorActionHost?: import("../ui-tailwind/chrome/editor-action-registry").EditorActionHostCallbacks;
5271
+ /**
5272
+ * Forward ref for the workspace's chrome controller. Wires the
5273
+ * `pm-command-bridge` `onContextMenuRequested` callback so a native
5274
+ * `contextmenu` event opens the menu at the click coordinates. Also
5275
+ * consumed by Phase D's inline "More…" buttons on demoted floating
5276
+ * toolbars.
5277
+ */
5278
+ chromeControllerRef?: import("react").Ref<
5279
+ import("../ui-tailwind/chrome/tw-workspace-chrome-host").TwWorkspaceChromeHostController
5280
+ >;
5281
+ /**
5282
+ * Suppress the global Ctrl/Cmd+K palette listener — e.g. when a
5283
+ * higher-priority modal captures keyboard focus. Defaults to
5284
+ * `false` (palette listener is active when `editorActionHost` is
5285
+ * supplied).
5286
+ */
5287
+ commandPaletteDisabled?: boolean;
5288
+ /**
5289
+ * Phase Q runtime-embedded debug UX (refactor/11 Slice 7 + refactor/10
5290
+ * Slice 5). Default is `"off"` — the editor mounts no debug chrome
5291
+ * and silently ignores the `ui.debug.attach()` hook. Flip to
5292
+ * `"top-bar"` to mount a slim status bar showing the active session
5293
+ * + scope telemetry, or to `"full"` to mount the tabbed overlay with
5294
+ * inspector / events / REPL panes.
5295
+ *
5296
+ * **CLAUDE.md Protected Invariant** — the default MUST be `"off"`.
5297
+ * Predecessor debug-preview props (`showUnsupportedObjectPreviews`,
5298
+ * `unsupportedPreviewsPolicy`) have regressed their safe defaults
5299
+ * multiple times; keep this one strict.
5300
+ */
5301
+ debugMode?: DebugMode;
4905
5302
  }
4906
5303
 
5304
+ /**
5305
+ * Phase Q debug-UX visibility mode. Consumed by
5306
+ * `WordReviewEditorProps.debugMode` + `src/ui-tailwind/debug/**`.
5307
+ */
5308
+ export type DebugMode = "off" | "top-bar" | "full";
5309
+
4907
5310
  /**
4908
5311
  * Selection context handed to host-delegated shortcut callbacks
4909
5312
  * (`onFindRequested`, `onReplaceRequested`, `onGoToRequested`,