@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
@@ -32,6 +32,115 @@ model:
32
32
  from host-page controls while its own shortcuts remain deterministic.
33
33
  Successful object and grid commands restore focus to the latest controlled
34
34
  selection before the next keystroke.
35
+ Writer keeps tab, group, label, and shortcut metadata in one internal
36
+ command catalog. Undo and redo live in a keyboard-described quick-access
37
+ toolbar. The ribbon measures its own toolbar instead of the browser viewport
38
+ and compacts low-priority, then normal-priority groups before exposing group
39
+ paging. It can remain collapsed; activating a tab temporarily overlays that
40
+ tab's commands without moving the document, and an outside pointer action
41
+ returns to the compact row. Writer routes its catalogued WPS font-size,
42
+ alignment, line-spacing, heading, spelling, field-refresh, comment, and
43
+ track-changes shortcuts only while the document surface owns the event. The
44
+ status route uses the same catalog for WPS word count, opening live page,
45
+ word, character, and paragraph details from either `Ctrl+Shift+G` or the
46
+ visible count. Its local formatting clipboard powers WPS copy-format and
47
+ paste-format shortcuts
48
+ plus a one-shot format painter without requiring browser clipboard access;
49
+ paste replaces only direct character and paragraph formatting, preserving
50
+ links, comments, and revision semantics in one document transaction.
51
+ Header and footer TipTap surfaces register the same WPS alignment and
52
+ copy-format shortcuts. Cross-surface paste retains compatible marks and
53
+ paragraph attributes while falling back from unsupported heading nodes.
54
+ Writer orders Insert commands as Pages, Table, Illustrations, Links, Header
55
+ and Footer, and Text. The Links group creates paired body-bookmark
56
+ boundaries around a selection or caret, keeps copy identity separate, and
57
+ represents internal destinations as `#name` marks with an explicit
58
+ missing-target class. The References target picker also exposes those body
59
+ bookmarks alongside captions; bookmark cross-reference atoms retain target
60
+ identity, source instruction, live display text, and a missing-target state.
61
+ DOCX import/export maps the boundaries to native
62
+ `w:bookmarkStart`/`w:bookmarkEnd` ranges, bookmark cross-references to `REF`
63
+ fields, and internal links to `w:anchor` rather than relationship-backed
64
+ external hyperlinks. Footnote and endnote reference atoms share a
65
+ transaction-normalized graph with their editable definitions. References
66
+ retain identity through moves, copied references clone definition content
67
+ under a new identity, deletions remove the complete pair, and one appended
68
+ transaction keeps undo and redo atomic. Each note kind numbers independently
69
+ in reference order; new or reconstructed footnote definitions use the
70
+ reference section and newly inserted endnotes use the final section. The
71
+ structured HTML parser
72
+ gives note markers precedence over generic superscript so native DOCX notes
73
+ survive repeated import and export. The Insert Text group creates atomic
74
+ `PAGE`, `NUMPAGES`, `SECTION`,
75
+ `SECTIONPAGES`, `DATE`, and `TIME` fields. A position resolver maps every
76
+ field to its measured Worker/WASM layout block, physical page descriptor,
77
+ owning section, and the set of physical pages occupied by that section, so
78
+ continuous sections sharing one page retain truthful section-page counts.
79
+ Pagination-driven numeric refreshes do not add undo history and deliberately
80
+ leave clock fields unchanged; the scoped F9 command refreshes date and time
81
+ too, as one history action. A transaction-mapped identity plugin lets moved
82
+ fields keep their IDs while copied atoms receive fresh, redo-stable IDs.
83
+ DOCX import atomizes only complete, non-nested inline `w:fldSimple` or
84
+ complex fields. Nested, incomplete, cross-paragraph, deleted, and
85
+ instructionless structures keep their rendered result as text and emit a
86
+ structural compatibility warning instead of being flattened into a false
87
+ editable field. Native export writes live simple fields and requests a Word
88
+ field update on open. Page Layout keeps direct margin, orientation, paper,
89
+ and equal-column presets in the ribbon; custom margins and advanced columns
90
+ open the corresponding controlled Page Setup tab instead of duplicating a
91
+ second settings model. References separates footnotes, captions, citations
92
+ and bibliography, and field updates; Review derives previous, next, accept,
93
+ and reject availability from the live revision ranges and moves the
94
+ selection to the next resolvable change. View keeps document modes before
95
+ display controls and calculates One Page and Page Width zoom from the live
96
+ page metrics and scroll viewport. Picture, Table, and Header and Footer tabs
97
+ carry explicit contextual semantics and disappear with their selection. The
98
+ Spreadsheet shell now uses the same responsive ribbon contract with its own
99
+ command catalog and workbook semantics. It keeps the WPS tab order, places
100
+ Conditional Formatting under Home and Styles, exposes real sorting under
101
+ Data, and owns F9 workbook recalculation in the root-scoped keyboard
102
+ controller. Paste, Cut, and Copy live in the first Home group; both button
103
+ clicks and WPS shortcuts cross one clipboard command port before using the
104
+ permission-resilient browser/local clipboard implementation. Format Painter
105
+ uses a dedicated format-pattern model and React session hook behind another
106
+ typed command port. It captures owned native style attributes only, expands
107
+ or tiles the pattern across same-sheet or cross-sheet targets, guards both
108
+ sides at 50,000 cells, suppresses repeated engine callbacks for the same
109
+ target, and emits one `batchCallApis` update per application. One-shot and
110
+ double-click locked state therefore stay outside the ribbon, while the
111
+ ribbon exposes pressed status and Escape cancellation without copying cell
112
+ values or workbook structure. AutoFilter follows the same boundary: a pure
113
+ workbook model derives a finite current region or accepts an explicit
114
+ multi-row range, a React hook owns controlled enable/disable state, and a
115
+ typed command port connects the Data ribbon plus `Cmd/Ctrl+Shift+L` and
116
+ `Alt+ArrowDown`. The Fortune adapter only exposes the header trigger and
117
+ value menu, adding dialog, checkbox, focus-restoration, and keyboard
118
+ semantics without making vendor DOM text the command contract. Freeze Panes
119
+ also stays controlled: a pure model translates the current WPS cell into
120
+ rows above and columns left or applies top-row and first-column presets, a
121
+ typed View command performs one immutable workbook update, and the native
122
+ Fortune/XLSX frozen-pane model remains the render and serialization
123
+ boundary. Its menu owns Arrow, Home, End, Enter, Escape, pressed state, and
124
+ focus restoration without introducing a parallel vendor toolbar. Home and
125
+ Cells now exposes the existing typed structure commands through one Rows and
126
+ Columns menu: insert and delete availability comes from the live selection,
127
+ execution stays in the workbook command port, and successful actions return
128
+ focus to the grid instead of introducing ribbon-local mutations. Home and
129
+ Alignment owns cell merging through a split control whose primary action and
130
+ `Ctrl+M` execute Merge and Center. Merge Cells, Merge Across, Unmerge Cells,
131
+ and Unmerge and Fill use the same typed command path, derive availability
132
+ from the selection and native Fortune merge ranges, and emit one
133
+ `batchCallApis` transaction per user intent. Home and Editing owns one Clear
134
+ disclosure for All, Formats, Contents, Comments, and Hyperlinks. Delete and
135
+ Backspace share the Contents command; all five modes transform the live
136
+ sheet immutably, retain merge geometry, preserve cell state outside the
137
+ selected mode, and emit one controlled workbook batch. The
138
+ catalog is the source of truth for labels, locations, and shortcut metadata;
139
+ typed command ports remain the source of truth for execution and
140
+ availability. The labelled status surface provides arrow-key traversal
141
+ across view and zoom
142
+ controls; compact Web widths remove secondary section, proofing, citation,
143
+ and save items in stages while retaining physical-page and zoom feedback.
35
144
  2. Each editor owns its selection model and exposes typed commands to the
36
145
  shell. A command never searches rendered text or infers intent from labels.
37
146
  3. Interactive editing stays on the main thread. Presentation keeps object
@@ -66,7 +175,7 @@ localized labels and viewport heuristics never decide behavior.
66
175
  | Task pane | Find and replace, page setup, citation sources, and revision review | Mutually exclusive at the right edge of the document workspace. It shares width with the page above 900 px, overlays the page below 900 px, and becomes workspace-wide below 520 px. Escape and the visible close action follow the same guarded close path. |
67
176
  | Review rail | Anchored comments and comment drafts | Sits beside the paper and connects each thread to its text range. Below 620 px it becomes a bounded review drawer, removes connector lines, and lays cards in document order instead of using absolute placement. |
68
177
  | Anchored popover | Table size, paragraph spacing, paragraph pagination, colors, and select options | Portaled to the body but positioned from the invoking control. It flips vertically, clamps to a 16 px viewport margin, updates on nested scroll and resize, focuses its first field when it behaves like a small dialog, and returns focus to the trigger on Escape. A dirty numeric field consumes the first Escape to discard only its local draft; a clean field lets the next Escape close the surface without a blur commit. |
69
- | Modal dialog | Captions, cross-references, links, image descriptions, notices, and confirmations | Centered in the viewport with bounded height and an independently scrolling body. The body-level portal makes every non-dialog body child inert. Focus stays inside, destructive confirmations initially focus the safe action, and closing returns to the actual invoker unless the completed command deliberately restores the editor. |
178
+ | Modal dialog | Bookmarks, captions, cross-references, links, image descriptions, notices, and confirmations | Centered in the viewport with bounded height and an independently scrolling body. The body-level portal makes every non-dialog body child inert. Focus stays inside, destructive confirmations initially focus the safe action, and closing returns to the actual invoker unless the completed command deliberately restores the editor. |
70
179
 
71
180
  Task panes preserve editing context instead of behaving like navigation.
72
181
  Closing a pane returns focus to the body editor. Switching away from a dirty
@@ -157,9 +266,9 @@ focus restoration.
157
266
 
158
267
  | Product | Implemented browser surface | Implemented kernel boundary | Next fidelity gate |
159
268
  | --- | --- | --- | --- |
160
- | Document | One TipTap/ProseMirror body tree retained across editing and read-only preview, controlled TipTap header/footer surfaces with direct paper-margin editing and a contextual ribbon, one typography and page-chrome baseline across editing, preview, and PDF surfaces, a persistent typed heading-navigation pane with active-selection tracking, filtering and collapsible keyboard traversal, host-owned selected-text menus with full document context and range-mapped async commands, responsive and keyboard-operated paragraph-style and list galleries, typed bullet and numbering commands with restart/continue/start controls, typed physical-page and section-page descriptors, repeated first/default/even page chrome, a versioned structured model with an HTML compatibility representation, prefix-reused visual-line measurement and pages, page decorations, page-aware horizontal and vertical rulers for page margins, paragraph indents and typed tab stops, structured list-item pagination, explicit paragraph and list-item direction, compact spacing and pagination controls, typed inline/square/top-and-bottom image layout, imported style-inherited paragraph properties, structured inline tabs, and theme-aware run font/size/color/background import | Worker plus resumable Rust/WASM flow pagination and Rustybuzz shaping across CSS-matched registered text runs; the same live result remains mounted in read-only preview and is consumed by bounded browser PDF capture, including eligible list paragraphs, Unicode bidi level segmentation, ordered per-grapheme font fallback, packaged Latin/CJK/Arabic/Hebrew faces, and structured left-to-right tabs, with explicit DOM and JavaScript fallbacks for text affected by supported floats | Language-complete font substitution, complete Word style and numbering coverage, locale-complete and bidirectional tabs, arbitrary floating-object offsets and layering, complex table flow, searchable/vector PDF output, and loss-preserving OOXML package state |
269
+ | Document | One TipTap/ProseMirror body tree retained across editing and read-only preview, controlled TipTap header/footer surfaces with direct paper-margin editing and a contextual ribbon, one typography and page-chrome baseline across editing, preview, and PDF surfaces, a persistent typed heading-navigation pane with active-selection tracking, filtering and collapsible keyboard traversal, host-owned selected-text menus with full document context and range-mapped async commands, responsive and keyboard-operated paragraph-style and list galleries, typed bullet and numbering commands with restart/continue/start controls, typed physical-page and section-page descriptors, repeated first/default/even page chrome, a versioned structured model with an HTML compatibility representation, prefix-reused visual-line measurement and pages, page decorations, page-aware horizontal and vertical rulers for page margins, paragraph indents and typed tab stops, structured list-item pagination, explicit paragraph and list-item direction, compact spacing and pagination controls, typed inline/square/tight/through/top-and-bottom/no-wrap image layout and floating-image drawing layers, imported style-inherited paragraph properties, structured inline tabs, and theme-aware run font/size/color/background import | Worker plus resumable Rust/WASM flow pagination and Rustybuzz shaping across CSS-matched registered text runs; the same live result remains mounted in read-only preview and is consumed by bounded browser PDF capture, including eligible list paragraphs, Unicode bidi level segmentation, ordered per-grapheme font fallback, packaged Latin/CJK/Arabic/Hebrew faces, and structured left-to-right tabs, with explicit DOM and JavaScript fallbacks for text affected by supported floats | Language-complete font substitution, complete Word style and numbering coverage, locale-complete and bidirectional tabs, arbitrary floating-object geometry and non-image drawing layers, complex table flow, searchable/vector PDF output, and loss-preserving OOXML package state |
161
270
  | Markdown | TipTap visual editing with a resizable source-and-preview split view by default, source-aware ribbon formatting and shortcuts, bounded source-native history with coalesced typing and selection restoration, host-defined selection menus across both editing surfaces, GFM tables, strikethrough, autolinks and nested task lists, controlled source state, coalesced preview rebuilds, proportional pane scrolling, keyboard-adjustable pane sizing, a flat measure-bounded reading surface, optional visual or source-only views, and a full-workspace Source/Preview switch on phones | No kernel required for normal editing | CommonMark differential fixtures, multi-megabyte profiling, and an off-main-thread parser boundary when measurements justify it |
162
- | Spreadsheet | Fortune Sheet grid integrated with the shared Office shell, shared grid/formula/footer visual tokens and one spreadsheet accent across selection, sheet tabs, menus, and zoom, an A3S-owned accessible single-row workbook footer for creation, activation, rename, duplicate, color, hide, reorder, delete, selection status, and zoom, a resize-observed worksheet viewport that keeps the active tab and its touch action visible across desktop, compact, and phone-width changes, one cell/worksheet context-menu surface whose displayed accelerators remain executable while the menu owns focus, Arrow/Home/End tab navigation plus Shift+F10 and native context-menu access, typed editing and calculation command ports, A3S-owned deterministic Arrow, Enter, Tab, Home, PageUp/PageDown, extended-selection, row, column, and all-cells keyboard commands, selection-preserving focus restoration across controlled workbook remounts and F2/Escape editing transitions, Cmd/Ctrl formatting, undo/redo, clear, a permission-resilient editor-local clipboard fallback, Shift+F11 sheet creation, and Ctrl/Cmd+PageUp/PageDown sheet-navigation shortcuts, direct font-family, horizontal/vertical-alignment, text-wrap, general/number/percent, and decimal-place controls backed by native cell-style keys, live count/sum/average selection summaries, operation-driven sparse-workbook projection, guarded controlled-value remounts that reject stale engine callbacks, and no-history result patches with cell-scoped Fortune fallback | Versioned, cancellable Worker/Rust-WASM calculation sessions using the shared bounded Rust formula parser, retained formula ASTs, incremental forward/reverse dependency graphs, dirty-subgraph recalculation, cross-sheet references, and a dynamically loaded JavaScript fallback | A3S-owned virtual grid, moving replacement projection off the main thread, broader Excel formula semantics, A3S-owned custom number-format evaluation, and print layout |
271
+ | Spreadsheet | Fortune Sheet grid integrated with the shared Office shell, a WPS-oriented command catalog and tab order, quick-access Undo and Redo, a priority-aware adaptive and collapsible ribbon with temporary tab expansion, Home and Styles Conditional Formatting, Home and Cells row/column insertion and deletion through the shared typed structure commands, Home and Alignment Merge and Center plus Merge Cells, Merge Across, Unmerge Cells, and Unmerge and Fill through one native-model-backed controlled batch per intent and the WPS `Ctrl+M` shortcut, Home and Editing Clear All, Formats, Contents, Comments, and Hyperlinks with Delete/Backspace mapped to content-only clearing and merge geometry retained, Data sorting and AutoFilter with bounded current-region discovery, controlled filter state, WPS toggle and header-menu shortcuts, and accessible vendor menu semantics, View and Window Freeze Panes with WPS current-cell, top-row, first-column, and unfreeze patterns backed by controlled state and native XLSX frozen panes, Formulas and F9 workbook recalculation, an executable Home clipboard group with permission-resilient Paste, Cut, and Copy plus a WPS-style one-shot and locked Format Painter for bounded cross-sheet native-style patterns, shared grid/formula/footer visual tokens and one spreadsheet accent across selection, sheet tabs, menus, and zoom, an A3S-owned accessible single-row workbook footer for creation, activation, rename, duplicate, color, hide, reorder, delete, selection status, and zoom, a resize-observed worksheet viewport that keeps the active tab and its touch action visible across desktop, compact, and phone-width changes, one cell/worksheet context-menu surface whose displayed accelerators remain executable while the menu owns focus, Arrow/Home/End tab navigation plus Shift+F10 and native context-menu access, typed editing and calculation command ports, A3S-owned deterministic Arrow, Enter, Tab, Home, PageUp/PageDown, extended-selection, row, column, and all-cells keyboard commands, selection-preserving focus restoration across controlled workbook remounts and F2/Escape editing transitions, Cmd/Ctrl formatting, undo/redo, clear, a permission-resilient editor-local clipboard fallback, Shift+F11 sheet creation, and Ctrl/Cmd+PageUp/PageDown sheet-navigation shortcuts, direct font-family, horizontal/vertical-alignment, text-wrap, general/number/percent, and decimal-place controls backed by native cell-style keys, live count/sum/average selection summaries, operation-driven sparse-workbook projection, guarded controlled-value remounts that reject stale engine callbacks, and no-history result patches with cell-scoped Fortune fallback | Versioned, cancellable Worker/Rust-WASM calculation sessions using the shared bounded Rust formula parser, retained formula ASTs, incremental forward/reverse dependency graphs, dirty-subgraph recalculation, cross-sheet references, and a dynamically loaded JavaScript fallback | A3S-owned virtual grid, moving replacement projection off the main thread, broader Excel formula semantics, A3S-owned custom number-format evaluation, and print layout |
163
272
  | Presentation | Scene canvas with ordered typed multi-selection, persistent nested browser groups, native PPTX group-node export, exact keyboard-accessible table-dimension insertion, native slide/object context actions with optional AI actions, a separate object/content editing state, one on-demand TipTap instance, collective move/scale/nudge/clipboard/delete/layer commands, selection-bound alignment and distribution, typed group/ungroup commands, one typed dispatcher for ribbon commands, editor-scoped shortcuts with post-command selection focus, direct beginning/current-slide playback with fullscreen fallback, frame-coalesced transactional move/resize previews that commit once on pointer release, two-level thumbnail node and scene windowing, and a phone stage that top-aligns the primary canvas while retaining one readable slide indicator beside view and zoom controls | Revisioned, cancellable Worker/Rust-WASM slide-relative alignment and object-set snapping with typed visual guides and a JavaScript fallback | Arbitrary rotated or reflected PPTX group transforms, connectors, theme resolution, text fitting, kernel-owned thumbnail layout, and slide serialization |
164
273
  | PDF | PDFium-backed page rendering with an A3S-owned responsive toolbar, a scrollable page-thumbnail rail with active-page synchronization and bounded bitmap/DOM windowing, a focus-contained phone page drawer, and typed capability controllers for navigation, zoom, search, basic annotations, annotation color, opacity, compatible stroke-width defaults and selection updates, history, and save; page and search drafts cancel without accidental commands, shortcuts remain scoped to the PDF root, and compact widths retain page status while exposing search-result traversal, navigation, zoom, and history through the keyboard-operated overflow menu | PDFium WebAssembly | Forms, redaction review, page organization, and reopen fixtures |
165
274
 
@@ -191,12 +300,13 @@ mode changes editability, accessible role, command chrome, and contextual
191
300
  interactions without replacing the ProseMirror DOM or clearing its measured
192
301
  blocks, shaped runs, page descriptors, and automatic-break decorations. Page
193
302
  headers and footers are visual overlays inside the configured top and bottom
194
- margins. Kernel protocol 15 therefore computes body height from page height
303
+ margins. Kernel protocol 16 therefore computes body height from page height
195
304
  minus physical margins only; page-chrome heights position repeated overlays
196
305
  and do not subtract the same space again. Browser PDF export locates the ready
197
306
  surface through the host's stable artifact ID, clones its ProseMirror DOM once,
198
307
  removes editing-only state, and crops exact physical pages from bounded capture
199
- batches. Explicit descriptor pages remain a fallback for surfaces without a
308
+ batches when their geometry is uniform or from exact per-page viewports when
309
+ it differs. Explicit descriptor pages remain a fallback for surfaces without a
200
310
  registered live document.
201
311
 
202
312
  The Word navigation pane uses that same capture boundary for real physical-page
@@ -396,20 +506,48 @@ Document image nodes carry typed layout, alignment, wrap-distance, alternative
396
506
  text, size, and per-image aspect-ratio-lock attributes. The contextual Picture
397
507
  ribbon keeps fast layout actions and opens one responsive Picture Properties
398
508
  dialog for centimeter width and height, aspect-ratio locking, wrapping,
399
- alignment, text distance, and alternative text. Applying the complete draft
509
+ alignment, text distance, signed horizontal and vertical offsets, their column,
510
+ paragraph, margin, or page reference frames, four-edge percentage cropping,
511
+ relative drawing order, behind-text placement, overlap and cell-layout policy,
512
+ anchor locking, and alternative text. Applying the complete draft
400
513
  updates only changed attributes in one separated TipTap history entry; cancel
401
514
  and Escape preserve the node and return focus to the exact invoker. Dimensions
402
515
  that were only projected into rounded centimeter fields retain their exact
403
516
  imported pixel values when untouched. Inline images stay in normal flow;
404
- supported left- or right-aligned square images use browser floats, and
405
- top-and-bottom images clear surrounding text. Paragraphs following a square
406
- float remain on the DOM visual-line path because the available line width
407
- changes while the float is active. The paginator reserves and observes the
408
- image block height, then sends the measured text fragments to the same
409
- Worker/Rust-WASM page-layout protocol. Supported square and top-and-bottom
410
- metadata round-trips through DOCX `wp:anchor`. Arbitrary offsets, crop geometry,
411
- contour wrapping, z-order, and drawing-layer relationships are not represented
412
- yet.
517
+ supported left- or right-aligned square images use browser floats, tight and
518
+ through images additionally project their DrawingML polygon through CSS
519
+ `shape-outside`, top-and-bottom images clear surrounding text, and no-wrap
520
+ images use absolute placement so body text does not reserve their rendered
521
+ height. A one-pixel pagination anchor keeps each free-floating image attached to
522
+ its document position, while `behindDoc` determines whether it paints behind or
523
+ in front of text. Paragraphs
524
+ following any supported side-wrapped float remain on the DOM visual-line path
525
+ because the available line width changes while the float is active. The
526
+ paginator reserves and observes the rendered height of flow-affecting images,
527
+ uses only the anchor height for no-wrap images, then sends the measured text
528
+ fragments to the same Worker/Rust-WASM page-layout protocol. Square,
529
+ tight, through, top-and-bottom, and no-wrap metadata round-trips through DOCX
530
+ `wp:anchor`; tight and through anchors preserve their wrap side, edited flag,
531
+ and ordered `wrapPolygon` vertices. Aligned anchors remain aligned,
532
+ while precise offsets preserve `positionH` and `positionV` reference frames
533
+ through edit, preview, and regenerated DOCX. Four-edge crop geometry remains
534
+ typed in the controlled model and round-trips as DrawingML `a:srcRect` for
535
+ inline and floating pictures. Supported floating pictures also preserve
536
+ drawing-layer relationships through unsigned `relativeHeight`,
537
+ `behindDoc`, `allowOverlap`, `layoutInCell`, and `locked` anchor attributes.
538
+ The browser maps the unsigned drawing order into bounded foreground and
539
+ behind-text stacking ranges while retaining the exact OOXML value for export.
540
+ Each image node also owns one normalized eight-hex-digit object identity plus
541
+ its DOCX drawing-property, anchor, and edit identifiers. A ProseMirror
542
+ transaction normalizer gives a pasted copy a fresh complete identity while a
543
+ move, cut-and-paste, deletion followed by undo, and redo retain the surviving
544
+ object's identity. Existing nodes and newly inserted images are normalized at
545
+ the editor boundary, and duplicates prioritize the mapped pre-transaction
546
+ object even when a copy is inserted before it. DOCX import retains
547
+ `wp:docPr@id`, `wp14:anchorId`, and a conforming `wp14:editId`. Export keeps the
548
+ drawing-property and anchor identity stable independently of regenerated media
549
+ relationship IDs, retains an untouched edit identifier, and advances the edit
550
+ identifier when the image itself is changed or moved.
413
551
 
414
552
  The page-layout panel mounts two bounded TipTap surfaces for the active
415
553
  header/footer variant. Pagination joins each kernel page placement to typed
@@ -534,10 +672,10 @@ font metric; imported tables no longer receive editor-only block margins. The
534
672
  Windows parity workflow exports the same fixture through WPS, captures both
535
673
  794 by 1123 CSS-pixel pages, and rejects page-size, landmark, or bounded pixel
536
674
  differences. Language-complete font substitution, variable font axes, the
537
- remaining character and table style properties, arbitrary floating-object
538
- offsets, cropping, contour wrapping and layering, row-internal table splitting
539
- inside a single long paragraph or complex merged-cell flow, nested tables,
540
- footnote balancing, multi-column flow, and mixed-size sections require the
675
+ remaining character and table style properties, non-image floating-object
676
+ layering, row-internal table splitting
677
+ inside a single long paragraph, footnote balancing, multi-column flow, and
678
+ mixed-size sections require the
541
679
  later layout stages below.
542
680
 
543
681
  Top-level tables now enter pagination as row flows. DOM measurement supplies
@@ -552,8 +690,11 @@ page, split at synchronized boundaries between direct cell blocks. One
552
690
  non-editable widget per cell aligns the page gap and paints a clipped slice of
553
691
  the same measured header overlay. The leading cell alone extends the paper-gap
554
692
  paint across the page margins. `cantSplit` rows and a single indivisible long
555
- paragraph remain atomic and may overflow; nested tables and complex merged-cell
556
- flows require a later fragmentation model.
693
+ paragraph remain atomic and may overflow. Nested tables contribute their own
694
+ row boundaries to the containing cell's synchronized fragment plan. A
695
+ `rowspan` cell is projected through every covered physical row with clipped,
696
+ contiguous document ranges; page breaks before continuation rows render inside
697
+ the spanning cell instead of inserting a conflicting synthetic table row.
557
698
 
558
699
  Table creation is selection-safe: a non-empty text selection is preserved and
559
700
  the chosen table is inserted after its containing block instead of replacing
@@ -563,7 +704,8 @@ Design owns keyboard-operated style presets, the header row, multi-cell
563
704
  shading, and a reusable border pen with whole-selection, outside, inside, side,
564
705
  inside-horizontal, and inside-vertical targets. Layout owns row and column
565
706
  insertion or deletion, cell merge and split, horizontal and vertical alignment, repeated headers,
566
- atomic rows, centimeter-based column width and row height fields, equal row and
707
+ atomic rows, percentage- or centimeter-based column width and centimeter-based
708
+ row height fields, equal row and
567
709
  column distribution, content/window autofit, table alignment, four-edge cell
568
710
  margins, and table deletion. Physical
569
711
  column widths remain coherent across merged cells through ProseMirror's table
@@ -586,7 +728,9 @@ areas.
586
728
  DOCX tables independently round-trip `tblGrid`, `tcW`, `tblLayout`, `tblW`,
587
729
  `jc`, `tblInd`, `tblCellMar`, `tcMar`, and `trHeight`; numeric fiftieth-percent
588
730
  and string percentage widths keep their actual size instead of collapsing to a
589
- full-width table. Window/content autofit remains responsive in the browser.
731
+ full-width table. Per-column percentage preferences are editable and export as
732
+ `tcW`, including merged cells, while `tblGrid` pixels remain browser layout
733
+ fallbacks. Window/content autofit remains responsive in the browser.
590
734
  Independent top, right, bottom, and left cell-border attributes
591
735
  render identically in edit and preview, export as independent `w:tcBorders`,
592
736
  and reopen without being flattened. Explicit table-level outer and inside
@@ -601,17 +745,19 @@ order. Their cell fills, per-edge borders, run emphasis, fonts, and colors, plus
601
745
  paragraph alignment, direction, indents, spacing and line rules, pagination
602
746
  rules, and tab stops enter the marker pipeline after paragraph styles and before
603
747
  direct paragraph, character-style, or run formatting. Direct table and cell
604
- properties remain higher-priority layers for cell presentation. Theme-derived
605
- conditional presentation is materialized as stable RGB for editing, preview,
606
- and regenerated DOCX output.
748
+ properties remain higher-priority layers for cell presentation. Nested tables
749
+ retain independent geometry and formatting through the same marker and export
750
+ paths, and target the innermost active table during editing. Theme-derived
751
+ presentation resolves to stable RGB for editing and preview, while untouched
752
+ run colors, run shading, cell fills, and per-edge borders retain semantic theme
753
+ references on regenerated DOCX output. Explicit color edits export direct RGB.
607
754
  The real styled-table fixture exercises a centered 62.5% table, table margins,
608
755
  a first-cell margin override, and matching edit/preview geometry through A3S
609
756
  Test.
610
757
  Command availability comes from the ProseMirror table state, so actions that
611
- cannot apply to the current selection remain disabled. Loss-preserving semantic
612
- theme references, less-common conditional paragraph properties outside the
613
- supported layout set, percentage-width column authoring, nested-table editing,
614
- and complex merged-cell conditional flow remain explicit fidelity gaps.
758
+ cannot apply to the current selection remain disabled. Less-common conditional
759
+ paragraph properties outside the supported layout set remain explicit fidelity
760
+ gaps.
615
761
 
616
762
  Paragraph tab stops are typed node attributes with normalized positions,
617
763
  left/center/right/decimal alignment, and leader styles. A leaf
@@ -698,6 +844,14 @@ text validation, UTF-16 offset mapping, shaping, and their tests live in
698
844
  focused modules. This keeps the fallback and WASM paths independently
699
845
  testable without duplicating their public protocol.
700
846
 
847
+ Layout requests carry a bounded, deduplicated page-style table and let each
848
+ measured block reference its section geometry. A geometry transition opens a
849
+ new physical page in both the JavaScript fallback and Rust/WASM kernel, and
850
+ each result page owns its exact metrics. The live page stack, navigation
851
+ thumbnail capture, and PDF capture all consume those result metrics, including
852
+ mixed custom sizes and orientations, instead of projecting the active
853
+ section's dimensions across the document.
854
+
701
855
  The npm package emits `office-kernel.worker.js`, `office-kernel.wasm`, and
702
856
  default Noto Sans, Noto Sans Hans, Noto Naskh Arabic, and Noto Sans Hebrew
703
857
  regular faces beside the public JavaScript entries. Hosts may override the
@@ -736,15 +890,76 @@ controlled value. Document-level page color remains outside the ProseMirror
736
890
  tree, is updated through the same controlled value, and is preserved by DOCX
737
891
  import/export and the browser PDF render surface.
738
892
 
739
- This is a transitional persistence boundary, not loss-preserving OOXML yet.
740
- DOCX still converts through Mammoth, but DOCX, HTML, and text imports create the
741
- structured model immediately through the same extension schema used by the
742
- editor. DOCX export materializes synchronized HTML from the structured model
743
- before OOXML generation, so a stale HTML cache cannot override model changes.
744
- Preview retains the mounted structured editor tree, and live browser PDF export
745
- captures that same paginated surface; compatibility HTML remains an
746
- import/export boundary. Unsupported OOXML package parts are not yet represented
747
- by the model.
893
+ `encodeDocumentSnapshot` and `decodeDocumentSnapshot` expose that complete
894
+ controlled value through the public Core entry point. The v1
895
+ `a3s.office.document.snapshot` envelope is deterministic bounded JSON and uses
896
+ the
897
+ `application/vnd.a3s.office.document-snapshot+json;version=1` media type. It
898
+ requires a synchronized structured model and retains every JSON-defined field,
899
+ including layout, review, comment, and bibliography state. A different schema
900
+ or version, malformed or oversized JSON, cyclic runtime input, and stale model
901
+ fingerprints fail closed. This is the persistence and transport boundary for
902
+ hosts that need exact browser/agent revision snapshots; they must not substitute
903
+ a lossy HTML-to-Markdown conversion.
904
+
905
+ This is a transitional persistence boundary, not fully loss-preserving OOXML
906
+ yet. DOCX still converts through Mammoth, but DOCX, HTML, and text imports
907
+ create the structured model immediately through the same extension schema used
908
+ by the editor. DOCX export materializes synchronized HTML from the structured
909
+ model before OOXML generation, so a stale HTML cache cannot override model
910
+ changes. Preview retains the mounted structured editor tree, and live browser
911
+ PDF export captures that same paginated surface; compatibility HTML remains an
912
+ import/export boundary.
913
+
914
+ The first package-state slice retains the original DOCX Blob by artifact ID.
915
+ After the generated core package is complete, safe source-only OPC parts are
916
+ copied byte-for-byte and their content-type declarations and relationships are
917
+ reconnected with collision-free IDs. The generated core parts remain
918
+ authoritative. Digital signatures, which are invalid after editing, plus VBA,
919
+ ActiveX, and custom-ribbon content are not propagated into the macro-free DOCX.
920
+ If a persisted artifact has lost its registered source Blob, export fails
921
+ closed. A persisted SHA-256 fingerprint also prevents a different DOCX from
922
+ being re-registered under the same artifact ID. Unknown attributes, elements,
923
+ and `mc:AlternateContent` branches are now selectively merged inside
924
+ `word/settings.xml`: only passive ignorable markup that is relationship-free,
925
+ structurally valid, and non-conflicting with generated Word settings survives.
926
+ Strict and transitional UTF-8/UTF-16 sources share this path. The package graph
927
+ also retains source font-table metadata and source-only internal obfuscated-font
928
+ payloads, then rewrites their references to collision-free relationship IDs.
929
+ External fonts, mismatched relationship or content types, duplicate identities,
930
+ and source payload paths that collide with generated parts are disconnected.
931
+ This preserves embedded fonts for native DOCX consumers without loading those
932
+ binaries into the browser editor, preview, or PDF renderer. Passive,
933
+ relationship-free extension trees at the roots and uniquely matched nodes of
934
+ `word/styles.xml` and `word/numbering.xml` are also retained. Styles match by
935
+ type plus style ID. Imported abstract-numbering, concrete-numbering, and level
936
+ metadata follows regenerated IDs. Duplicate, source-only, malformed, and
937
+ ambiguous one-to-many mappings fail closed, and generated Word semantics remain
938
+ authoritative. Relationship-free passive extensions from non-OOXML ignorable
939
+ namespaces also follow uniquely matched picture drawings in regenerated
940
+ document, header, and footer parts. The identity is the normalized anchor plus
941
+ drawing-property ID; header and footer imports retain both through sanitized
942
+ editable HTML. Strict/transitional UTF-8/UTF-16 sources share the same path.
943
+ Source-only or duplicate drawings, relationship-bound content,
944
+ Microsoft/OOXML semantic namespaces, and ambiguous identities fail closed,
945
+ while generated geometry and media win. The paragraph-identity slice preserves
946
+ the same class of passive extension on uniquely matched, unchanged paragraphs
947
+ and their paragraph properties. Native `w14:paraId` plus `w14:textId` survives
948
+ sanitized body and page-chrome HTML. Text edits rotate `textId`, formatting-only
949
+ edits and moves retain it, and copies or splits receive new paragraph IDs.
950
+ Changed text versions, duplicate identities, relationship-bound content, and
951
+ Microsoft/OOXML semantic branches fail closed; generated paragraph semantics
952
+ remain authoritative. The table-identity slice applies the same policy to
953
+ `w:tbl`, `w:tr`, and `w:tc` plus their property nodes. Rows carry native
954
+ `w14:paraId` and `w14:textId` through body and page-chrome HTML. Tables match by
955
+ their ordered directly owned row IDs, while cells match by their owning row and
956
+ directly owned paragraph IDs. Text or structural edits rotate a row version;
957
+ formatting-only edits and moves retain it, and copies receive independent IDs.
958
+ Nested DOM row and cell collections are filtered to their closest owning table
959
+ or row. Missing, duplicate, cross-kind, relationship-bound, or semantic
960
+ identities fail closed, and generated table geometry remains authoritative.
961
+ Unknown run, note, comment, and other inline markup remains the next
962
+ loss-preservation boundary.
748
963
 
749
964
  Migration to browser-native OOXML is staged:
750
965
 
@@ -797,12 +1012,12 @@ bundle regression.
797
1012
  - Extend the current horizontal and vertical page rulers with bidirectional and
798
1013
  locale-complete tab behavior, plus complete style, numbering, and theme
799
1014
  inheritance beyond the implemented paragraph slices.
800
- - Complete row-internal splitting for single indivisible paragraphs and
801
- complex merged-cell flows, and add nested tables, full floating-object
802
- geometry beyond the supported square/top-and-bottom image anchors, footnote
803
- balancing, columns, and mixed page sections. Row-flow pagination, direct-cell
804
- block splitting, repeating headers, and the initial image-wrapping slice are
805
- already implemented.
1015
+ - Complete row-internal splitting for single indivisible paragraphs and full
1016
+ floating-object geometry beyond the supported wrap, precise-anchor, and
1017
+ image-layer subset, plus footnote balancing and columns. Row-flow
1018
+ pagination, direct-cell and nested-row splitting, merged-cell continuations,
1019
+ repeating headers, and the current image-wrapping slice are already
1020
+ implemented.
806
1021
  - Keep pagination results as mapped ProseMirror decorations so reflow never
807
1022
  corrupts selection or undo history.
808
1023
 
@@ -1005,8 +1220,8 @@ repeatable fixtures. The targets below are release gates, not current claims:
1005
1220
  - WebAssembly performs no network or filesystem access.
1006
1221
  - Worker failure is recoverable and does not block typing.
1007
1222
  - Automatic pagination transactions are excluded from editor history.
1008
- - Multi-column and mixed-page-layout documents currently retain explicit-break
1009
- behavior until their layout protocols are implemented.
1223
+ - Multi-column documents currently retain explicit-break behavior until their
1224
+ layout protocol is implemented.
1010
1225
 
1011
1226
  ## Verification
1012
1227
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@a3s-lab/office",
3
- "version": "0.2.2",
3
+ "version": "0.4.0",
4
4
  "description": "Open-source browser editors for documents, Markdown, spreadsheets, presentations, and PDFs.",
5
5
  "keywords": [
6
6
  "office",
@@ -51,6 +51,7 @@
51
51
  "files": [
52
52
  "dist",
53
53
  "docs/latest/en/browser-editor-architecture.md",
54
+ "COLLABORATION_ROADMAP.md",
54
55
  "README.md",
55
56
  "LICENSE",
56
57
  "THIRD_PARTY_NOTICES.md"
@@ -83,13 +84,32 @@
83
84
  "playground:preview": "rsbuild preview --config playground/rsbuild.config.ts --host 127.0.0.1 --port 4175 --strict-port",
84
85
  "playground:typecheck": "tsc --noEmit -p playground/tsconfig.json",
85
86
  "playground:visual": "playwright test --config playwright.config.ts",
87
+ "playground:visual:spreadsheet-ribbon": "playwright test visual-tests/spreadsheet-ribbon.functional.spec.ts --config playwright.config.ts",
86
88
  "playground:visual:update": "playwright test --config playwright.config.ts --update-snapshots",
87
89
  "test": "rstest",
88
- "test:e2e": "bun run test:e2e:fixtures && a3s-test run tests/e2e/word-page-color.acl --json && a3s-test run tests/e2e/word-page-setup-phone.acl --json && a3s-test run tests/e2e/word-paragraph-layout-phone.acl --json && a3s-test run tests/e2e/word-list-formatting-phone.acl --json && a3s-test run tests/e2e/word-comments-drawer.acl --json && a3s-test run tests/e2e/word-comment-windowing.acl --json && a3s-test run tests/e2e/word-citations-phone.acl --json && a3s-test run tests/e2e/word-navigation-search.acl --json && a3s-test run tests/e2e/word-navigation-windowing.acl --json && a3s-test run tests/e2e/word-find-replace-phone.acl --json && a3s-test run tests/e2e/word-page-navigation.acl --json && a3s-test run tests/e2e/word-page-windowing.acl --json && a3s-test run tests/e2e/word-ai-question.acl --json && a3s-test run tests/e2e/word-picture-insert.acl --json && a3s-test run tests/e2e/word-picture-alt-text-phone.acl --json && a3s-test run tests/e2e/word-track-changes-phone.acl --json && a3s-test run tests/e2e/word-revision-windowing.acl --json && a3s-test run tests/e2e/word-table-phone.acl --json && a3s-test run tests/e2e/word-table-borders.acl --json && a3s-test run tests/e2e/word-theme-table.acl --json && a3s-test run tests/e2e/word-styled-table.acl --json && a3s-test run tests/e2e/word-multi-page-table.acl --json && a3s-test run tests/e2e/word-cross-reference-phone.acl --json && a3s-test run tests/e2e/spreadsheet-phone-rename.acl --json && a3s-test run tests/e2e/spreadsheet-phone-find.acl --json && a3s-test run tests/e2e/spreadsheet-phone-context-menu.acl --json && a3s-test run tests/e2e/spreadsheet-phone-task-pane.acl --json && a3s-test run tests/e2e/presentation-cut-paste-focus.acl --json && a3s-test run tests/e2e/presentation-presenter-view.acl --json && a3s-test run tests/e2e/presentation-phone-chart-pane.acl --json && a3s-test run tests/e2e/presentation-phone-comments.acl --json && a3s-test run tests/e2e/pdf-thumbnail-keyboard.acl --json && a3s-test run tests/e2e/pdf-page-drawer-phone.acl --json && a3s-test run tests/e2e/markdown-phone-modes.acl --json && a3s-test run tests/e2e/office-sidebar-breakpoint.acl --json && a3s-test run tests/e2e/office-docs-navigation.acl --json",
89
- "test:e2e:check": "bun run test:e2e:fixtures && a3s-test check tests/e2e/word-page-color.acl --json && a3s-test check tests/e2e/word-page-setup-phone.acl --json && a3s-test check tests/e2e/word-paragraph-layout-phone.acl --json && a3s-test check tests/e2e/word-list-formatting-phone.acl --json && a3s-test check tests/e2e/word-comments-drawer.acl --json && a3s-test check tests/e2e/word-comment-windowing.acl --json && a3s-test check tests/e2e/word-citations-phone.acl --json && a3s-test check tests/e2e/word-navigation-search.acl --json && a3s-test check tests/e2e/word-navigation-windowing.acl --json && a3s-test check tests/e2e/word-find-replace-phone.acl --json && a3s-test check tests/e2e/word-page-navigation.acl --json && a3s-test check tests/e2e/word-page-windowing.acl --json && a3s-test check tests/e2e/word-ai-question.acl --json && a3s-test check tests/e2e/word-picture-insert.acl --json && a3s-test check tests/e2e/word-picture-alt-text-phone.acl --json && a3s-test check tests/e2e/word-track-changes-phone.acl --json && a3s-test check tests/e2e/word-revision-windowing.acl --json && a3s-test check tests/e2e/word-table-phone.acl --json && a3s-test check tests/e2e/word-table-borders.acl --json && a3s-test check tests/e2e/word-theme-table.acl --json && a3s-test check tests/e2e/word-styled-table.acl --json && a3s-test check tests/e2e/word-multi-page-table.acl --json && a3s-test check tests/e2e/word-cross-reference-phone.acl --json && a3s-test check tests/e2e/spreadsheet-phone-rename.acl --json && a3s-test check tests/e2e/spreadsheet-phone-find.acl --json && a3s-test check tests/e2e/spreadsheet-phone-context-menu.acl --json && a3s-test check tests/e2e/spreadsheet-phone-task-pane.acl --json && a3s-test check tests/e2e/presentation-cut-paste-focus.acl --json && a3s-test check tests/e2e/presentation-presenter-view.acl --json && a3s-test check tests/e2e/presentation-phone-chart-pane.acl --json && a3s-test check tests/e2e/presentation-phone-comments.acl --json && a3s-test check tests/e2e/pdf-thumbnail-keyboard.acl --json && a3s-test check tests/e2e/pdf-page-drawer-phone.acl --json && a3s-test check tests/e2e/markdown-phone-modes.acl --json && a3s-test check tests/e2e/office-sidebar-breakpoint.acl --json && a3s-test check tests/e2e/office-docs-navigation.acl --json",
90
+ "test:e2e": "bun run test:e2e:fixtures && a3s-test run tests/e2e/word-page-color.acl --json && a3s-test run tests/e2e/word-page-setup-phone.acl --json && a3s-test run tests/e2e/word-paragraph-layout-phone.acl --json && a3s-test run tests/e2e/word-list-formatting-phone.acl --json && a3s-test run tests/e2e/word-font-picker-phone.acl --json && a3s-test run tests/e2e/word-comments-drawer.acl --json && a3s-test run tests/e2e/word-comment-windowing.acl --json && a3s-test run tests/e2e/word-citations-phone.acl --json && a3s-test run tests/e2e/word-navigation-search.acl --json && a3s-test run tests/e2e/word-navigation-windowing.acl --json && a3s-test run tests/e2e/word-find-replace-phone.acl --json && a3s-test run tests/e2e/word-page-navigation.acl --json && a3s-test run tests/e2e/word-page-windowing.acl --json && a3s-test run tests/e2e/word-ai-question.acl --json && a3s-test run tests/e2e/word-picture-insert.acl --json && a3s-test run tests/e2e/word-picture-alt-text-phone.acl --json && a3s-test run tests/e2e/word-track-changes-phone.acl --json && a3s-test run tests/e2e/word-review-conflict-phone.acl --json && a3s-test run tests/e2e/word-revision-windowing.acl --json && a3s-test run tests/e2e/word-table-phone.acl --json && a3s-test run tests/e2e/word-table-borders.acl --json && a3s-test run tests/e2e/word-theme-table.acl --json && a3s-test run tests/e2e/word-styled-table.acl --json && a3s-test run tests/e2e/word-multi-page-table.acl --json && a3s-test run tests/e2e/word-cross-reference-phone.acl --json && a3s-test run tests/e2e/word-bookmark-links-phone.acl --json && a3s-test run tests/e2e/word-notes-phone.acl --json && a3s-test run tests/e2e/word-fields-phone.acl --json && a3s-test run tests/e2e/spreadsheet-phone-rename.acl --json && a3s-test run tests/e2e/spreadsheet-phone-find.acl --json && a3s-test run tests/e2e/spreadsheet-phone-context-menu.acl --json && a3s-test run tests/e2e/spreadsheet-phone-task-pane.acl --json && a3s-test run tests/e2e/presentation-cut-paste-focus.acl --json && a3s-test run tests/e2e/presentation-presenter-view.acl --json && a3s-test run tests/e2e/presentation-phone-chart-pane.acl --json && a3s-test run tests/e2e/presentation-phone-comments.acl --json && a3s-test run tests/e2e/pdf-thumbnail-keyboard.acl --json && a3s-test run tests/e2e/pdf-page-drawer-phone.acl --json && a3s-test run tests/e2e/markdown-phone-modes.acl --json && a3s-test run tests/e2e/office-sidebar-breakpoint.acl --json && a3s-test run tests/e2e/office-docs-navigation.acl --json && a3s-test run tests/e2e/collaboration-participants.acl --json && a3s-test run tests/e2e/collaboration-pdf-annotations.acl --json",
91
+ "test:e2e:check": "bun run test:e2e:fixtures && a3s-test check tests/e2e/word-page-color.acl --json && a3s-test check tests/e2e/word-page-setup-phone.acl --json && a3s-test check tests/e2e/word-paragraph-layout-phone.acl --json && a3s-test check tests/e2e/word-list-formatting-phone.acl --json && a3s-test check tests/e2e/word-font-picker-phone.acl --json && a3s-test check tests/e2e/word-comments-drawer.acl --json && a3s-test check tests/e2e/word-comment-windowing.acl --json && a3s-test check tests/e2e/word-citations-phone.acl --json && a3s-test check tests/e2e/word-navigation-search.acl --json && a3s-test check tests/e2e/word-navigation-windowing.acl --json && a3s-test check tests/e2e/word-find-replace-phone.acl --json && a3s-test check tests/e2e/word-page-navigation.acl --json && a3s-test check tests/e2e/word-page-windowing.acl --json && a3s-test check tests/e2e/word-ai-question.acl --json && a3s-test check tests/e2e/word-picture-insert.acl --json && a3s-test check tests/e2e/word-picture-alt-text-phone.acl --json && a3s-test check tests/e2e/word-track-changes-phone.acl --json && a3s-test check tests/e2e/word-review-conflict-phone.acl --json && a3s-test check tests/e2e/word-revision-windowing.acl --json && a3s-test check tests/e2e/word-table-phone.acl --json && a3s-test check tests/e2e/word-table-borders.acl --json && a3s-test check tests/e2e/word-theme-table.acl --json && a3s-test check tests/e2e/word-styled-table.acl --json && a3s-test check tests/e2e/word-multi-page-table.acl --json && a3s-test check tests/e2e/word-cross-reference-phone.acl --json && a3s-test check tests/e2e/word-bookmark-links-phone.acl --json && a3s-test check tests/e2e/word-notes-phone.acl --json && a3s-test check tests/e2e/word-fields-phone.acl --json && a3s-test check tests/e2e/spreadsheet-phone-rename.acl --json && a3s-test check tests/e2e/spreadsheet-phone-find.acl --json && a3s-test check tests/e2e/spreadsheet-phone-context-menu.acl --json && a3s-test check tests/e2e/spreadsheet-phone-task-pane.acl --json && a3s-test check tests/e2e/presentation-cut-paste-focus.acl --json && a3s-test check tests/e2e/presentation-presenter-view.acl --json && a3s-test check tests/e2e/presentation-phone-chart-pane.acl --json && a3s-test check tests/e2e/presentation-phone-comments.acl --json && a3s-test check tests/e2e/pdf-thumbnail-keyboard.acl --json && a3s-test check tests/e2e/pdf-page-drawer-phone.acl --json && a3s-test check tests/e2e/markdown-phone-modes.acl --json && a3s-test check tests/e2e/office-sidebar-breakpoint.acl --json && a3s-test check tests/e2e/office-docs-navigation.acl --json && a3s-test check tests/e2e/collaboration-participants.acl --json && a3s-test check tests/e2e/collaboration-pdf-annotations.acl --json",
90
92
  "test:e2e:fixtures": "bun scripts/create-e2e-fixtures.ts",
93
+ "test:e2e:initial-focus": "a3s-test run tests/e2e/office-editor-initial-focus.acl --json",
94
+ "test:e2e:initial-focus:check": "a3s-test check tests/e2e/office-editor-initial-focus.acl --json",
95
+ "test:e2e:collaboration-participants": "a3s-test run tests/e2e/collaboration-participants.acl --json",
96
+ "test:e2e:collaboration-participants:check": "a3s-test check tests/e2e/collaboration-participants.acl --json",
97
+ "test:e2e:collaboration-pdf-annotations": "a3s-test run tests/e2e/collaboration-pdf-annotations.acl --json",
98
+ "test:e2e:collaboration-pdf-annotations:check": "a3s-test check tests/e2e/collaboration-pdf-annotations.acl --json",
91
99
  "test:e2e:wps-layout": "bun run test:e2e:fixtures && a3s-test run tests/e2e/word-wps-layout-parity.acl --json && a3s-test run tests/e2e/word-wps-font-grid-parity.acl --json",
92
100
  "test:e2e:wps-layout:check": "bun run test:e2e:fixtures && a3s-test check tests/e2e/word-wps-layout-parity.acl --json && a3s-test check tests/e2e/word-wps-font-grid-parity.acl --json",
101
+ "test:e2e:writer-ribbon": "a3s-test run tests/e2e/word-ribbon-collapse.acl --json",
102
+ "test:e2e:writer-ribbon:check": "a3s-test check tests/e2e/word-ribbon-collapse.acl --json",
103
+ "test:e2e:spreadsheet-ribbon": "a3s-test run tests/e2e/spreadsheet-ribbon-alignment.acl --json",
104
+ "test:e2e:spreadsheet-ribbon:check": "a3s-test check tests/e2e/spreadsheet-ribbon-alignment.acl --json",
105
+ "test:e2e:writer-shortcuts": "a3s-test run tests/e2e/word-wps-shortcuts.acl --json",
106
+ "test:e2e:writer-shortcuts:check": "a3s-test check tests/e2e/word-wps-shortcuts.acl --json",
107
+ "test:e2e:writer-layout": "a3s-test run tests/e2e/word-insert-page-layout.acl --json",
108
+ "test:e2e:writer-layout:check": "a3s-test check tests/e2e/word-insert-page-layout.acl --json",
109
+ "test:e2e:writer-review-view": "a3s-test run tests/e2e/word-review-view.acl --json",
110
+ "test:e2e:writer-review-view:check": "a3s-test check tests/e2e/word-review-view.acl --json",
111
+ "test:e2e:writer-status": "a3s-test run tests/e2e/word-status-bar.acl --json",
112
+ "test:e2e:writer-status:check": "a3s-test check tests/e2e/word-status-bar.acl --json",
93
113
  "test:wps-layout": "powershell -NoProfile -ExecutionPolicy Bypass -File scripts/test-wps-layout-parity.ps1",
94
114
  "test:watch": "rstest --watch",
95
115
  "typecheck": "tsc --noEmit"
@@ -105,6 +125,8 @@
105
125
  "@fortune-sheet/formula-parser": "0.2.13",
106
126
  "@fortune-sheet/react": "^1.0.4",
107
127
  "@tiptap/core": "3.28.0",
128
+ "@tiptap/extension-collaboration": "3.28.0",
129
+ "@tiptap/extension-collaboration-caret": "3.28.0",
108
130
  "@tiptap/extension-color": "3.28.0",
109
131
  "@tiptap/extension-highlight": "3.28.0",
110
132
  "@tiptap/extension-image": "3.28.0",
@@ -120,6 +142,7 @@
120
142
  "@tiptap/pm": "3.28.0",
121
143
  "@tiptap/react": "3.28.0",
122
144
  "@tiptap/starter-kit": "3.28.0",
145
+ "@tiptap/y-tiptap": "3.0.8",
123
146
  "docx": "^9.7.1",
124
147
  "html2canvas": "^1.4.1",
125
148
  "jspdf": "^3.0.3",
@@ -127,7 +150,9 @@
127
150
  "lucide-react": "^0.544.0",
128
151
  "mammoth": "^1.12.0",
129
152
  "pptxgenjs": "^4.0.1",
130
- "xlsx": "^0.18.5"
153
+ "xlsx": "^0.18.5",
154
+ "y-protocols": "1.0.7",
155
+ "yjs": "13.6.32"
131
156
  },
132
157
  "peerDependencies": {
133
158
  "react": ">=18.2.0 <20",