@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
@@ -27,180 +27,52 @@ import type {
27
27
  import type { ResolvedDocumentSection } from "../document-layout.ts";
28
28
 
29
29
  // ---------------------------------------------------------------------------
30
- // Enriched graph types
30
+ // Types all pure data shapes relocated to `src/model/layout/`
31
+ // per `docs/plans/cross-layer-coord-04.md §1.12`.
32
+ //
33
+ // Pass 1 (2026-04-22): pure page-region / fragment / line-box / note /
34
+ // anchor types moved to `page-graph-types.ts`.
35
+ // Pass 2 (2026-04-22): `RuntimePageGraph`, `RuntimePageNode`, and
36
+ // `BuildPageGraphInput` moved to `runtime-page-graph-types.ts`
37
+ // (after `ResolvedPageStories` + `ResolvedDocumentSection` +
38
+ // `PageLayoutSnapshot` + `DocumentPageSnapshot` were also
39
+ // relocated to the model tree). This cuts Layer 01's
40
+ // `CacheEnvelope → RuntimePageGraph → runtime/**` transit.
41
+ //
42
+ // Re-exported here so every existing consumer import of these types
43
+ // from this file continues working unchanged. Graph construction
44
+ // functions (`buildPageGraph`, `spliceGraph`) and the `graphRevision`
45
+ // counter stay in this file — only the type shapes moved.
31
46
  // ---------------------------------------------------------------------------
32
47
 
33
- export interface RuntimePageGraph {
34
- /** Monotonically increasing revision stamp. */
35
- revision: number;
36
- /** Ordered page nodes. */
37
- pages: RuntimePageNode[];
38
- /** Flat list of every block fragment produced during pagination. */
39
- fragments: RuntimeBlockFragment[];
40
- /** Per-offset anchor index for O(log n) lookup. */
41
- anchors: RuntimePageAnchor[];
42
- /** Section metadata. */
43
- sections: ResolvedDocumentSection[];
44
- /** Total non-blank page count. */
45
- contentPageCount: number;
46
- }
47
-
48
- export interface RuntimePageNode {
49
- pageId: string;
50
- pageIndex: number;
51
- sectionIndex: number;
52
- pageInSection: number;
53
- startOffset: number;
54
- endOffset: number;
55
- layout: PageLayoutSnapshot;
56
- stories: ResolvedPageStories;
57
- /** Sub-regions on the page. */
58
- regions: RuntimePageRegions;
59
- /** Line boxes rendered in the body region. */
60
- lineBoxes: RuntimeLineBox[];
61
- /** Footnote allocations reserved at the bottom of the page. */
62
- noteAllocations: RuntimeNoteAllocation[];
63
- /** Whether this page is a blank filler (from even/odd page breaks). */
64
- isBlankFiller: boolean;
65
- }
66
-
67
- export interface RuntimePageRegions {
68
- body: RuntimePageRegion;
69
- header?: RuntimePageRegion;
70
- footer?: RuntimePageRegion;
71
- /**
72
- * For multi-column bodies, `body.columns` is populated. For single-column
73
- * pages, the top-level body is used and `columns` is undefined.
74
- */
75
- columns?: RuntimePageRegion[];
76
- /**
77
- * P4 — footnote regions reserved at the bottom of the page (above
78
- * the footer band) when `noteAllocations` reserved space for one or
79
- * more footnote bodies. Empty until the page-graph builder
80
- * populates them, which lands alongside the P8 per-page region
81
- * rendering work. The shape exists now so consumers
82
- * (`getStoryRegionsOnPage` / `getLineBoxesForRegion("footnote-area")`)
83
- * have a stable seam to read from when the builder catches up —
84
- * pre-P8 reads return `[]` because no entries are populated.
85
- */
86
- footnotes?: RuntimePageRegion[];
87
- }
88
-
89
- export interface RuntimePageRegion {
90
- kind: "body" | "header" | "footer" | "column" | "footnote-area";
91
- /** Twips offset from page top (header) or similar region-specific origin. */
92
- originTwips: number;
93
- /** Width in twips. */
94
- widthTwips: number;
95
- /** Height in twips. */
96
- heightTwips: number;
97
- /** IDs of block fragments rendered in this region, in order. */
98
- fragmentIds: string[];
99
- }
100
-
101
- export interface RuntimeBlockFragment {
102
- fragmentId: string;
103
- /** Canonical block id the fragment slices. */
104
- blockId: string;
105
- /** Page this fragment lives on. */
106
- pageId: string;
107
- /** Zero-based order within the page region. */
108
- orderInRegion: number;
109
- /** Region id the fragment sits in (matches RuntimePageRegion.kind). */
110
- regionKind: RuntimePageRegion["kind"];
111
- /** Inclusive from / exclusive to offsets within the main story. */
112
- from: number;
113
- to: number;
114
- /** Height consumed on this page (twips). */
115
- heightTwips: number;
116
- /**
117
- * Fragment classification.
118
- * - `"whole"` (default): the fragment represents the entire block; no slicing.
119
- * - `"paragraph-slice"`: one of several fragments produced by intra-paragraph
120
- * line-box splitting. `paragraphLineRange` identifies which lines this
121
- * slice renders.
122
- * - `"table-slice"`: one of several fragments produced by row-boundary table
123
- * splitting (emitted by the table-fidelity workstream).
124
- * `tableRowRange` identifies which canonical rows this slice renders.
125
- * Consumers that predate multi-fragment blocks may treat an absent `kind`
126
- * as `"whole"`.
127
- */
128
- kind?: "whole" | "paragraph-slice" | "table-slice";
129
- /**
130
- * For `kind === "paragraph-slice"`, the inclusive-exclusive line-box index
131
- * range rendered by this slice plus the total line count for the source
132
- * paragraph. `from`/`to` still span the full paragraph offset range on
133
- * every slice — only the visible lines differ.
134
- */
135
- paragraphLineRange?: {
136
- from: number;
137
- to: number;
138
- totalLines: number;
139
- };
140
- /**
141
- * For `kind === "table-slice"`, the inclusive-exclusive row-index range
142
- * rendered by this slice. Repeated header rows (when the table has
143
- * `isHeader` rows and `continuation` pages) are implied by the owning
144
- * table's canonical row list — consumers prepend header rows for slices
145
- * whose `from > 0`.
146
- */
147
- tableRowRange?: {
148
- from: number;
149
- to: number;
150
- totalRows: number;
151
- };
152
- /**
153
- * Slice 5 — opaque style-chain ref derived from the block's `styleId`.
154
- * Used by `analyzeStylesChange` to bound invalidation to the first page
155
- * that carries a fragment referencing a dirty style.
156
- */
157
- resolvedStyleChainRef?: string;
158
- /**
159
- * Slice 5 — numbering instance id copied from the block's `numbering`
160
- * field. Used by `analyzeNumberingChange` to bound invalidation to the
161
- * first page that carries a fragment from the affected list instance.
162
- */
163
- numberingInstanceId?: string;
164
- }
48
+ export type {
49
+ RuntimePageRegions,
50
+ RuntimePageRegion,
51
+ RuntimeBlockFragment,
52
+ RuntimeLineBox,
53
+ RuntimeNoteAllocation,
54
+ RuntimePageAnchor,
55
+ } from "../../model/layout/page-graph-types.ts";
56
+
57
+ export type {
58
+ RuntimePageGraph,
59
+ RuntimePageNode,
60
+ BuildPageGraphInput,
61
+ } from "../../model/layout/runtime-page-graph-types.ts";
165
62
 
166
- export interface RuntimeLineBox {
167
- /** Fragment this line belongs to. */
168
- fragmentId: string;
169
- /** Zero-based line index inside the fragment. */
170
- lineIndex: number;
171
- /** Baseline twips from the region's origin. */
172
- baselineTwips: number;
173
- /** Line height twips. */
174
- heightTwips: number;
175
- /** Approximate inline width consumed on this line. */
176
- widthTwips: number;
177
- }
178
-
179
- export interface RuntimeNoteAllocation {
180
- noteKind: "footnote" | "endnote";
181
- noteId: string;
182
- /** Twips reserved at the bottom of the page for this note's content. */
183
- reservedHeightTwips: number;
184
- /**
185
- * P8 — fragment ID of this note's body. The corresponding
186
- * `RuntimeBlockFragment` lives in `RuntimePageGraph.fragments` with
187
- * `regionKind: "footnote-area"`. Undefined when the engine hasn't
188
- * yet emitted a fragment for the allocation (back-compat for pre-P8
189
- * callers).
190
- */
191
- fragmentId?: string;
192
- }
193
-
194
- export interface RuntimePageAnchor {
195
- /** Story target the anchor is for. Main story is the common case. */
196
- storyKey: string;
197
- /** Offset the anchor represents. */
198
- offset: number;
199
- /** Page id resolved for this offset. */
200
- pageId: string;
201
- /** Fragment id resolved for this offset, if available. */
202
- fragmentId?: string;
203
- }
63
+ import type {
64
+ RuntimeBlockFragment,
65
+ RuntimeLineBox,
66
+ RuntimeNoteAllocation,
67
+ RuntimePageAnchor,
68
+ RuntimePageRegion,
69
+ RuntimePageRegions,
70
+ } from "../../model/layout/page-graph-types.ts";
71
+ import type {
72
+ RuntimePageGraph,
73
+ RuntimePageNode,
74
+ BuildPageGraphInput,
75
+ } from "../../model/layout/runtime-page-graph-types.ts";
204
76
 
205
77
  // ---------------------------------------------------------------------------
206
78
  // Graph construction
@@ -208,36 +80,6 @@ export interface RuntimePageAnchor {
208
80
 
209
81
  let graphRevision = 0;
210
82
 
211
- export interface BuildPageGraphInput {
212
- pages: readonly DocumentPageSnapshot[];
213
- sections: readonly ResolvedDocumentSection[];
214
- stories: readonly ResolvedPageStories[];
215
- /** Optional block fragments pre-computed by pagination; when omitted the
216
- * graph produces one fragment per page spanning its entire offset range. */
217
- fragments?: readonly RuntimeBlockFragment[];
218
- /**
219
- * Optional block fragments keyed by pageIndex with the `pageId` omitted.
220
- * `buildPageGraph` fills in the pageId using the graph's fresh revision
221
- * stamp. Use this when the caller wants to emit per-block fragments but
222
- * cannot know the pageId in advance.
223
- */
224
- fragmentsByPageIndex?: ReadonlyMap<
225
- number,
226
- ReadonlyArray<Omit<RuntimeBlockFragment, "pageId">>
227
- >;
228
- /** Optional per-page line boxes. */
229
- lineBoxes?: ReadonlyMap<string, RuntimeLineBox[]>;
230
- /** Optional per-page note allocations keyed by graph-assigned pageId. */
231
- noteAllocations?: ReadonlyMap<string, RuntimeNoteAllocation[]>;
232
- /**
233
- * P8 — per-page note allocations keyed by pageIndex (0-based).
234
- * Parallel to `fragmentsByPageIndex`; `buildPageGraph` uses the index to
235
- * look up allocations without requiring callers to know the graph-internal
236
- * `page-${revision}-${index}` pageId in advance.
237
- */
238
- noteAllocationsByPageIndex?: ReadonlyMap<number, RuntimeNoteAllocation[]>;
239
- }
240
-
241
83
  export function buildPageGraph(input: BuildPageGraphInput): RuntimePageGraph;
242
84
  export function buildPageGraph(
243
85
  pages: readonly DocumentPageSnapshot[],
@@ -284,15 +126,13 @@ export function buildPageGraph(
284
126
  const pageFragments = aggregatedFragments.filter((f) => f.pageId === pageId);
285
127
  // Split fragments into body-region ones (for the body fragmentIds list)
286
128
  // and footnote-area ones (handled by buildRegions via noteAllocations).
287
- const bodyPageFragments = pageFragments.filter(
129
+ let bodyPageFragments = pageFragments.filter(
288
130
  (f) => f.regionKind !== "footnote-area",
289
131
  );
290
- const fragmentIds = bodyPageFragments.map((f) => f.fragmentId);
291
132
 
292
133
  // If no body fragments were supplied, synthesize a coarse body fragment so
293
134
  // the graph is still internally consistent.
294
- let bodyFragmentIds = fragmentIds;
295
- if (fragmentIds.length === 0 && page.endOffset > page.startOffset) {
135
+ if (bodyPageFragments.length === 0 && page.endOffset > page.startOffset) {
296
136
  const coarse: RuntimeBlockFragment = {
297
137
  fragmentId: `${pageId}-body-0`,
298
138
  blockId: "synthetic",
@@ -304,8 +144,9 @@ export function buildPageGraph(
304
144
  heightTwips: 0,
305
145
  };
306
146
  aggregatedFragments.push(coarse);
307
- bodyFragmentIds = [coarse.fragmentId];
147
+ bodyPageFragments = [coarse];
308
148
  }
149
+ const bodyFragmentIds = bodyPageFragments.map((f) => f.fragmentId);
309
150
 
310
151
  // Resolve per-page note allocations: prefer noteAllocationsByPageIndex
311
152
  // (index-based, suitable when the caller doesn't know the graph-internal
@@ -325,7 +166,7 @@ export function buildPageGraph(
325
166
  endOffset: page.endOffset,
326
167
  layout: page.layout,
327
168
  stories,
328
- regions: buildRegions(page.layout, bodyFragmentIds, stories, pageNoteAllocations),
169
+ regions: buildRegions(page.layout, bodyPageFragments, stories, pageNoteAllocations),
329
170
  lineBoxes: input.lineBoxes?.get(pageId) ?? [],
330
171
  noteAllocations: pageNoteAllocations,
331
172
  isBlankFiller: page.pageInSection === -1,
@@ -352,10 +193,11 @@ export function buildPageGraph(
352
193
 
353
194
  function buildRegions(
354
195
  layout: PageLayoutSnapshot,
355
- bodyFragmentIds: readonly string[],
196
+ bodyFragments: readonly RuntimeBlockFragment[],
356
197
  stories: ResolvedPageStories,
357
198
  noteAllocations: readonly RuntimeNoteAllocation[] = [],
358
199
  ): RuntimePageRegions {
200
+ const bodyFragmentIds = bodyFragments.map((f) => f.fragmentId);
359
201
  // Gutter (w:gutter / pgMar @gutter) reduces usable body width on the bound
360
202
  // edge. Parity fix with `src/runtime/page-layout-estimation.ts:153`, which
361
203
  // already subtracts `layout.gutter`; prior to this edit the graph path
@@ -428,6 +270,17 @@ function buildRegions(
428
270
  1,
429
271
  Math.floor((bodyWidth - gap * (layout.columns - 1)) / layout.columns),
430
272
  );
273
+ // Refactor/04 Slice 4 — partition body fragments into per-column
274
+ // fragment-id lists. Fragments without `columnIndex` (e.g. blocks
275
+ // from a pre-Slice-4 call path, or single-column pages rendered on a
276
+ // multi-column layout revision) fall through to column 0 so the
277
+ // union of `columns[*].fragmentIds` still covers every body fragment.
278
+ const perColumnIds: string[][] = Array.from({ length: layout.columns }, () => []);
279
+ for (const frag of bodyFragments) {
280
+ const raw = frag.columnIndex;
281
+ const idx = raw !== undefined && raw >= 0 && raw < layout.columns ? raw : 0;
282
+ perColumnIds[idx]!.push(frag.fragmentId);
283
+ }
431
284
  const columns: RuntimePageRegion[] = [];
432
285
  for (let i = 0; i < layout.columns; i += 1) {
433
286
  columns.push({
@@ -435,7 +288,7 @@ function buildRegions(
435
288
  originTwips: layout.marginTop,
436
289
  widthTwips: perColumnWidth,
437
290
  heightTwips: Math.max(0, bodyHeight),
438
- fragmentIds: [],
291
+ fragmentIds: perColumnIds[i]!,
439
292
  });
440
293
  }
441
294
  regions.columns = columns;
@@ -16,23 +16,18 @@ import type {
16
16
  EditorStoryTarget,
17
17
  PageLayoutSnapshot,
18
18
  } from "../../api/public-types";
19
+ import type { ResolvedPageStories } from "../../model/layout/resolved-layout-types.ts";
19
20
 
20
21
  // ---------------------------------------------------------------------------
21
22
  // Types
22
23
  // ---------------------------------------------------------------------------
23
24
 
24
- export interface ResolvedPageStories {
25
- /** Header story target for this page, if any. */
26
- header?: EditorStoryTarget;
27
- /** Footer story target for this page, if any. */
28
- footer?: EditorStoryTarget;
29
- /** Whether this is a "first page" in its section (title page behavior). */
30
- isFirstPage: boolean;
31
- /** Whether this is an even-numbered page (1-indexed for display). */
32
- isEvenPage: boolean;
33
- /** The effective page number for display (accounting for page numbering settings). */
34
- displayPageNumber: number;
35
- }
25
+ /**
26
+ * Pass 2 (2026-04-22) relocated to
27
+ * `src/model/layout/resolved-layout-types.ts`. Re-exported here so
28
+ * existing consumers of `ResolvedPageStories` keep working unchanged.
29
+ */
30
+ export type { ResolvedPageStories } from "../../model/layout/resolved-layout-types.ts";
36
31
 
37
32
  // ---------------------------------------------------------------------------
38
33
  // Resolver