@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,65 @@
1
+ /**
2
+ * Field scope kind — Slice 3.
3
+ *
4
+ * A field is an inline `FieldNode` living inside a paragraph. Content is
5
+ * the concatenated inline text (the field's result tree). Instruction,
6
+ * refresh status, and family live on the formatting + audit projections
7
+ * so AI consumers can branch on family (`PAGE`, `REF`, `STYLEREF`, …)
8
+ * without re-parsing the instruction string.
9
+ */
10
+
11
+ import type { InlineNode } from "../../../model/canonical-document.ts";
12
+ import type { FieldEnumeratedScope } from "../enumerate-scopes.ts";
13
+ import { deriveReplaceability } from "../replaceability.ts";
14
+ import type {
15
+ SemanticScope,
16
+ SemanticScopeFormatting,
17
+ } from "../semantic-scope-types.ts";
18
+ import { buildExcerpt } from "./_paragraph-text.ts";
19
+
20
+ function flattenFieldText(children: readonly InlineNode[]): string {
21
+ const parts: string[] = [];
22
+ for (const child of children) {
23
+ if (child.type === "text") parts.push(child.text);
24
+ else if (child.type === "tab") parts.push("\t");
25
+ else if (child.type === "hard_break" || child.type === "column_break") parts.push("\n");
26
+ else if (child.type === "symbol") parts.push(child.char ?? "");
27
+ else if (child.type === "hyperlink" || child.type === "field") {
28
+ parts.push(flattenFieldText(child.children as readonly InlineNode[]));
29
+ }
30
+ }
31
+ return parts.join("");
32
+ }
33
+
34
+ export function compileFieldScope(entry: FieldEnumeratedScope): SemanticScope {
35
+ const { handle, field } = entry;
36
+ const text = flattenFieldText(field.children as readonly InlineNode[]);
37
+ const formatting: SemanticScopeFormatting = {};
38
+ return {
39
+ handle,
40
+ kind: "field",
41
+ classifications: entry.classifications,
42
+ content: {
43
+ text,
44
+ excerpt: buildExcerpt(text),
45
+ },
46
+ formatting,
47
+ layout: {},
48
+ geometry: {},
49
+ // Fields are computed — agents must not edit the result tree
50
+ // directly; authoring goes through the instruction. Workflow mode
51
+ // `view` matches replaceability `preserve-only`.
52
+ workflow: { scopeIds: [], effectiveMode: "view" },
53
+ replaceability: deriveReplaceability(entry.kind, handle.provenance),
54
+ audit: {
55
+ source: "runtime",
56
+ derivedFrom: [
57
+ "canonical",
58
+ `field-family:${field.fieldFamily ?? "unknown"}`,
59
+ `field-instruction:${field.instruction}`,
60
+ ],
61
+ confidence: "medium",
62
+ },
63
+ partial: true,
64
+ };
65
+ }
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Heading scope kind — Slice 1 + 2 + 2026-04-22 closure.
3
+ *
4
+ * A heading is a paragraph carrying either `outlineLevel` or a `Heading{N}`
5
+ * style id. Formatting flows through the scope-local seam, which delegates
6
+ * to Layer 03's `resolveEffectiveFormatting` when the full canonical
7
+ * document is threaded.
8
+ *
9
+ * When we cannot determine the outline level (neither `outlineLevel` nor a
10
+ * `Heading\d` style id is present on the paragraph), we OMIT `outlineLevel`
11
+ * from the formatting projection — silently defaulting to 0 would be a
12
+ * correctness surprise (consumers would see H1 when the author's intent
13
+ * was unknown).
14
+ */
15
+
16
+ import type { CanonicalDocument } from "../../../model/canonical-document.ts";
17
+ import { resolveEffectiveFormattingForScope } from "../_formatting-seam.ts";
18
+ import type { ParagraphLikeEnumeratedScope } from "../enumerate-scopes.ts";
19
+ import { deriveReplaceability } from "../replaceability.ts";
20
+ import type {
21
+ SemanticScope,
22
+ SemanticScopeFormatting,
23
+ SemanticScopeWorkflow,
24
+ } from "../semantic-scope-types.ts";
25
+
26
+ import {
27
+ buildExcerpt,
28
+ extractParagraphText,
29
+ } from "./_paragraph-text.ts";
30
+
31
+ export interface CompileHeadingOptions {
32
+ readonly document?: CanonicalDocument;
33
+ readonly paragraphIndex?: number;
34
+ readonly workflow?: SemanticScopeWorkflow;
35
+ /** See `CompileParagraphOptions.sectionIndex` — coord-08 §12. */
36
+ readonly sectionIndex?: number;
37
+ }
38
+
39
+ export function compileHeadingScope(
40
+ entry: ParagraphLikeEnumeratedScope,
41
+ options: CompileHeadingOptions = {},
42
+ ): SemanticScope {
43
+ const { handle, paragraph } = entry;
44
+ const text = extractParagraphText(paragraph);
45
+ const effective = resolveEffectiveFormattingForScope({
46
+ paragraph,
47
+ ...(options.document ? { document: options.document } : {}),
48
+ ...(typeof options.paragraphIndex === "number"
49
+ ? { paragraphIndex: options.paragraphIndex }
50
+ : {}),
51
+ });
52
+ const formatting: SemanticScopeFormatting = {
53
+ ...(typeof effective.outlineLevel === "number"
54
+ ? { outlineLevel: effective.outlineLevel }
55
+ : {}),
56
+ ...(effective.paragraphStyleId
57
+ ? { paragraphStyleId: effective.paragraphStyleId }
58
+ : {}),
59
+ ...(effective.emphasis.length > 0 ? { emphasis: effective.emphasis } : {}),
60
+ };
61
+ return {
62
+ handle,
63
+ kind: "heading",
64
+ classifications: entry.classifications,
65
+ content: {
66
+ text,
67
+ excerpt: buildExcerpt(text),
68
+ },
69
+ formatting,
70
+ layout:
71
+ typeof options.sectionIndex === "number"
72
+ ? { sectionIndex: options.sectionIndex }
73
+ : {},
74
+ geometry: {},
75
+ workflow: options.workflow ?? { scopeIds: [], effectiveMode: "edit" },
76
+ replaceability: deriveReplaceability(entry.kind, handle.provenance),
77
+ audit: {
78
+ source: "runtime",
79
+ derivedFrom: ["canonical"],
80
+ confidence: "medium",
81
+ },
82
+ partial: true,
83
+ };
84
+ }
@@ -0,0 +1,77 @@
1
+ /**
2
+ * List-item scope kind — Slice 1 + 2 + 2026-04-22 closure.
3
+ *
4
+ * Carries the numbering binding on the formatting projection. When the
5
+ * seam has access to Layer 03 (full canonical document threaded), the
6
+ * resolved marker glyph ("1.", "a)", "•") lands in
7
+ * `formatting.numbering.label`; without it, only the instance + level are
8
+ * populated.
9
+ */
10
+
11
+ import type { CanonicalDocument } from "../../../model/canonical-document.ts";
12
+ import { resolveEffectiveFormattingForScope } from "../_formatting-seam.ts";
13
+ import type { ParagraphLikeEnumeratedScope } from "../enumerate-scopes.ts";
14
+ import { deriveReplaceability } from "../replaceability.ts";
15
+ import type {
16
+ SemanticScope,
17
+ SemanticScopeFormatting,
18
+ SemanticScopeWorkflow,
19
+ } from "../semantic-scope-types.ts";
20
+
21
+ import {
22
+ buildExcerpt,
23
+ extractParagraphText,
24
+ } from "./_paragraph-text.ts";
25
+
26
+ export interface CompileListItemOptions {
27
+ readonly document?: CanonicalDocument;
28
+ readonly paragraphIndex?: number;
29
+ readonly workflow?: SemanticScopeWorkflow;
30
+ /** See `CompileParagraphOptions.sectionIndex` — coord-08 §12. */
31
+ readonly sectionIndex?: number;
32
+ }
33
+
34
+ export function compileListItemScope(
35
+ entry: ParagraphLikeEnumeratedScope,
36
+ options: CompileListItemOptions = {},
37
+ ): SemanticScope {
38
+ const { handle, paragraph } = entry;
39
+ const text = extractParagraphText(paragraph);
40
+ const effective = resolveEffectiveFormattingForScope({
41
+ paragraph,
42
+ ...(options.document ? { document: options.document } : {}),
43
+ ...(typeof options.paragraphIndex === "number"
44
+ ? { paragraphIndex: options.paragraphIndex }
45
+ : {}),
46
+ });
47
+ const formatting: SemanticScopeFormatting = {
48
+ ...(effective.numbering ? { numbering: effective.numbering } : {}),
49
+ ...(effective.paragraphStyleId
50
+ ? { paragraphStyleId: effective.paragraphStyleId }
51
+ : {}),
52
+ ...(effective.emphasis.length > 0 ? { emphasis: effective.emphasis } : {}),
53
+ };
54
+ return {
55
+ handle,
56
+ kind: "list-item",
57
+ classifications: entry.classifications,
58
+ content: {
59
+ text,
60
+ excerpt: buildExcerpt(text),
61
+ },
62
+ formatting,
63
+ layout:
64
+ typeof options.sectionIndex === "number"
65
+ ? { sectionIndex: options.sectionIndex }
66
+ : {},
67
+ geometry: {},
68
+ workflow: options.workflow ?? { scopeIds: [], effectiveMode: "edit" },
69
+ replaceability: deriveReplaceability(entry.kind, handle.provenance),
70
+ audit: {
71
+ source: "runtime",
72
+ derivedFrom: ["canonical"],
73
+ confidence: "medium",
74
+ },
75
+ partial: true,
76
+ };
77
+ }
@@ -0,0 +1,182 @@
1
+ /**
2
+ * Paragraph scope kind — Slice 1 + 2 + 2026-04-22 closure.
3
+ *
4
+ * Routes formatting through the scope-local seam, which itself delegates
5
+ * to Layer 03's `resolveEffectiveFormatting` when `doc` + `paragraphIndex`
6
+ * are threaded. Without them, the seam degrades to a narrow paragraph-
7
+ * only projection (still honest, just narrower).
8
+ *
9
+ * `layout` / `geometry` / `workflow` are intentionally bounded — see
10
+ * module `layout-geometry-bounded.md` in the architecture doc. Paragraph
11
+ * scopes stay `partial: true` because those projections are not yet
12
+ * compiler-backed.
13
+ */
14
+
15
+ import type { CanonicalDocument } from "../../../model/canonical-document.ts";
16
+ import { resolveEffectiveFormattingForScope } from "../_formatting-seam.ts";
17
+ import type { ParagraphLikeEnumeratedScope } from "../enumerate-scopes.ts";
18
+ import { computeBlockPositions } from "../position-map.ts";
19
+ import { deriveReplaceability } from "../replaceability.ts";
20
+ import {
21
+ isStructuredReplacementContent,
22
+ type ReplacementScope,
23
+ type RuntimeOperationPlan,
24
+ type SemanticScope,
25
+ type SemanticScopeFormatting,
26
+ type SemanticScopeWorkflow,
27
+ } from "../semantic-scope-types.ts";
28
+ import type { CanonicalDocumentEnvelope } from "../../../core/state/editor-state.ts";
29
+
30
+ import {
31
+ buildExcerpt,
32
+ extractParagraphText,
33
+ } from "./_paragraph-text.ts";
34
+
35
+ export interface CompileParagraphOptions {
36
+ readonly document?: CanonicalDocument;
37
+ readonly paragraphIndex?: number;
38
+ readonly workflow?: SemanticScopeWorkflow;
39
+ /**
40
+ * 0-based section index derived by counting `section_break` blocks
41
+ * that appear before this paragraph's block (see
42
+ * `buildSectionIndexByBlockIndex` in `../compile-scope.ts`). When
43
+ * present, projects into `SemanticScopeLayout.sectionIndex`. Closes
44
+ * coord-08 §12 / harness finding E5a.
45
+ */
46
+ readonly sectionIndex?: number;
47
+ }
48
+
49
+ export function compileParagraphScope(
50
+ entry: ParagraphLikeEnumeratedScope,
51
+ options: CompileParagraphOptions = {},
52
+ ): SemanticScope {
53
+ const { handle, paragraph } = entry;
54
+ const text = extractParagraphText(paragraph);
55
+ const effective = resolveEffectiveFormattingForScope({
56
+ paragraph,
57
+ ...(options.document ? { document: options.document } : {}),
58
+ ...(typeof options.paragraphIndex === "number"
59
+ ? { paragraphIndex: options.paragraphIndex }
60
+ : {}),
61
+ });
62
+ const formatting: SemanticScopeFormatting = {
63
+ ...(effective.paragraphStyleId
64
+ ? { paragraphStyleId: effective.paragraphStyleId }
65
+ : {}),
66
+ ...(effective.emphasis.length > 0 ? { emphasis: effective.emphasis } : {}),
67
+ };
68
+ return {
69
+ handle,
70
+ kind: "paragraph",
71
+ classifications: entry.classifications,
72
+ content: {
73
+ text,
74
+ excerpt: buildExcerpt(text),
75
+ },
76
+ formatting,
77
+ layout:
78
+ typeof options.sectionIndex === "number"
79
+ ? { sectionIndex: options.sectionIndex }
80
+ : {},
81
+ geometry: {},
82
+ workflow: options.workflow ?? { scopeIds: [], effectiveMode: "edit" },
83
+ replaceability: deriveReplaceability(entry.kind, handle.provenance),
84
+ audit: {
85
+ source: "runtime",
86
+ derivedFrom:
87
+ entry.classifications.length > 0
88
+ ? ["canonical", "workflow-overlay"]
89
+ : ["canonical"],
90
+ confidence: "medium",
91
+ },
92
+ partial: true,
93
+ };
94
+ }
95
+
96
+ export interface CompileParagraphReplacementOptions {
97
+ readonly document: CanonicalDocumentEnvelope;
98
+ readonly posture: "direct-edit" | "suggest-mode";
99
+ }
100
+
101
+ /**
102
+ * Slice 5 — lower a paragraph-scope replacement proposal into a
103
+ * `RuntimeOperationPlan`. Handles two content kinds:
104
+ *
105
+ * - `kind: "text"` → single `text-replace` step spanning the
106
+ * paragraph's canonical block range; passes a flat string through
107
+ * the existing `text.insert` runtime command.
108
+ * - `kind: "structured"` → single `fragment-replace` step carrying
109
+ * a `CanonicalDocumentFragment` payload; dispatches via the
110
+ * runtime's `insertFragment` pipeline with the block range as
111
+ * selection. Unblocked 2026-04-22 once L02 shipped
112
+ * `CanonicalDocumentFragment` (`src/model/canonical-document.ts`).
113
+ *
114
+ * Determinism (S3): the plan is a pure projection of (blockIndex,
115
+ * content, posture). No timestamps, no random ids.
116
+ */
117
+ export function compileParagraphReplacement(
118
+ entry: ParagraphLikeEnumeratedScope,
119
+ proposed: ReplacementScope,
120
+ options: CompileParagraphReplacementOptions,
121
+ ): RuntimeOperationPlan | null {
122
+ if (proposed.operation !== "replace") return null;
123
+
124
+ const blocks = computeBlockPositions(options.document);
125
+ const blockRange = blocks.find((b) => b.blockIndex === entry.blockIndex);
126
+ if (!blockRange) return null;
127
+
128
+ if (proposed.proposedContent.kind === "text") {
129
+ const text = proposed.proposedContent.text ?? "";
130
+ const stepKind =
131
+ options.posture === "suggest-mode" ? "text-insert-tracked" : "text-replace";
132
+ return {
133
+ scopeId: entry.handle.scopeId,
134
+ targetKind: "paragraph",
135
+ operation: proposed.operation,
136
+ steps: Object.freeze([
137
+ {
138
+ kind: stepKind,
139
+ summary:
140
+ stepKind === "text-replace"
141
+ ? `replace paragraph #${entry.blockIndex} text (len ${text.length})`
142
+ : `suggest-mode paragraph #${entry.blockIndex} text replace (len ${text.length})`,
143
+ range: { from: blockRange.from, to: blockRange.to },
144
+ text,
145
+ },
146
+ ]),
147
+ ...(proposed.preserve ? { preserve: proposed.preserve } : {}),
148
+ posture: options.posture,
149
+ };
150
+ }
151
+
152
+ if (proposed.proposedContent.kind === "structured") {
153
+ // Structured-fragment path (L02-shipped CanonicalDocumentFragment).
154
+ // Suggest-mode fragment replacement is NOT wired today — it would
155
+ // require per-block tracked-insert/delete dispatch which depends
156
+ // on the same runtime-core suggest-mode primitive that blocks
157
+ // coord item 2. Refuse cleanly until both are ready.
158
+ if (options.posture === "suggest-mode") {
159
+ return null;
160
+ }
161
+ const fragment = proposed.proposedContent.structured;
162
+ if (!isStructuredReplacementContent(fragment)) return null;
163
+ const blockCount = fragment.blocks.length;
164
+ return {
165
+ scopeId: entry.handle.scopeId,
166
+ targetKind: "paragraph",
167
+ operation: proposed.operation,
168
+ steps: Object.freeze([
169
+ {
170
+ kind: "fragment-replace",
171
+ summary: `replace paragraph #${entry.blockIndex} with structured fragment (${blockCount} block(s))`,
172
+ range: { from: blockRange.from, to: blockRange.to },
173
+ fragment,
174
+ },
175
+ ]),
176
+ ...(proposed.preserve ? { preserve: proposed.preserve } : {}),
177
+ posture: options.posture,
178
+ };
179
+ }
180
+
181
+ return null;
182
+ }
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Revision scope kind — Slice 3.
3
+ *
4
+ * Projects a canonical `RevisionRecord` into a scope. Content is a terse
5
+ * one-line summary (`<kind> by <authorId>`); richer narrative (before /
6
+ * after payloads, semanticKind, linkedRevisionIds) rides on the `audit`
7
+ * projection for agent inspection without inflating `content.text`.
8
+ */
9
+
10
+ import type { RevisionEnumeratedScope } from "../enumerate-scopes.ts";
11
+ import { deriveReplaceability } from "../replaceability.ts";
12
+ import type {
13
+ SemanticScope,
14
+ SemanticScopeWorkflow,
15
+ } from "../semantic-scope-types.ts";
16
+
17
+ function revisionSummary(
18
+ revision: RevisionEnumeratedScope["revision"],
19
+ ): string {
20
+ const author = revision.authorId ?? "unknown-author";
21
+ return `${revision.kind} by ${author}`;
22
+ }
23
+
24
+ export function compileRevisionScope(
25
+ entry: RevisionEnumeratedScope,
26
+ ): SemanticScope {
27
+ const { handle, revision } = entry;
28
+ const text = revisionSummary(revision);
29
+ const workflow: SemanticScopeWorkflow = {
30
+ scopeIds: [revision.changeId],
31
+ effectiveMode: revision.status === "open" ? "suggest" : "view",
32
+ ...(revision.status === "detached"
33
+ ? { blockedReasons: ["revision-detached"] }
34
+ : {}),
35
+ };
36
+ const derivedFrom: string[] = [
37
+ "canonical.review.revisions",
38
+ `kind:${revision.kind}`,
39
+ `status:${revision.status}`,
40
+ ];
41
+ if (revision.metadata?.semanticKind) {
42
+ derivedFrom.push(`semantic-kind:${revision.metadata.semanticKind}`);
43
+ }
44
+ return {
45
+ handle,
46
+ kind: "revision",
47
+ classifications: entry.classifications,
48
+ content: { text },
49
+ formatting: {},
50
+ layout: {},
51
+ geometry: {},
52
+ workflow,
53
+ replaceability: deriveReplaceability(entry.kind, handle.provenance),
54
+ audit: {
55
+ source: revision.metadata?.source === "import" ? "import" : "runtime",
56
+ derivedFrom,
57
+ confidence: revision.status === "detached" ? "low" : "high",
58
+ },
59
+ // layout / geometry projections unpopulated until refactor/05 Slice 5.
60
+ partial: true,
61
+ };
62
+ }
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Table-cell scope kind — Slice 2.
3
+ *
4
+ * Content is the joined text of the cell's paragraphs. Formatting carries
5
+ * the cell's structural role (header / body / footer) derived from the
6
+ * enclosing row. A cell's replaceability is `text-only` because editing
7
+ * structure (grid span, merge) belongs to a higher-level operation than
8
+ * scope-scoped replacement.
9
+ */
10
+
11
+ import type { TableCellEnumeratedScope } from "../enumerate-scopes.ts";
12
+ import type {
13
+ SemanticScope,
14
+ SemanticScopeFormatting,
15
+ SemanticScopeWorkflow,
16
+ } from "../semantic-scope-types.ts";
17
+
18
+ import { deriveTableCellRole } from "../_formatting-seam.ts";
19
+ import { buildExcerpt } from "./_paragraph-text.ts";
20
+ import { extractCellText } from "./_table-text.ts";
21
+
22
+ export interface CompileTableCellOptions {
23
+ readonly workflow?: SemanticScopeWorkflow;
24
+ }
25
+
26
+ export function compileTableCellScope(
27
+ entry: TableCellEnumeratedScope,
28
+ options: CompileTableCellOptions = {},
29
+ ): SemanticScope {
30
+ const { handle, cell, row, table, rowIndex } = entry;
31
+ const text = extractCellText(cell);
32
+ const role = deriveTableCellRole({ row, rowIndex, table }, cell);
33
+ const formatting: SemanticScopeFormatting = { tableRole: role };
34
+ return {
35
+ handle,
36
+ kind: "table-cell",
37
+ classifications: entry.classifications,
38
+ content: {
39
+ text,
40
+ excerpt: buildExcerpt(text),
41
+ },
42
+ formatting,
43
+ layout: {},
44
+ geometry: {},
45
+ workflow: options.workflow ?? { scopeIds: [], effectiveMode: "edit" },
46
+ replaceability: {
47
+ level: "text-only",
48
+ reason: "table-cell-preserves-structure",
49
+ },
50
+ audit: {
51
+ source: "runtime",
52
+ derivedFrom: ["canonical"],
53
+ confidence: "medium",
54
+ },
55
+ partial: true,
56
+ };
57
+ }
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Table-row scope kind — Slice 2.
3
+ *
4
+ * Content is the joined text of the row's cells (pipe-separated). The row
5
+ * carries the structural role (header / body / footer) on the formatting
6
+ * projection so consumers can branch without walking structure.
7
+ */
8
+
9
+ import type { TableRowEnumeratedScope } from "../enumerate-scopes.ts";
10
+ import type {
11
+ SemanticScope,
12
+ SemanticScopeFormatting,
13
+ SemanticScopeWorkflow,
14
+ } from "../semantic-scope-types.ts";
15
+
16
+ import { deriveTableCellRole } from "../_formatting-seam.ts";
17
+ import { buildExcerpt } from "./_paragraph-text.ts";
18
+ import { extractRowText } from "./_table-text.ts";
19
+
20
+ export interface CompileTableRowOptions {
21
+ readonly workflow?: SemanticScopeWorkflow;
22
+ }
23
+
24
+ export function compileTableRowScope(
25
+ entry: TableRowEnumeratedScope,
26
+ options: CompileTableRowOptions = {},
27
+ ): SemanticScope {
28
+ const { handle, row, table, rowIndex } = entry;
29
+ const text = extractRowText(row);
30
+ // Role is a row-level concept; borrow the cell-role derivation since it
31
+ // reads `row.isHeader` + row position. A header row's cells are all
32
+ // "header"; a body row's cells are "body"; terminal row is "footer".
33
+ const firstCell = row.cells[0];
34
+ const role = firstCell
35
+ ? deriveTableCellRole({ row, rowIndex, table }, firstCell)
36
+ : "body";
37
+ const formatting: SemanticScopeFormatting = { tableRole: role };
38
+ return {
39
+ handle,
40
+ kind: "table-row",
41
+ classifications: entry.classifications,
42
+ content: {
43
+ text,
44
+ excerpt: buildExcerpt(text),
45
+ },
46
+ formatting,
47
+ layout: {},
48
+ geometry: {},
49
+ workflow: options.workflow ?? { scopeIds: [], effectiveMode: "edit" },
50
+ replaceability: {
51
+ level: "blocked",
52
+ reason: "table-row-replacement-not-yet-implemented",
53
+ },
54
+ audit: {
55
+ source: "runtime",
56
+ derivedFrom: ["canonical"],
57
+ confidence: "medium",
58
+ },
59
+ partial: true,
60
+ };
61
+ }
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Table scope kind — Slice 2.
3
+ *
4
+ * A table scope is the whole `TableNode`. Formatting projects `styleId`;
5
+ * content is a joined plain-text preview of the first two rows so AI
6
+ * bundles can disambiguate tables by opening content.
7
+ */
8
+
9
+ import type { TableEnumeratedScope } from "../enumerate-scopes.ts";
10
+ import type {
11
+ SemanticScope,
12
+ SemanticScopeFormatting,
13
+ SemanticScopeWorkflow,
14
+ } from "../semantic-scope-types.ts";
15
+
16
+ import { buildExcerpt } from "./_paragraph-text.ts";
17
+ import { extractTablePreview } from "./_table-text.ts";
18
+
19
+ export interface CompileTableOptions {
20
+ readonly workflow?: SemanticScopeWorkflow;
21
+ }
22
+
23
+ export function compileTableScope(
24
+ entry: TableEnumeratedScope,
25
+ options: CompileTableOptions = {},
26
+ ): SemanticScope {
27
+ const { handle, table } = entry;
28
+ const previewText = extractTablePreview(table);
29
+ const formatting: SemanticScopeFormatting = {
30
+ ...(table.styleId ? { paragraphStyleId: table.styleId } : {}),
31
+ };
32
+ return {
33
+ handle,
34
+ kind: "table",
35
+ classifications: entry.classifications,
36
+ content: {
37
+ text: previewText,
38
+ excerpt: buildExcerpt(previewText),
39
+ },
40
+ formatting,
41
+ layout: {},
42
+ geometry: {},
43
+ workflow: options.workflow ?? { scopeIds: [], effectiveMode: "edit" },
44
+ replaceability: {
45
+ level: "blocked",
46
+ reason: "table-replacement-not-yet-implemented",
47
+ },
48
+ audit: {
49
+ source: "runtime",
50
+ derivedFrom: ["canonical"],
51
+ confidence: "medium",
52
+ },
53
+ partial: true,
54
+ };
55
+ }