@a3s-lab/office 0.1.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 (463) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +470 -0
  3. package/THIRD_PARTY_NOTICES.md +33 -0
  4. package/dist/0~1403.js +245 -0
  5. package/dist/0~152.js +94 -0
  6. package/dist/0~3539.js +1856 -0
  7. package/dist/0~3557.js +179 -0
  8. package/dist/0~3635.js +302 -0
  9. package/dist/0~4595.js +1162 -0
  10. package/dist/0~5050.js +308 -0
  11. package/dist/0~6552.js +787 -0
  12. package/dist/0~7048.js +2110 -0
  13. package/dist/0~7614.js +1037 -0
  14. package/dist/0~8155.js +299 -0
  15. package/dist/0~9445.js +283 -0
  16. package/dist/0~9512.js +743 -0
  17. package/dist/0~document-editor.js +10967 -0
  18. package/dist/0~markdown-editor.js +2260 -0
  19. package/dist/0~pdf-viewer.js +2156 -0
  20. package/dist/0~presentation-editor.js +8359 -0
  21. package/dist/0~rslib-runtime.js +27 -0
  22. package/dist/0~spreadsheet-editor.js +10388 -0
  23. package/dist/0~use-office-draft.js +46 -0
  24. package/dist/0~work-document-extensions.js +2470 -0
  25. package/dist/0~work-document-links.js +14 -0
  26. package/dist/0~work-document-model-codec.js +42 -0
  27. package/dist/0~work-document-page-color.js +11 -0
  28. package/dist/0~work-document-paragraph-formatting.js +425 -0
  29. package/dist/0~work-docx-bibliography.js +347 -0
  30. package/dist/0~work-docx-export.js +1151 -0
  31. package/dist/0~work-docx-import.js +3116 -0
  32. package/dist/0~work-docx-page-color.js +42 -0
  33. package/dist/0~work-office-diagnostics.js +1377 -0
  34. package/dist/0~work-pptx-export.js +1009 -0
  35. package/dist/0~work-pptx-import.js +1138 -0
  36. package/dist/0~work-presentation-charts.js +442 -0
  37. package/dist/0~work-presentation-transition.js +38 -0
  38. package/dist/0~work-presentation-visual-scale.js +38 -0
  39. package/dist/0~work-spreadsheet-formula-support.js +9 -0
  40. package/dist/1134.js +445 -0
  41. package/dist/4104.js +5786 -0
  42. package/dist/432.js +211 -0
  43. package/dist/4704.js +1364 -0
  44. package/dist/6489.js +182 -0
  45. package/dist/8715.js +3959 -0
  46. package/dist/8728.js +723 -0
  47. package/dist/9356.js +10 -0
  48. package/dist/core.d.ts +15 -0
  49. package/dist/core.js +4 -0
  50. package/dist/index.d.ts +2 -0
  51. package/dist/index.js +5 -0
  52. package/dist/internal/design-system/primitives/button/button.d.ts +9 -0
  53. package/dist/internal/design-system/primitives/button/icon-button.d.ts +7 -0
  54. package/dist/internal/design-system/primitives/dialog/dialog.d.ts +12 -0
  55. package/dist/internal/design-system/primitives/feedback/collection-state.d.ts +9 -0
  56. package/dist/internal/design-system/primitives/feedback/inline-notice.d.ts +10 -0
  57. package/dist/internal/design-system/primitives/feedback/state-view.d.ts +13 -0
  58. package/dist/internal/design-system/primitives/form/field.d.ts +19 -0
  59. package/dist/internal/design-system/primitives/index.d.ts +14 -0
  60. package/dist/internal/design-system/primitives/layout/split-handle.d.ts +17 -0
  61. package/dist/internal/design-system/primitives/navigation/segmented-control.d.ts +19 -0
  62. package/dist/internal/design-system/primitives/navigation/tab-navigation.d.ts +13 -0
  63. package/dist/internal/design-system/primitives/navigation/tabs.d.ts +21 -0
  64. package/dist/internal/design-system/primitives/overlay/dialog-focus-scope.d.ts +17 -0
  65. package/dist/internal/design-system/primitives/overlay/popover.d.ts +34 -0
  66. package/dist/internal/design-system/primitives/overlay/portal-root.d.ts +1 -0
  67. package/dist/internal/design-system/primitives/status/status-badge.d.ts +6 -0
  68. package/dist/internal/features/work/components/work-document-pages.d.ts +4 -0
  69. package/dist/internal/features/work/components/work-editor-agent-menus.d.ts +12 -0
  70. package/dist/internal/features/work/components/work-editor-loading-state.d.ts +3 -0
  71. package/dist/internal/features/work/editors/document-changes-panel.d.ts +9 -0
  72. package/dist/internal/features/work/editors/document-citation-source-form.d.ts +33 -0
  73. package/dist/internal/features/work/editors/document-citations-panel.d.ts +8 -0
  74. package/dist/internal/features/work/editors/document-columns-panel.d.ts +5 -0
  75. package/dist/internal/features/work/editors/document-comment-composer.d.ts +13 -0
  76. package/dist/internal/features/work/editors/document-comments-panel.d.ts +17 -0
  77. package/dist/internal/features/work/editors/document-editor-focus.d.ts +1 -0
  78. package/dist/internal/features/work/editors/document-editor-pagination.d.ts +3 -0
  79. package/dist/internal/features/work/editors/document-editor-support.d.ts +34 -0
  80. package/dist/internal/features/work/editors/document-editor.d.ts +20 -0
  81. package/dist/internal/features/work/editors/document-find-highlight.d.ts +8 -0
  82. package/dist/internal/features/work/editors/document-find-replace-panel.d.ts +10 -0
  83. package/dist/internal/features/work/editors/document-formatting-options.d.ts +113 -0
  84. package/dist/internal/features/work/editors/document-home-ribbon.d.ts +9 -0
  85. package/dist/internal/features/work/editors/document-layout-panel.d.ts +10 -0
  86. package/dist/internal/features/work/editors/document-list-gallery.d.ts +4 -0
  87. package/dist/internal/features/work/editors/document-navigation-panel.d.ts +9 -0
  88. package/dist/internal/features/work/editors/document-page-chrome-editor.d.ts +39 -0
  89. package/dist/internal/features/work/editors/document-page-chrome-panel.d.ts +5 -0
  90. package/dist/internal/features/work/editors/document-page-chrome-ribbon.d.ts +10 -0
  91. package/dist/internal/features/work/editors/document-page-navigation.d.ts +14 -0
  92. package/dist/internal/features/work/editors/document-page-stack.d.ts +8 -0
  93. package/dist/internal/features/work/editors/document-pagination-popover.d.ts +4 -0
  94. package/dist/internal/features/work/editors/document-paragraph-spacing-popover.d.ts +4 -0
  95. package/dist/internal/features/work/editors/document-picture-ribbon.d.ts +4 -0
  96. package/dist/internal/features/work/editors/document-ruler-tab-stops.d.ts +12 -0
  97. package/dist/internal/features/work/editors/document-ruler.d.ts +15 -0
  98. package/dist/internal/features/work/editors/document-selection-context-menu.d.ts +22 -0
  99. package/dist/internal/features/work/editors/document-selection-toolbar.d.ts +8 -0
  100. package/dist/internal/features/work/editors/document-status-bar.d.ts +19 -0
  101. package/dist/internal/features/work/editors/document-style-gallery.d.ts +4 -0
  102. package/dist/internal/features/work/editors/document-table-insert-popover.d.ts +4 -0
  103. package/dist/internal/features/work/editors/document-table-ribbon.d.ts +7 -0
  104. package/dist/internal/features/work/editors/document-task-pane.d.ts +11 -0
  105. package/dist/internal/features/work/editors/document-toolbar.d.ts +100 -0
  106. package/dist/internal/features/work/editors/document-vertical-ruler.d.ts +6 -0
  107. package/dist/internal/features/work/editors/markdown-editor-focus.d.ts +2 -0
  108. package/dist/internal/features/work/editors/markdown-editor.d.ts +16 -0
  109. package/dist/internal/features/work/editors/markdown-insert-dialog.d.ts +19 -0
  110. package/dist/internal/features/work/editors/markdown-selection-context-menu.d.ts +14 -0
  111. package/dist/internal/features/work/editors/markdown-source-commands.d.ts +41 -0
  112. package/dist/internal/features/work/editors/markdown-status.d.ts +7 -0
  113. package/dist/internal/features/work/editors/markdown-toolbar.d.ts +22 -0
  114. package/dist/internal/features/work/editors/markdown-workspace.d.ts +26 -0
  115. package/dist/internal/features/work/editors/office-checkbox.d.ts +9 -0
  116. package/dist/internal/features/work/editors/office-color-picker.d.ts +11 -0
  117. package/dist/internal/features/work/editors/office-controls.d.ts +7 -0
  118. package/dist/internal/features/work/editors/office-dialog.d.ts +35 -0
  119. package/dist/internal/features/work/editors/office-editor-extension.d.ts +86 -0
  120. package/dist/internal/features/work/editors/office-file-data.d.ts +1 -0
  121. package/dist/internal/features/work/editors/office-font-families.d.ts +187 -0
  122. package/dist/internal/features/work/editors/office-menu-keyboard.d.ts +2 -0
  123. package/dist/internal/features/work/editors/office-number-field.d.ts +21 -0
  124. package/dist/internal/features/work/editors/office-number-normalization.d.ts +9 -0
  125. package/dist/internal/features/work/editors/office-select.d.ts +19 -0
  126. package/dist/internal/features/work/editors/office-shortcuts.d.ts +1 -0
  127. package/dist/internal/features/work/editors/office-slider.d.ts +10 -0
  128. package/dist/internal/features/work/editors/office-table-dimensions.d.ts +4 -0
  129. package/dist/internal/features/work/editors/office-table-insert-popover.d.ts +7 -0
  130. package/dist/internal/features/work/editors/office-task-pane.d.ts +7 -0
  131. package/dist/internal/features/work/editors/office-text-field.d.ts +20 -0
  132. package/dist/internal/features/work/editors/office-tiptap-extensions.d.ts +2 -0
  133. package/dist/internal/features/work/editors/pdf-annotation-controller.d.ts +23 -0
  134. package/dist/internal/features/work/editors/pdf-editor-extensions.d.ts +36 -0
  135. package/dist/internal/features/work/editors/pdf-thumbnail-rail.d.ts +26 -0
  136. package/dist/internal/features/work/editors/pdf-toolbar.d.ts +23 -0
  137. package/dist/internal/features/work/editors/pdf-viewer-controller.d.ts +48 -0
  138. package/dist/internal/features/work/editors/pdf-viewer.d.ts +11 -0
  139. package/dist/internal/features/work/editors/presentation-arrangement-controller.d.ts +19 -0
  140. package/dist/internal/features/work/editors/presentation-chart-analysis-canvas.d.ts +21 -0
  141. package/dist/internal/features/work/editors/presentation-chart-axis-canvas.d.ts +33 -0
  142. package/dist/internal/features/work/editors/presentation-chart-axis-editor.d.ts +5 -0
  143. package/dist/internal/features/work/editors/presentation-chart-canvas.d.ts +5 -0
  144. package/dist/internal/features/work/editors/presentation-chart-cartesian-canvas.d.ts +3 -0
  145. package/dist/internal/features/work/editors/presentation-chart-data-label-editor.d.ts +6 -0
  146. package/dist/internal/features/work/editors/presentation-chart-data-labels.d.ts +26 -0
  147. package/dist/internal/features/work/editors/presentation-chart-layout-editor.d.ts +5 -0
  148. package/dist/internal/features/work/editors/presentation-chart-legend-canvas.d.ts +15 -0
  149. package/dist/internal/features/work/editors/presentation-chart-panel.d.ts +7 -0
  150. package/dist/internal/features/work/editors/presentation-chart-series-analysis-editor.d.ts +6 -0
  151. package/dist/internal/features/work/editors/presentation-chart-series-canvas.d.ts +15 -0
  152. package/dist/internal/features/work/editors/presentation-command-controller.d.ts +3 -0
  153. package/dist/internal/features/work/editors/presentation-command-types.d.ts +206 -0
  154. package/dist/internal/features/work/editors/presentation-comments-panel.d.ts +9 -0
  155. package/dist/internal/features/work/editors/presentation-context-menu.d.ts +11 -0
  156. package/dist/internal/features/work/editors/presentation-design-panel.d.ts +13 -0
  157. package/dist/internal/features/work/editors/presentation-editor-focus.d.ts +12 -0
  158. package/dist/internal/features/work/editors/presentation-editor-operations.d.ts +10 -0
  159. package/dist/internal/features/work/editors/presentation-editor-types.d.ts +22 -0
  160. package/dist/internal/features/work/editors/presentation-editor.d.ts +3 -0
  161. package/dist/internal/features/work/editors/presentation-keyboard-extension.d.ts +3 -0
  162. package/dist/internal/features/work/editors/presentation-player.d.ts +7 -0
  163. package/dist/internal/features/work/editors/presentation-presenter-view.d.ts +15 -0
  164. package/dist/internal/features/work/editors/presentation-selection.d.ts +21 -0
  165. package/dist/internal/features/work/editors/presentation-slide-canvas.d.ts +26 -0
  166. package/dist/internal/features/work/editors/presentation-slide-thumbnail.d.ts +18 -0
  167. package/dist/internal/features/work/editors/presentation-status-bar.d.ts +10 -0
  168. package/dist/internal/features/work/editors/presentation-text-editor.d.ts +22 -0
  169. package/dist/internal/features/work/editors/presentation-text-formatting.d.ts +3 -0
  170. package/dist/internal/features/work/editors/presentation-thumbnail-rail.d.ts +20 -0
  171. package/dist/internal/features/work/editors/presentation-toolbar.d.ts +19 -0
  172. package/dist/internal/features/work/editors/presentation-transition-panel.d.ts +9 -0
  173. package/dist/internal/features/work/editors/presentation-workspace.d.ts +38 -0
  174. package/dist/internal/features/work/editors/spreadsheet-calculation-model.d.ts +8 -0
  175. package/dist/internal/features/work/editors/spreadsheet-calculation-projection.d.ts +32 -0
  176. package/dist/internal/features/work/editors/spreadsheet-chart-axis-editor.d.ts +9 -0
  177. package/dist/internal/features/work/editors/spreadsheet-chart-draft.d.ts +17 -0
  178. package/dist/internal/features/work/editors/spreadsheet-chart-layout-editor.d.ts +13 -0
  179. package/dist/internal/features/work/editors/spreadsheet-chart-panel.d.ts +10 -0
  180. package/dist/internal/features/work/editors/spreadsheet-chart-series-style-editor.d.ts +9 -0
  181. package/dist/internal/features/work/editors/spreadsheet-clipboard-shortcuts.d.ts +9 -0
  182. package/dist/internal/features/work/editors/spreadsheet-command-controller.d.ts +121 -0
  183. package/dist/internal/features/work/editors/spreadsheet-conditional-comparison-fields.d.ts +7 -0
  184. package/dist/internal/features/work/editors/spreadsheet-conditional-format-model.d.ts +72 -0
  185. package/dist/internal/features/work/editors/spreadsheet-conditional-format-panel.d.ts +7 -0
  186. package/dist/internal/features/work/editors/spreadsheet-conditional-threshold-fields.d.ts +10 -0
  187. package/dist/internal/features/work/editors/spreadsheet-context-menu.d.ts +36 -0
  188. package/dist/internal/features/work/editors/spreadsheet-data-label-editor.d.ts +9 -0
  189. package/dist/internal/features/work/editors/spreadsheet-editor-ribbon.d.ts +46 -0
  190. package/dist/internal/features/work/editors/spreadsheet-editor-support.d.ts +31 -0
  191. package/dist/internal/features/work/editors/spreadsheet-editor.d.ts +16 -0
  192. package/dist/internal/features/work/editors/spreadsheet-error-bar-editor.d.ts +10 -0
  193. package/dist/internal/features/work/editors/spreadsheet-find-bar.d.ts +8 -0
  194. package/dist/internal/features/work/editors/spreadsheet-find.d.ts +9 -0
  195. package/dist/internal/features/work/editors/spreadsheet-formula-panel.d.ts +10 -0
  196. package/dist/internal/features/work/editors/spreadsheet-header-footer-fields.d.ts +5 -0
  197. package/dist/internal/features/work/editors/spreadsheet-keyboard-navigation.d.ts +18 -0
  198. package/dist/internal/features/work/editors/spreadsheet-number-format.d.ts +11 -0
  199. package/dist/internal/features/work/editors/spreadsheet-pivot-panel.d.ts +10 -0
  200. package/dist/internal/features/work/editors/spreadsheet-print-settings-panel.d.ts +6 -0
  201. package/dist/internal/features/work/editors/spreadsheet-protection-panel.d.ts +7 -0
  202. package/dist/internal/features/work/editors/spreadsheet-sheet-bar.d.ts +17 -0
  203. package/dist/internal/features/work/editors/spreadsheet-sheet-model.d.ts +13 -0
  204. package/dist/internal/features/work/editors/spreadsheet-trendline-editor.d.ts +8 -0
  205. package/dist/internal/features/work/editors/spreadsheet-workbook-panel.d.ts +16 -0
  206. package/dist/internal/features/work/editors/use-document-comments.d.ts +26 -0
  207. package/dist/internal/features/work/editors/use-document-insert-commands.d.ts +19 -0
  208. package/dist/internal/features/work/editors/use-document-layout-fonts.d.ts +2 -0
  209. package/dist/internal/features/work/editors/use-document-page-chrome.d.ts +33 -0
  210. package/dist/internal/features/work/editors/use-document-pagination.d.ts +46 -0
  211. package/dist/internal/features/work/editors/use-markdown-source-history.d.ts +16 -0
  212. package/dist/internal/features/work/editors/use-office-draft.d.ts +10 -0
  213. package/dist/internal/features/work/editors/use-office-editor-keyboard-shortcuts.d.ts +9 -0
  214. package/dist/internal/features/work/editors/use-office-editor-runtime.d.ts +6 -0
  215. package/dist/internal/features/work/editors/use-office-editor-wheel-zoom.d.ts +19 -0
  216. package/dist/internal/features/work/editors/use-office-history.d.ts +10 -0
  217. package/dist/internal/features/work/editors/use-presentation-clipboard.d.ts +22 -0
  218. package/dist/internal/features/work/editors/use-presentation-design-commands.d.ts +33 -0
  219. package/dist/internal/features/work/editors/use-presentation-element-commands.d.ts +29 -0
  220. package/dist/internal/features/work/editors/use-presentation-geometry.d.ts +17 -0
  221. package/dist/internal/features/work/editors/use-presentation-history.d.ts +12 -0
  222. package/dist/internal/features/work/editors/use-presentation-review-commands.d.ts +22 -0
  223. package/dist/internal/features/work/editors/use-presentation-selection.d.ts +11 -0
  224. package/dist/internal/features/work/editors/use-presentation-slide-commands.d.ts +18 -0
  225. package/dist/internal/features/work/editors/use-presentation-thumbnail-visibility.d.ts +4 -0
  226. package/dist/internal/features/work/editors/use-presentation-thumbnail-window.d.ts +17 -0
  227. package/dist/internal/features/work/editors/use-presentation-transform.d.ts +53 -0
  228. package/dist/internal/features/work/editors/use-spreadsheet-calculation.d.ts +17 -0
  229. package/dist/internal/features/work/editors/use-spreadsheet-workbook-sync.d.ts +10 -0
  230. package/dist/internal/features/work/editors/work-office-chrome.d.ts +61 -0
  231. package/dist/internal/features/work/editors/work-office-ribbon-overflow.d.ts +18 -0
  232. package/dist/internal/features/work/work-agent-proposal-apply.d.ts +8 -0
  233. package/dist/internal/features/work/work-agent-proposal.d.ts +55 -0
  234. package/dist/internal/features/work/work-agent-request.d.ts +6 -0
  235. package/dist/internal/features/work/work-chart-series-analysis-context.d.ts +3 -0
  236. package/dist/internal/features/work/work-document-caption-nodes.d.ts +13 -0
  237. package/dist/internal/features/work/work-document-captions.d.ts +14 -0
  238. package/dist/internal/features/work/work-document-changes.d.ts +35 -0
  239. package/dist/internal/features/work/work-document-character-formatting.d.ts +13 -0
  240. package/dist/internal/features/work/work-document-citation-nodes.d.ts +25 -0
  241. package/dist/internal/features/work/work-document-citations.d.ts +21 -0
  242. package/dist/internal/features/work/work-document-columns.d.ts +15 -0
  243. package/dist/internal/features/work/work-document-comments.d.ts +48 -0
  244. package/dist/internal/features/work/work-document-extensions.d.ts +11 -0
  245. package/dist/internal/features/work/work-document-field-node.d.ts +12 -0
  246. package/dist/internal/features/work/work-document-fields.d.ts +15 -0
  247. package/dist/internal/features/work/work-document-file-io.d.ts +4 -0
  248. package/dist/internal/features/work/work-document-fonts.d.ts +16 -0
  249. package/dist/internal/features/work/work-document-image-layout.d.ts +29 -0
  250. package/dist/internal/features/work/work-document-incremental-layout.d.ts +17 -0
  251. package/dist/internal/features/work/work-document-layout.d.ts +5 -0
  252. package/dist/internal/features/work/work-document-line-measurement.d.ts +24 -0
  253. package/dist/internal/features/work/work-document-links.d.ts +2 -0
  254. package/dist/internal/features/work/work-document-lists.d.ts +25 -0
  255. package/dist/internal/features/work/work-document-model-codec.d.ts +3 -0
  256. package/dist/internal/features/work/work-document-model.d.ts +12 -0
  257. package/dist/internal/features/work/work-document-note-nodes.d.ts +11 -0
  258. package/dist/internal/features/work/work-document-notes.d.ts +18 -0
  259. package/dist/internal/features/work/work-document-outline.d.ts +14 -0
  260. package/dist/internal/features/work/work-document-page-break.d.ts +2 -0
  261. package/dist/internal/features/work/work-document-page-chrome-commands.d.ts +15 -0
  262. package/dist/internal/features/work/work-document-page-chrome.d.ts +19 -0
  263. package/dist/internal/features/work/work-document-page-color.d.ts +3 -0
  264. package/dist/internal/features/work/work-document-pages.d.ts +19 -0
  265. package/dist/internal/features/work/work-document-pagination-decorations.d.ts +3 -0
  266. package/dist/internal/features/work/work-document-pagination-dom.d.ts +35 -0
  267. package/dist/internal/features/work/work-document-pagination-measurement.d.ts +9 -0
  268. package/dist/internal/features/work/work-document-pagination-types.d.ts +88 -0
  269. package/dist/internal/features/work/work-document-pagination.d.ts +17 -0
  270. package/dist/internal/features/work/work-document-paragraph-formatting.d.ts +61 -0
  271. package/dist/internal/features/work/work-document-search.d.ts +11 -0
  272. package/dist/internal/features/work/work-document-section-editor.d.ts +20 -0
  273. package/dist/internal/features/work/work-document-section-node.d.ts +13 -0
  274. package/dist/internal/features/work/work-document-section.d.ts +34 -0
  275. package/dist/internal/features/work/work-document-selection-menu.d.ts +54 -0
  276. package/dist/internal/features/work/work-document-tab-node.d.ts +6 -0
  277. package/dist/internal/features/work/work-document-tab-stops.d.ts +29 -0
  278. package/dist/internal/features/work/work-document-table-cell-formatting.d.ts +46 -0
  279. package/dist/internal/features/work/work-document-table-commands.d.ts +17 -0
  280. package/dist/internal/features/work/work-document-table-pagination.d.ts +5 -0
  281. package/dist/internal/features/work/work-document-table-row.d.ts +37 -0
  282. package/dist/internal/features/work/work-document-table-sizing.d.ts +27 -0
  283. package/dist/internal/features/work/work-document-text-layout.d.ts +14 -0
  284. package/dist/internal/features/work/work-docx-bibliography.d.ts +12 -0
  285. package/dist/internal/features/work/work-docx-caption-diagnostics.d.ts +6 -0
  286. package/dist/internal/features/work/work-docx-caption-export.d.ts +4 -0
  287. package/dist/internal/features/work/work-docx-caption-fields.d.ts +5 -0
  288. package/dist/internal/features/work/work-docx-caption-import.d.ts +20 -0
  289. package/dist/internal/features/work/work-docx-change-import.d.ts +12 -0
  290. package/dist/internal/features/work/work-docx-citation-diagnostics.d.ts +3 -0
  291. package/dist/internal/features/work/work-docx-citation-export.d.ts +3 -0
  292. package/dist/internal/features/work/work-docx-citation-import.d.ts +23 -0
  293. package/dist/internal/features/work/work-docx-column-export.d.ts +14 -0
  294. package/dist/internal/features/work/work-docx-column-import.d.ts +2 -0
  295. package/dist/internal/features/work/work-docx-comment-import.d.ts +14 -0
  296. package/dist/internal/features/work/work-docx-export-formatting.d.ts +30 -0
  297. package/dist/internal/features/work/work-docx-export-image.d.ts +2 -0
  298. package/dist/internal/features/work/work-docx-export.d.ts +2 -0
  299. package/dist/internal/features/work/work-docx-field-export.d.ts +2 -0
  300. package/dist/internal/features/work/work-docx-field-import.d.ts +16 -0
  301. package/dist/internal/features/work/work-docx-field-instructions.d.ts +8 -0
  302. package/dist/internal/features/work/work-docx-image-layout-import.d.ts +12 -0
  303. package/dist/internal/features/work/work-docx-import.d.ts +50 -0
  304. package/dist/internal/features/work/work-docx-list-import.d.ts +14 -0
  305. package/dist/internal/features/work/work-docx-note-diagnostics.d.ts +3 -0
  306. package/dist/internal/features/work/work-docx-note-import.d.ts +3 -0
  307. package/dist/internal/features/work/work-docx-page-chrome-diagnostics.d.ts +3 -0
  308. package/dist/internal/features/work/work-docx-page-chrome-import.d.ts +11 -0
  309. package/dist/internal/features/work/work-docx-page-color.d.ts +2 -0
  310. package/dist/internal/features/work/work-docx-paragraph-alignment-import.d.ts +12 -0
  311. package/dist/internal/features/work/work-docx-paragraph-direction-import.d.ts +12 -0
  312. package/dist/internal/features/work/work-docx-paragraph-indent-import.d.ts +12 -0
  313. package/dist/internal/features/work/work-docx-paragraph-pagination-import.d.ts +12 -0
  314. package/dist/internal/features/work/work-docx-paragraph-spacing-import.d.ts +12 -0
  315. package/dist/internal/features/work/work-docx-paragraph-styles.d.ts +18 -0
  316. package/dist/internal/features/work/work-docx-run-formatting-import.d.ts +19 -0
  317. package/dist/internal/features/work/work-docx-tab-stop-import.d.ts +13 -0
  318. package/dist/internal/features/work/work-docx-table-cell-export.d.ts +4 -0
  319. package/dist/internal/features/work/work-docx-table-cell-import.d.ts +16 -0
  320. package/dist/internal/features/work/work-docx-table-row-import.d.ts +13 -0
  321. package/dist/internal/features/work/work-docx-table-sizing-export.d.ts +8 -0
  322. package/dist/internal/features/work/work-docx-table-sizing-import.d.ts +12 -0
  323. package/dist/internal/features/work/work-docx-theme.d.ts +9 -0
  324. package/dist/internal/features/work/work-file-data.d.ts +1 -0
  325. package/dist/internal/features/work/work-file-download.d.ts +3 -0
  326. package/dist/internal/features/work/work-file-io.d.ts +8 -0
  327. package/dist/internal/features/work/work-markdown-extensions.d.ts +19 -0
  328. package/dist/internal/features/work/work-markdown-file-io.d.ts +3 -0
  329. package/dist/internal/features/work/work-markdown-selection-menu.d.ts +57 -0
  330. package/dist/internal/features/work/work-office-diagnostics.d.ts +9 -0
  331. package/dist/internal/features/work/work-ooxml-package.d.ts +28 -0
  332. package/dist/internal/features/work/work-pdf-export.d.ts +23 -0
  333. package/dist/internal/features/work/work-pptx-chart-axes.d.ts +3 -0
  334. package/dist/internal/features/work/work-pptx-chart-axis-diagnostics.d.ts +5 -0
  335. package/dist/internal/features/work/work-pptx-chart-data-labels.d.ts +12 -0
  336. package/dist/internal/features/work/work-pptx-chart-import.d.ts +11 -0
  337. package/dist/internal/features/work/work-pptx-chart-layout-style.d.ts +15 -0
  338. package/dist/internal/features/work/work-pptx-chart-series-analysis.d.ts +13 -0
  339. package/dist/internal/features/work/work-pptx-chart-xy.d.ts +3 -0
  340. package/dist/internal/features/work/work-pptx-comments.d.ts +17 -0
  341. package/dist/internal/features/work/work-pptx-export.d.ts +4 -0
  342. package/dist/internal/features/work/work-pptx-groups.d.ts +19 -0
  343. package/dist/internal/features/work/work-pptx-import.d.ts +6 -0
  344. package/dist/internal/features/work/work-pptx-layout-export.d.ts +13 -0
  345. package/dist/internal/features/work/work-pptx-layout-import.d.ts +30 -0
  346. package/dist/internal/features/work/work-pptx-style.d.ts +13 -0
  347. package/dist/internal/features/work/work-pptx-transition.d.ts +13 -0
  348. package/dist/internal/features/work/work-presentation-agent-context.d.ts +6 -0
  349. package/dist/internal/features/work/work-presentation-chart-axes.d.ts +14 -0
  350. package/dist/internal/features/work/work-presentation-charts.d.ts +37 -0
  351. package/dist/internal/features/work/work-presentation-clipboard.d.ts +26 -0
  352. package/dist/internal/features/work/work-presentation-file-io.d.ts +15 -0
  353. package/dist/internal/features/work/work-presentation-groups.d.ts +17 -0
  354. package/dist/internal/features/work/work-presentation-layouts.d.ts +13 -0
  355. package/dist/internal/features/work/work-presentation-transition.d.ts +4 -0
  356. package/dist/internal/features/work/work-presentation-visual-scale.d.ts +2 -0
  357. package/dist/internal/features/work/work-repository.d.ts +4 -0
  358. package/dist/internal/features/work/work-spreadsheet-agent-context.d.ts +15 -0
  359. package/dist/internal/features/work/work-spreadsheet-chart-axis.d.ts +42 -0
  360. package/dist/internal/features/work/work-spreadsheet-chart-layout.d.ts +29 -0
  361. package/dist/internal/features/work/work-spreadsheet-chart-legend-svg.d.ts +18 -0
  362. package/dist/internal/features/work/work-spreadsheet-chart-series-layout.d.ts +24 -0
  363. package/dist/internal/features/work/work-spreadsheet-chart-series-style.d.ts +29 -0
  364. package/dist/internal/features/work/work-spreadsheet-chart-svg-utils.d.ts +7 -0
  365. package/dist/internal/features/work/work-spreadsheet-chart-svg.d.ts +3 -0
  366. package/dist/internal/features/work/work-spreadsheet-chart-types.d.ts +147 -0
  367. package/dist/internal/features/work/work-spreadsheet-chart-validation.d.ts +2 -0
  368. package/dist/internal/features/work/work-spreadsheet-charts.d.ts +17 -0
  369. package/dist/internal/features/work/work-spreadsheet-combination-chart-svg.d.ts +9 -0
  370. package/dist/internal/features/work/work-spreadsheet-comments.d.ts +7 -0
  371. package/dist/internal/features/work/work-spreadsheet-conditional-canvas.d.ts +5 -0
  372. package/dist/internal/features/work/work-spreadsheet-conditional-colors.d.ts +9 -0
  373. package/dist/internal/features/work/work-spreadsheet-conditional-comparisons.d.ts +4 -0
  374. package/dist/internal/features/work/work-spreadsheet-conditional-data-bar.d.ts +8 -0
  375. package/dist/internal/features/work/work-spreadsheet-conditional-format.d.ts +10 -0
  376. package/dist/internal/features/work/work-spreadsheet-conditional-icons.d.ts +107 -0
  377. package/dist/internal/features/work/work-spreadsheet-conditional-values.d.ts +19 -0
  378. package/dist/internal/features/work/work-spreadsheet-data-label-svg.d.ts +27 -0
  379. package/dist/internal/features/work/work-spreadsheet-error-bar-svg.d.ts +5 -0
  380. package/dist/internal/features/work/work-spreadsheet-error-bars.d.ts +8 -0
  381. package/dist/internal/features/work/work-spreadsheet-formula-analysis.d.ts +30 -0
  382. package/dist/internal/features/work/work-spreadsheet-formula-support.d.ts +1 -0
  383. package/dist/internal/features/work/work-spreadsheet-formulas.d.ts +19 -0
  384. package/dist/internal/features/work/work-spreadsheet-header-footer.d.ts +14 -0
  385. package/dist/internal/features/work/work-spreadsheet-line-chart-svg.d.ts +10 -0
  386. package/dist/internal/features/work/work-spreadsheet-page-breaks.d.ts +4 -0
  387. package/dist/internal/features/work/work-spreadsheet-page-setup.d.ts +26 -0
  388. package/dist/internal/features/work/work-spreadsheet-pivot-engine.d.ts +21 -0
  389. package/dist/internal/features/work/work-spreadsheet-pivot-values.d.ts +7 -0
  390. package/dist/internal/features/work/work-spreadsheet-pivots.d.ts +27 -0
  391. package/dist/internal/features/work/work-spreadsheet-protection.d.ts +55 -0
  392. package/dist/internal/features/work/work-spreadsheet-ranges.d.ts +25 -0
  393. package/dist/internal/features/work/work-spreadsheet-trendline-svg.d.ts +9 -0
  394. package/dist/internal/features/work/work-spreadsheet-trendlines.d.ts +11 -0
  395. package/dist/internal/features/work/work-spreadsheet-xy-chart-axes-svg.d.ts +10 -0
  396. package/dist/internal/features/work/work-templates.d.ts +4 -0
  397. package/dist/internal/features/work/work-types.d.ts +513 -0
  398. package/dist/internal/features/work/work-xlsx-chart-axes.d.ts +4 -0
  399. package/dist/internal/features/work/work-xlsx-chart-diagnostics.d.ts +3 -0
  400. package/dist/internal/features/work/work-xlsx-chart-layout.d.ts +16 -0
  401. package/dist/internal/features/work/work-xlsx-chart-series-style.d.ts +6 -0
  402. package/dist/internal/features/work/work-xlsx-chart-values.d.ts +10 -0
  403. package/dist/internal/features/work/work-xlsx-charts.d.ts +32 -0
  404. package/dist/internal/features/work/work-xlsx-conditional-format-diagnostics.d.ts +6 -0
  405. package/dist/internal/features/work/work-xlsx-conditional-format-write.d.ts +11 -0
  406. package/dist/internal/features/work/work-xlsx-conditional-format.d.ts +29 -0
  407. package/dist/internal/features/work/work-xlsx-defined-names.d.ts +4 -0
  408. package/dist/internal/features/work/work-xlsx-drawing-geometry.d.ts +27 -0
  409. package/dist/internal/features/work/work-xlsx-formula-diagnostics.d.ts +3 -0
  410. package/dist/internal/features/work/work-xlsx-formulas.d.ts +40 -0
  411. package/dist/internal/features/work/work-xlsx-header-footer.d.ts +12 -0
  412. package/dist/internal/features/work/work-xlsx-images.d.ts +17 -0
  413. package/dist/internal/features/work/work-xlsx-interop.d.ts +39 -0
  414. package/dist/internal/features/work/work-xlsx-page-breaks.d.ts +7 -0
  415. package/dist/internal/features/work/work-xlsx-page-setup-diagnostics.d.ts +2 -0
  416. package/dist/internal/features/work/work-xlsx-page-setup.d.ts +5 -0
  417. package/dist/internal/features/work/work-xlsx-pivot-diagnostics.d.ts +3 -0
  418. package/dist/internal/features/work/work-xlsx-pivot-xml.d.ts +9 -0
  419. package/dist/internal/features/work/work-xlsx-pivots.d.ts +32 -0
  420. package/dist/internal/features/work/work-xlsx-protection.d.ts +24 -0
  421. package/dist/internal/features/workspace/components/workspace-context-menu.d.ts +29 -0
  422. package/dist/internal/features/workspace/components/workspace-text-control-selection.d.ts +7 -0
  423. package/dist/internal/kernel/office-kernel-client-types.d.ts +40 -0
  424. package/dist/internal/kernel/office-kernel-client.d.ts +4 -0
  425. package/dist/internal/kernel/office-kernel-fallback.d.ts +2 -0
  426. package/dist/internal/kernel/office-kernel-presentation-fallback.d.ts +2 -0
  427. package/dist/internal/kernel/office-kernel-protocol.d.ts +229 -0
  428. package/dist/internal/kernel/office-kernel-spreadsheet-fallback-formula.d.ts +3 -0
  429. package/dist/internal/kernel/office-kernel-spreadsheet-fallback-validation.d.ts +5 -0
  430. package/dist/internal/kernel/office-kernel-spreadsheet-fallback-value.d.ts +6 -0
  431. package/dist/internal/kernel/office-kernel-spreadsheet-fallback.d.ts +2 -0
  432. package/dist/internal/kernel/office-kernel-spreadsheet-protocol.d.ts +112 -0
  433. package/dist/internal/kernel/office-kernel-spreadsheet-session-fallback.d.ts +8 -0
  434. package/dist/internal/kernel/office-kernel-text-fallback.d.ts +10 -0
  435. package/dist/internal/kernel/office-kernel-version.d.ts +1 -0
  436. package/dist/internal/kernel/office-kernel.worker.d.ts +1 -0
  437. package/dist/internal/keyboard-shortcuts.d.ts +2 -0
  438. package/dist/internal/state/app-state.d.ts +8 -0
  439. package/dist/noto-naskh-arabic-regular.ttf +0 -0
  440. package/dist/noto-naskh-arabic.LICENSE.txt +94 -0
  441. package/dist/noto-sans-hans-regular.otf +0 -0
  442. package/dist/noto-sans-hans.LICENSE.txt +94 -0
  443. package/dist/noto-sans-hebrew-regular.ttf +0 -0
  444. package/dist/noto-sans-hebrew.LICENSE.txt +94 -0
  445. package/dist/noto-sans-regular.ttf +0 -0
  446. package/dist/noto-sans.LICENSE.txt +94 -0
  447. package/dist/office-kernel.wasm +0 -0
  448. package/dist/office-kernel.worker.js +14605 -0
  449. package/dist/office-surface.d.ts +10 -0
  450. package/dist/pdfium.LICENSE.txt +196 -0
  451. package/dist/pdfium.wasm +0 -0
  452. package/dist/pptxgen.LICENSE.txt +21 -0
  453. package/dist/pptxgen.bundle.js +11244 -0
  454. package/dist/react.d.ts +51 -0
  455. package/dist/react.js +1 -0
  456. package/dist/styles.css +17435 -0
  457. package/dist/styles.js +0 -0
  458. package/dist/vue.d.ts +282 -0
  459. package/dist/vue.js +231 -0
  460. package/dist/web-component.d.ts +98 -0
  461. package/dist/web-component.js +335 -0
  462. package/docs/browser-editor-architecture.md +947 -0
  463. package/package.json +165 -0
@@ -0,0 +1,947 @@
1
+ # Browser editor architecture
2
+
3
+ A3S Office uses an editor-specific interaction surface above a shared,
4
+ browser-safe Office kernel. TipTap is the right document engine for flowing
5
+ rich text, but it is not the canonical interaction model for a spreadsheet
6
+ grid, slide canvas, or PDF page.
7
+
8
+ ## Product architecture
9
+
10
+ | Product | Interaction surface | TipTap responsibility | Kernel responsibility |
11
+ | --- | --- | --- | --- |
12
+ | Document | TipTap and ProseMirror | Complete logical document, selection, commands, history, comments, and collaboration boundary | Page layout, style and font resolution, OOXML semantics, and serialization |
13
+ | Spreadsheet | Virtualized grid and canvas | Rich text inside a cell or floating text object | Formula calculation, workbook semantics, print layout, OOXML, and serialization |
14
+ | Presentation | Scene graph and slide canvas | Text inside an individual text box | Masters, layouts, themes, object geometry, OOXML, and serialization |
15
+ | PDF | PDFium page surface | None | PDF parsing, rendering, annotation serialization, and document save |
16
+
17
+ This separation prevents an editor framework from becoming a false abstraction
18
+ over products with different selection, layout, and performance requirements.
19
+
20
+ ## Shared platform layers
21
+
22
+ The products share infrastructure without sharing a false universal document
23
+ model:
24
+
25
+ 1. The Office shell owns the ribbon, status bar, dialogs, keyboard routing,
26
+ accessibility, file actions, anchored context menus, theming, and responsive
27
+ behavior. Context menus share pointer and Shift+F10 entry, viewport-bounded
28
+ placement, disabled-item-aware arrow navigation, Escape restoration, and an
29
+ explicit Tab exit that follows document focus order. Window-level shortcut
30
+ listeners are scoped to their mounted editor root and may capture before a
31
+ vendor engine's document listeners, so an editor cannot consume commands
32
+ from host-page controls while its own shortcuts remain deterministic.
33
+ Successful object and grid commands restore focus to the latest controlled
34
+ selection before the next keystroke.
35
+ 2. Each editor owns its selection model and exposes typed commands to the
36
+ shell. A command never searches rendered text or infers intent from labels.
37
+ 3. Interactive editing stays on the main thread. Presentation keeps object
38
+ selection separate from content editing and mounts TipTap only for the text
39
+ box explicitly opened with double-click or Enter; inactive text boxes use
40
+ lightweight scene previews.
41
+ 4. A versioned Worker client schedules bounded jobs, cancels superseded jobs,
42
+ and rejects stale responses.
43
+ 5. Rust WebAssembly kernels own deterministic calculation: layout, formulas,
44
+ geometry, package parsing, OOXML semantics, and serialization.
45
+ 6. Versioned structured models are the persistence boundary. HTML, canvas, and
46
+ DOM measurements are views or migration inputs, not the long-term source of
47
+ truth for OOXML documents.
48
+
49
+ At phone widths, Document, Markdown, Spreadsheet, and Presentation place file
50
+ identity and actions on the first compact row and keep unshrunk ribbon tabs in
51
+ a second horizontally scrollable row. This preserves tab labels and keyboard
52
+ navigation instead of squeezing both command regions into one line. PDF keeps
53
+ its purpose-built single compact toolbar and is excluded from that stacking
54
+ rule.
55
+
56
+ This split keeps typing, selection, drag, and resize responsive while moving
57
+ CPU-heavy and memory-bounded work away from the UI event loop.
58
+
59
+ ## Document interaction surfaces
60
+
61
+ Document commands use four interaction surfaces. The command owns the choice;
62
+ localized labels and viewport heuristics never decide behavior.
63
+
64
+ | Surface | Use | Placement and behavior |
65
+ | --- | --- | --- |
66
+ | 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
+ | 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
+ | 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. |
70
+
71
+ Task panes preserve editing context instead of behaving like navigation.
72
+ Closing a pane returns focus to the body editor. Switching away from a dirty
73
+ citation draft or an unsent comment reply requires an explicit discard
74
+ decision; cancelling that decision returns to the control that requested the
75
+ switch. Citation editing uses progressive disclosure: citation identity,
76
+ title, year, and authors remain visible while secondary publication metadata
77
+ stays collapsed until requested. An edited source cannot be inserted before it
78
+ is saved.
79
+
80
+ List galleries use a roving tab stop that follows Arrow, Home, and End focus.
81
+ Tab therefore exits from the visibly focused style rather than from a stale
82
+ previous option, and completed list commands return directly to document
83
+ editing.
84
+
85
+ Numeric ribbon and task-pane controls keep incomplete edits local. Escape
86
+ restores the last committed value, Enter produces exactly one command even
87
+ when that command synchronously returns focus to the editor, and IME
88
+ composition Enter is never treated as a commit. Table dimensions follow this
89
+ contract without changing the active cell selection. Spreadsheet and
90
+ presentation chart axes additionally reject minimum/maximum pairs that invert
91
+ the visible range and expose the invalid draft before it is committed.
92
+
93
+ Spreadsheet workbook task panes share one explicit saved-draft contract across
94
+ defined names, charts, conditional formats, calculation settings, pivot tables,
95
+ editable protection ranges, and print settings. Unrelated workbook updates do
96
+ not overwrite a dirty draft, switching to another managed object is blocked
97
+ until the current draft is saved or cancelled, and save actions stay disabled
98
+ when there is no change. The first Escape discards a dirty pane draft while
99
+ keeping the pane open; a second Escape closes the clean pane. Field-level
100
+ numeric drafts still consume Escape before the pane-level draft, so incomplete
101
+ input cannot trigger either a workbook mutation or an accidental close.
102
+
103
+ Review actions distinguish reversible, local decisions from broad destructive
104
+ ones. Individual revision decisions remain direct commands. Accepting or
105
+ rejecting every revision requires confirmation, and an empty revision pane does
106
+ not retain disabled bulk controls. Deleting a comment confirms that its thread
107
+ and any unsent reply will also be removed.
108
+
109
+ Selected document text has a typed host-owned context-menu boundary.
110
+ `getSelectionMenuItems` receives an immutable snapshot containing the selected
111
+ plain text and structured fragment, bounded adjacent text, synchronized HTML,
112
+ the complete document text, and the current controlled `WorkDocumentContent`.
113
+ When a host item is selected, its callback receives conflict-aware copy,
114
+ replace, insert-before, and insert-after commands. The menu factory completely
115
+ replaces the built-in selection menu, so the editor does not infer host intent
116
+ from localized labels or keywords. While an async callback Promise remains
117
+ pending, its target range maps through unrelated transactions. An edit to the
118
+ selected text makes the target stale and rejects the later command rather than
119
+ changing an unrelated range. Successful edit commands honor tracked changes
120
+ and produce one controlled update and one undo record. Open-ended host actions
121
+ collect required user input before creating an agent request. The Playground's
122
+ question action therefore opens a focused composer, preserves the complete
123
+ selection context in controlled state, and dispatches only after an explicit
124
+ submit; prepared context is collapsed by default in the assistant UI.
125
+
126
+ Markdown exposes the same host-owned boundary for both source and visual
127
+ selections. Its snapshot identifies the active surface and includes the exact
128
+ selection, bounded adjacent text, complete Markdown, rendered plain text, and
129
+ the current `WorkMarkdownContent`. Source actions validate their exact string
130
+ range; visual actions map through unrelated ProseMirror transactions. Both
131
+ surfaces reject changed targets with `stale-selection`, and every successful
132
+ edit returns a new controlled content value through `onChange`. The ribbon
133
+ also routes formatting and insertion commands to the active source selection
134
+ instead of silently changing the visual editor.
135
+
136
+ The controlled Markdown textarea owns a bounded source-history stack rather
137
+ than relying on browser-native undo for a controlled value. Consecutive typing
138
+ is coalesced, explicit commands remain separate records, undo and redo restore
139
+ the source selection, and a host replacement rebases the stack. Source-to-
140
+ visual synchronization is marked as non-historical so one source intent does
141
+ not create a second visual-editor undo record.
142
+
143
+ These rules are implemented by `DocumentTaskPane`, `Popover`, `Dialog`, and
144
+ `useOfficeDialog`. Native browser prompts, confirms, and selects are not valid
145
+ fallbacks. All four surfaces must be verified at 1280 px, 768 px, 520 px, and
146
+ 390 px widths for viewport containment, keyboard entry, Escape behavior, and
147
+ focus restoration.
148
+
149
+ ## Current implementation status
150
+
151
+ | Product | Implemented browser surface | Implemented kernel boundary | Next fidelity gate |
152
+ | --- | --- | --- | --- |
153
+ | 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 |
154
+ | 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, optional visual or source-only views, and a stacked phone layout | No kernel required for normal editing | CommonMark differential fixtures, multi-megabyte profiling, and an off-main-thread parser boundary when measurements justify it |
155
+ | 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 |
156
+ | 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 |
157
+ | 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 |
158
+
159
+ The table is a fidelity statement, not a marketing capability list. The
160
+ current Document path shapes text-flow paragraphs in Rust/WASM when every
161
+ explicit CSS family resolves to an exact registered face. Each run may carry up
162
+ to eight ordered faces; the kernel selects one face per grapheme and coalesces
163
+ adjacent selections before shaping. Unicode bidi levels split mixed-direction
164
+ text into logical shaping runs, including left-to-right number runs nested in
165
+ right-to-left text. Structured left-to-right tabs use normalized stops and
166
+ pre-shaped following-segment widths in the kernel. Glyphs missing from the
167
+ complete stack, unsupported OpenType behavior, inline objects, tab paragraphs
168
+ that resolve any right-to-left run, and unregistered faces deliberately retain
169
+ browser line measurement.
170
+
171
+ Document editing, read-only preview, and browser PDF composition resolve their
172
+ base font, size, line height, paragraph spacing, headings, lists, quotations,
173
+ and image wrapping from the same CSS rendering variables. Preview and PDF page
174
+ chrome is absolutely positioned inside the physical page margins, matching the
175
+ editing surface instead of consuming body flow. An absent header produces no
176
+ header element, and PDF composition never invents a filename header. Imported
177
+ inline formatting and host typography variables remain higher-priority inputs.
178
+ Narrow preview containers retain the physical page width and margins and
179
+ scroll the page instead of silently shrinking the text area and changing line
180
+ breaks.
181
+
182
+ Editing and read-only preview mount the same TipTap document surface. Switching
183
+ mode changes editability, accessible role, command chrome, and contextual
184
+ interactions without replacing the ProseMirror DOM or clearing its measured
185
+ blocks, shaped runs, page descriptors, and automatic-break decorations. Page
186
+ headers and footers are visual overlays inside the configured top and bottom
187
+ margins. Kernel protocol 15 therefore computes body height from page height
188
+ minus physical margins only; page-chrome heights position repeated overlays
189
+ and do not subtract the same space again. Browser PDF export locates the ready
190
+ surface through the host's stable artifact ID, clones its ProseMirror DOM once,
191
+ removes editing-only state, and crops exact physical pages from bounded capture
192
+ batches. Explicit descriptor pages remain a fallback for surfaces without a
193
+ registered live document.
194
+
195
+ Spreadsheet now uses a persistent browser Rust/WASM calculation session. The
196
+ editor initializes it with a sparse workbook replacement, sends bounded cell
197
+ patches from stable Fortune cell operations, and requests only the dirty
198
+ dependency subgraph during automatic calculation. One-cell edits read only
199
+ their changed coordinates; row, column, sheet, broad data, pivot, and
200
+ unrecognized operations take the checked replacement path. Manual mode keeps
201
+ an independent current projection while the last submitted session remains an
202
+ immutable diff baseline. No-history calculation result patches are consumed as
203
+ projection updates without returning formula caches as user input or creating
204
+ a separate undo step. Fortune does not apply later `data` props to a populated
205
+ workbook, so external, history, panel, and agent-controlled values use a
206
+ guarded remount; a value already emitted by the live workbook does not remount
207
+ or lose its interaction state.
208
+
209
+ Rust retains parsed formula ASTs plus forward and reverse dependency edges;
210
+ references to blank cells, dependency rewiring, unresolved formulas, partial
211
+ target calculation, cancellation, and stale patch revisions have explicit
212
+ tests. Successful scalar results are applied without adding undo history,
213
+ known grouped formulas refresh before their dependents, and unresolved
214
+ dependencies enter an ordered, cell-scoped Fortune Sheet compatibility pass.
215
+ The shared Rust parser handles the same bounded formula grammar in the native
216
+ core and browser kernel. This is not a complete Excel engine: Fortune Sheet
217
+ remains the canonical grid, initial and replacement sparse projection still
218
+ run on the main thread, and the kernel does not materialize whole-row or
219
+ whole-column ranges, calculate arrays, spills, structured references or
220
+ external workbooks, own number formatting, or own print layout.
221
+ Presentation sends alignment plus move and resize snapping to Rust/WASM. The
222
+ main thread treats an ordered selection as one bounded geometry frame, paints
223
+ at most one transient preview per animation frame, and ignores stale geometry
224
+ responses. The Worker returns snapped slide-relative geometry and at most one
225
+ typed guide per axis. Pointer movement never mutates the controlled document;
226
+ pointer release emits one host change for every moved object, while
227
+ cancellation emits none. Selection-only clicks mount no editor, Shift-click
228
+ toggles membership, and double-click or Enter opens content editing.
229
+
230
+ Presentation elements may carry an outermost-first `groupIds` path. The
231
+ top-level path segment defines the current logical selection unit: selecting or
232
+ dragging one member selects or moves every member, while alignment,
233
+ distribution, layer movement, clipboard operations, deletion, and history
234
+ operate on the complete unit. Group and ungroup commands add or remove one path
235
+ level in one controlled update. Copying objects, slides, or layouts remaps every
236
+ group ID without linking the copy to its source. PPTX import retains nested
237
+ group paths after mapping child geometry into slide coordinates and applies the
238
+ smaller cumulative group axis to typography, explicit rich-text run sizes, and
239
+ border weights. PPTX export resolves exact generated objects through temporary
240
+ names, removes those names, and builds nested native group nodes for slides,
241
+ layouts, and master-derived artwork. The generated group coordinate maps are
242
+ identity transforms based on emitted OOXML bounds, preserving hierarchy and
243
+ visual geometry after non-rotated, non-reflected transform round trips.
244
+ Arbitrary group rotation or reflection, connector routing, text fitting, theme
245
+ resolution, and kernel-owned thumbnail layout remain later fidelity gates.
246
+
247
+ Spreadsheet, Presentation, and PDF commands cross explicit typed boundaries.
248
+ The shell never searches visible labels, scrapes rendered text, or synthesizes
249
+ clicks to infer product intent. This keeps localized UI copy independent from
250
+ behavior and gives Worker/WASM operations a stable request contract.
251
+
252
+ ## Markdown editing flow
253
+
254
+ ```text
255
+ Controlled Markdown source
256
+ |
257
+ immediate source textarea + host onChange
258
+ |
259
+ trailing 160 ms coalescing boundary
260
+ |
261
+ TipTap Markdown parser and visual tree
262
+ |
263
+ GFM table / task / link / strike surface
264
+ ```
265
+
266
+ Markdown source remains the persistence boundary. Source keystrokes update the
267
+ controlled value immediately, while the visual tree consumes only the latest
268
+ queued value after a short trailing delay. Moving focus into the visual pane or
269
+ switching from source-only mode flushes the newest source first, so the user can
270
+ never edit a stale preview. Visual edits serialize back to Markdown and cancel
271
+ any pending source parse.
272
+
273
+ The split panes synchronize by normalized scroll progress rather than raw
274
+ pixels because source lines and rendered blocks have different heights. Status
275
+ counts use React deferred work so code-point counting does not compete with
276
+ high-priority typing. GFM compatibility fixtures cover tables, strikethrough,
277
+ autolinks, task-state round trips, controlled host replacement, and coalesced
278
+ source updates. Parsing remains on the main thread for now; moving it to a
279
+ Worker is a measured follow-up for multi-megabyte inputs, not an assumed
280
+ abstraction.
281
+
282
+ ## Document editing flow
283
+
284
+ ```text
285
+ Controlled WorkDocumentContent
286
+ |
287
+ versioned structured model
288
+ schema + revision + HTML fingerprint
289
+ |
290
+ TipTap / ProseMirror
291
+ one logical document
292
+ |
293
+ text-run collection and format-specific measurement
294
+ |
295
+ dedicated Worker
296
+ |
297
+ Rustybuzz shaping + Rust WebAssembly layout
298
+ |
299
+ versioned page and break result
300
+ |
301
+ ProseMirror widget decorations
302
+ no document or history mutation
303
+ ```
304
+
305
+ The document remains one logical ProseMirror tree. Automatic page boundaries
306
+ are widget decorations, not page nodes. Reflow therefore does not split the
307
+ content model or corrupt undo, selection mapping, copy and paste, or a future
308
+ collaboration protocol.
309
+
310
+ Document section nodes are isolating editing boundaries. Normal paragraph
311
+ breaks, empty paragraphs, and multiline paste therefore remain inside the
312
+ active section instead of becoming unmeasured root blocks. Explicit section
313
+ commands still split or merge those boundaries transactionally.
314
+
315
+ Page view renders one non-editable physical paper sheet per measured kernel
316
+ page behind that single editor tree. The mapped boundary widgets reserve the
317
+ remaining printable height, page chrome, and page gap while the sheet stack
318
+ provides separate page backgrounds, borders, and shadows. The visible page
319
+ count therefore cannot degrade into one continuously stretched paper surface,
320
+ and changing the page color still applies to every physical sheet without
321
+ creating additional editable roots.
322
+
323
+ The current browser-kernel slice collects contiguous geometry-affecting text
324
+ runs from eligible paragraphs. Each run carries an ordered registered font
325
+ stack, size, line height, letter spacing, ligature, and kerning behavior. Font
326
+ families and normal/italic styles remain exact; numeric weights follow the CSS
327
+ Fonts matching order so WPS-style values such as 680 or 730 select a registered
328
+ 700 face. When a family has only one normal-style weight, the same face
329
+ provides deterministic metrics for browser-synthesized bold text. The kernel
330
+ selects a face for each grapheme, joins adjacent selections that use the same
331
+ face, and includes every used face in line ascent and descent.
332
+ Rustybuzz shapes those segments and the kernel applies Unicode and
333
+ grapheme-safe line breaking across run boundaries. Unsupported paragraphs
334
+ retain the existing DOM range path, which maps each browser visual-line start
335
+ back to a ProseMirror position. This fallback also fragments paragraphs with
336
+ explicit hard breaks so gradual typing and multiline paste cannot overflow a
337
+ physical sheet as one atomic block. The Worker/WASM kernel chooses page
338
+ breaks, keeps a minimum number of line fragments on either side of a break,
339
+ and returns mapped decorations.
340
+ Tables, images, code blocks, and other complex content use explicit
341
+ format-specific measurement. Top-level tables are row flows; eligible rows can
342
+ additionally expose synchronized direct-cell block fragments. Ordered and bullet
343
+ lists recurse through semantic list items, expose each direct item block at its
344
+ stable ProseMirror position, and distribute list-container height without
345
+ double-counting nested content.
346
+
347
+ Document image nodes carry typed layout, alignment, wrap-distance, alternative
348
+ text, and size attributes. The selected image exposes the same operations
349
+ through a contextual Picture ribbon. Inline images stay in normal flow;
350
+ supported left- or right-aligned square images use browser floats, and
351
+ top-and-bottom images clear surrounding text. Paragraphs following a square
352
+ float remain on the DOM visual-line path because the available line width
353
+ changes while the float is active. The paginator reserves and observes the
354
+ image block height, then sends the measured text fragments to the same
355
+ Worker/Rust-WASM page-layout protocol. Supported square and top-and-bottom
356
+ metadata round-trips through DOCX `wp:anchor`. Arbitrary offsets, crop geometry,
357
+ contour wrapping, z-order, and drawing-layer relationships are not represented
358
+ yet.
359
+
360
+ The page-layout panel mounts two bounded TipTap surfaces for the active
361
+ header/footer variant. Pagination joins each kernel page placement to typed
362
+ section metadata and derives its physical page, section page, displayed page
363
+ number, and resolved first/default/even chrome variant. Page view fixes the
364
+ first paper header and final paper footer to their physical descriptors and
365
+ paints the previous footer plus next header inside every automatic page gap.
366
+ Those repeated surfaces are non-editable decorations and never enter document
367
+ history. Empty outer-paper margins render no persistent placeholder, border,
368
+ or activation control. A double click anywhere in the header or footer margin,
369
+ or the keyboard-accessible Header and Footer commands in the Insert ribbon,
370
+ replaces the static HTML with one toolbar-free TipTap surface in place and adds
371
+ a contextual Header and Footer ribbon. Existing imported content remains
372
+ visible in the clean state without an edit label. The contextual ribbon uses
373
+ the same typed command functions for formatting, alignment, links, images,
374
+ page-number visibility, switching between header and footer, and closing the
375
+ mode. Escape and web-view transitions close the mode and restore body focus.
376
+ The body is visually de-emphasized without being copied or removed from the
377
+ canonical tree. Both surfaces preserve semantic paragraphs, lists, tables,
378
+ links, marks, alignment, color, and inline raster images while exposing a
379
+ smaller command set than the document body. Toolbar controls derive active
380
+ state from the current selection; they do not inspect localized labels or use
381
+ `document.execCommand`. The controlled HTML values still pass through the
382
+ page-chrome sanitizer and the default/first/even-page model, so direct paper
383
+ editing does not create a second persistence format or bypass DOCX
384
+ header/footer relationships.
385
+
386
+ The editor records the earliest position changed by each ProseMirror
387
+ transaction and reuses measured blocks before that position. Runtime
388
+ diagnostics report measured and reused block counts, shaped paragraphs, and
389
+ submitted and accepted text-run counts. The incremental planner also retains
390
+ complete stable pages before the affected region. It rewinds at least one page
391
+ and continues rewinding when a paragraph flow or `keepWithNext` relationship
392
+ crosses the proposed boundary. The Worker/WASM kernel receives only the safe
393
+ suffix with an absolute start-page index; the integration then merges the
394
+ retained pages with a newly calculated boundary break. Layout requests carry
395
+ both a monotonic document revision and an independent layout revision,
396
+ allowing font, viewport, or page-size work to supersede an older layout without
397
+ changing the document identity.
398
+
399
+ It also supports explicit page and section breaks, keep-together blocks,
400
+ keep-with-next headings, cancellation, stale-revision rejection, and automatic
401
+ reflow after editing, resizing, font loading, or zoom changes. Page view uses
402
+ the result for visual paper gaps and status-bar page counts. Its horizontal
403
+ ruler is bound to the active section's paper width and left/right margins and
404
+ to the active paragraph's left, right, first-line, and hanging-indent
405
+ attributes. A vertical ruler controls the active section's top and bottom
406
+ margins. Pointer and keyboard changes update the same section node used by
407
+ pagination; compact layouts hide the vertical ruler while retaining Page
408
+ Layout controls. The Page Setup task pane separates Page, Columns and Sections,
409
+ and Header and Footer into keyboard-operated tabs. It opens on paper and margin
410
+ settings, keeps only one settings group mounted, and defers the two bounded
411
+ TipTap page-chrome editors until the user explicitly requests them. The
412
+ paragraph attributes map to and from `w:ind` formatting during DOCX import and
413
+ export. Paragraph spacing keeps before/after values plus Word's `auto`, `exact`,
414
+ and `atLeast` line rules. Direct `keepLines`,
415
+ `keepWithNext`, `pageBreakBefore`, and `widowControl` attributes also
416
+ round-trip through their matching OOXML paragraph properties. The kernel
417
+ applies those rules to visual-line flows, including reserving the first two
418
+ lines of the next paragraph when a keep-with-next boundary fits on a page.
419
+ Paragraph direction is a typed `ltr` or `rtl` node attribute rendered as
420
+ semantic `dir`, passed to the text-layout request, and controlled from the Home
421
+ ribbon. DOCX import resolves `w:bidi` through document defaults, the default
422
+ paragraph style, bounded and cycle-safe `basedOn` chains, and direct
423
+ overrides, including numbered paragraphs. Export maps explicit paragraph or
424
+ list-item direction to `w:bidi` and right-to-left text runs to `w:rtl`. DOCX
425
+ import resolves `w:jc` alignment through the same defaults, style inheritance,
426
+ and direct overrides. Physical left/right values remain physical, logical
427
+ start/end values follow the resolved paragraph direction, and Word's supported
428
+ distributed variants map to editable justification. Aligned list paragraphs
429
+ remain semantic list items with an aligned paragraph child. Indents, spacing,
430
+ and pagination use the same style chain. One shared style index serves these
431
+ paragraph import passes. Marker application scans converted text once per
432
+ property family instead of once per paragraph. Web view removes both automatic
433
+ pagination and the paper ruler.
434
+
435
+ Run-format import uses the same style index. It merges document run defaults,
436
+ paragraph-style run properties, direct paragraph run properties, bounded
437
+ character-style `basedOn` chains, and direct run properties. Unique sentinels
438
+ survive Mammoth conversion and become ordinary inline spans before the
439
+ TipTap/ProseMirror model is created. This currently preserves visible font
440
+ families, half-point sizes, direct hexadecimal colors, Word highlights, and
441
+ run shading. The importer also reads the DOCX font and color schemes, resolves
442
+ major/minor theme font references, system or sRGB theme colors, and tint/shade
443
+ transforms. Superscript and subscript remain structured, mutually exclusive
444
+ TipTap marks; their ribbon and keyboard commands switch vertical position
445
+ without stacking both marks, and DOCX round trips retain the corresponding
446
+ `w:vertAlign` values. Export maps background colors back to OOXML run shading.
447
+
448
+ Lists remain semantic ProseMirror structures. Pagination measures each direct
449
+ list-item block independently and maps a page widget before the first block
450
+ inside the target `li`; eligible list paragraphs are collected for the same
451
+ Rustybuzz text-layout request as ordinary paragraphs. DOCX export emits one
452
+ paragraph with `w:numPr` per item, supports levels zero through eight, positive
453
+ ordered-list starts, decimal, letter, and Roman formats, three canonical bullet
454
+ shapes, nesting, and RTL paragraph/run properties. Table cells, notes, headers,
455
+ and footers use the same export path. DOCX import uses bounded numbering
456
+ metadata to restore starts, common ordered formats, and disc/circle/square
457
+ bullets after Mammoth conversion, while direction markers are applied to the
458
+ semantic list item. Typed commands apply an active style idempotently, restart
459
+ at one, set a positive start, or continue the preceding same-depth list by
460
+ adopting its format and calculated next value. The split-button galleries keep
461
+ quick toggles separate from keyboard-operated style selection and local
462
+ numbering settings. Reversed lists, per-item `value` overrides, native Word
463
+ list-identity continuation, arbitrary multilevel templates, and loss-preserving
464
+ custom numbering formats remain later fidelity gates.
465
+
466
+ This slice is not yet a Microsoft Word or WPS line-layout fidelity claim.
467
+ Language-complete font substitution, variable font axes, the remaining
468
+ character and table style properties, arbitrary floating-object offsets,
469
+ cropping, contour wrapping and layering, row-internal table splitting inside a
470
+ single paragraph or an oversized multi-page row, nested tables, footnote
471
+ balancing, multi-column flow, and mixed-size sections require the later layout
472
+ stages below.
473
+
474
+ Top-level tables now enter pagination as row flows. DOM measurement supplies
475
+ row heights and stable ProseMirror positions; the Worker/Rust-WASM kernel keeps
476
+ leading header rows with the first body row and reserves the measured header
477
+ height on continuation pages. A table-aware widget creates the paper gap and
478
+ an `aria-hidden`, non-editable copy of the rendered header with the original
479
+ column group. The editable row remains the only canonical content. TipTap row
480
+ attributes preserve `cantSplit` and `tblHeader` through structured HTML and
481
+ DOCX import/export. Ordinary rows whose full height fits a continuation page
482
+ can split at synchronized boundaries between direct cell blocks. One
483
+ non-editable widget per cell aligns the page gap and paints a clipped slice of
484
+ the same measured header overlay. The leading cell alone extends the paper-gap
485
+ paint across the page margins. `cantSplit` rows, single long paragraphs, and
486
+ oversized rows are still atomic and may overflow.
487
+
488
+ Table creation is selection-safe: a non-empty text selection is preserved and
489
+ the chosen table is inserted after its containing block instead of replacing
490
+ the selected content. The insert ribbon exposes a keyboard-navigable 8 by 10
491
+ size picker. Entering a table opens separate Design and Layout contextual tabs.
492
+ Design owns keyboard-operated style presets, the header row, multi-cell
493
+ shading, and uniform borders. Layout owns row and column insertion or deletion,
494
+ cell merge and split, horizontal and vertical alignment, repeated headers,
495
+ atomic rows, centimeter-based column width and row height fields, equal row and
496
+ column distribution, content/window autofit, and table deletion. Physical
497
+ column widths remain coherent across merged cells through ProseMirror's table
498
+ map; explicit row heights and the table layout mode are typed attributes rather
499
+ than transient DOM measurements. Edit, preview, print, and DOCX import/export
500
+ share those attributes. Fixed DOCX tables round-trip `tblGrid`, `tcW`,
501
+ `tblLayout`, and `trHeight`, while window/content autofit remains responsive in
502
+ the browser. Command availability comes from the ProseMirror table state, so
503
+ actions that cannot apply to the current selection remain disabled. Per-edge
504
+ and theme borders, percentage-width column authoring, nested-table editing, and
505
+ arbitrary table-style inheritance remain explicit fidelity gaps.
506
+
507
+ Paragraph tab stops are typed node attributes with normalized positions,
508
+ left/center/right/decimal alignment, and leader styles. A leaf
509
+ `documentTab` node preserves each Tab keystroke in the ProseMirror model
510
+ outside tables and lists; table navigation and list nesting keep priority.
511
+ DOM layout resolves default and custom stops after browser font measurement,
512
+ normalizes zoomed geometry back to document coordinates, and runs in edit,
513
+ preview, and PDF surfaces before pagination or capture. DOCX import merges
514
+ `w:tabs` through bounded paragraph-style inheritance, applies `clear` entries
515
+ by position, and replaces `w:tab` with sentinels during Mammoth conversion.
516
+ DOCX export restores paragraph tab definitions and inline tabs. Deterministic
517
+ font shaping now crosses multiple exact registered text runs in one paragraph,
518
+ and structured left-to-right tabs share the browser's default/custom stop
519
+ selection policy. Center, right, and decimal offsets use Rustybuzz-shaped
520
+ following-segment widths. Locale-specific decimal separators, bidirectional tab
521
+ paragraphs, and loss-preserving unsupported tab kinds remain later fidelity
522
+ gates.
523
+
524
+ ## WebAssembly boundary
525
+
526
+ `crates/web-kernel` is deliberately independent of the DOM, filesystem,
527
+ network, and an async runtime. It accepts bounded JSON requests through a
528
+ small raw WebAssembly ABI:
529
+
530
+ - `office_kernel_abi_version`
531
+ - `office_kernel_alloc` and `office_kernel_dealloc`
532
+ - `office_kernel_register_font`
533
+ - `office_kernel_layout`
534
+ - `office_kernel_text_layout`
535
+ - `office_kernel_presentation_geometry`
536
+ - `office_kernel_spreadsheet_calculation`
537
+ - `office_kernel_spreadsheet_session_calculation`
538
+ - `office_kernel_result_pointer` and `office_kernel_result_length`
539
+
540
+ The protocol is versioned and carries independent layout and document
541
+ revisions plus an absolute start-page index for resumable suffix layout.
542
+ Font registration crosses the ABI as bounded raw bytes rather than base64 in
543
+ JSON. Batched text-layout requests carry contiguous UTF-16 run ranges, ordered
544
+ font IDs, CSS-pixel metrics, whitespace, ligature and kerning behavior,
545
+ direction, and first-line width. The Unicode bidi algorithm resolves one
546
+ paragraph level and directional levels before Rustybuzz shapes every
547
+ intersection of direction, style, and registered font. Unicode line breaking
548
+ and grapheme-safe emergency breaks span run boundaries and produce UTF-16
549
+ offsets that map directly to ProseMirror.
550
+ Presentation geometry requests carry stable element IDs, slide-relative
551
+ coordinates, and a tagged operation for slide alignment or object snapping.
552
+ Snap operations identify the moving element, transform mode, and independent
553
+ horizontal and vertical thresholds derived from a six-pixel visual distance.
554
+ Results return the resolved geometry plus typed slide or element guides. The
555
+ Worker suppresses cancelled responses, and the React integration accepts only
556
+ the newest request in the active gesture. Matching JavaScript implementations
557
+ preserve editing if Worker or WebAssembly loading is unavailable. The
558
+ JavaScript text fallback explicitly reports unsupported paragraphs so the
559
+ editor uses DOM line measurement instead of estimated font metrics.
560
+
561
+ Spreadsheet requests carry populated cells only, zero-based coordinates,
562
+ cached scalar values, formulas, and optional calculation targets. The kernel
563
+ recursively resolves dependencies in deterministic order and returns successful
564
+ cells separately from cell-scoped issues. Its first scalar function set covers
565
+ common arithmetic, comparison, concatenation, aggregation, logical, and numeric
566
+ operations. Persistent requests begin with `replace`, then use revisioned
567
+ `patch` updates plus `dirty`, `targets`, or `workbook` calculation scopes.
568
+ Formula ASTs and dependency edges survive between requests, while patches
569
+ rewire only changed formula nodes and mark their transitive dependents dirty.
570
+ Cancelled requests still execute in the serialized Worker queue so the next
571
+ patch always observes its declared base revision; only their responses are
572
+ discarded. The JavaScript fallback loads its parser only when needed and
573
+ recalculates from the supplied full sparse snapshot. Unsupported formula
574
+ structures remain unchanged and conservatively dirty so a host never loses the
575
+ source formula or cached value.
576
+ Rust/WASM remains the canonical calculation path. If Worker or WebAssembly
577
+ loading fails, the Fortune-based fallback keeps the workbook editable but may
578
+ use Fortune coercion and eager-branch evaluation for formulas beyond the
579
+ shared parity fixtures; this is an explicit first-slice compatibility limit,
580
+ not a cross-engine equivalence claim.
581
+
582
+ The browser pagination implementation is split by capability instead of
583
+ accumulating in one editor module. `work-document-pagination.ts` owns only the
584
+ TipTap extension and public facade; dedicated modules own block measurement,
585
+ table fragmentation, text-layout request collection, visual-line measurement,
586
+ DOM geometry, page-break decorations, and shared contracts. The Rust kernel
587
+ uses the same separation: the crate root owns the ABI and flow layout, while
588
+ text validation, UTF-16 offset mapping, shaping, and their tests live in
589
+ focused modules. This keeps the fallback and WASM paths independently
590
+ testable without duplicating their public protocol.
591
+
592
+ The npm package emits `office-kernel.worker.js`, `office-kernel.wasm`, and
593
+ default Noto Sans, Noto Sans Hans, Noto Naskh Arabic, and Noto Sans Hebrew
594
+ regular faces beside the public JavaScript entries. Hosts may override the
595
+ WASM URL and provide typed `layoutFonts` when assets are served from a CDN or a
596
+ nonstandard path. The browser loads the same faces through `FontFace`; a
597
+ paragraph enters the deterministic path only when every explicit family in its
598
+ CSS stack matches a
599
+ successfully loaded and registered asset in the same order.
600
+
601
+ The document font selector groups packaged layout faces, common Chinese,
602
+ Western, and monospace system families, host-provided layout faces, and an
603
+ otherwise unknown family retained from imported content. Each choice previews
604
+ its own CSS family while short section headings distinguish packaged, system,
605
+ host, and imported entries without repeating status text on every row. The same
606
+ grouped catalog is reused by the compact selection toolbar, Presentation text
607
+ controls, and Spreadsheet cell formatting.
608
+
609
+ ## Structured document boundary
610
+
611
+ `WorkDocumentContent` remains controlled by the host and keeps `html` as a
612
+ required compatibility representation. It may also carry a versioned
613
+ `WorkDocumentModel` containing:
614
+
615
+ - the `a3s.office.document` schema identifier and schema version;
616
+ - a monotonically increasing document revision;
617
+ - the structured TipTap/ProseMirror root; and
618
+ - a fingerprint of the synchronized HTML representation.
619
+
620
+ `DocumentEditor` emits the structured model and HTML together after an edit.
621
+ It loads the model only when the fingerprint still matches normalized HTML.
622
+ If a legacy host changes `html` without updating the model, the stale model is
623
+ ignored and removed on the next synchronization instead of overwriting the
624
+ host's change. Model trees are bounded and validated before they cross into the
625
+ editor. React, Vue, and Web Component wrappers continue to share the same
626
+ controlled value. Document-level page color remains outside the ProseMirror
627
+ tree, is updated through the same controlled value, and is preserved by DOCX
628
+ import/export and the browser PDF render surface.
629
+
630
+ This is a transitional persistence boundary, not loss-preserving OOXML yet.
631
+ DOCX still converts through Mammoth, but DOCX, HTML, and text imports create the
632
+ structured model immediately through the same extension schema used by the
633
+ editor. DOCX export materializes synchronized HTML from the structured model
634
+ before OOXML generation, so a stale HTML cache cannot override model changes.
635
+ Preview retains the mounted structured editor tree, and live browser PDF export
636
+ captures that same paginated surface; compatibility HTML remains an
637
+ import/export boundary. Unsupported OOXML package parts are not yet represented
638
+ by the model.
639
+
640
+ Migration to browser-native OOXML is staged:
641
+
642
+ 1. Keep editing behavior stable while moving pagination off the React thread.
643
+ 2. Persist the versioned logical document model while retaining checked HTML
644
+ compatibility for existing hosts.
645
+ 3. Replace eligible browser-measured visual-line flows with deterministic
646
+ shaped line boxes, font metrics, configurable widow and orphan rules, notes,
647
+ fields, and full floating-object geometry beyond the supported image-anchor
648
+ subset.
649
+ 4. Compile the A3S OOXML, relationship, style, numbering, theme, and package
650
+ layers for the browser with explicit memory and archive limits.
651
+ 5. Extend the structured model with loss-preserving OOXML package state and
652
+ round trips without making HTML the only source of truth.
653
+ 6. Share style, theme, formula, geometry, and serialization primitives across
654
+ Document, Spreadsheet, and Presentation while retaining their distinct
655
+ editing surfaces.
656
+
657
+ Each stage needs compatibility fixtures, deterministic layout goldens, large
658
+ document performance budgets, and real Microsoft Office and WPS
659
+ interoperability evidence before it can be described as fidelity-complete.
660
+
661
+ ## Delivery roadmap
662
+
663
+ Work is delivered as vertical slices. Each slice must preserve controlled
664
+ component behavior and import/export compatibility before the next slice starts.
665
+
666
+ ### Stage 1: shared editing foundation
667
+
668
+ - Use the same ribbon, status bar, dialogs, fields, zoom controls, loading
669
+ states, shortcuts, and responsive rules in every editor. Ctrl/Cmd + wheel is
670
+ captured inside the active editor and routed to the same bounded zoom model
671
+ as its status controls instead of changing browser page scale.
672
+ - Keep one command route per product and make commands operate on typed
673
+ selections.
674
+ - Load Document, Markdown, Spreadsheet, Presentation, PDF, Workers, and WASM as
675
+ independent chunks.
676
+ - Keep reproducible Chromium screenshots and shared-shell geometry checks for
677
+ all five editors at 1280 × 800 and 768 × 800.
678
+
679
+ Exit criteria: no native prompt, confirm, or select UI; no editor-specific copy
680
+ of shared chrome; keyboard-only access to all primary commands; no initial
681
+ bundle regression.
682
+
683
+ ### Stage 2: Word-compatible document layout
684
+
685
+ - Finish replacing browser-measured visual-line pagination with shaped line
686
+ boxes produced from resolved fonts and paragraph properties. Text-flow
687
+ paragraphs already support multiple exact registered runs.
688
+ - Extend the current horizontal and vertical page rulers with bidirectional and
689
+ locale-complete tab behavior, plus complete style, numbering, and theme
690
+ inheritance beyond the implemented paragraph slices.
691
+ - Complete row-internal splitting for single paragraphs and oversized
692
+ multi-page rows, and add nested tables, full floating-object geometry beyond
693
+ the supported square/top-and-bottom image anchors, footnote balancing,
694
+ columns, and mixed page sections. Row-flow pagination, direct-cell block
695
+ splitting, repeating headers, and the initial image-wrapping slice are
696
+ already implemented.
697
+ - Keep pagination results as mapped ProseMirror decorations so reflow never
698
+ corrupts selection or undo history.
699
+
700
+ Exit criteria: deterministic layout goldens for the supported feature set;
701
+ incremental reflow does not rebuild unaffected pages; DOCX fixtures round-trip
702
+ through Microsoft Word and WPS without losing unsupported package parts.
703
+
704
+ ### Stage 3: spreadsheet calculation and virtualization
705
+
706
+ - Introduce an A3S-owned sparse workbook model and a row/column virtualized
707
+ viewport.
708
+ - Mount TipTap only for the active rich-text cell or floating text object.
709
+ - Move formula parsing, dependency graph updates, dirty-cell recalculation,
710
+ number formatting, sorting, filtering, and print pagination to a Worker/WASM
711
+ kernel.
712
+ - Keep viewport rendering independent from workbook size and retain a typed
713
+ value for every cell.
714
+
715
+ The first calculation slice is implemented: a sparse calculation projection,
716
+ shared bounded Rust formula grammar, Worker/WASM scalar dependency evaluation,
717
+ revision cancellation, stale-result rejection, target-only recalculation, and
718
+ JavaScript and cell-scoped Fortune fallbacks. Persistent Worker/WASM sessions
719
+ now retain parsed formulas and bounded forward/reverse dependency graphs;
720
+ stable workbook edits use cell patches and automatic calculation evaluates only
721
+ the affected transitive formula subgraph. Stable Fortune cell operations now
722
+ produce those patches directly without a dense workbook scan. Structural and
723
+ external controlled changes use a replacement projection, and controlled
724
+ values that did not originate from the live grid remount the Fortune surface
725
+ so the visible workbook cannot diverge from the host value. The canonical grid
726
+ is still Fortune Sheet. The A3S-owned virtual viewport, moving initial and
727
+ replacement projection off the main thread, complete formula semantics, kernel
728
+ number formatting, and print pagination remain open work in this stage.
729
+
730
+ Exit criteria: scrolling and selection do not scale with total row count;
731
+ incremental recalculation touches only affected dependency subgraphs; XLSX
732
+ fixtures preserve formulas, styles, names, validation, conditional formatting,
733
+ and unknown package parts within the declared support boundary.
734
+
735
+ ### Stage 4: presentation scene and geometry kernel
736
+
737
+ - Keep slides as a typed scene graph and mount one TipTap editor only for the
738
+ selected text box.
739
+ - Move transforms, snapping, alignment guides, grouping, connector routing,
740
+ text fitting, theme/master resolution, and thumbnail layout to Worker/WASM.
741
+ - Add stable object IDs so selection, history, comments, animation, and OOXML
742
+ relationships survive import and export.
743
+
744
+ The first transform slice is implemented. Move and resize gestures keep their
745
+ starting object immutable, coalesce pointer events into a transient preview,
746
+ and submit only the latest candidate to the cancellable geometry Worker. The
747
+ Rust/WASM kernel resolves slide-edge, slide-center, and sibling-object anchors;
748
+ the canvas paints the returned horizontal or vertical guide without adding
749
+ text or persistent scene objects. Pointer release submits one controlled
750
+ content value, so the complete gesture occupies one undo step. Pointer cancel,
751
+ selection-only clicks, stale responses, and superseded gestures do not create
752
+ history. A short timer fallback preserves progress when a browser temporarily
753
+ suspends animation frames.
754
+
755
+ The object-selection slice is also implemented. Selection is an ordered set
756
+ owned by the Presentation editor rather than a DOM class or visible-label
757
+ lookup. Shift-click toggles membership; a plain canvas click clears it;
758
+ double-click or Enter opens content editing; and Escape returns focus to object
759
+ mode. Multi-object move, arrow-key nudge, copy, cut, paste, duplicate, delete,
760
+ layer movement, alignment, and distribution each publish one controlled value
761
+ and therefore one undo record.
762
+
763
+ The persistent-grouping slice is implemented. Nested, outermost-first group
764
+ paths survive controlled browser edits and PPTX group import. A top-level group
765
+ is one selection and arrangement unit; group and ungroup commands,
766
+ `Ctrl`/`Command` + `G`, and `Ctrl`/`Command` + `Shift` + `G` each publish one
767
+ controlled value. Object, slide, and layout copies receive independent group
768
+ IDs. A shared bottom-right selection handle scales every selected member
769
+ against the immutable selection frame. Geometry uses independent horizontal
770
+ and vertical factors; typography, explicit rich-text run sizes, and border
771
+ weights use the smaller factor so a non-uniform scale does not force text
772
+ outside its child bounds. Preview work remains frame-coalesced and pointer
773
+ release publishes one controlled value, so one undo restores the complete
774
+ group. PPTX export emits nested native groups without matching objects by
775
+ position, removes every temporary object marker, and keeps slide, layout, and
776
+ master-derived group scopes separate. Import normalizes supported group scale
777
+ into child geometry and visual metrics. Arbitrary group rotation and
778
+ reflection, source group names, and kernel-owned group geometry remain
779
+ separate fidelity gates.
780
+
781
+ The thumbnail-virtualization slices are implemented. Short decks retain every
782
+ thumbnail button. Decks above the bounded threshold render a contiguous row
783
+ window plus measured virtual spacers in both the normal strip and sorter, so
784
+ React and DOM node counts depend on the viewport rather than the slide count.
785
+ Keyboard commands use absolute slide indexes instead of querying mounted
786
+ siblings; `Home`, `End`, arrow navigation, and deletion can therefore cross an
787
+ unmounted range. Each mounted button exposes its absolute position and total in
788
+ its accessible name, and an externally selected slide is revealed without
789
+ stealing focus.
790
+
791
+ The mounted window shares one root-scoped intersection observer. Full inherited
792
+ layouts, images, tables, charts, and text scenes mount only for the selected
793
+ slide and slides inside a bounded viewport overscan, and unmount after leaving
794
+ it. A mutation observer reconnects scene observation as thumbnail windows
795
+ change. Environments without `IntersectionObserver` render complete scenes for
796
+ the bounded mounted window. Kernel-owned thumbnail layout remains a separate
797
+ performance gate.
798
+
799
+ Exit criteria: object drag and resize stay interactive on complex slides;
800
+ partial rich-text formatting survives PPTX round trips; masters, layouts,
801
+ themes, tables, charts, links, and notes have compatibility fixtures for
802
+ PowerPoint and WPS.
803
+
804
+ ### Stage 5: PDF product surface
805
+
806
+ - Keep PDFium as the parsing and rendering engine.
807
+ - Replace embedded product chrome with the shared A3S Office shell.
808
+ - Own annotation, form, redaction, page organization, search, history, and save
809
+ commands through typed models.
810
+
811
+ The first PDF shell slice is implemented. It disables the embedded toolbar and
812
+ routes page navigation, zoom presets, search result navigation, basic
813
+ annotation tools, annotation color, opacity, and compatible stroke-width
814
+ defaults and selected-annotation updates, annotation deletion, history, and
815
+ copy export through public plugin capabilities. It contains no shadow-DOM
816
+ queries, private viewer selectors, label inference, or synthetic clicks.
817
+ Page-number Escape cancels without blur submission, pending searches cannot
818
+ replay stale results, and responsive overflow actions remain reachable whenever
819
+ their direct toolbar controls are hidden. The product-owned thumbnail rail uses
820
+ PDFium thumbnail capabilities without enabling the embedded sidebar, keeps page
821
+ numbers and active-page state synchronized with the main scroll controller,
822
+ automatically reveals the current page, and mounts only a bounded page window
823
+ for long files. At phone widths the same navigation becomes a focus-contained,
824
+ dismissible drawer rather than reducing the document canvas.
825
+ Existing PDF password handling remains in the PDF document lifecycle rather
826
+ than the removed toolbar. Form-authoring controls, redaction review, page
827
+ organization, and compatibility fixtures remain part of this stage.
828
+
829
+ Exit criteria: annotations and form changes survive reopen; destructive
830
+ redaction requires an explicit review step; large documents render a bounded
831
+ page window rather than the complete file.
832
+
833
+ ### Stage 6: loss-preserving Office persistence
834
+
835
+ - Compile the bounded A3S package, relationship, style, numbering, theme, and
836
+ OOXML layers for browser Workers.
837
+ - Preserve unsupported parts and attributes instead of regenerating an entire
838
+ package from the visible view model.
839
+ - Use the same structured mutation contracts in the browser library, Office
840
+ CLI, MCP server, and Skill.
841
+
842
+ Exit criteria: import-edit-export fixtures show semantic and package-level
843
+ round-trip evidence in Microsoft Office and WPS; unsupported content is
844
+ retained or rejected explicitly, never silently discarded.
845
+
846
+ ## Performance gates
847
+
848
+ Performance claims are measured on a documented reference machine with
849
+ repeatable fixtures. The targets below are release gates, not current claims:
850
+
851
+ - Local typing, selection, and object manipulation have a p95 main-thread task
852
+ below 16 ms; no normal interaction creates a task above 50 ms.
853
+ - Incremental work is revisioned and bounded. A new edit cancels stale layout,
854
+ formula, geometry, or serialization jobs.
855
+ - Document reflow begins at the earliest affected line and does not remeasure
856
+ stable earlier pages.
857
+ - Spreadsheet rendering cost depends on the visible viewport, not sheet
858
+ dimensions; formula cost depends on the dirty dependency subgraph.
859
+ - Presentation renders the active slide at full fidelity and virtualizes
860
+ off-screen thumbnails and inactive slide content.
861
+ - PDF keeps a bounded render cache and releases page bitmaps outside the active
862
+ window.
863
+ - Every editor has fixture-based memory, interaction-latency, load-time, and
864
+ output-size budgets in CI before it can be called production-ready.
865
+
866
+ ## Performance and safety rules
867
+
868
+ - Editing and selection stay on the main thread; parsing and layout do not.
869
+ - The public React entry loads editor engines as independent asynchronous
870
+ chunks. `preloadOfficeEditor` may warm one engine from hover or keyboard
871
+ focus without mounting it.
872
+ - Spreadsheet formula-language metadata loads with Spreadsheet diagnostics and
873
+ editing, never with the empty Office workspace.
874
+ - Presentation pointer movement schedules at most one preview request per
875
+ animation frame, never calls the host `onChange`, cancels superseded geometry
876
+ work, and commits once when the pointer is released.
877
+ - The Playground initial JavaScript budget is 220 KiB gzip and is enforced in
878
+ CI against the scripts referenced by the generated `index.html`.
879
+ - One active layout request exists per editor. A newer revision cancels the
880
+ previous request.
881
+ - Requests reject invalid dimensions and more than 10,000 layout blocks.
882
+ - Text requests are bounded to 1,024 paragraphs and 1 MiB of UTF-8 text.
883
+ They accept at most 16,384 contiguous runs, with no more than 4,096 in one
884
+ paragraph and no more than eight ordered faces per run. Font registration is
885
+ bounded to 16 faces and 32 MiB per face.
886
+ - Spreadsheet calculation requests are bounded to 1,024 sheets, 100,000
887
+ populated cells, 100,000 targets, 8,192 Unicode characters per formula,
888
+ 100,000 materialized range cells cumulatively per formula, 64 nested formula
889
+ dependencies, 100,000 patch cells, 1,000,000 dependency edges, Excel's
890
+ XFD1048576 coordinate boundary, and 32,767 UTF-8 bytes per text value. The
891
+ editor replaces rather than diffs a session when one controlled update
892
+ changes more than 10,000 populated cells.
893
+ - Glyphs missing from the complete registered stack, ambiguous font stacks,
894
+ and unsupported inline structures retain DOM measurement instead of
895
+ accepting approximate line boxes.
896
+ - WebAssembly performs no network or filesystem access.
897
+ - Worker failure is recoverable and does not block typing.
898
+ - Automatic pagination transactions are excluded from editor history.
899
+ - Multi-column and mixed-page-layout documents currently retain explicit-break
900
+ behavior until their layout protocols are implemented.
901
+
902
+ ## Verification
903
+
904
+ The browser kernel is covered at four boundaries:
905
+
906
+ 1. Rust unit tests for deterministic pagination, Unicode line breaking,
907
+ grapheme-safe emergency wrapping, whitespace modes, shared formula parsing,
908
+ scalar dependency calculation, cycles, targets, and validation.
909
+ 2. JavaScript fallback tests for protocol parity, safe page-prefix reuse,
910
+ no-Worker operation, cancellation, sparse Spreadsheet calculation,
911
+ revisioned session fallback, and the shared Spreadsheet parity fixtures.
912
+ 3. A raw generated-WASM ABI smoke test that registers both shipped fonts,
913
+ proves the Latin face lacks CJK glyphs, resolves them through the ordered
914
+ fallback face, verifies mixed-face line metrics, initializes a Spreadsheet
915
+ session, and recalculates a dirty formula chain from a cell patch.
916
+ 4. Browser checks for real Worker/WASM/font loading, shaped-line parity with
917
+ browser line boxes at non-100% zoom, real per-grapheme fallback diagnostics,
918
+ explicit unresolved-glyph fallback, page-view reflow, web-view clearing,
919
+ page counts, one physical sheet per measured page, visible page gaps, nested
920
+ and RTL list flow, undo behavior, and slide-relative element alignment.
921
+
922
+ Presentation group serialization tests inspect generated slide and layout
923
+ OOXML, nested group order, identity child-coordinate transforms, unique
924
+ non-visual IDs, marker removal, master/layout scope isolation, grouped
925
+ placeholder materialization, cumulative visual scaling, and unsupported
926
+ rotation/reflection diagnostics.
927
+
928
+ Presentation thumbnail tests use a controlled intersection observer to prove
929
+ that long decks retain absolute keyboard reachability while bounding mounted
930
+ buttons and full scenes, releasing scenes that leave the window, preserving
931
+ focus after deletion, and reconnecting the observer when switching between
932
+ normal and sorter views.
933
+
934
+ Run the focused kernel checks with:
935
+
936
+ ```bash
937
+ bun run kernel:test
938
+ cargo test -p a3s-office-web-kernel
939
+ ```
940
+
941
+ Build and verify the Playground performance boundary with:
942
+
943
+ ```bash
944
+ bun run playground:build
945
+ bun run playground:bundle-check
946
+ bun run playground:visual
947
+ ```