@a3s-lab/office 0.2.2 → 0.4.0

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 (277) hide show
  1. package/COLLABORATION_ROADMAP.md +426 -0
  2. package/README.md +649 -10
  3. package/dist/0~1403.js +1 -1
  4. package/dist/0~2805.js +1279 -0
  5. package/dist/{0~use-office-draft.js → 0~345.js} +30 -1
  6. package/dist/0~3539.js +1 -1
  7. package/dist/0~3557.js +1 -1
  8. package/dist/0~3635.js +1 -1
  9. package/dist/0~4595.js +123 -12
  10. package/dist/0~4980.js +154 -0
  11. package/dist/0~5050.js +124 -113
  12. package/dist/{0~9512.js → 0~6090.js} +540 -3
  13. package/dist/0~7048.js +92 -66
  14. package/dist/0~7614.js +2 -1
  15. package/dist/0~7754.js +5653 -0
  16. package/dist/0~9445.js +1 -1
  17. package/dist/0~document-editor.js +4992 -3323
  18. package/dist/0~markdown-editor.js +250 -44
  19. package/dist/0~pdf-viewer.js +1016 -24
  20. package/dist/0~presentation-editor.js +179 -8
  21. package/dist/0~spreadsheet-editor.js +3371 -578
  22. package/dist/0~work-docx-export.js +6801 -658
  23. package/dist/0~work-docx-import.js +1388 -795
  24. package/dist/0~work-office-diagnostics.js +524 -30
  25. package/dist/0~work-pptx-export.js +2 -1
  26. package/dist/0~work-pptx-import.js +1 -2
  27. package/dist/0~work-presentation-charts.js +1 -1
  28. package/dist/2591.js +197 -0
  29. package/dist/3818.js +1090 -0
  30. package/dist/4104.js +970 -60
  31. package/dist/432.js +171 -14
  32. package/dist/4476.js +2008 -0
  33. package/dist/4560.js +674 -0
  34. package/dist/4650.js +70 -0
  35. package/dist/{1134.js → 5184.js} +183 -1
  36. package/dist/6489.js +18 -18
  37. package/dist/7060.js +132 -0
  38. package/dist/8715.js +2 -136
  39. package/dist/8928.js +16778 -0
  40. package/dist/9787.js +209 -0
  41. package/dist/core.d.ts +29 -9
  42. package/dist/core.js +10 -2
  43. package/dist/index.js +13 -3
  44. package/dist/internal/collaboration/office-collaboration-flat-json.d.ts +13 -0
  45. package/dist/internal/collaboration/office-collaboration-json.d.ts +4 -0
  46. package/dist/internal/collaboration/office-collaboration-presence.d.ts +86 -0
  47. package/dist/internal/collaboration/office-collaboration-transport.d.ts +42 -0
  48. package/dist/internal/collaboration/office-collaboration.d.ts +85 -0
  49. package/dist/internal/collaboration/office-document-collaboration-bibliography.d.ts +7 -0
  50. package/dist/internal/collaboration/office-document-collaboration-claims.d.ts +9 -0
  51. package/dist/internal/collaboration/office-document-collaboration-comments.d.ts +7 -0
  52. package/dist/internal/collaboration/office-document-collaboration-sidecar-utils.d.ts +27 -0
  53. package/dist/internal/collaboration/office-document-collaboration-sidecars.d.ts +16 -0
  54. package/dist/internal/collaboration/office-document-collaboration.d.ts +45 -0
  55. package/dist/internal/collaboration/office-markdown-collaboration.d.ts +31 -0
  56. package/dist/internal/collaboration/office-pdf-collaboration-claims.d.ts +4 -0
  57. package/dist/internal/collaboration/office-pdf-collaboration-conflicts.d.ts +2 -0
  58. package/dist/internal/collaboration/office-pdf-collaboration-model.d.ts +26 -0
  59. package/dist/internal/collaboration/office-pdf-collaboration-records.d.ts +21 -0
  60. package/dist/internal/collaboration/office-pdf-collaboration-types.d.ts +91 -0
  61. package/dist/internal/collaboration/office-pdf-collaboration-validation.d.ts +4 -0
  62. package/dist/internal/collaboration/office-pdf-collaboration.d.ts +35 -0
  63. package/dist/internal/collaboration/office-presentation-collaboration-model.d.ts +25 -0
  64. package/dist/internal/collaboration/office-presentation-collaboration-records.d.ts +22 -0
  65. package/dist/internal/collaboration/office-presentation-collaboration-validation.d.ts +4 -0
  66. package/dist/internal/collaboration/office-presentation-collaboration.d.ts +32 -0
  67. package/dist/internal/collaboration/office-spreadsheet-collaboration-cells.d.ts +13 -0
  68. package/dist/internal/collaboration/office-spreadsheet-collaboration-claims.d.ts +4 -0
  69. package/dist/internal/collaboration/office-spreadsheet-collaboration-conflicts.d.ts +2 -0
  70. package/dist/internal/collaboration/office-spreadsheet-collaboration-flat-json.d.ts +10 -0
  71. package/dist/internal/collaboration/office-spreadsheet-collaboration-model.d.ts +31 -0
  72. package/dist/internal/collaboration/office-spreadsheet-collaboration-records.d.ts +17 -0
  73. package/dist/internal/collaboration/office-spreadsheet-collaboration-validation.d.ts +4 -0
  74. package/dist/internal/collaboration/office-spreadsheet-collaboration.d.ts +32 -0
  75. package/dist/internal/design-system/primitives/navigation/tabs.d.ts +3 -1
  76. package/dist/internal/features/work/components/work-document-page-border.d.ts +6 -0
  77. package/dist/internal/features/work/editors/document-command-catalog.d.ts +536 -0
  78. package/dist/internal/features/work/editors/document-editor-focus.d.ts +1 -1
  79. package/dist/internal/features/work/editors/document-editor-support.d.ts +7 -3
  80. package/dist/internal/features/work/editors/document-editor.d.ts +8 -2
  81. package/dist/internal/features/work/editors/document-external-content.d.ts +14 -0
  82. package/dist/internal/features/work/editors/document-format-clipboard.d.ts +6 -0
  83. package/dist/internal/features/work/editors/document-format-tools.d.ts +4 -0
  84. package/dist/internal/features/work/editors/document-layout-panel.d.ts +4 -1
  85. package/dist/internal/features/work/editors/document-page-chrome-wps-shortcuts.d.ts +2 -0
  86. package/dist/internal/features/work/editors/document-page-layout-ribbon.d.ts +14 -0
  87. package/dist/internal/features/work/editors/document-page-stack.d.ts +10 -1
  88. package/dist/internal/features/work/editors/document-page-thumbnail.d.ts +2 -0
  89. package/dist/internal/features/work/editors/document-pagination-run-coordinator.d.ts +26 -0
  90. package/dist/internal/features/work/editors/document-picture-properties-dialog-model.d.ts +20 -1
  91. package/dist/internal/features/work/editors/document-review-navigation.d.ts +9 -0
  92. package/dist/internal/features/work/editors/document-statistics-dialog.d.ts +7 -0
  93. package/dist/internal/features/work/editors/document-status-bar.d.ts +2 -1
  94. package/dist/internal/features/work/editors/document-table-properties-dialog-model.d.ts +4 -1
  95. package/dist/internal/features/work/editors/document-toolbar.d.ts +19 -42
  96. package/dist/internal/features/work/editors/document-wps-shortcuts.d.ts +12 -0
  97. package/dist/internal/features/work/editors/document-zoom.d.ts +17 -0
  98. package/dist/internal/features/work/editors/markdown-editor-focus.d.ts +1 -1
  99. package/dist/internal/features/work/editors/markdown-editor.d.ts +5 -1
  100. package/dist/internal/features/work/editors/markdown-toolbar.d.ts +2 -1
  101. package/dist/internal/features/work/editors/office-collaboration-participants.d.ts +3 -0
  102. package/dist/internal/features/work/editors/office-collaboration-presence-context.d.ts +17 -0
  103. package/dist/internal/features/work/editors/office-collaboration-presence-ui.d.ts +25 -0
  104. package/dist/internal/features/work/editors/office-editor-focus-handoff.d.ts +27 -0
  105. package/dist/internal/features/work/editors/pdf-annotation-controller.d.ts +5 -0
  106. package/dist/internal/features/work/editors/pdf-collaboration-presence.d.ts +3 -0
  107. package/dist/internal/features/work/editors/pdf-collaboration-projection.d.ts +10 -0
  108. package/dist/internal/features/work/editors/pdf-evidence-contract.d.ts +36 -0
  109. package/dist/internal/features/work/editors/pdf-evidence-overlay.d.ts +37 -0
  110. package/dist/internal/features/work/editors/pdf-toolbar.d.ts +2 -1
  111. package/dist/internal/features/work/editors/pdf-viewer-controller.d.ts +7 -1
  112. package/dist/internal/features/work/editors/pdf-viewer.d.ts +11 -1
  113. package/dist/internal/features/work/editors/presentation-collaboration-presence.d.ts +5 -0
  114. package/dist/internal/features/work/editors/presentation-editor-focus.d.ts +3 -2
  115. package/dist/internal/features/work/editors/presentation-editor-types.d.ts +3 -0
  116. package/dist/internal/features/work/editors/presentation-editor.d.ts +1 -1
  117. package/dist/internal/features/work/editors/spreadsheet-auto-filter.d.ts +9 -0
  118. package/dist/internal/features/work/editors/spreadsheet-cell-clear.d.ts +3 -0
  119. package/dist/internal/features/work/editors/spreadsheet-cell-merge.d.ts +12 -0
  120. package/dist/internal/features/work/editors/spreadsheet-clipboard-shortcuts.d.ts +3 -7
  121. package/dist/internal/features/work/editors/spreadsheet-collaboration-presence.d.ts +9 -0
  122. package/dist/internal/features/work/editors/spreadsheet-command-catalog.d.ts +464 -0
  123. package/dist/internal/features/work/editors/spreadsheet-command-controller.d.ts +45 -9
  124. package/dist/internal/features/work/editors/spreadsheet-context-menu.d.ts +2 -0
  125. package/dist/internal/features/work/editors/spreadsheet-editor-ribbon.d.ts +9 -28
  126. package/dist/internal/features/work/editors/spreadsheet-editor.d.ts +8 -2
  127. package/dist/internal/features/work/editors/spreadsheet-format-painter.d.ts +27 -0
  128. package/dist/internal/features/work/editors/spreadsheet-freeze-panes.d.ts +14 -0
  129. package/dist/internal/features/work/editors/use-document-insert-commands.d.ts +3 -2
  130. package/dist/internal/features/work/editors/use-document-pagination.d.ts +6 -1
  131. package/dist/internal/features/work/editors/use-document-review-conflicts.d.ts +28 -0
  132. package/dist/internal/features/work/editors/use-spreadsheet-auto-filter.d.ts +21 -0
  133. package/dist/internal/features/work/editors/use-spreadsheet-collaboration.d.ts +27 -0
  134. package/dist/internal/features/work/editors/use-spreadsheet-format-painter.d.ts +18 -0
  135. package/dist/internal/features/work/editors/work-office-chrome.d.ts +22 -3
  136. package/dist/internal/features/work/editors/work-office-ribbon-overflow.d.ts +2 -0
  137. package/dist/internal/features/work/work-document-bookmark-references.d.ts +37 -0
  138. package/dist/internal/features/work/work-document-bookmarks.d.ts +29 -0
  139. package/dist/internal/features/work/work-document-caption-nodes.d.ts +4 -1
  140. package/dist/internal/features/work/work-document-comments.d.ts +1 -1
  141. package/dist/internal/features/work/work-document-equations.d.ts +513 -0
  142. package/dist/internal/features/work/work-document-extensions.d.ts +1 -0
  143. package/dist/internal/features/work/work-document-field-identity.d.ts +2 -0
  144. package/dist/internal/features/work/work-document-field-node.d.ts +2 -2
  145. package/dist/internal/features/work/work-document-fields.d.ts +7 -0
  146. package/dist/internal/features/work/work-document-image-identity.d.ts +30 -0
  147. package/dist/internal/features/work/work-document-image-layout.d.ts +46 -1
  148. package/dist/internal/features/work/work-document-image-wrap-contour.d.ts +16 -0
  149. package/dist/internal/features/work/work-document-incremental-layout.d.ts +2 -2
  150. package/dist/internal/features/work/work-document-model-codec.d.ts +4 -1
  151. package/dist/internal/features/work/work-document-note-integrity.d.ts +2 -0
  152. package/dist/internal/features/work/work-document-page-borders.d.ts +25 -0
  153. package/dist/internal/features/work/work-document-page-capture.d.ts +8 -0
  154. package/dist/internal/features/work/work-document-page-frames.d.ts +15 -0
  155. package/dist/internal/features/work/work-document-page-margins.d.ts +56 -0
  156. package/dist/internal/features/work/work-document-page-size.d.ts +47 -0
  157. package/dist/internal/features/work/work-document-pagination-measurement.d.ts +1 -2
  158. package/dist/internal/features/work/work-document-pagination-types.d.ts +7 -2
  159. package/dist/internal/features/work/work-document-pagination.d.ts +2 -2
  160. package/dist/internal/features/work/work-document-paragraph-borders.d.ts +32 -0
  161. package/dist/internal/features/work/work-document-paragraph-identity.d.ts +26 -0
  162. package/dist/internal/features/work/work-document-paragraph-shading.d.ts +18 -0
  163. package/dist/internal/features/work/work-document-review-conflicts.d.ts +35 -0
  164. package/dist/internal/features/work/work-document-section.d.ts +4 -0
  165. package/dist/internal/features/work/work-document-snapshot.d.ts +19 -0
  166. package/dist/internal/features/work/work-document-source.d.ts +23 -0
  167. package/dist/internal/features/work/work-document-table-column-widths.d.ts +7 -0
  168. package/dist/internal/features/work/work-document-table-property-changes.d.ts +3 -0
  169. package/dist/internal/features/work/work-document-table-row-identity.d.ts +15 -0
  170. package/dist/internal/features/work/work-document-table-sizing.d.ts +3 -0
  171. package/dist/internal/features/work/work-document-text-layout.d.ts +3 -1
  172. package/dist/internal/features/work/work-document-word-line-metrics.d.ts +2 -0
  173. package/dist/internal/features/work/work-docx-bookmark-diagnostics.d.ts +3 -0
  174. package/dist/internal/features/work/work-docx-bookmark-import.d.ts +24 -0
  175. package/dist/internal/features/work/work-docx-bookmarks.d.ts +17 -0
  176. package/dist/internal/features/work/work-docx-comment-durable-id-preservation.d.ts +2 -0
  177. package/dist/internal/features/work/work-docx-comment-export.d.ts +3 -0
  178. package/dist/internal/features/work/work-docx-comment-metadata.d.ts +2 -0
  179. package/dist/internal/features/work/work-docx-drawing-extension-preservation.d.ts +4 -0
  180. package/dist/internal/features/work/work-docx-equation-diagnostics.d.ts +3 -0
  181. package/dist/internal/features/work/work-docx-equation-export.d.ts +14 -0
  182. package/dist/internal/features/work/work-docx-equation-import.d.ts +30 -0
  183. package/dist/internal/features/work/work-docx-equation-story.d.ts +9 -0
  184. package/dist/internal/features/work/work-docx-export-formatting.d.ts +3 -1
  185. package/dist/internal/features/work/work-docx-export-image.d.ts +5 -1
  186. package/dist/internal/features/work/work-docx-export.d.ts +1 -1
  187. package/dist/internal/features/work/work-docx-field-instructions.d.ts +8 -0
  188. package/dist/internal/features/work/work-docx-font-table-preservation.d.ts +3 -0
  189. package/dist/internal/features/work/work-docx-ignorable-extension-preservation.d.ts +15 -0
  190. package/dist/internal/features/work/work-docx-image-crop.d.ts +12 -0
  191. package/dist/internal/features/work/work-docx-image-identity.d.ts +17 -0
  192. package/dist/internal/features/work/work-docx-image-layer.d.ts +12 -0
  193. package/dist/internal/features/work/work-docx-image-layout-import.d.ts +14 -2
  194. package/dist/internal/features/work/work-docx-image-wrap.d.ts +15 -0
  195. package/dist/internal/features/work/work-docx-import.d.ts +13 -3
  196. package/dist/internal/features/work/work-docx-list-export.d.ts +18 -0
  197. package/dist/internal/features/work/work-docx-list-import.d.ts +14 -0
  198. package/dist/internal/features/work/work-docx-note-comment-content-control-block-preservation.d.ts +18 -0
  199. package/dist/internal/features/work/work-docx-note-comment-content-control-model.d.ts +47 -0
  200. package/dist/internal/features/work/work-docx-note-comment-content-control-preservation.d.ts +4 -0
  201. package/dist/internal/features/work/work-docx-note-comment-content-control-properties.d.ts +17 -0
  202. package/dist/internal/features/work/work-docx-note-comment-content-control-table-model.d.ts +17 -0
  203. package/dist/internal/features/work/work-docx-note-comment-content-control-xml.d.ts +14 -0
  204. package/dist/internal/features/work/work-docx-note-comment-extension-preservation.d.ts +2 -0
  205. package/dist/internal/features/work/work-docx-note-comment-hyperlink-content.d.ts +40 -0
  206. package/dist/internal/features/work/work-docx-note-comment-hyperlink-preservation.d.ts +5 -0
  207. package/dist/internal/features/work/work-docx-note-comment-hyperlink-relationships.d.ts +35 -0
  208. package/dist/internal/features/work/work-docx-note-comment-identity.d.ts +15 -0
  209. package/dist/internal/features/work/work-docx-note-comment-run-preservation.d.ts +4 -0
  210. package/dist/internal/features/work/work-docx-note-comment-run-properties.d.ts +2 -0
  211. package/dist/internal/features/work/work-docx-note-image-import.d.ts +12 -0
  212. package/dist/internal/features/work/work-docx-note-image-relationships.d.ts +1 -0
  213. package/dist/internal/features/work/work-docx-numbering-extension-preservation.d.ts +6 -0
  214. package/dist/internal/features/work/work-docx-numbering.d.ts +1 -0
  215. package/dist/internal/features/work/work-docx-page-borders-diagnostics.d.ts +3 -0
  216. package/dist/internal/features/work/work-docx-page-borders-import.d.ts +10 -0
  217. package/dist/internal/features/work/work-docx-page-margins-diagnostics.d.ts +3 -0
  218. package/dist/internal/features/work/work-docx-page-margins-import.d.ts +18 -0
  219. package/dist/internal/features/work/work-docx-page-size-diagnostics.d.ts +2 -0
  220. package/dist/internal/features/work/work-docx-page-size-import.d.ts +17 -0
  221. package/dist/internal/features/work/work-docx-paragraph-borders-diagnostics.d.ts +3 -0
  222. package/dist/internal/features/work/work-docx-paragraph-borders-export.d.ts +18 -0
  223. package/dist/internal/features/work/work-docx-paragraph-borders-import.d.ts +24 -0
  224. package/dist/internal/features/work/work-docx-paragraph-default-collapsed.d.ts +19 -0
  225. package/dist/internal/features/work/work-docx-paragraph-extension-preservation.d.ts +2 -0
  226. package/dist/internal/features/work/work-docx-paragraph-identity-import.d.ts +10 -0
  227. package/dist/internal/features/work/work-docx-paragraph-identity.d.ts +18 -0
  228. package/dist/internal/features/work/work-docx-paragraph-pagination-import.d.ts +6 -1
  229. package/dist/internal/features/work/work-docx-paragraph-shading-diagnostics.d.ts +3 -0
  230. package/dist/internal/features/work/work-docx-paragraph-shading-export.d.ts +5 -0
  231. package/dist/internal/features/work/work-docx-paragraph-shading-import.d.ts +18 -0
  232. package/dist/internal/features/work/work-docx-run-formatting-import.d.ts +3 -0
  233. package/dist/internal/features/work/work-docx-settings-preservation.d.ts +10 -0
  234. package/dist/internal/features/work/work-docx-settings-xml.d.ts +16 -0
  235. package/dist/internal/features/work/work-docx-style-extension-preservation.d.ts +2 -0
  236. package/dist/internal/features/work/work-docx-table-cell-export.d.ts +2 -1
  237. package/dist/internal/features/work/work-docx-table-cell-import.d.ts +3 -0
  238. package/dist/internal/features/work/work-docx-table-extension-preservation.d.ts +2 -0
  239. package/dist/internal/features/work/work-docx-table-row-import.d.ts +2 -0
  240. package/dist/internal/features/work/work-docx-table-sizing-import.d.ts +1 -0
  241. package/dist/internal/features/work/work-docx-theme-reference.d.ts +23 -0
  242. package/dist/internal/features/work/work-docx-theme.d.ts +4 -1
  243. package/dist/internal/features/work/work-docx-twips.d.ts +12 -0
  244. package/dist/internal/features/work/work-file-contract.d.ts +1 -0
  245. package/dist/internal/features/work/work-file-io.d.ts +1 -1
  246. package/dist/internal/features/work/work-markdown-extensions.d.ts +4 -1
  247. package/dist/internal/features/work/work-ooxml-package-preservation.d.ts +12 -0
  248. package/dist/internal/features/work/work-ooxml-package-security.d.ts +6 -0
  249. package/dist/internal/features/work/work-ooxml-relationship-preservation.d.ts +10 -0
  250. package/dist/internal/features/work/work-ooxml-xml.d.ts +2 -0
  251. package/dist/internal/features/work/work-pdf-export.d.ts +10 -0
  252. package/dist/internal/features/work/work-repository.d.ts +2 -0
  253. package/dist/internal/features/work/work-types.d.ts +15 -2
  254. package/dist/internal/kernel/office-kernel-client-types.d.ts +1 -0
  255. package/dist/internal/kernel/office-kernel-protocol.d.ts +7 -0
  256. package/dist/internal/kernel/office-kernel-version.d.ts +1 -1
  257. package/dist/office-kernel.wasm +0 -0
  258. package/dist/office-kernel.worker.js +93 -41
  259. package/dist/react.d.ts +18 -12
  260. package/dist/react.js +1 -1
  261. package/dist/styles.css +1367 -16
  262. package/dist/vue.d.ts +48 -5
  263. package/dist/vue.js +42 -3
  264. package/dist/web-component.d.ts +24 -2
  265. package/dist/web-component.js +101 -2
  266. package/docs/latest/en/browser-editor-architecture.md +262 -47
  267. package/package.json +29 -4
  268. package/dist/0~152.js +0 -94
  269. package/dist/0~2582.js +0 -485
  270. package/dist/0~4750.js +0 -939
  271. package/dist/0~5861.js +0 -596
  272. package/dist/0~work-document-extensions.js +0 -3045
  273. package/dist/0~work-document-model-codec.js +0 -42
  274. package/dist/0~work-docx-bibliography.js +0 -347
  275. package/dist/0~work-docx-page-color.js +0 -42
  276. package/dist/2881.js +0 -1455
  277. package/dist/8728.js +0 -723
package/README.md CHANGED
@@ -25,6 +25,8 @@
25
25
  <a href="#five-format-native-surfaces">Editors</a> ·
26
26
  <a href="#native-automation">Automation</a> ·
27
27
  <a href="#architecture">Architecture</a> ·
28
+ <a href="ROADMAP.md">WPS gap roadmap</a> ·
29
+ <a href="COLLABORATION_ROADMAP.md">Collaboration roadmap</a> ·
28
30
  <a href="CONTRIBUTING.md">Contributing</a>
29
31
  </p>
30
32
 
@@ -81,7 +83,7 @@ The images below are committed visual-regression baselines from the real
81
83
  <a href="visual-tests/__snapshots__/linux/desktop-1280/pdf.png">
82
84
  <img src="visual-tests/__snapshots__/linux/desktop-1280/pdf.png" alt="A3S Office PDF editor with search, annotation, save, and download controls">
83
85
  </a>
84
- <br><sub><strong>PDF</strong> — PDFium rendering, forms, annotations, and save</sub>
86
+ <br><sub><strong>PDF</strong> — PDFium rendering, forms, annotations, Yjs overlays, and save</sub>
85
87
  </td>
86
88
  </tr>
87
89
  </table>
@@ -99,6 +101,8 @@ The images below are committed visual-regression baselines from the real
99
101
  unexpected blocking modal or steal focus from the workspace.
100
102
  Shared color palettes expand to an eight-column touch layout on phones while
101
103
  preserving spatial arrow-key navigation.
104
+ Shared Office selects use 44 px phone option rows and bounded internal
105
+ scrolling while retaining keyboard selection and exact focus restoration.
102
106
  - **Editor-scoped zoom** — Status controls and Ctrl/Cmd + mouse-wheel gestures
103
107
  share each surface's bounded zoom model without changing the host browser's
104
108
  page scale.
@@ -109,7 +113,21 @@ The images below are committed visual-regression baselines from the real
109
113
  export captures that same Worker/WASM page layout instead of rebuilding
110
114
  content from compatibility HTML. Caption numbering and cross-reference
111
115
  validity also update in that same transaction graph, including a truthful
112
- missing-target state after deletion.
116
+ missing-target state after deletion. Paired Word bookmarks can span blocks,
117
+ retain stable native identities through edits, drive live editable REF
118
+ fields, and keep internal links distinct from external hyperlink
119
+ relationships; deleting a target exposes truthful missing-link and
120
+ missing-reference states that undo repairs. Footnote and endnote references
121
+ remain paired with one editable definition, renumber live in independent
122
+ reference-order sequences, receive new identities when copied, and are
123
+ deleted or restored together through one undoable transaction. Body `PAGE`,
124
+ `NUMPAGES`, `SECTION`, `SECTIONPAGES`, `DATE`, and `TIME` fields are atomic,
125
+ copied under fresh stable identities, and resolve from the live Worker/WASM
126
+ page containing each field. Automatic reflow updates numeric fields without
127
+ adding history or ticking clock fields; F9 refreshes every field in one
128
+ undoable action. Safe inline DOCX fields round-trip natively, while nested,
129
+ incomplete, cross-paragraph, deleted, or instructionless structures stay
130
+ text and produce an explicit compatibility warning.
113
131
  - **Framework choice** — React components, Vue 3 adapters, Custom Elements,
114
132
  and a framework-neutral Core API over the same engine.
115
133
  - **Responsive computation** — Lazy editor chunks, cancellable Workers,
@@ -118,7 +136,11 @@ The images below are committed visual-regression baselines from the real
118
136
  - **AI without UI scraping** — Typed agent ports and host-defined selection
119
137
  actions receive structured context and editing commands.
120
138
  - **Automation outside the browser** — The native Rust CLI, standard MCP
121
- server, and Office Skill share bounded mutation contracts.
139
+ server, and Office Skill share bounded mutation contracts. Coding agents can
140
+ also keep a durable Yrs replica, exchange standard Yjs v1 updates and state
141
+ vectors, perform authorized typed Markdown, Document, and PDF annotation,
142
+ form-value, and review changes, retain browser/native actor attribution, and
143
+ checkpoint without replacing a whole Office file.
122
144
 
123
145
  ## Quick start
124
146
 
@@ -178,6 +200,32 @@ export function ProjectBrief() {
178
200
  The editor owns editing, layout, import/export, and browser rendering. The host
179
201
  owns persistence and decides when, where, and how the emitted content is saved.
180
202
 
203
+ ### Persist a structured document snapshot
204
+
205
+ Hosts that round-trip controlled document values across a process or language
206
+ boundary should use the public versioned snapshot codec instead of converting
207
+ the editor value to Markdown or treating HTML as the complete document:
208
+
209
+ ```ts
210
+ import {
211
+ decodeDocumentSnapshot,
212
+ encodeDocumentSnapshot,
213
+ } from '@a3s-lab/office/core';
214
+
215
+ const encoded = encodeDocumentSnapshot(content);
216
+ await storage.put(documentId, encoded);
217
+
218
+ const restored = decodeDocumentSnapshot(await storage.get(documentId));
219
+ ```
220
+
221
+ The v1 envelope uses the
222
+ `application/vnd.a3s.office.document-snapshot+json;version=1` media type. It
223
+ retains the synchronized HTML, structured ProseMirror model, page layout,
224
+ comments, review state, and bibliography as deterministic bounded JSON. Decode
225
+ fails closed for a different schema or version, malformed JSON, an oversized
226
+ payload, or a model whose HTML fingerprint is stale. Optional `undefined`
227
+ properties are omitted because they are outside the JSON data model.
228
+
181
229
  ### Export the live Word layout to PDF
182
230
 
183
231
  Give each mounted document a stable `artifactId`, then pass the matching,
@@ -237,7 +285,8 @@ into the PDF; searchable text and vector output remain future fidelity work.
237
285
  - `@a3s-lab/office/web-component` — Custom Elements for framework-agnostic UI
238
286
  composition.
239
287
  - `@a3s-lab/office/core` — Typed models, templates, import, export, and browser
240
- file workflows.
288
+ file workflows, plus transport-neutral Yjs bindings for Markdown, Document,
289
+ Spreadsheet, Presentation, and PDF collaboration.
241
290
  - `@a3s-lab/office/styles.css` — Shared editor and interaction-system styles.
242
291
 
243
292
  Copyable React, Vue, and Web Component examples live in the
@@ -255,7 +304,19 @@ interaction model.
255
304
  long-document windows for page buttons, heading rows, full-text results, and
256
305
  tracked-revision and anchored-comment review that preserve native scroll
257
306
  distance, sparse current/selection/draft pins, and Home/End reachability;
258
- paragraph styles and phone-sized paragraph-spacing and pagination controls
307
+ a WPS-familiar command catalog, quick-access undo and redo, a priority-aware
308
+ adaptive and persistently collapsible ribbon whose tabs can temporarily
309
+ expose commands; WPS-oriented Insert groups and direct Page Layout presets
310
+ for margins, orientation, paper size, and columns, with matching advanced
311
+ Page Setup destinations; WPS-oriented References, Review, and View groups,
312
+ direct tracked-change navigation and decisions, contextual object tabs, and
313
+ viewport-calculated 100%, one-page, and page-width zoom; an actionable status
314
+ bar with live word-count details, WPS `Ctrl+Shift+G`, keyboard-traversable
315
+ view and zoom controls, and compact Web prioritization; editor-scoped WPS
316
+ formatting, paragraph, style, and review shortcuts, plus a permission-free
317
+ formatting clipboard and one-shot format painter shared with compatible
318
+ header and footer formatting, paragraph styles and phone-sized
319
+ paragraph-spacing and pagination controls
259
320
  with touch targets and exact invoker-focus restoration; stable compact-ribbon
260
321
  edge paging and viewport-bounded list galleries with touch-sized numbering
261
322
  actions, selection-preserving bullet and numbering commands, and explicit
@@ -285,8 +346,28 @@ interaction model.
285
346
  underline, strikethrough, fonts, and text colors are materialized before
286
347
  direct table, cell, paragraph, and run formatting. Conditional paragraph
287
348
  alignment, direction, indents, spacing and line rules, pagination rules, and
288
- tab stops use the same precedence chain. Theme tint and shade values resolve
289
- for table borders and cell fills across edit, preview, and RGB-stable export.
349
+ tab stops use the same precedence chain. Paragraph shading follows document
350
+ defaults, based-on paragraph styles, conditional table styles, and direct
351
+ formatting in that order. The complete Word `w:shd` pattern set, independent
352
+ foreground/background colors, `auto`, `nil` resets, and independently tinted
353
+ or shaded theme references remain structured through body and page-chrome
354
+ HTML; browser previews use bounded CSS masks while DOCX export restores the
355
+ native pattern and both theme channels. Preview follows Word's tint-over-shade
356
+ precedence when both transforms occur on one theme channel while retaining
357
+ both attributes for export. Malformed, duplicated,
358
+ namespace-spoofed, relationship-bound, or unresolved theme values fail closed
359
+ instead of inheriting stale shading. Theme tint and shade values resolve for
360
+ table borders and cell fills across edit, preview, and RGB-stable export.
361
+ Paragraph borders use the same precedence chain and retain the complete
362
+ `w:pBdr` model: schema-ordered `top`, `left`, `bottom`, `right`, `between`,
363
+ and facing-page `bar` edges; all 197 line and art styles; direct, automatic,
364
+ and theme colors; eighth-point or point widths; spacing; shadow; and frame.
365
+ Physical edges remain editable CSS, while art, between-paragraph, and
366
+ facing-page behavior uses a bounded browser approximation; DOCX export
367
+ restores the exact native edge set and attributes. Direct CSS edits replace
368
+ only the edited edge's theme binding, strict and transitional namespaces are
369
+ accepted, and malformed order, duplicates, spoofed namespaces, unsafe
370
+ attributes, invalid measures, and unresolved themes fail closed.
290
371
  Splittable table rows that exceed a full physical page
291
372
  continue at paragraph boundaries with repeated heading rows on every page,
292
373
  viewport-safe comment drafting and focus-preserving citation drafts, tracked
@@ -336,6 +417,26 @@ interaction model.
336
417
  phone layout, touch-sized controls, and exact grid-focus restoration,
337
418
  desktop workbook task panes that become focus-contained phone dialogs with
338
419
  an inert workbook background and exact ribbon-invoker restoration,
420
+ a WPS-familiar command catalog and tab order, quick-access Undo and Redo,
421
+ a priority-aware adaptive and collapsible ribbon with temporary tab
422
+ expansion, an executable Home clipboard group whose Paste, Cut, and Copy
423
+ commands share the permission-resilient local fallback with their WPS
424
+ shortcuts, a WPS-style Format Painter with single-use and double-click locked
425
+ sessions, cross-sheet range-pattern tiling, Escape cancellation, and native
426
+ style-only writes, Conditional Formatting under Home and Styles, executable
427
+ sorting plus WPS-style AutoFilter under Data, finite current-region discovery,
428
+ `Cmd/Ctrl+Shift+L` toggling, an `Alt+ArrowDown` keyboard filter menu,
429
+ a Home and Cells Rows and Columns menu for inserting above, below, left, or
430
+ right and deleting selected rows or columns through the shared structure
431
+ command port, a Home and Alignment Merge and Center split control with
432
+ Merge Cells, Merge Across, Unmerge Cells, Unmerge and Fill, and the WPS
433
+ `Ctrl+M` shortcut through one controlled native workbook batch,
434
+ a Home and Editing Clear menu for independently removing content, formats,
435
+ comments, hyperlinks, or all cell state while preserving merge geometry,
436
+ with Delete and Backspace mapped to Clear Contents,
437
+ a View and Window Freeze Panes menu for current-cell, top-row, first-column,
438
+ and unfreeze patterns with XLSX round trips, and visible F9 workbook
439
+ recalculation,
339
440
  Shift+F11 creation, Ctrl/Cmd+PageUp/PageDown switching in edit and read-only
340
441
  preview,
341
442
  one shared cell/worksheet context-menu surface with executable shortcut
@@ -389,6 +490,18 @@ ports.
389
490
  and collaboration; the application shell and navigation; AI providers,
390
491
  prompts, policy, and request lifecycle.
391
492
 
493
+ For collaborative surfaces, pass the host-owned typed Presence controller as
494
+ `presence` beside its exact `collaboration` session. Every editor projects the
495
+ same responsive participant roster across editing and preview chrome, including
496
+ human/agent identity, mode, activity, and a format-specific location summary.
497
+ Editors publish their local location and project remote locations without
498
+ writing them into canonical content: Document and Markdown render text
499
+ selections/carets, Spreadsheet uses Fortune Sheet's native cell-presence layer,
500
+ Presentation frames stable object IDs, and PDF identifies peers on the current
501
+ page or annotation. A remote roster row explicitly navigates and focuses that
502
+ location; passive Awareness updates never move the local selection, viewport,
503
+ or focus. The host continues to synchronize Awareness and own both lifecycles.
504
+
392
505
  Document and Markdown selection menus can be replaced with host-defined typed
393
506
  actions. Each action receives an immutable selection snapshot, nearby text,
394
507
  the complete controlled content, and conflict-aware `replaceText`,
@@ -419,6 +532,425 @@ const blankDeck = createArtifact('blank-presentation');
419
532
 
420
533
  Use `downloadArtifact` to start a browser download or
421
534
  `createArtifactBlob` when your application owns upload and persistence.
535
+ Imported DOCX artifacts are source-backed: safe source-only OPC parts,
536
+ content-type registrations, and relationships survive a regenerated export.
537
+ Persist the original Blob alongside the artifact and call `registerSourceBlob`
538
+ after a browser reload. If that source is unavailable, DOCX export fails
539
+ explicitly instead of silently dropping complex package state. The artifact's
540
+ source metadata carries a SHA-256 fingerprint, so registering a different DOCX
541
+ under the same artifact ID also fails. Generated core parts remain
542
+ authoritative; compatibility diagnostics identify known inline OOXML
543
+ normalization and the deliberate removal of invalid signatures, VBA, ActiveX,
544
+ and custom-ribbon parts. Within `word/settings.xml`, relationship-free
545
+ ignorable attributes, elements, and structurally valid, non-conflicting
546
+ `mc:AlternateContent` blocks survive strict or transitional UTF-8/UTF-16
547
+ sources. Generated Word settings still win, and this preservation does not yet
548
+ restore behavior-changing settings. Regenerated `word/styles.xml` and
549
+ `word/numbering.xml` also retain relationship-free passive extensions at the
550
+ root and on uniquely matched identities. Styles match by type plus style ID;
551
+ imported abstract-numbering, concrete-numbering, and level metadata follows
552
+ regenerated IDs. Source-only or duplicate identities, malformed trees,
553
+ relationship-bound content, and ambiguous one-to-many numbering mappings are
554
+ dropped. Generated Word style and numbering semantics still win. In regenerated
555
+ document, header, footer, footnote, and endnote parts, relationship-free passive
556
+ extensions from non-OOXML ignorable namespaces also follow uniquely matched
557
+ picture drawings, using normalized anchor and drawing-property IDs. Body,
558
+ header, footer, footnote, and endnote imports retain those image identities in
559
+ sanitized editable HTML. Passive extensions also follow uniquely matched,
560
+ unchanged paragraphs and their paragraph properties by native `w14:paraId`
561
+ plus `w14:textId`. Body and page-chrome HTML
562
+ retain these identities; text edits rotate `textId`, formatting-only edits and
563
+ moves keep it, and copies or splits receive new paragraph IDs. Source-only,
564
+ duplicate, changed-text, relationship-bound, Microsoft/OOXML semantic, and
565
+ ambiguous branches are dropped; generated paragraph and drawing semantics stay
566
+ authoritative. Office 2013 `w15:collapsed` paragraph metadata also round-trips
567
+ through body and page-chrome HTML as `data-office-default-collapsed`. Import
568
+ accepts only an empty leaf or the exact core Word `w:val` lexicals `true`,
569
+ `on`, `1`, `false`, `off`, and `0`; an omitted value means true, while a
570
+ malformed or duplicated direct value fails closed instead of inheriting stale
571
+ state. Export canonicalizes explicit states to `1` or `0`, declares the Word
572
+ 2012 namespace, and adds its prefix to `mc:Ignorable`. This metadata remains
573
+ native-only: browser content stays expanded and editable, without conflating
574
+ Word's initial collapsed-heading view with navigation-pane state or hidden
575
+ text. Stable table hierarchies use native row `w14:paraId` plus
576
+ `w14:textId`, ordered directly owned row IDs for tables, and directly owned
577
+ paragraph IDs for cells. Passive extensions on `w:tbl`/`w:tblPr`,
578
+ `w:tr`/`w:trPr`, and `w:tc`/`w:tcPr` survive body or page-chrome regeneration.
579
+ Row text or structural edits rotate the row version; formatting-only edits and
580
+ moves retain it, copies receive independent IDs, and nested rows or cells are
581
+ isolated from their outer table. Duplicate or cross-kind identities and unsafe
582
+ extension branches fail closed, while generated table geometry and formatting
583
+ win. Imported footnotes and endnotes now retain their native positive `w:id`
584
+ across reorderings, while copies receive independent IDs. Signed native comment
585
+ and reply IDs, reply parentage, and resolved state also survive regeneration.
586
+ Native DrawingML pictures inside footnotes and endnotes retain their identity,
587
+ layout, wrapping, crop, and layer metadata through public import and artifact
588
+ export. Export repairs missing image relationships in generated note parts,
589
+ allocates collision-free relationship IDs, and validates each media payload.
590
+ Changed, duplicate, namespace-spoofed, relationship-bound, or semantic drawing
591
+ branches stay disconnected; generated geometry and media remain authoritative,
592
+ while legacy VML, shapes, and SmartArt normalize.
593
+
594
+ Supported native OMML equations now survive as bounded structured objects in
595
+ the document body, headers, footers, footnotes, and endnotes. Inline and display
596
+ math, Unicode runs with literal/normal-text semantics, math script/style,
597
+ manual-break, and alignment-point properties, common fractions, scripts,
598
+ left-side pre-sub/superscripts with empty script slots, radicals with optional
599
+ degrees, functions, n-ary operators, combining accents, overbars and underbars,
600
+ group characters with
601
+ explicit grouping-character placement and baseline justification, phantoms with
602
+ visible or hidden bases, independently zeroed width, ascent, or descent, and
603
+ transparent spacing, border boxes with independently visible edges and four
604
+ strike directions, semantic boxes with
605
+ operator-emulation, no-break, differential-spacing, manual-break, and alignment
606
+ properties, bounded rectangular matrices with explicit column alignment,
607
+ row-spacing and column-gap rules, and minimum column widths,
608
+ equation arrays with 1–64 rows, vertical base alignment, maximum/object
609
+ distribution, row-spacing rules, and `&` alignment/spacer markers, lower and
610
+ upper limit objects, and delimiters regenerate as `m:oMath` or `m:oMathPara` and
611
+ render an accessible MathML preview. Bar placement preserves the distinct OMML
612
+ defaults for an omitted `barPr` and an omitted `pos`. Group-character
613
+ normalization separately preserves an absent `chr` as U+23DF, an explicitly
614
+ empty `chr`, bottom `pos`, and the absent-versus-empty `vertJc` defaults.
615
+ Phantom normalization preserves the visible `show` default and disabled
616
+ `zeroWid`, `zeroAsc`, `zeroDesc`, and `transp` defaults; MathML preview uses
617
+ `mphantom` and `mpadded` without discarding the native spacing properties.
618
+ Pre-scripts preserve required `sub`, `sup`, and `e` ordering and map empty left
619
+ script slots to MathML `none` children after `mprescripts`.
620
+ Right-side `sSup`, `sSub`, and `sSubSup` objects enforce their property-first
621
+ argument order. `sSubSupPr` preserves `alnScr`, canonicalizes its absent or
622
+ disabled value to unaligned scripts, and retains the enabled state through
623
+ native export. Supported fraction, script, limit, radical, function, n-ary,
624
+ accent, bar, group-character, phantom, border-box, box, matrix,
625
+ equation-array, and delimiter property containers preserve one optional ordered
626
+ `m:ctrlPr` control format through the same bounded Word run-property model.
627
+ The control may contain a direct `w:rPr` or bounded tracked provenance rooted
628
+ at `w:ins`, `w:del`, `w:moveFrom`, or `w:moveTo`. Each revision retains a
629
+ non-negative 32-bit `w:id`, a bounded `w:author`, an optional validated
630
+ `w:date`, and optional Microsoft 365 `w16du:dateUtc` with a UTC `Z` suffix.
631
+ Word's legal `moveFrom/moveTo -> ins/del` and `ins -> del` chains are
632
+ preserved, with the optional `w:rPr` at the deepest level. Every supported
633
+ `deg`, `den`, `e`, `fName`, `lim`, `num`, `sub`, and `sup` argument slot
634
+ preserves the same direct or revision-wrapped control format after its
635
+ expressions. Empty `ctrlPr` or direct `w:rPr` values canonicalize away, while
636
+ an empty revision remains native provenance. Safe object-control values project
637
+ only onto separable MathML control/operator nodes; argument-slot formatting and
638
+ all revision provenance remain native metadata because professional MathML has
639
+ neither linear-build control characters nor Word review/move-range semantics.
640
+ Document-level move-range pairing is not inferred from an isolated equation.
641
+ Matrix properties follow the ordered
642
+ `baseJc -> plcHide -> rSpRule -> cGpRule -> rSp -> cSp -> cGp -> mcs -> ctrlPr`
643
+ grammar. Row and column rules accept single, 1.5, double, exact, and multiple
644
+ spacing. `rSp` and `cGp` are bounded to 65,535, while the minimum column width
645
+ `cSp` is bounded to 31,680 twips. If any spacing property is
646
+ present, omitted or attribute-free peers take their Word defaults and native
647
+ export emits a complete canonical spacing group. Row spacing and column gaps
648
+ project to MathML `rowspacing` and `columnspacing`; `cSp` remains native-only
649
+ for layout because MathML `columnwidth` is a fixed width rather than Word's
650
+ minimum.
651
+ Fractions enforce optional `fPr` before required `num` and `den` arguments.
652
+ An absent `type` or an attribute-free `type` canonicalizes to `bar`; `noBar`,
653
+ `skw`, and `lin` remain distinct through native export and MathML projection.
654
+ Radicals enforce `radPr`, optional `deg`, and `e` ordering. An omitted or empty
655
+ degree normalizes to a square root, while a visible nonempty degree remains an
656
+ nth root. Native export emits the canonical `radPr -> deg -> e` shape and uses
657
+ `degHide=1` with an empty degree slot for square roots.
658
+ Functions enforce optional `funcPr` before required `fName` and `e` slots. Both
659
+ required slots may be empty. Every supported `CT_OMathArg` slot may likewise be
660
+ empty and follows `argPr -> expressions -> ctrlPr`. Its optional trailing
661
+ `ctrlPr` retains one bounded direct or revision-wrapped Word control; fixed
662
+ slots use named metadata, while matrix cells, equation-array rows, and delimiter
663
+ arguments use strictly dimension-aligned metadata. Absent or empty
664
+ argument/control properties and
665
+ absent, empty, or zero `argSz` values normalize to the default. Bounded
666
+ `argSz` values from -2 through 2 round-trip as relative argument sizes. The
667
+ Word-effective `box/e`, `groupChr/e`, `limLow/lim`, `limUpp/lim`, `nary/sub`,
668
+ `nary/sup`, `rad/deg`, `sPre/sub`, `sPre/sup`, `sSub/sub`, `sSubSup/sub`,
669
+ `sSubSup/sup`, and `sSup/sup` pairs project to inverse-sign relative MathML
670
+ `scriptlevel`; valid sizes in other argument slots remain native metadata.
671
+ Out-of-range or malformed sizes, duplicate or misplaced properties, malformed
672
+ control-revision identities or nesting, and semantic argument properties fail
673
+ closed.
674
+ N-ary operators enforce optional `naryPr` before required `sub`, `sup`, and `e`
675
+ slots. An omitted `chr` defaults to U+222B, while an attribute-free `chr`
676
+ remains an explicitly empty unsupported operator; an attribute-free `limLoc`
677
+ defaults to `undOvr`. Omitted or disabled `grow` values normalize to the
678
+ non-growing default; an attribute-free or enabled `grow` round-trips and maps
679
+ to MathML `stretchy=true`. Native export always emits both limit slots with
680
+ `subHide` or `supHide` for absent scripts.
681
+ Delimiters require optional `dPr` before 1–32 `e` arguments and preserve empty
682
+ argument slots. Their properties follow
683
+ `begChr -> sepChr -> endChr -> grow -> shp -> ctrlPr`; omitted characters
684
+ normalize to `(`, U+2502, and `)`, while attribute-free character properties
685
+ remain explicitly empty. Omitted or enabled `grow` and omitted, attribute-free,
686
+ or `centered` shapes canonicalize to the growing centered defaults. Non-growing
687
+ and `match` shapes round-trip in schema order. MathML projects fixed delimiters
688
+ with `stretchy=false` and content-matched growing delimiters with
689
+ `symmetric=false`; Word ignores shape while delimiter growth is disabled.
690
+ Display equations preserve `left`, `right`, `center`, and `centerGroup`
691
+ paragraph justification. The bounded native grammar accepts one optional
692
+ `m:oMathParaPr` before one `m:oMath`, while absent properties, absent `m:jc`,
693
+ and an attribute-free `m:jc` all canonicalize to the `centerGroup` default.
694
+ Math-run properties preserve the ordered `lit`, `nor`, `scr`, `sty`, `brk`, and
695
+ `aln` grammar, canonicalize Roman/italic and disabled defaults, bound `alnAt` to
696
+ 1–255, and project supported script/style combinations through MathML
697
+ `mathvariant` while retaining native break and alignment metadata.
698
+ Math runs also preserve the native `m:rPr -> w:rPr -> m:t/w:t` order. The
699
+ bounded Word run-property subset covers direct and theme font references,
700
+ Latin and complex-script bold/italic flags, all-caps and small-caps
701
+ presentation, strike and double-strike, outline, shadow, emboss, imprint,
702
+ proofing/grid flags, hidden and web-hidden states, direct and theme colors with
703
+ tint/shade, signed character
704
+ spacing through 31,680 twips, 1–600% horizontal scaling, half-point kerning
705
+ thresholds and signed baseline positions, half-point font sizes, colored
706
+ underline styles, all seven legacy text-animation values, all 27 line-border
707
+ styles with direct/theme colors, 2–96 eighth-point widths, 0–31 point spacing,
708
+ and explicit shadow/frame flags, all named highlight colors, complete patterned
709
+ run shading with direct or theme foreground/background colors, manual run
710
+ widths from 0 through 31,680 twips with optional signed 32-bit grouping IDs,
711
+ explicit baseline/superscript/subscript run alignment, all five Word
712
+ emphasis-mark values (`none`, `dot`, `comma`, `circle`, and `underDot`),
713
+ RTL/complex-script flags, Latin, East Asian, and bidi language tags, and East
714
+ Asian typography metadata with optional signed 32-bit run IDs, two-lines-in-one
715
+ flags, all five enclosing-bracket styles, horizontal-in-vertical rotation, and
716
+ rotated-text compression, plus explicit paragraph-mark always-hidden/reset
717
+ flags and Office 2010 text glow, shadow, reflection, text-outline, text-fill,
718
+ 3D-scene, and 3D-property effects plus all 16 ligature combinations, all three
719
+ numeral forms, all three numeral-spacing modes, bounded lists of all 20
720
+ OpenType stylistic sets, and explicit contextual-alternate enable/reset values.
721
+ Glow preserves an optional
722
+ 0 through
723
+ 2,147,483,647 EMU
724
+ radius, exactly
725
+ one RGB or 17-slot theme color source, and up to 64 ordered, repeatable tint,
726
+ shade, alpha, hue-modulation, saturation, and luminance transform entries.
727
+ The distinct Office 2010 shadow effect preserves the same color model plus
728
+ optional 0 through 2,147,483,647 EMU blur and offset coordinates, a direction
729
+ from 0 inclusive to 360 degrees exclusive, signed horizontal and vertical
730
+ scales, skew angles strictly between -90 and 90 degrees, and all ten rectangle
731
+ alignments. Angles retain exact 1/60,000-degree units and scales retain exact
732
+ 1/1,000-percent units.
733
+ The leaf Office 2010 reflection effect preserves optional blur and distance
734
+ coordinates, start/end opacity and position from 0 through 100 percent,
735
+ direction and fade direction from 0 inclusive to 360 degrees exclusive,
736
+ signed horizontal and vertical scales, skew angles strictly between -90 and 90
737
+ degrees, and the same ten rectangle alignments. Angles retain exact
738
+ 1/60,000-degree units, while opacity, positions, and scales retain exact
739
+ 1/1,000-percent units.
740
+ The structured Office 2010 text-outline effect preserves an optional width from
741
+ 0 through 20,116,800 EMUs, all three line caps, five compound-line styles, and
742
+ both pen alignments. Its fill choice remains distinct among none, solid, and
743
+ gradient fills. Solid fills and optional lists of 2 through 10 gradient stops
744
+ retain RGB or theme colors and ordered transforms. Gradient shading retains an
745
+ optional exact linear angle and scale flag or a path shape with an optional
746
+ signed 32-bit relative fill rectangle. All 11 preset dashes and round, bevel,
747
+ or miter joins survive, including an optional exact nonnegative miter limit.
748
+ The Office 2010 text-fill effect reuses the same strict fill grammar without
749
+ outline geometry. It preserves explicit no-fill, empty or colored solid-fill,
750
+ and empty or bounded gradient-fill choices, including the same colors,
751
+ transforms, stop limits, shade geometry, and exact units.
752
+ The Office 2010 3D scene preserves all 62 camera presets, all 27 light-rig
753
+ presets, and all eight light directions. Its required camera then light-rig
754
+ structure remains exact; only the light rig may contain an optional rotation,
755
+ whose latitude, longitude, and revolution each retain exact 1/60,000-degree
756
+ units from 0 inclusive to 360 degrees exclusive.
757
+ The Office 2010 3D properties preserve optional extrusion height and contour
758
+ width from 0 through 2,147,483,647 EMUs, all 16 material presets, optional top
759
+ and bottom bevels with independently optional bounded width and height plus all
760
+ 12 bevel presets, and ordered extrusion and contour RGB/theme colors with the
761
+ same bounded transform chains. The exact
762
+ `bevelT -> bevelB -> extrusionClr -> contourClr` order remains intact.
763
+ The Office 2010 ligature leaf requires one exact value and preserves every
764
+ combination of standard, contextual, historical, and discretional OpenType
765
+ ligatures, including explicit `none` and `all` values.
766
+ The Office 2010 numeral-form leaf likewise requires one exact value and retains
767
+ the font default, lining numerals, or oldstyle numerals without conflating an
768
+ explicit default reset with omission.
769
+ The Office 2010 numeral-spacing leaf also requires one exact value and retains
770
+ the font default, proportional numerals, or tabular numerals without conflating
771
+ an explicit default reset with omission.
772
+ The Office 2010 stylistic-set container accepts up to 4,096 raw entries and
773
+ canonicalizes enabled IDs from 1 through 20 into a unique list in first-enabled
774
+ order. An omitted `w14:val`, `true`, or `1` enables an entry; `false` or `0`
775
+ does not enable it.
776
+ The leaf Office 2010 contextual-alternates property has no child content and
777
+ accepts only the exact `true`, `false`, `1`, or `0` lexical values.
778
+ Explicit zero/default geometry values remain present so they can reset
779
+ inherited formatting. Strict universal font-size and position measures are
780
+ accepted only when they convert exactly to the bounded half-point model. Strict
781
+ universal manual widths are accepted only when they convert exactly to bounded
782
+ whole twips; omitted
783
+ grouping IDs remain distinct from explicit zero. Explicit baseline alignment
784
+ remains present so inherited superscript or subscript formatting can be reset;
785
+ explicit `none` emphasis likewise removes inherited emphasis marks.
786
+ Empty `w:eastAsianLayout` elements canonicalize away, while omitted flags stay
787
+ distinct from explicit `false` resets and signed run IDs retain explicit zero.
788
+ An empty `w:specVanish` is canonicalized to `true`; omission remains distinct
789
+ from an explicit `false` inheritance reset.
790
+ An omitted `w14:glow/@w14:rad` retains the schema default of zero while an
791
+ explicit zero remains present. Glow export declares the Office 2010 namespace
792
+ and adds its prefix to `mc:Ignorable` without replacing existing tokens.
793
+ Omitted `w14:shadow` geometry retains its zero/`none` schema defaults while
794
+ explicit zero and `none` values remain present; this effect stays distinct from
795
+ the legacy `w:shadow` on/off property.
796
+ A present empty `w14:reflection` remains distinct from omission. Its omitted
797
+ geometry retains zero/`none` schema defaults while explicit zero and `none`
798
+ values remain present.
799
+ A present empty `w14:textOutline` also remains distinct from omission and keeps
800
+ the schema's bevel default. Omitted fill, dash, and join choices retain their
801
+ defaults, while explicit zero/default attributes and empty child choices remain
802
+ present.
803
+ A missing `w14:textFill` continues to use `w:color`. A present empty text fill,
804
+ an empty solid fill, or a gradient without a stop list remains distinct and
805
+ retains its schema-defined black default.
806
+ A present empty `w14:props3d` remains distinct from omission and retains zero
807
+ extrusion and contour geometry, warm-matte material, and black color defaults.
808
+ Attribute-free bevels likewise remain present with zero width/height and circle
809
+ defaults.
810
+ An omitted `w14:ligatures` uses Word's no-ligature default. A present leaf must
811
+ carry `w14:val`; explicit `none` remains present so it can reset inherited
812
+ formatting.
813
+ An omitted `w14:numForm` uses the font's default numeral form. A present leaf
814
+ must carry `w14:val`, and explicit `default` remains present as an inheritance
815
+ reset.
816
+ An omitted `w14:stylisticSets` enables no stylistic sets. A present empty
817
+ container remains explicit so it can reset inherited sets; export emits one
818
+ canonical attribute-free `w14:styleSet` child for each enabled ID.
819
+ An omitted `w14:cntxtAlts` uses Word's disabled default. A present leaf with no
820
+ `w14:val` means `true`; explicit `false` remains present as an inheritance
821
+ reset, and export canonicalizes both states to `1` or `0`.
822
+ Explicit on/off values remain distinct, export uses canonical
823
+ `m:rPr -> w:rPr -> m:t`, and the MathML preview projects safe direct color,
824
+ exact transform-free Office 2010 RGB text fills and black fill defaults,
825
+ background, size, font, direction, language, emphasis, decoration, character
826
+ spacing, width, effective kerning, baseline-shift,
827
+ baseline/superscript/subscript alignment, Word emphasis marks, all-caps, and
828
+ small-caps values without changing source Unicode text. Emphasis marks project
829
+ as filled dots, a literal comma, or an open circle above the text, or a filled
830
+ dot below it. Superscript and subscript also project the smaller rendered size
831
+ required by Word. When `w:position` and `w:vertAlign` coexist, both remain in
832
+ native schema order and the later explicit alignment controls the CSS vertical
833
+ position. All 16 explicit ligature values map exactly to the OpenType `liga`,
834
+ `clig`, `hlig`, and `dlig` tags. Those controls compose with stylistic-set IDs
835
+ in exactly one CSS `font-feature-settings` declaration, using `"ss01" 1`
836
+ through `"ss20" 1`; an explicit empty stylistic-set list emits `normal` when
837
+ there are no ligature controls. `w14:cntxtAlts` maps independently to CSS
838
+ `font-variant-ligatures: contextual` or `no-contextual`, which controls the
839
+ OpenType `calt` feature without conflating it with the `clig` contextual
840
+ ligature feature. Numeral forms and spacing
841
+ compose into exactly one CSS `font-variant-numeric` declaration: forms map to
842
+ `normal`, `lining-nums`, or `oldstyle-nums`, while spacing maps to `normal`,
843
+ `proportional-nums`, or `tabular-nums`. A default paired with a non-default
844
+ category emits only the non-default token; two explicit defaults emit `normal`.
845
+ `w:em` remains after `w:rtl`/`w:cs` and before
846
+ `w:lang`, while
847
+ `w:eastAsianLayout` remains after `w:lang`, `w:specVanish` follows it,
848
+ `w14:glow` follows `w:specVanish`, `w14:shadow` follows `w14:glow`, and
849
+ `w14:reflection` follows `w14:shadow`, followed by `w14:textOutline`,
850
+ `w14:textFill`, `w14:scene3d`, `w14:props3d`, `w14:ligatures`, `w14:numForm`,
851
+ `w14:numSpacing`, `w14:stylisticSets`, and `w14:cntxtAlts`. Simple
852
+ explicitly sized solid, double, dotted, dashed, inset, and outset line borders
853
+ project through CSS with direct or automatic color and point padding; explicit
854
+ `nil`/`none` resets also project. Outline, shadow, emboss, imprint, legacy text
855
+ animations, complex
856
+ multi-line, wavy, or 3D line borders, border shadow/frame, theme-only border
857
+ colors, hidden, and web-hidden values remain native-only because Word rendering
858
+ and view settings govern them. Manual run widths also remain native-only
859
+ because Word ignores `w:fitText` inside Office Math, so the MathML preview
860
+ deliberately does not emulate them.
861
+ East Asian two-lines-in-one, enclosing brackets, horizontal-in-vertical
862
+ rotation, and rotated-text compression also remain native-only. CSS
863
+ `text-combine-upright`, writing modes, and transforms do not preserve Word's
864
+ two-sub-line distribution or its left-rotated inline line box, so approximating
865
+ them would introduce layout drift.
866
+ `w:specVanish` also remains native-only and never hides an equation preview.
867
+ The standard limits its display semantics to paragraph marks and allows it to
868
+ be ignored on any other run; Word additionally ignores it unless `w:vanish` is
869
+ set. Schema-valid values are still retained without inventing that dependency.
870
+ Office 2010 glow, shadow, reflection, text-outline, 3D-scene, and 3D-property
871
+ effects also remain native-only. CSS `text-shadow`, reflection, opacity, perspective,
872
+ transform, text-stroke, paint-order, and border approximations cannot preserve
873
+ theme-bound colors,
874
+ ordered color transforms, exact blur and offset coordinates, reflection
875
+ opacity/position/fade geometry, signed scaling and skew, rectangle alignment,
876
+ gradient or compound strokes, preset dashes, caps, joins, or pen alignment, so
877
+ previews retain readable equation text without inventing a visually misleading
878
+ effect.
879
+ Text `noFill`, theme or transformed text-fill colors, and nonempty gradients
880
+ remain native-only when no exact MathML color exists. CSS transparent text or
881
+ background-clipped gradient approximations would make previews fragile, so the
882
+ underlying readable color remains the fallback.
883
+ `w:highlight` takes display precedence over `w:shd`; named highlights, explicit
884
+ highlight removal, clear direct fills, solid direct foregrounds, and nil
885
+ shading map to MathML `mathbackground`. Pattern masks and theme-only colors
886
+ remain native metadata when no exact browser color is available.
887
+ Enabled mutually exclusive all-caps/small-caps, strike/double-strike, or relief
888
+ combinations, invalid animation values, art-border styles, out-of-range border
889
+ width/spacing, malformed border colors/flags, missing, malformed, fractional,
890
+ or out-of-range manual widths and grouping IDs, missing or unknown
891
+ vertical-alignment or emphasis-mark values, malformed or out-of-range East
892
+ Asian layout IDs, flags, or bracket styles, malformed paragraph-mark visibility
893
+ flags, malformed glow radii, shadow or reflection geometry, text-outline
894
+ fill/gradient/dash/join structure, text-fill wrapper/fill/gradient structure,
895
+ color choices or transform chains, 3D-scene camera/light structure,
896
+ 3D-property extrusion/contour/bevel/color structure, bounded coordinates,
897
+ missing or malformed ligature values, non-leaf ligature content, preset values,
898
+ missing or malformed numeral-form values, non-leaf numeral-form content,
899
+ missing or malformed numeral-spacing values, non-leaf numeral-spacing content,
900
+ malformed or over-limit stylistic-set containers, entries, IDs, or on/off
901
+ values, malformed or non-leaf contextual-alternate values, directions, or
902
+ rotation angles, and unknown, duplicated, reordered,
903
+ namespace-spoofed, or relationship-bound Word run properties fail
904
+ closed instead of being silently discarded.
905
+ Border-box, box, and equation-array flags retain their semantic defaults, and
906
+ manual-break alignment indices are bounded to 1–255. Strict and transitional
907
+ UTF-8/UTF-16 math is normalized for editing. Invalid or non-combining accent
908
+ characters, malformed math-run or function structures, invalid or contradictory
909
+ fraction, radical, n-ary, delimiter, bar, group-character, phantom, border-box,
910
+ box, or equation-array properties,
911
+ malformed script-property, pre-script, math-paragraph, or lower/upper limit
912
+ structures,
913
+ malformed, duplicated, reordered, or out-of-range matrix spacing/gap
914
+ properties, ragged or over-limit matrices,
915
+ over-limit equation arrays,
916
+ malformed, misplaced, over-budget, namespace-spoofed, nested, or
917
+ relationship-bound math is flattened to bounded text and reported instead of
918
+ being trusted or silently attached to another equation.
919
+ Relationship-free passive extensions on uniquely matched `w:footnote`,
920
+ `w:endnote`, `w:comment`, and `w15:commentEx` roots are retained, and valid
921
+ `commentsIds` durable IDs are rebound to each regenerated final comment
922
+ paragraph. Duplicate or namespace-spoofed identities, deleted semantic records,
923
+ relationship-bound branches, and unsupported modern reaction/people sidecars
924
+ fail closed. Within uniquely matched note, comment, and reply records,
925
+ text-stable direct paragraphs and runs retain eligible passive extensions on
926
+ `w:p`, `w:r`, and `w:rPr`. Safe unmodeled note properties also survive, while
927
+ unchanged plain-text comments recover relationship-free source run boundaries
928
+ and formatting. Stable `w:hyperlink` wrappers now retain safe tooltips and
929
+ passive metadata. Generated note destinations remain authoritative; unchanged
930
+ comments and replies recover validated HTTP(S), `mailto`, or internal-anchor
931
+ destinations, with external relationship IDs deduplicated or rewritten after
932
+ collisions. Text-stable static rich-text and plain-text content controls also
933
+ recover eligible inline or contiguous block wrappers, aliases, tags, locking,
934
+ signed IDs, Word 2013 appearance and color, end-character formatting, passive
935
+ metadata, and stable runs. Editable footnote and endnote tables now regenerate
936
+ as native `w:tbl` blocks rather than flattened row text. Rich-text block
937
+ controls can safely span structurally stable paragraphs, tables, and nested
938
+ tables; matching includes row/cell shape, grid spans, merge state, nested block
939
+ shape, and exact paragraph text while generated table geometry wins. Colliding
940
+ control IDs are rewritten while unconflicted source IDs remain stable. Text or
941
+ table-structure edits, duplicate paragraphs or properties, missing or malformed
942
+ hyperlink relationships, wrong target types or modes, unsafe or relative
943
+ targets, combined external-plus-anchor destinations, namespace spoofing,
944
+ active data bindings or placeholder state, form or nested controls,
945
+ relationship-bound content, math, drawing-bearing control wrappers, and other
946
+ unsupported wrappers fail closed or normalize instead of being attached to the
947
+ wrong content. Source font-table metadata and source-only internal obfuscated
948
+ font payloads are also retained, with relationship references rewritten after
949
+ ID collisions. External fonts, wrong relationship or content types, duplicate
950
+ identities, and paths that collide with generated payloads are not reconnected.
951
+ Native DOCX consumers can use the retained embedded fonts; the browser editor,
952
+ preview, and PDF renderer do not load document-embedded font binaries and may
953
+ substitute fonts or wrap text differently.
422
954
 
423
955
  ## Native automation
424
956
 
@@ -436,8 +968,10 @@ selected pages from one previously validated complete inventory without
436
968
  rescanning the full document; render still revalidates the immutable source and
437
969
  actual page profile before publication. The same retained inventory now
438
970
  authorizes bounded native PDF text-layer extraction with source-order Unicode,
439
- exact UTF-8/UTF-16 ranges, optional glyph boxes in PDF coordinates, and bounded
440
- document outlines with exact page targets. Text and outline calls revalidate
971
+ exact UTF-8/UTF-16 ranges, optional glyph boxes, and PDFium-native same-line,
972
+ same-style runs with exact PDF-coordinate bounds. Independent character and run
973
+ limits keep the result bounded. Document outlines retain exact page targets.
974
+ Text and outline calls revalidate
441
975
  the immutable source, reuse inventory authority, and return typed limit or
442
976
  unsupported failures without OCR or Browser access. Richer slides and formats
443
977
  without an authoritative provider remain typed unsupported instead of being
@@ -454,11 +988,112 @@ cargo run -p a3s-office-cli -- set report.docx /body --find Draft --replace Fina
454
988
 
455
989
  # Start the standard MCP server
456
990
  cargo run -p a3s-office-cli -- mcp
991
+
992
+ # Join a browser-owned Yjs document as a durable coding-agent replica.
993
+ cargo run -p a3s-office-cli -- collab join .a3s/report.replica \
994
+ --artifact-id report --kind document --actor-id agent-7 \
995
+ --operation-id join-1 --input browser.update --json
996
+
997
+ # Export only the CRDT state missing from a remote state vector.
998
+ cargo run -p a3s-office-cli -- collab diff .a3s/report.replica \
999
+ --state-vector-input browser.state-vector --output agent.update --json
1000
+
1001
+ # Bridge that replica to a host-owned room over machine-readable JSONL.
1002
+ cargo run -p a3s-office-cli -- collab session .a3s/report.replica \
1003
+ --poll-ms 100 --json
1004
+
1005
+ # Make a typed local change in an initialized Markdown replica. A running
1006
+ # session publishes the resulting incremental Yjs update automatically.
1007
+ cargo run -p a3s-office-cli -- collab mutate .a3s/notes.replica \
1008
+ --artifact-id notes --kind markdown --actor-id agent-7 --mode edit \
1009
+ --operation-id edit-42 \
1010
+ --mutation '{"type":"markdown-replace","markdown":"# Shared notes"}' --json
1011
+
1012
+ # Document text replacement is fail-closed: the shared XmlText must contain
1013
+ # exactly the declared number of non-overlapping matches.
1014
+ cargo run -p a3s-office-cli -- collab mutate .a3s/report.replica \
1015
+ --artifact-id report --kind document --actor-id agent-7 --mode edit \
1016
+ --operation-id edit-43 \
1017
+ --mutation '{"type":"document-replace-text","search":"Draft","replacement":"Final","expectedMatches":1}' --json
1018
+
1019
+ # Insert one plain paragraph beside a stable paragraph in a supported block
1020
+ # container, including a nested list item or table cell.
1021
+ cargo run -p a3s-office-cli -- collab mutate .a3s/report.replica \
1022
+ --artifact-id report --kind document --actor-id agent-7 --mode edit \
1023
+ --operation-id edit-44 \
1024
+ --mutation '{"type":"document-insert-paragraph","anchorParagraphId":"00000001","position":"after","paragraphId":"00000012","textId":"00000013","text":"Native paragraph"}' --json
1025
+
1026
+ # Set one PDF form value through its stable fully-qualified field name.
1027
+ cargo run -p a3s-office-cli -- collab mutate .a3s/application.replica \
1028
+ --artifact-id application --kind pdf --actor-id agent-7 --mode edit \
1029
+ --operation-id edit-45 \
1030
+ --mutation '{"type":"pdf-set-form-value","fieldId":"Applicant.Name","value":"Grace Hopper"}' --json
1031
+
1032
+ # Create one portable highlight on source page 1. The nested rect and
1033
+ # segmentRects use EmbedPDF's browser annotation geometry.
1034
+ cargo run -p a3s-office-cli -- collab mutate .a3s/application.replica \
1035
+ --artifact-id application --kind pdf --actor-id agent-7 --mode edit \
1036
+ --operation-id annotation-create-1 \
1037
+ --mutation '{"type":"pdf-create-annotation","annotationId":"annotation-1","pageIndex":0,"annotation":{"id":"annotation-1","pageIndex":0,"type":9,"rect":{"origin":{"x":68,"y":78},"size":{"width":300,"height":28}},"segmentRects":[{"origin":{"x":68,"y":78},"size":{"width":300,"height":28}}],"strokeColor":"#f59e0b","color":"#f59e0b","opacity":0.48,"contents":"Review this heading"}}' --json
1038
+
1039
+ # Append one attributable redaction proposal. Geometry is expressed in source
1040
+ # page coordinates and the replica actor becomes proposedBy.
1041
+ cargo run -p a3s-office-cli -- collab mutate .a3s/application.replica \
1042
+ --artifact-id application --kind pdf --actor-id agent-7 --mode edit \
1043
+ --operation-id edit-46 \
1044
+ --mutation '{"type":"pdf-propose-redaction","proposalId":"redaction-1","pageIndex":0,"rects":[{"left":10,"top":20,"right":80,"bottom":40}],"proposedAt":"2026-08-15T03:00:00.000Z","reason":"Personal data"}' --json
1045
+
1046
+ # Append the one final decision for that review target. The replica actor
1047
+ # becomes actorId; it is never accepted from caller-authored JSON.
1048
+ cargo run -p a3s-office-cli -- collab mutate .a3s/application.replica \
1049
+ --artifact-id application --kind pdf --actor-id agent-7 --mode edit \
1050
+ --operation-id edit-47 \
1051
+ --mutation '{"type":"pdf-decide-review","decisionId":"decision-1","targetKind":"redaction","targetId":"redaction-1","decision":"approve","createdAt":"2026-08-15T03:05:00.000Z"}' --json
1052
+
1053
+ # Propose a clockwise rotation for selected immutable source pages. Deletion
1054
+ # and complete reorder use pdf-propose-page-deletion/page-reorder.
1055
+ cargo run -p a3s-office-cli -- collab mutate .a3s/application.replica \
1056
+ --artifact-id application --kind pdf --actor-id agent-7 --mode edit \
1057
+ --operation-id edit-48 \
1058
+ --mutation '{"type":"pdf-propose-page-rotation","pageOperationId":"page-operation-1","pageIndices":[0,2],"degrees":90,"proposedAt":"2026-08-15T03:10:00.000Z"}' --json
457
1059
  ```
458
1060
 
459
1061
  CLI, MCP, the typed Rust API, and the packaged Office Skill share the same
460
1062
  bounded contracts. They inspect and modify files without launching desktop
461
- Office or scraping editor UI.
1063
+ Office or scraping editor UI. The collaboration replica is transport-neutral:
1064
+ the host still owns rooms, authentication, authorization, and delivery. Browser
1065
+ Core also provides a bounded host-channel adapter for Yjs state-vector/update
1066
+ sync and a typed, ephemeral Awareness controller for participants and
1067
+ format-specific locations. React, Vue, and Web Components can project that
1068
+ controller as a shared participant roster, remote canvas projection, and
1069
+ participant-to-location navigation; neither component creates an account or
1070
+ backend. The native CLI's JSONL session bridges the same host-channel envelope,
1071
+ including reconnect handshakes, durable agent updates, and remote-echo
1072
+ suppression, without opening its own network provider. Typed Markdown
1073
+ replace/splice operations use browser UTF-16 offsets. Document mutations edit
1074
+ ProseMirror `Y.XmlText` in place, rotate the affected Word `textId`, insert a
1075
+ plain paragraph beside a stable identity in a bounded section, list-item,
1076
+ table-cell/header, or blockquote container, or delete one only after its
1077
+ complete text and `textId` still match. Required container blocks and each list
1078
+ item's leading paragraph are preserved. Text or structural edits inside a
1079
+ table rotate every identified ancestor row's `rowTextId`; incomplete row
1080
+ identities fail before any write. Paragraphs containing inline atoms or review
1081
+ marks remain guarded.
1082
+ Page-color/track-changes sidecars remain independent conflict-local fields. All
1083
+ mutations use the same durable event path. PDF annotation creation accepts the
1084
+ portable browser record for FreeText, Highlight, Underline, StrikeOut, or Ink,
1085
+ writes `source: created`, and commits its immutable claim atomically. An update
1086
+ supplies complete `expectedAnnotation` and `nextAnnotation` values; recursive
1087
+ optimistic matching merges unrelated concurrent leaves and rejects a stale
1088
+ same-leaf edit. Deletion supplies expected source/page/type identity and writes
1089
+ an irreversible tombstone. PDF form mutations update the same field-addressed
1090
+ presence/fields/order roots as the browser binding. PDF redaction and
1091
+ rotate/delete/reorder page-operation proposals plus final decisions append
1092
+ immutable typed records and canonical claims in one transaction, derive actor
1093
+ attribution from the replica, and reject invalid source-page sets, missing
1094
+ targets, or a second final decision. None of these paths puts source or
1095
+ signature bytes in Yjs. Validated browser source origins survive native
1096
+ persistence and are re-emitted separately from host delivery IDs.
462
1097
 
463
1098
  Read the [native engine design](docs/latest/en/native-office-engine.md), the
464
1099
  complete [CLI reference](docs/latest/en/cli-reference.md), or the published
@@ -523,9 +1158,13 @@ without hard-coded return URLs.
523
1158
 
524
1159
  - [Live Playground](https://a3s-lab.github.io/Office/)
525
1160
  - [Documentation center](https://a3s-lab.github.io/Office/docs/)
1161
+ - [A3S Office 0.4.0 documentation](https://a3s-lab.github.io/Office/docs/0.4.0/)
1162
+ - [A3S Office 0.3.0 documentation](https://a3s-lab.github.io/Office/docs/0.3.0/)
526
1163
  - [A3S Office 0.2.0 documentation](https://a3s-lab.github.io/Office/docs/0.2.0/)
527
1164
  - [A3S Office 0.1.0 documentation](https://a3s-lab.github.io/Office/docs/0.1.0/)
528
1165
  - [React, Vue, and Web Component integration](https://a3s-lab.github.io/Office/docs/components/)
1166
+ - [Real-time collaboration](https://a3s-lab.github.io/Office/docs/en/components/collaboration.html)
1167
+ - [Collaboration delivery roadmap](COLLABORATION_ROADMAP.md)
529
1168
  - [Office CLI and coding-agent Skill](https://a3s-lab.github.io/Office/docs/automation/)
530
1169
  - [Browser editor architecture](docs/latest/en/browser-editor-architecture.md)
531
1170
  - [Native Office engine](docs/latest/en/native-office-engine.md)