@beyondwork/docx-react-component 1.0.66 → 1.0.69

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (384) hide show
  1. package/README.md +75 -931
  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 -4795
  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
@@ -0,0 +1,342 @@
1
+ /**
2
+ * resolveChromeComposition — canonical chrome-composition seam (layer 10, §U5.b).
3
+ *
4
+ * Relocated from `src/ui-tailwind/chrome/chrome-composition-model.ts` by
5
+ * refactor/10 Slice 8 so the UI API owns chrome composition end-to-end
6
+ * (architecture 10 §U5). `ui.chrome.getComposition(input)` wraps this
7
+ * function in refactor/10 Slice 9. A re-export shim remains at the old
8
+ * path during consumer migration.
9
+ *
10
+ * Normative references:
11
+ * - docs/reference/designsystem.md §2.3 (chrome hierarchy: Shell / Workspace /
12
+ * Local context / Management rail)
13
+ * - docs/reference/designsystem.md §8.3 (three-axis rule — runtime/surface/chrome)
14
+ * - docs/architecture/10-ui-api.md §U5.b (ChromeComposition target shape)
15
+ *
16
+ * Perf discipline (CLAUDE.md §Performance Invariants #4 + #7):
17
+ * - Pure function. No DOM reads, no runtime calls, no observers.
18
+ * - Structurally equal on equal inputs, but each call allocates a NEW
19
+ * outer object + NEW Sets + NEW arrays. Callers that want referential
20
+ * stability MUST wrap the call in `useMemo` with an explicit
21
+ * dependency list. The memoization hook at
22
+ * `src/ui-tailwind/review-workspace/use-workspace-composition.ts`
23
+ * handles this for the mounted workspace consumer.
24
+ */
25
+
26
+ import type {
27
+ EditorRole,
28
+ WordReviewEditorChromeOptions,
29
+ WordReviewEditorChromePreset,
30
+ WordReviewEditorChromeVisibility,
31
+ } from "../../public-types";
32
+ import {
33
+ resolveChromePresetOptions,
34
+ resolveChromeVisibilityForPreset,
35
+ } from "./chrome-preset-model";
36
+
37
+ /**
38
+ * Pure breakpoint resolver — inlined at layer 10 so chrome composition does
39
+ * not reach into layer 11 for presentation helpers. The React hook
40
+ * `useContainerBreakpoint` (layer 11, `src/ui-tailwind/chrome/use-container-breakpoint.ts`)
41
+ * carries its own copy for its ResizeObserver wiring. Keeping them in sync
42
+ * is trivial — this is a 5-line mapping over a threshold record.
43
+ */
44
+ type BreakpointMap = Readonly<Record<string, number>>;
45
+ function resolveBreakpoint<T extends BreakpointMap>(
46
+ width: number,
47
+ thresholds: T,
48
+ ): keyof T | null {
49
+ let best: keyof T | null = null;
50
+ let bestThreshold = -Infinity;
51
+ for (const name of Object.keys(thresholds) as (keyof T)[]) {
52
+ const t = thresholds[name] as number;
53
+ if (width >= t && t > bestThreshold) {
54
+ best = name;
55
+ bestThreshold = t;
56
+ }
57
+ }
58
+ return best;
59
+ }
60
+
61
+ export type EditorChromeMode = "edit" | "review" | "workflow" | "more";
62
+ export type EditorRailTab = "comments" | "changes" | "workflow" | "health";
63
+
64
+ /**
65
+ * LocalSurfaceKind enumerates every surface type the global local-surface
66
+ * arbiter (Phase F) knows about. Phase A ships the enum so consumers can
67
+ * begin typing against it; Phase F wires the arbiter that consumes it.
68
+ */
69
+ export type LocalSurfaceKind =
70
+ | "none"
71
+ | "selection-format"
72
+ | "comment-preview"
73
+ | "suggestion-card"
74
+ | "workflow-card"
75
+ | "blocked-card"
76
+ | "scope-card"
77
+ | "context-menu";
78
+
79
+ export type DiagnosticsSeverity = "none" | "info" | "warning" | "blocked";
80
+ export type ChromeDensity = "compact" | "standard" | "comfortable";
81
+ export type ChromeResponsiveTier = "compact" | "standard" | "wide";
82
+
83
+ export interface DiagnosticsSignal {
84
+ readonly severity: DiagnosticsSeverity;
85
+ readonly count: number;
86
+ }
87
+
88
+ export interface WorkspaceRowComposition {
89
+ readonly left: readonly string[];
90
+ readonly contextBand: {
91
+ readonly owner: EditorChromeMode;
92
+ readonly items: readonly string[];
93
+ };
94
+ readonly right: readonly string[];
95
+ }
96
+
97
+ export interface RailComposition {
98
+ readonly open: boolean;
99
+ readonly activeTab: EditorRailTab | null;
100
+ readonly visibleTabs: ReadonlySet<EditorRailTab>;
101
+ readonly pinnedTabs: ReadonlySet<EditorRailTab>;
102
+ }
103
+
104
+ export interface ChromeComposition {
105
+ readonly mode: EditorChromeMode;
106
+ readonly shell: {
107
+ readonly visible: true;
108
+ readonly modeSwitcher: "always";
109
+ };
110
+ readonly workspaceRow: WorkspaceRowComposition;
111
+ readonly rail: RailComposition;
112
+ readonly diagnostics: DiagnosticsSignal;
113
+ readonly density: ChromeDensity;
114
+ readonly responsiveTier: ChromeResponsiveTier;
115
+ readonly visibility: WordReviewEditorChromeVisibility;
116
+ }
117
+
118
+ export interface ChromeCompositionInput {
119
+ readonly chromePreset: WordReviewEditorChromePreset;
120
+ readonly chromeOptions?: Partial<WordReviewEditorChromeOptions>;
121
+ readonly chromeVisibility?: Partial<WordReviewEditorChromeVisibility>;
122
+ readonly reviewMode?: "editing" | "review";
123
+ readonly role?: EditorRole;
124
+ readonly readOnly?: boolean;
125
+ readonly markupDisplay?:
126
+ | "all-markup"
127
+ | "simple-markup"
128
+ | "no-markup"
129
+ | "original"
130
+ | "clean"
131
+ | "simple"
132
+ | "all";
133
+ readonly activeRailTab?: EditorRailTab | null;
134
+ readonly pinnedRailTabs?: ReadonlySet<EditorRailTab>;
135
+ readonly density?: ChromeDensity;
136
+ readonly containerWidth?: number;
137
+ readonly diagnosticsSignal?: DiagnosticsSignal;
138
+ /**
139
+ * Shell-owned mode override. The shell passes `"more"` here when it
140
+ * opens the diagnostics / search surface. All other modes are derived
141
+ * from runtime signals (role, reviewMode); this field exists so
142
+ * `resolveChromeComposition` can produce `mode: "more"` without
143
+ * conflating it with the other three runtime-derived modes.
144
+ * Layer 10 (`src/api/v3/ui/chrome.ts`) will wrap this seam.
145
+ */
146
+ readonly modeOverride?: EditorChromeMode;
147
+ }
148
+
149
+ /**
150
+ * Container-driven responsive tier thresholds (per designsystem.md §2.13:
151
+ * "Responsive rules are container-driven, not viewport-only"). The named
152
+ * set mirrors the `compact | standard | wide` triple used across shell,
153
+ * workspace row, and rail.
154
+ */
155
+ export const CHROME_RESPONSIVE_THRESHOLDS = {
156
+ compact: 0,
157
+ standard: 720,
158
+ wide: 1200,
159
+ } as const;
160
+
161
+ /**
162
+ * Derive the `mode` field from the richest posture signal available:
163
+ * - explicit shell override (`modeOverride`) wins — used for "more"
164
+ * - explicit workflow role (runtime authority) comes next
165
+ * - reviewMode="review" (session signal) comes next
166
+ * - default is "edit"
167
+ */
168
+ function deriveMode(input: ChromeCompositionInput): EditorChromeMode {
169
+ if (input.modeOverride) return input.modeOverride;
170
+ if (input.role === "workflow") return "workflow";
171
+ if (input.reviewMode === "review") return "review";
172
+ return "edit";
173
+ }
174
+
175
+ /**
176
+ * Context-band item tables per audit §2.5. Each table names the item ids
177
+ * that the band exposes in that mode; ordering is the render order.
178
+ *
179
+ * These are contract with Phase B (TwContextBand). The band reads this
180
+ * array and renders a button per id through a shared registry.
181
+ */
182
+ const CONTEXT_BAND_ITEMS_BY_MODE: Record<EditorChromeMode, readonly string[]> = {
183
+ edit: [
184
+ "paragraph-style",
185
+ "bold",
186
+ "italic",
187
+ "underline",
188
+ "list-bullet",
189
+ "list-numbered",
190
+ "insert-menu",
191
+ ],
192
+ review: [
193
+ "review-current-label",
194
+ "review-prev",
195
+ "review-next",
196
+ "review-accept",
197
+ "review-reject",
198
+ "markup-display",
199
+ ],
200
+ workflow: [
201
+ "scope-current-label",
202
+ "scope-prev",
203
+ "scope-next",
204
+ "workflow-claim",
205
+ "workflow-skip",
206
+ "workflow-complete",
207
+ "workflow-blocked-explanation",
208
+ ],
209
+ more: [
210
+ "diagnostics-link",
211
+ "compatibility-link",
212
+ "outline-link",
213
+ "search-link",
214
+ ],
215
+ };
216
+
217
+ /**
218
+ * Left edge is the stable-utility cluster per audit §2.3. "Stable" means
219
+ * the same actions repeat across modes; paragraph style is edit-only since
220
+ * review/workflow modes do not expose structural formatting here.
221
+ */
222
+ function resolveLeftEdge(mode: EditorChromeMode): readonly string[] {
223
+ if (mode === "edit") return ["undo", "redo", "paragraph-style"];
224
+ return ["undo", "redo"];
225
+ }
226
+
227
+ /**
228
+ * Right edge per audit §2.3: rail toggle + diagnostics signal (severity +
229
+ * count, not detail) + zoom + overflow.
230
+ *
231
+ * The right cluster is intentionally mode-agnostic today — "more" mode's
232
+ * command / search affordance lives in the shell header (§6.1), not in
233
+ * the workspace row's right edge. If Phase D or later finds mode-
234
+ * dependent right-cluster items, add a `mode` parameter.
235
+ */
236
+ function resolveRightEdge(
237
+ diagnosticsSignal: DiagnosticsSignal,
238
+ ): readonly string[] {
239
+ const items: string[] = ["rail-toggle"];
240
+ if (diagnosticsSignal.severity !== "none" || diagnosticsSignal.count > 0) {
241
+ items.push("diagnostics-signal");
242
+ }
243
+ items.push("zoom", "overflow");
244
+ return items;
245
+ }
246
+
247
+ /**
248
+ * Rail visibility rules per audit §2.9 and designsystem.md §6.11:
249
+ * - comments/changes/workflow visible when rail is open
250
+ * - health visible when diagnostics signal present
251
+ * - empty tabs hide unless pinned
252
+ * - pinned tabs always visible
253
+ */
254
+ function resolveVisibleRailTabs(
255
+ railOpen: boolean,
256
+ diagnosticsSignal: DiagnosticsSignal,
257
+ pinned: ReadonlySet<EditorRailTab>,
258
+ ): ReadonlySet<EditorRailTab> {
259
+ const visible = new Set<EditorRailTab>();
260
+ if (railOpen) {
261
+ visible.add("comments");
262
+ visible.add("changes");
263
+ visible.add("workflow");
264
+ if (diagnosticsSignal.severity !== "none" || diagnosticsSignal.count > 0) {
265
+ visible.add("health");
266
+ }
267
+ }
268
+ // Pinned tabs survive even when the rail is closed or when the tab is empty.
269
+ for (const tab of pinned) {
270
+ visible.add(tab);
271
+ }
272
+ return visible;
273
+ }
274
+
275
+ /**
276
+ * Main entry. Pure, referentially stable for equal inputs.
277
+ */
278
+ export function resolveChromeComposition(
279
+ input: ChromeCompositionInput,
280
+ ): ChromeComposition {
281
+ const mode = deriveMode(input);
282
+ const options = resolveChromePresetOptions(
283
+ input.chromePreset,
284
+ input.chromeOptions,
285
+ input.role,
286
+ );
287
+ const visibility = resolveChromeVisibilityForPreset({
288
+ chromePreset: input.chromePreset,
289
+ chromeOptions: input.chromeOptions,
290
+ chromeVisibility: input.chromeVisibility,
291
+ });
292
+ const diagnosticsSignal: DiagnosticsSignal =
293
+ input.diagnosticsSignal ?? { severity: "none", count: 0 };
294
+ const density: ChromeDensity = input.density ?? "standard";
295
+ const pinnedRailTabs: ReadonlySet<EditorRailTab> =
296
+ input.pinnedRailTabs ?? new Set<EditorRailTab>();
297
+ const railOpen = options.showReviewRail && visibility.reviewRail;
298
+ const visibleTabs = resolveVisibleRailTabs(
299
+ railOpen,
300
+ diagnosticsSignal,
301
+ pinnedRailTabs,
302
+ );
303
+
304
+ // Default active tab: honor caller; otherwise land on the mode-appropriate tab.
305
+ const defaultActive: EditorRailTab =
306
+ mode === "workflow" ? "workflow" : mode === "review" ? "changes" : "comments";
307
+ const activeTab: EditorRailTab | null =
308
+ input.activeRailTab !== undefined
309
+ ? input.activeRailTab
310
+ : railOpen
311
+ ? defaultActive
312
+ : null;
313
+
314
+ const responsiveTier: ChromeResponsiveTier =
315
+ (resolveBreakpoint(
316
+ input.containerWidth ?? CHROME_RESPONSIVE_THRESHOLDS.standard,
317
+ CHROME_RESPONSIVE_THRESHOLDS,
318
+ ) as ChromeResponsiveTier | null) ?? "standard";
319
+
320
+ return {
321
+ mode,
322
+ shell: { visible: true, modeSwitcher: "always" },
323
+ workspaceRow: {
324
+ left: resolveLeftEdge(mode),
325
+ contextBand: {
326
+ owner: mode,
327
+ items: CONTEXT_BAND_ITEMS_BY_MODE[mode],
328
+ },
329
+ right: resolveRightEdge(diagnosticsSignal),
330
+ },
331
+ rail: {
332
+ open: railOpen,
333
+ activeTab,
334
+ visibleTabs,
335
+ pinnedTabs: pinnedRailTabs,
336
+ },
337
+ diagnostics: diagnosticsSignal,
338
+ density,
339
+ responsiveTier,
340
+ visibility,
341
+ };
342
+ }
@@ -1,10 +1,20 @@
1
+ /**
2
+ * Chrome preset + visibility composition — layer 10.
3
+ *
4
+ * Relocated from `src/ui-tailwind/chrome/chrome-preset-model.ts` by
5
+ * refactor/10 Slice 8 so the UI API owns the chrome-composition seam
6
+ * end-to-end (architecture 10 §U5). Pure type-shape logic, no DOM, no
7
+ * React. Consumed by `chrome-composition.ts` (also layer 10) to compose
8
+ * `ChromeComposition`. A re-export shim remains at the old path during
9
+ * consumer migration.
10
+ */
1
11
  import type {
2
12
  EditorRole,
3
13
  WordReviewEditorChromeOptions,
4
14
  WordReviewEditorChromePreset,
5
15
  WordReviewEditorChromeVisibility,
6
16
  WordReviewEditorProps,
7
- } from "../../api/public-types";
17
+ } from "../../public-types";
8
18
 
9
19
  export function resolveChromePreset(
10
20
  chromePreset: WordReviewEditorProps["chromePreset"],