@dxos/plugin-sheet 0.8.4-main.fd6878d → 0.8.4-staging.60fe92afc8

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 (393) hide show
  1. package/LICENSE +102 -5
  2. package/PLUGIN.mdl +359 -0
  3. package/dist/lib/neutral/RangeList-HYB5S6KQ.mjs +46 -0
  4. package/dist/lib/neutral/RangeList-HYB5S6KQ.mjs.map +7 -0
  5. package/dist/lib/neutral/SheetArticle-5AJRM3V3.mjs +33 -0
  6. package/dist/lib/neutral/SheetArticle-5AJRM3V3.mjs.map +7 -0
  7. package/dist/lib/neutral/SheetPlugin.mjs +63 -0
  8. package/dist/lib/neutral/SheetPlugin.mjs.map +7 -0
  9. package/dist/lib/neutral/SheetPlugin.node.mjs +27 -0
  10. package/dist/lib/neutral/SheetPlugin.node.mjs.map +7 -0
  11. package/dist/lib/neutral/SheetPlugin.workerd.mjs +21 -0
  12. package/dist/lib/neutral/SheetPlugin.workerd.mjs.map +7 -0
  13. package/dist/lib/neutral/anchor-sort-2POWTKTD.mjs +22 -0
  14. package/dist/lib/neutral/anchor-sort-2POWTKTD.mjs.map +7 -0
  15. package/dist/lib/neutral/app-graph-builder-2QP6GYB2.mjs +67 -0
  16. package/dist/lib/neutral/app-graph-builder-2QP6GYB2.mjs.map +7 -0
  17. package/dist/lib/neutral/capabilities/index.mjs +29 -0
  18. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  19. package/dist/lib/neutral/chunk-BGR7FVNF.mjs +8 -0
  20. package/dist/lib/neutral/chunk-BGR7FVNF.mjs.map +7 -0
  21. package/dist/lib/{browser/chunk-VTTKAHAY.mjs → neutral/chunk-ERHMBRSU.mjs} +16 -16
  22. package/dist/lib/neutral/chunk-ERHMBRSU.mjs.map +7 -0
  23. package/dist/lib/neutral/chunk-FQHTXKMF.mjs +34 -0
  24. package/dist/lib/neutral/chunk-FQHTXKMF.mjs.map +7 -0
  25. package/dist/lib/neutral/chunk-HEN74ZWI.mjs +83 -0
  26. package/dist/lib/neutral/chunk-HEN74ZWI.mjs.map +7 -0
  27. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  28. package/dist/lib/neutral/chunk-KUWATEHB.mjs +374 -0
  29. package/dist/lib/neutral/chunk-KUWATEHB.mjs.map +7 -0
  30. package/dist/lib/neutral/chunk-S2UNH6VD.mjs +10 -0
  31. package/dist/lib/neutral/chunk-S2UNH6VD.mjs.map +7 -0
  32. package/dist/lib/neutral/comment-config-WGXXX5FG.mjs +22 -0
  33. package/dist/lib/neutral/comment-config-WGXXX5FG.mjs.map +7 -0
  34. package/dist/lib/neutral/components/index.mjs +1552 -0
  35. package/dist/lib/neutral/components/index.mjs.map +7 -0
  36. package/dist/lib/neutral/compute-graph-registry-YYINTFC2.mjs +26 -0
  37. package/dist/lib/neutral/compute-graph-registry-YYINTFC2.mjs.map +7 -0
  38. package/dist/lib/neutral/containers/index.mjs +11 -0
  39. package/dist/lib/neutral/containers/index.mjs.map +7 -0
  40. package/dist/lib/neutral/create-object-TDQQ24IB.mjs +31 -0
  41. package/dist/lib/neutral/create-object-TDQQ24IB.mjs.map +7 -0
  42. package/dist/lib/neutral/drop-axis-WSWFOLQN.mjs +23 -0
  43. package/dist/lib/neutral/drop-axis-WSWFOLQN.mjs.map +7 -0
  44. package/dist/lib/{node-esm/types → neutral}/index.mjs +22 -13
  45. package/dist/lib/neutral/insert-axis-6UQJTIWC.mjs +16 -0
  46. package/dist/lib/neutral/insert-axis-6UQJTIWC.mjs.map +7 -0
  47. package/dist/lib/neutral/markdown-extension-HTJDICGT.mjs +28 -0
  48. package/dist/lib/neutral/markdown-extension-HTJDICGT.mjs.map +7 -0
  49. package/dist/lib/neutral/meta.json +1 -0
  50. package/dist/lib/neutral/meta.mjs +8 -0
  51. package/dist/lib/neutral/meta.mjs.map +7 -0
  52. package/dist/lib/neutral/navigation-resolver-FXEZYO7G.mjs +14 -0
  53. package/dist/lib/neutral/navigation-resolver-FXEZYO7G.mjs.map +7 -0
  54. package/dist/lib/neutral/operation-handler-TB6LFV2H.mjs +13 -0
  55. package/dist/lib/neutral/operation-handler-TB6LFV2H.mjs.map +7 -0
  56. package/dist/lib/neutral/operations/index.mjs +8 -0
  57. package/dist/lib/neutral/operations/index.mjs.map +7 -0
  58. package/dist/lib/neutral/plugin.mjs +16 -0
  59. package/dist/lib/neutral/plugin.mjs.map +7 -0
  60. package/dist/lib/neutral/react-surface-4H3PC4WG.mjs +44 -0
  61. package/dist/lib/neutral/react-surface-4H3PC4WG.mjs.map +7 -0
  62. package/dist/lib/neutral/restore-axis-AMMVTPS3.mjs +16 -0
  63. package/dist/lib/neutral/restore-axis-AMMVTPS3.mjs.map +7 -0
  64. package/dist/lib/neutral/scroll-to-anchor-FK2CXCQR.mjs +33 -0
  65. package/dist/lib/neutral/scroll-to-anchor-FK2CXCQR.mjs.map +7 -0
  66. package/dist/lib/neutral/state-HPA27MX2.mjs +29 -0
  67. package/dist/lib/neutral/state-HPA27MX2.mjs.map +7 -0
  68. package/dist/lib/neutral/testing/index.mjs +103 -0
  69. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  70. package/dist/lib/neutral/translations.mjs +56 -0
  71. package/dist/lib/neutral/translations.mjs.map +7 -0
  72. package/dist/lib/{browser → neutral}/types/index.mjs +8 -12
  73. package/dist/lib/neutral/types/index.mjs.map +7 -0
  74. package/dist/lib/neutral/undo-mappings-3FQLSTCZ.mjs +31 -0
  75. package/dist/lib/neutral/undo-mappings-3FQLSTCZ.mjs.map +7 -0
  76. package/dist/types/src/SheetPlugin.d.ts +3 -1
  77. package/dist/types/src/SheetPlugin.d.ts.map +1 -1
  78. package/dist/types/src/SheetPlugin.node.d.ts +4 -0
  79. package/dist/types/src/SheetPlugin.node.d.ts.map +1 -0
  80. package/dist/types/src/SheetPlugin.test.d.ts +2 -0
  81. package/dist/types/src/SheetPlugin.test.d.ts.map +1 -0
  82. package/dist/types/src/SheetPlugin.workerd.d.ts +4 -0
  83. package/dist/types/src/SheetPlugin.workerd.d.ts.map +1 -0
  84. package/dist/types/src/capabilities/anchor-sort.d.ts +4 -4
  85. package/dist/types/src/capabilities/anchor-sort.d.ts.map +1 -1
  86. package/dist/types/src/capabilities/app-graph-builder.d.ts +6 -0
  87. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -0
  88. package/dist/types/src/capabilities/comment-config.d.ts +6 -0
  89. package/dist/types/src/capabilities/comment-config.d.ts.map +1 -0
  90. package/dist/types/src/capabilities/compute-graph-registry.d.ts +9 -2
  91. package/dist/types/src/capabilities/compute-graph-registry.d.ts.map +1 -1
  92. package/dist/types/src/capabilities/create-object.d.ts +11 -0
  93. package/dist/types/src/capabilities/create-object.d.ts.map +1 -0
  94. package/dist/types/src/capabilities/index.d.ts +19 -11
  95. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  96. package/dist/types/src/capabilities/markdown-extension.d.ts +5 -0
  97. package/dist/types/src/capabilities/markdown-extension.d.ts.map +1 -0
  98. package/dist/types/src/capabilities/navigation-resolver.d.ts +6 -0
  99. package/dist/types/src/capabilities/navigation-resolver.d.ts.map +1 -0
  100. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  101. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  102. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  103. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  104. package/dist/types/src/capabilities/state.d.ts +6 -0
  105. package/dist/types/src/capabilities/state.d.ts.map +1 -0
  106. package/dist/types/src/capabilities/undo-mappings.d.ts +5 -0
  107. package/dist/types/src/capabilities/undo-mappings.d.ts.map +1 -0
  108. package/dist/types/src/components/ComputeGraph/ComputeGraphContextProvider.d.ts +1 -1
  109. package/dist/types/src/components/ComputeGraph/ComputeGraphContextProvider.d.ts.map +1 -1
  110. package/dist/types/src/components/ComputeGraph/compute-graph.stories.d.ts +9 -4
  111. package/dist/types/src/components/ComputeGraph/compute-graph.stories.d.ts.map +1 -1
  112. package/dist/types/src/components/Sheet/Sheet.d.ts +17 -0
  113. package/dist/types/src/components/Sheet/Sheet.d.ts.map +1 -0
  114. package/dist/types/src/components/Sheet/index.d.ts +2 -0
  115. package/dist/types/src/components/Sheet/index.d.ts.map +1 -0
  116. package/dist/types/src/components/SheetContent/SheetCellEditor.stories.d.ts +16 -0
  117. package/dist/types/src/components/SheetContent/SheetCellEditor.stories.d.ts.map +1 -0
  118. package/dist/types/src/components/SheetContent/SheetContent.d.ts +6 -0
  119. package/dist/types/src/components/SheetContent/SheetContent.d.ts.map +1 -0
  120. package/dist/types/src/components/SheetContent/SheetContent.stories.d.ts +93 -0
  121. package/dist/types/src/components/SheetContent/SheetContent.stories.d.ts.map +1 -0
  122. package/dist/types/src/components/SheetContent/index.d.ts +2 -0
  123. package/dist/types/src/components/SheetContent/index.d.ts.map +1 -0
  124. package/dist/types/src/components/{GridSheet → SheetContent}/util.d.ts +1 -1
  125. package/dist/types/src/components/SheetContent/util.d.ts.map +1 -0
  126. package/dist/types/src/components/{SheetContext/SheetContext.d.ts → SheetRoot/SheetRoot.d.ts} +9 -7
  127. package/dist/types/src/components/SheetRoot/SheetRoot.d.ts.map +1 -0
  128. package/dist/types/src/components/SheetRoot/index.d.ts +2 -0
  129. package/dist/types/src/components/SheetRoot/index.d.ts.map +1 -0
  130. package/dist/types/src/components/SheetStatusbar/SheetStatusbar.d.ts +6 -0
  131. package/dist/types/src/components/SheetStatusbar/SheetStatusbar.d.ts.map +1 -0
  132. package/dist/types/src/components/SheetStatusbar/index.d.ts +2 -0
  133. package/dist/types/src/components/SheetStatusbar/index.d.ts.map +1 -0
  134. package/dist/types/src/components/SheetToolbar/SheetToolbar.d.ts +5 -6
  135. package/dist/types/src/components/SheetToolbar/SheetToolbar.d.ts.map +1 -1
  136. package/dist/types/src/components/SheetToolbar/SheetToolbar.stories.d.ts +92 -4
  137. package/dist/types/src/components/SheetToolbar/SheetToolbar.stories.d.ts.map +1 -1
  138. package/dist/types/src/components/SheetToolbar/align.d.ts +14 -21
  139. package/dist/types/src/components/SheetToolbar/align.d.ts.map +1 -1
  140. package/dist/types/src/components/SheetToolbar/style.d.ts +14 -20
  141. package/dist/types/src/components/SheetToolbar/style.d.ts.map +1 -1
  142. package/dist/types/src/components/SheetToolbar/useToolbarState.d.ts +14 -1
  143. package/dist/types/src/components/SheetToolbar/useToolbarState.d.ts.map +1 -1
  144. package/dist/types/src/components/index.d.ts +1 -4
  145. package/dist/types/src/components/index.d.ts.map +1 -1
  146. package/dist/types/src/containers/RangeList/RangeList.d.ts +7 -0
  147. package/dist/types/src/containers/RangeList/RangeList.d.ts.map +1 -0
  148. package/dist/types/src/containers/RangeList/index.d.ts +2 -0
  149. package/dist/types/src/containers/RangeList/index.d.ts.map +1 -0
  150. package/dist/types/src/containers/SheetArticle/SheetArticle.d.ts +12 -0
  151. package/dist/types/src/containers/SheetArticle/SheetArticle.d.ts.map +1 -0
  152. package/dist/types/src/containers/SheetArticle/SheetArticle.stories.d.ts +92 -0
  153. package/dist/types/src/containers/SheetArticle/SheetArticle.stories.d.ts.map +1 -0
  154. package/dist/types/src/containers/SheetArticle/index.d.ts +2 -0
  155. package/dist/types/src/containers/SheetArticle/index.d.ts.map +1 -0
  156. package/dist/types/src/containers/index.d.ts +4 -0
  157. package/dist/types/src/containers/index.d.ts.map +1 -0
  158. package/dist/types/src/extensions/compute.d.ts +2 -2
  159. package/dist/types/src/extensions/compute.d.ts.map +1 -1
  160. package/dist/types/src/extensions/compute.stories.d.ts +10 -13
  161. package/dist/types/src/extensions/compute.stories.d.ts.map +1 -1
  162. package/dist/types/src/extensions/editor/index.d.ts +1 -1
  163. package/dist/types/src/extensions/editor/index.d.ts.map +1 -1
  164. package/dist/types/src/extensions/editor/{extension.d.ts → sheet-extension.d.ts} +2 -2
  165. package/dist/types/src/extensions/editor/sheet-extension.d.ts.map +1 -0
  166. package/dist/types/src/extensions/editor/sheet-extension.test.d.ts +2 -0
  167. package/dist/types/src/extensions/editor/sheet-extension.test.d.ts.map +1 -0
  168. package/dist/types/src/index.d.ts +3 -2
  169. package/dist/types/src/index.d.ts.map +1 -1
  170. package/dist/types/src/integrations/thread-ranges.d.ts +1 -3
  171. package/dist/types/src/integrations/thread-ranges.d.ts.map +1 -1
  172. package/dist/types/src/meta.d.ts +2 -3
  173. package/dist/types/src/meta.d.ts.map +1 -1
  174. package/dist/types/src/model/sheet-model.d.ts +31 -7
  175. package/dist/types/src/model/sheet-model.d.ts.map +1 -1
  176. package/dist/types/src/model/testing.d.ts +2 -2
  177. package/dist/types/src/model/testing.d.ts.map +1 -1
  178. package/dist/types/src/model/useSheetModel.d.ts +3 -3
  179. package/dist/types/src/model/useSheetModel.d.ts.map +1 -1
  180. package/dist/types/src/operations/drop-axis.d.ts +5 -0
  181. package/dist/types/src/operations/drop-axis.d.ts.map +1 -0
  182. package/dist/types/src/operations/index.d.ts +3 -0
  183. package/dist/types/src/operations/index.d.ts.map +1 -0
  184. package/dist/types/src/operations/insert-axis.d.ts +5 -0
  185. package/dist/types/src/operations/insert-axis.d.ts.map +1 -0
  186. package/dist/types/src/operations/restore-axis.d.ts +5 -0
  187. package/dist/types/src/operations/restore-axis.d.ts.map +1 -0
  188. package/dist/types/src/operations/scroll-to-anchor.d.ts +5 -0
  189. package/dist/types/src/operations/scroll-to-anchor.d.ts.map +1 -0
  190. package/dist/types/src/paths.d.ts +3 -0
  191. package/dist/types/src/paths.d.ts.map +1 -0
  192. package/dist/types/src/playwright/playwright.config.d.ts.map +1 -1
  193. package/dist/types/src/playwright/sheet-manager.d.ts.map +1 -1
  194. package/dist/types/src/plugin.d.ts +4 -0
  195. package/dist/types/src/plugin.d.ts.map +1 -0
  196. package/dist/types/src/serializer.d.ts +3 -3
  197. package/dist/types/src/serializer.d.ts.map +1 -1
  198. package/dist/types/src/testing/data.d.ts +2 -2
  199. package/dist/types/src/testing/data.d.ts.map +1 -1
  200. package/dist/types/src/testing/testing.d.ts +28 -4
  201. package/dist/types/src/testing/testing.d.ts.map +1 -1
  202. package/dist/types/src/translations.d.ts +74 -38
  203. package/dist/types/src/translations.d.ts.map +1 -1
  204. package/dist/types/src/types/Sheet.d.ts +75 -0
  205. package/dist/types/src/types/Sheet.d.ts.map +1 -0
  206. package/dist/types/src/types/SheetCapabilities.d.ts +16 -0
  207. package/dist/types/src/types/SheetCapabilities.d.ts.map +1 -0
  208. package/dist/types/src/types/SheetOperation.d.ts +45 -0
  209. package/dist/types/src/types/SheetOperation.d.ts.map +1 -0
  210. package/dist/types/src/types/index.d.ts +3 -1
  211. package/dist/types/src/types/index.d.ts.map +1 -1
  212. package/dist/types/src/types/sheet-range-types.d.ts +2 -2
  213. package/dist/types/src/types/sheet-range-types.d.ts.map +1 -1
  214. package/dist/types/src/types/types.d.ts +3 -78
  215. package/dist/types/src/types/types.d.ts.map +1 -1
  216. package/dist/types/src/types/util.d.ts +11 -11
  217. package/dist/types/src/types/util.d.ts.map +1 -1
  218. package/dist/types/tsconfig.tsbuildinfo +1 -1
  219. package/package.json +132 -98
  220. package/src/SheetPlugin.node.ts +21 -0
  221. package/src/SheetPlugin.test.ts +30 -0
  222. package/src/SheetPlugin.tsx +55 -68
  223. package/src/SheetPlugin.workerd.ts +18 -0
  224. package/src/capabilities/anchor-sort.ts +20 -15
  225. package/src/capabilities/app-graph-builder.ts +63 -0
  226. package/src/capabilities/comment-config.ts +28 -0
  227. package/src/capabilities/compute-graph-registry.ts +34 -20
  228. package/src/capabilities/create-object.ts +33 -0
  229. package/src/capabilities/index.ts +22 -8
  230. package/src/capabilities/markdown-extension.ts +31 -0
  231. package/src/capabilities/navigation-resolver.ts +16 -0
  232. package/src/capabilities/operation-handler.ts +16 -0
  233. package/src/capabilities/react-surface.tsx +38 -29
  234. package/src/capabilities/state.ts +29 -0
  235. package/src/capabilities/undo-mappings.ts +30 -0
  236. package/src/components/ComputeGraph/ComputeGraphContextProvider.tsx +1 -1
  237. package/src/components/ComputeGraph/compute-graph.stories.tsx +35 -27
  238. package/src/components/Sheet/Sheet.tsx +20 -0
  239. package/src/components/Sheet/index.ts +5 -0
  240. package/src/components/SheetContent/SheetCellEditor.stories.tsx +95 -0
  241. package/src/components/SheetContent/SheetContent.stories.tsx +60 -0
  242. package/src/components/{GridSheet/GridSheet.tsx → SheetContent/SheetContent.tsx} +88 -58
  243. package/src/components/{RangeList → SheetContent}/index.ts +1 -1
  244. package/src/components/{GridSheet → SheetContent}/util.ts +17 -10
  245. package/src/components/{SheetContext/SheetContext.tsx → SheetRoot/SheetRoot.tsx} +55 -42
  246. package/src/components/{GridSheet → SheetRoot}/index.ts +1 -1
  247. package/src/components/{FunctionEditor/FunctionEditor.tsx → SheetStatusbar/SheetStatusbar.tsx} +20 -7
  248. package/src/components/{FunctionEditor → SheetStatusbar}/index.ts +1 -1
  249. package/src/components/SheetToolbar/SheetToolbar.stories.tsx +19 -14
  250. package/src/components/SheetToolbar/SheetToolbar.tsx +61 -56
  251. package/src/components/SheetToolbar/align.ts +50 -25
  252. package/src/components/SheetToolbar/style.ts +52 -22
  253. package/src/components/SheetToolbar/useToolbarState.ts +22 -5
  254. package/src/components/index.ts +1 -7
  255. package/src/containers/RangeList/RangeList.tsx +65 -0
  256. package/src/containers/RangeList/index.ts +5 -0
  257. package/src/containers/SheetArticle/SheetArticle.stories.tsx +110 -0
  258. package/src/containers/SheetArticle/SheetArticle.tsx +57 -0
  259. package/src/containers/SheetArticle/index.ts +5 -0
  260. package/src/containers/index.ts +8 -0
  261. package/src/extensions/compute.stories.tsx +49 -36
  262. package/src/extensions/compute.ts +3 -4
  263. package/src/extensions/editor/index.ts +1 -1
  264. package/src/extensions/editor/{extension.test.ts → sheet-extension.test.ts} +2 -2
  265. package/src/extensions/editor/{extension.ts → sheet-extension.ts} +18 -15
  266. package/src/index.ts +3 -2
  267. package/src/integrations/thread-ranges.ts +20 -62
  268. package/src/meta.ts +22 -8
  269. package/src/model/sheet-model.test.ts +34 -6
  270. package/src/model/sheet-model.ts +84 -52
  271. package/src/model/testing.ts +5 -5
  272. package/src/model/useSheetModel.ts +4 -3
  273. package/src/operations/drop-axis.ts +26 -0
  274. package/src/operations/index.ts +12 -0
  275. package/src/operations/insert-axis.ts +19 -0
  276. package/src/operations/restore-axis.ts +19 -0
  277. package/src/operations/scroll-to-anchor.ts +30 -0
  278. package/src/paths.ts +11 -0
  279. package/src/playwright/playwright.config.ts +1 -1
  280. package/src/playwright/sheet.spec.ts +4 -3
  281. package/src/plugin.ts +11 -0
  282. package/src/sanity.test.ts +9 -3
  283. package/src/serializer.ts +4 -12
  284. package/src/testing/data.ts +2 -2
  285. package/src/testing/testing.tsx +13 -7
  286. package/src/translations.ts +43 -36
  287. package/src/types/Sheet.ts +97 -0
  288. package/src/types/SheetCapabilities.ts +26 -0
  289. package/src/types/SheetOperation.ts +84 -0
  290. package/src/types/index.ts +4 -1
  291. package/src/types/sheet-range-types.ts +5 -5
  292. package/src/types/types.ts +6 -52
  293. package/src/types/util.ts +15 -42
  294. package/src/vite-env.d.ts +10 -0
  295. package/dist/lib/browser/SheetContainer-JZNFXBW3.mjs +0 -351
  296. package/dist/lib/browser/SheetContainer-JZNFXBW3.mjs.map +0 -7
  297. package/dist/lib/browser/anchor-sort-VRX3YZKT.mjs +0 -24
  298. package/dist/lib/browser/anchor-sort-VRX3YZKT.mjs.map +0 -7
  299. package/dist/lib/browser/chunk-6AKBCBL4.mjs +0 -18
  300. package/dist/lib/browser/chunk-6AKBCBL4.mjs.map +0 -7
  301. package/dist/lib/browser/chunk-BVTHIA5U.mjs +0 -847
  302. package/dist/lib/browser/chunk-BVTHIA5U.mjs.map +0 -7
  303. package/dist/lib/browser/chunk-ELAASQ5H.mjs +0 -899
  304. package/dist/lib/browser/chunk-ELAASQ5H.mjs.map +0 -7
  305. package/dist/lib/browser/chunk-KJWZUQVA.mjs +0 -15
  306. package/dist/lib/browser/chunk-KJWZUQVA.mjs.map +0 -7
  307. package/dist/lib/browser/chunk-VTTKAHAY.mjs.map +0 -7
  308. package/dist/lib/browser/compute-graph-registry-6YJHXORG.mjs +0 -30
  309. package/dist/lib/browser/compute-graph-registry-6YJHXORG.mjs.map +0 -7
  310. package/dist/lib/browser/index.mjs +0 -155
  311. package/dist/lib/browser/index.mjs.map +0 -7
  312. package/dist/lib/browser/intent-resolver-SSLPTP5O.mjs +0 -56
  313. package/dist/lib/browser/intent-resolver-SSLPTP5O.mjs.map +0 -7
  314. package/dist/lib/browser/markdown-3VPZYNGU.mjs +0 -26
  315. package/dist/lib/browser/markdown-3VPZYNGU.mjs.map +0 -7
  316. package/dist/lib/browser/meta.json +0 -1
  317. package/dist/lib/browser/react-surface-Y7KTPJW2.mjs +0 -53
  318. package/dist/lib/browser/react-surface-Y7KTPJW2.mjs.map +0 -7
  319. package/dist/lib/node-esm/SheetContainer-GOIBAE2P.mjs +0 -352
  320. package/dist/lib/node-esm/SheetContainer-GOIBAE2P.mjs.map +0 -7
  321. package/dist/lib/node-esm/anchor-sort-YM2UBIKL.mjs +0 -25
  322. package/dist/lib/node-esm/anchor-sort-YM2UBIKL.mjs.map +0 -7
  323. package/dist/lib/node-esm/chunk-3K5VNYOF.mjs +0 -20
  324. package/dist/lib/node-esm/chunk-3K5VNYOF.mjs.map +0 -7
  325. package/dist/lib/node-esm/chunk-4L5CIB7E.mjs +0 -900
  326. package/dist/lib/node-esm/chunk-4L5CIB7E.mjs.map +0 -7
  327. package/dist/lib/node-esm/chunk-56HYMW55.mjs +0 -848
  328. package/dist/lib/node-esm/chunk-56HYMW55.mjs.map +0 -7
  329. package/dist/lib/node-esm/chunk-6SK5LJ5S.mjs +0 -16
  330. package/dist/lib/node-esm/chunk-6SK5LJ5S.mjs.map +0 -7
  331. package/dist/lib/node-esm/chunk-FXRXBHWM.mjs +0 -236
  332. package/dist/lib/node-esm/chunk-FXRXBHWM.mjs.map +0 -7
  333. package/dist/lib/node-esm/compute-graph-registry-ET5KJNLV.mjs +0 -31
  334. package/dist/lib/node-esm/compute-graph-registry-ET5KJNLV.mjs.map +0 -7
  335. package/dist/lib/node-esm/index.mjs +0 -156
  336. package/dist/lib/node-esm/index.mjs.map +0 -7
  337. package/dist/lib/node-esm/intent-resolver-5P6DBGK2.mjs +0 -57
  338. package/dist/lib/node-esm/intent-resolver-5P6DBGK2.mjs.map +0 -7
  339. package/dist/lib/node-esm/markdown-SFDGQWYE.mjs +0 -27
  340. package/dist/lib/node-esm/markdown-SFDGQWYE.mjs.map +0 -7
  341. package/dist/lib/node-esm/meta.json +0 -1
  342. package/dist/lib/node-esm/react-surface-6Z5FAOBH.mjs +0 -54
  343. package/dist/lib/node-esm/react-surface-6Z5FAOBH.mjs.map +0 -7
  344. package/dist/types/src/capabilities/capabilities.d.ts +0 -5
  345. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  346. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  347. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  348. package/dist/types/src/capabilities/markdown.d.ts +0 -6
  349. package/dist/types/src/capabilities/markdown.d.ts.map +0 -1
  350. package/dist/types/src/components/FunctionEditor/FunctionEditor.d.ts +0 -3
  351. package/dist/types/src/components/FunctionEditor/FunctionEditor.d.ts.map +0 -1
  352. package/dist/types/src/components/FunctionEditor/index.d.ts +0 -2
  353. package/dist/types/src/components/FunctionEditor/index.d.ts.map +0 -1
  354. package/dist/types/src/components/GridSheet/GridSheet.d.ts +0 -3
  355. package/dist/types/src/components/GridSheet/GridSheet.d.ts.map +0 -1
  356. package/dist/types/src/components/GridSheet/GridSheet.stories.d.ts +0 -7
  357. package/dist/types/src/components/GridSheet/GridSheet.stories.d.ts.map +0 -1
  358. package/dist/types/src/components/GridSheet/SheetCellEditor.stories.d.ts +0 -25
  359. package/dist/types/src/components/GridSheet/SheetCellEditor.stories.d.ts.map +0 -1
  360. package/dist/types/src/components/GridSheet/index.d.ts +0 -2
  361. package/dist/types/src/components/GridSheet/index.d.ts.map +0 -1
  362. package/dist/types/src/components/GridSheet/util.d.ts.map +0 -1
  363. package/dist/types/src/components/RangeList/RangeList.d.ts +0 -7
  364. package/dist/types/src/components/RangeList/RangeList.d.ts.map +0 -1
  365. package/dist/types/src/components/RangeList/index.d.ts +0 -2
  366. package/dist/types/src/components/RangeList/index.d.ts.map +0 -1
  367. package/dist/types/src/components/SheetContainer/SheetContainer.d.ts +0 -11
  368. package/dist/types/src/components/SheetContainer/SheetContainer.d.ts.map +0 -1
  369. package/dist/types/src/components/SheetContainer/SheetContainer.stories.d.ts +0 -8
  370. package/dist/types/src/components/SheetContainer/SheetContainer.stories.d.ts.map +0 -1
  371. package/dist/types/src/components/SheetContainer/index.d.ts +0 -3
  372. package/dist/types/src/components/SheetContainer/index.d.ts.map +0 -1
  373. package/dist/types/src/components/SheetContext/SheetContext.d.ts.map +0 -1
  374. package/dist/types/src/components/SheetContext/index.d.ts +0 -2
  375. package/dist/types/src/components/SheetContext/index.d.ts.map +0 -1
  376. package/dist/types/src/extensions/editor/extension.d.ts.map +0 -1
  377. package/dist/types/src/extensions/editor/extension.test.d.ts +0 -2
  378. package/dist/types/src/extensions/editor/extension.test.d.ts.map +0 -1
  379. package/dist/types/src/types/schema.d.ts +0 -37
  380. package/dist/types/src/types/schema.d.ts.map +0 -1
  381. package/src/capabilities/capabilities.ts +0 -14
  382. package/src/capabilities/intent-resolver.ts +0 -38
  383. package/src/capabilities/markdown.ts +0 -23
  384. package/src/components/GridSheet/GridSheet.stories.tsx +0 -54
  385. package/src/components/GridSheet/SheetCellEditor.stories.tsx +0 -93
  386. package/src/components/RangeList/RangeList.tsx +0 -60
  387. package/src/components/SheetContainer/SheetContainer.stories.tsx +0 -90
  388. package/src/components/SheetContainer/SheetContainer.tsx +0 -36
  389. package/src/components/SheetContainer/index.ts +0 -7
  390. package/src/components/SheetContext/index.ts +0 -5
  391. package/src/types/schema.ts +0 -61
  392. /package/dist/lib/{browser/types/index.mjs.map → neutral/chunk-J5LGTIGS.mjs.map} +0 -0
  393. /package/dist/lib/{node-esm/types → neutral}/index.mjs.map +0 -0
@@ -2,84 +2,89 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { Rx } from '@effect-rx/rx-react';
6
- import React, { type PropsWithChildren, useMemo } from 'react';
5
+ import { Atom, type Registry, RegistryContext } from '@effect-atom/atom-react';
6
+ import React, { useContext, useMemo } from 'react';
7
7
 
8
- import { useAppGraph } from '@dxos/app-framework';
9
- import { type CompleteCellRange } from '@dxos/compute';
10
- import { type ThemedClassName } from '@dxos/react-ui';
11
- import {
12
- type ActionGraphEdges,
13
- type ActionGraphNodes,
14
- type ActionGraphProps,
15
- MenuProvider,
16
- ToolbarMenu,
17
- createGapSeparator,
18
- rxFromSignal,
19
- useMenuActions,
20
- } from '@dxos/react-ui-menu';
8
+ import { useAppGraph } from '@dxos/app-toolkit/ui';
9
+ import { type CompleteCellRange } from '@dxos/compute-hyperformula';
10
+ import { composable, composableProps } from '@dxos/react-ui';
11
+ import { type ActionGraphProps, Menu, createGapSeparator, useMenuActions } from '@dxos/react-ui-menu';
21
12
 
22
13
  import { type SheetModel } from '../../model';
23
- import { useSheetContext } from '../SheetContext';
24
-
14
+ import { useSheetContext } from '../SheetRoot';
25
15
  import { createAlign, useAlignState } from './align';
26
16
  import { createStyle, useStyleState } from './style';
27
- import { type ToolbarState, useToolbarState } from './useToolbarState';
28
-
29
- //
30
- // Root
31
- //
17
+ import { type ToolbarStateAtom, useToolbarState } from './useToolbarState';
32
18
 
33
- export type SheetToolbarProps = ThemedClassName<PropsWithChildren<{ id: string }>>;
19
+ type ToolbarActionsContext = {
20
+ model: SheetModel;
21
+ stateAtom: ToolbarStateAtom;
22
+ registry: Registry.Registry;
23
+ cursorFallbackRange?: CompleteCellRange;
24
+ customActions?: Atom.Atom<ActionGraphProps>;
25
+ };
34
26
 
35
- const createToolbarActions = (
36
- model: SheetModel,
37
- state: ToolbarState,
38
- cursorFallbackRange?: CompleteCellRange,
39
- customActions?: Rx.Rx<ActionGraphProps>,
40
- ) => {
41
- return Rx.make((get) => {
42
- const align = get(rxFromSignal(() => createAlign(model, state, cursorFallbackRange)));
43
- const style = get(rxFromSignal(() => createStyle(model, state, cursorFallbackRange)));
27
+ const createToolbarActions = ({
28
+ model,
29
+ stateAtom,
30
+ registry,
31
+ cursorFallbackRange,
32
+ customActions,
33
+ }: ToolbarActionsContext): Atom.Atom<ActionGraphProps> => {
34
+ return Atom.make((get) => {
35
+ const state = get(stateAtom);
36
+ const context = { model, state, stateAtom, registry, cursorFallbackRange };
37
+ const align = createAlign(context);
38
+ const style = createStyle(context);
44
39
  const gap = createGapSeparator();
45
- const nodes: ActionGraphNodes = [...align.nodes, ...style.nodes, ...gap.nodes];
46
- const edges: ActionGraphEdges = [...align.edges, ...style.edges, ...gap.edges];
40
+
41
+ const graph: ActionGraphProps = {
42
+ nodes: [...align.nodes, ...style.nodes, ...gap.nodes],
43
+ edges: [...align.edges, ...style.edges, ...gap.edges],
44
+ };
45
+
47
46
  if (customActions) {
48
47
  const custom = get(customActions);
49
- nodes.push(...custom.nodes);
50
- edges.push(...custom.edges);
48
+ graph.nodes.push(...custom.nodes);
49
+ graph.edges.push(...custom.edges);
51
50
  }
52
- return {
53
- nodes,
54
- edges,
55
- };
51
+
52
+ return graph;
56
53
  });
57
54
  };
58
55
 
59
- export const SheetToolbar = ({ id, classNames }: SheetToolbarProps) => {
60
- const { model, cursorFallbackRange } = useSheetContext();
61
- const state = useToolbarState({});
62
- useAlignState(state);
63
- useStyleState(state);
56
+ export type SheetToolbarProps = {};
57
+
58
+ export const SheetToolbar = composable<HTMLDivElement, SheetToolbarProps>((props, forwardedRef) => {
59
+ const { attendableId, model, cursorFallbackRange } = useSheetContext();
60
+ const stateAtom = useToolbarState({});
61
+ const registry = useContext(RegistryContext);
62
+ useAlignState(stateAtom);
63
+ useStyleState(stateAtom);
64
64
 
65
65
  const { graph } = useAppGraph();
66
66
  const customActions = useMemo(() => {
67
- return Rx.make((get) => {
68
- const actions = get(graph.actions(id));
67
+ return Atom.make((get) => {
68
+ const actions = get(graph.actions(attendableId));
69
69
  const nodes = actions.filter((action) => action.properties.disposition === 'toolbar');
70
- return { nodes, edges: nodes.map((node) => ({ source: 'root', target: node.id })) };
70
+ return {
71
+ nodes,
72
+ edges: nodes.map((node) => ({ source: 'root', target: node.id, relation: 'child' })),
73
+ };
71
74
  });
72
- }, [graph]);
75
+ }, [graph, attendableId]);
73
76
 
74
77
  const actionsCreator = useMemo(
75
- () => createToolbarActions(model, state, cursorFallbackRange, customActions),
76
- [model, state, cursorFallbackRange, customActions],
78
+ () => createToolbarActions({ model, stateAtom, registry, cursorFallbackRange, customActions }),
79
+ [model, stateAtom, registry, cursorFallbackRange, customActions],
77
80
  );
78
- const menu = useMenuActions(actionsCreator);
81
+ const menuActions = useMenuActions(actionsCreator);
79
82
 
80
83
  return (
81
- <MenuProvider {...menu} attendableId={id}>
82
- <ToolbarMenu classNames={classNames} />
83
- </MenuProvider>
84
+ <Menu.Root {...menuActions} attendableId={attendableId}>
85
+ <Menu.Toolbar {...composableProps(props)} ref={forwardedRef} />
86
+ </Menu.Root>
84
87
  );
85
- };
88
+ });
89
+
90
+ SheetToolbar.displayName = 'SheetToolbar';
@@ -2,17 +2,24 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { useEffect } from 'react';
5
+ import { type Registry, RegistryContext } from '@effect-atom/atom-react';
6
+ import { useContext, useEffect } from 'react';
6
7
 
7
- import { type CompleteCellRange, inRange } from '@dxos/compute';
8
- import { type ToolbarMenuActionGroupProperties, createMenuAction, createMenuItemGroup } from '@dxos/react-ui-menu';
8
+ import { type CompleteCellRange, inRange } from '@dxos/compute-hyperformula';
9
+ import { Obj } from '@dxos/echo';
10
+ import {
11
+ type ActionGraphProps,
12
+ type ToolbarMenuActionGroupProperties,
13
+ createMenuAction,
14
+ createMenuItemGroup,
15
+ } from '@dxos/react-ui-menu';
9
16
 
10
- import { SHEET_PLUGIN } from '../../meta';
11
- import { type SheetModel } from '../../model';
12
- import { type AlignKey, type AlignValue, alignKey, rangeFromIndex, rangeToIndex } from '../../types';
13
- import { useSheetContext } from '../SheetContext';
17
+ import { meta } from '#meta';
18
+ import { type AlignKey, type AlignValue, alignKey, rangeFromIndex, rangeToIndex } from '#types';
14
19
 
15
- import { type ToolbarState } from './useToolbarState';
20
+ import { type SheetModel } from '../../model';
21
+ import { useSheetContext } from '../SheetRoot';
22
+ import { type ToolbarState, type ToolbarStateAtom } from './useToolbarState';
16
23
 
17
24
  export type AlignAction = { key: AlignKey; value: AlignValue };
18
25
 
@@ -24,29 +31,40 @@ const aligns: Record<AlignValue, string> = {
24
31
  end: 'ph--text-align-right--regular',
25
32
  };
26
33
 
27
- export const useAlignState = (state: Partial<AlignState>) => {
34
+ export const useAlignState = (stateAtom: ToolbarStateAtom) => {
35
+ const registry = useContext(RegistryContext);
28
36
  const { cursor, model } = useSheetContext();
29
37
  useEffect(() => {
30
38
  // TODO(thure): Can this O(n) call be memoized?
31
- state[alignKey] = (
39
+ const alignValue = (
32
40
  cursor
33
41
  ? model.sheet.ranges?.findLast(
34
42
  ({ range, key }) => key === alignKey && inRange(rangeFromIndex(model.sheet, range), cursor),
35
43
  )?.value
36
44
  : undefined
37
45
  ) as AlignValue | undefined;
38
- }, [cursor, model.sheet]);
46
+ const prev = registry.get(stateAtom);
47
+ registry.set(stateAtom, { ...prev, [alignKey]: alignValue });
48
+ }, [cursor, model.sheet, registry, stateAtom]);
39
49
  };
40
50
 
41
51
  const createAlignGroupAction = (value?: AlignValue) =>
42
52
  createMenuItemGroup('align', {
43
- label: ['align label', { ns: SHEET_PLUGIN }],
53
+ label: ['align.label', { ns: meta.id }],
44
54
  variant: 'toggleGroup',
45
55
  selectCardinality: 'single',
46
56
  value: `${alignKey}--${value}`,
47
57
  } as ToolbarMenuActionGroupProperties);
48
58
 
49
- const createAlignActions = (model: SheetModel, state: ToolbarState, cursorFallbackRange?: CompleteCellRange) =>
59
+ type AlignActionsContext = {
60
+ model: SheetModel;
61
+ state: ToolbarState;
62
+ stateAtom: ToolbarStateAtom;
63
+ registry: Registry.Registry;
64
+ cursorFallbackRange?: CompleteCellRange;
65
+ };
66
+
67
+ const createAlignActions = ({ model, state, stateAtom, registry, cursorFallbackRange }: AlignActionsContext) =>
50
68
  Object.entries(aligns).map(([alignValue, icon]) => {
51
69
  return createMenuAction<AlignAction>(
52
70
  `${alignKey}--${alignValue}`,
@@ -64,36 +82,43 @@ const createAlignActions = (model: SheetModel, state: ToolbarState, cursorFallba
64
82
  key: alignKey,
65
83
  value: alignValue as AlignValue,
66
84
  };
85
+ const currentState = registry.get(stateAtom);
67
86
  if (index < 0) {
68
- model.sheet.ranges?.push(nextRangeEntity);
69
- state[alignKey] = nextRangeEntity.value;
87
+ Obj.update(model.sheet, (obj) => {
88
+ obj.ranges?.push(nextRangeEntity);
89
+ });
90
+ registry.set(stateAtom, { ...currentState, [alignKey]: nextRangeEntity.value });
70
91
  } else if (model.sheet.ranges![index].value === nextRangeEntity.value) {
71
- model.sheet.ranges?.splice(index, 1);
72
- state[alignKey] = undefined;
92
+ Obj.update(model.sheet, (obj) => {
93
+ obj.ranges?.splice(index, 1);
94
+ });
95
+ registry.set(stateAtom, { ...currentState, [alignKey]: undefined });
73
96
  } else {
74
- model.sheet.ranges?.splice(index, 1, nextRangeEntity);
75
- state[alignKey] = nextRangeEntity.value;
97
+ Obj.update(model.sheet, (obj) => {
98
+ obj.ranges?.splice(index, 1, nextRangeEntity);
99
+ });
100
+ registry.set(stateAtom, { ...currentState, [alignKey]: nextRangeEntity.value });
76
101
  }
77
102
  },
78
103
  {
79
104
  key: alignKey,
80
105
  value: alignValue as AlignValue,
81
106
  checked: state[alignKey] === alignValue,
82
- label: [`range value ${alignValue} label`, { ns: SHEET_PLUGIN }],
107
+ label: [`range-value.${alignValue}.label`, { ns: meta.id }],
83
108
  icon,
84
109
  testId: `grid.toolbar.${alignKey}.${alignValue}`,
85
110
  },
86
111
  );
87
112
  });
88
113
 
89
- export const createAlign = (model: SheetModel, state: ToolbarState, cursorFallbackRange?: CompleteCellRange) => {
90
- const alignGroup = createAlignGroupAction(state[alignKey]);
91
- const alignActions = createAlignActions(model, state, cursorFallbackRange);
114
+ export const createAlign = (context: AlignActionsContext): ActionGraphProps => {
115
+ const alignGroup = createAlignGroupAction(context.state[alignKey]);
116
+ const alignActions = createAlignActions(context);
92
117
  return {
93
118
  nodes: [alignGroup, ...alignActions],
94
119
  edges: [
95
- { source: 'root', target: 'align' },
96
- ...alignActions.map(({ id }) => ({ source: alignGroup.id, target: id })),
120
+ { source: 'root', target: 'align', relation: 'child' },
121
+ ...alignActions.map(({ id }) => ({ source: alignGroup.id, target: id, relation: 'child' })),
97
122
  ],
98
123
  };
99
124
  };
@@ -2,15 +2,24 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { useEffect } from 'react';
5
+ import { type Registry, RegistryContext } from '@effect-atom/atom-react';
6
+ import { useContext, useEffect } from 'react';
6
7
 
7
- import { type CompleteCellRange, inRange } from '@dxos/compute';
8
- import { type ToolbarMenuActionGroupProperties, createMenuAction, createMenuItemGroup } from '@dxos/react-ui-menu';
8
+ import { type CompleteCellRange, inRange } from '@dxos/compute-hyperformula';
9
+ import { Obj } from '@dxos/echo';
10
+ import {
11
+ type ActionGraphProps,
12
+ type ToolbarMenuActionGroupProperties,
13
+ createMenuAction,
14
+ createMenuItemGroup,
15
+ } from '@dxos/react-ui-menu';
16
+
17
+ import { meta } from '#meta';
18
+ import { type StyleKey, type StyleValue, rangeFromIndex, rangeToIndex } from '#types';
9
19
 
10
- import { SHEET_PLUGIN } from '../../meta';
11
20
  import { type SheetModel } from '../../model';
12
- import { type StyleKey, type StyleValue, rangeFromIndex, rangeToIndex } from '../../types';
13
- import { useSheetContext } from '../SheetContext';
21
+ import { useSheetContext } from '../SheetRoot';
22
+ import { type ToolbarState, type ToolbarStateAtom } from './useToolbarState';
14
23
 
15
24
  export type StyleState = Partial<Record<StyleValue, boolean>>;
16
25
 
@@ -21,22 +30,30 @@ const styles: Record<StyleValue, string> = {
21
30
  softwrap: 'ph--paragraph--regular',
22
31
  };
23
32
 
24
- export const useStyleState = (state: StyleState) => {
33
+ export const useStyleState = (stateAtom: ToolbarStateAtom) => {
34
+ const registry = useContext(RegistryContext);
25
35
  const { cursorFallbackRange, model } = useSheetContext();
26
36
 
27
37
  useEffect(() => {
28
- state.highlight = false;
29
- state.softwrap = false;
38
+ let highlight = false;
39
+ let softwrap = false;
30
40
  if (cursorFallbackRange && model.sheet.ranges) {
31
41
  model.sheet.ranges
32
42
  .filter(
33
43
  ({ range, key }) => key === 'style' && inRange(rangeFromIndex(model.sheet, range), cursorFallbackRange.from),
34
44
  )
35
45
  .forEach(({ value }) => {
36
- state[value as StyleValue] = true;
46
+ if (value === 'highlight') {
47
+ highlight = true;
48
+ }
49
+ if (value === 'softwrap') {
50
+ softwrap = true;
51
+ }
37
52
  });
38
53
  }
39
- }, [cursorFallbackRange, model.sheet]);
54
+ const prev = registry.get(stateAtom);
55
+ registry.set(stateAtom, { ...prev, highlight, softwrap });
56
+ }, [cursorFallbackRange, model.sheet, registry, stateAtom]);
40
57
  };
41
58
 
42
59
  const createStyleGroup = (state: StyleState) => {
@@ -49,7 +66,15 @@ const createStyleGroup = (state: StyleState) => {
49
66
  } as ToolbarMenuActionGroupProperties);
50
67
  };
51
68
 
52
- const createStyleActions = (model: SheetModel, state: StyleState, cursorFallbackRange?: CompleteCellRange) =>
69
+ type StyleActionsContext = {
70
+ model: SheetModel;
71
+ state: ToolbarState;
72
+ stateAtom: ToolbarStateAtom;
73
+ registry: Registry.Registry;
74
+ cursorFallbackRange?: CompleteCellRange;
75
+ };
76
+
77
+ const createStyleActions = ({ model, state, stateAtom, registry, cursorFallbackRange }: StyleActionsContext) =>
53
78
  Object.entries(styles).map(([styleValue, icon]) => {
54
79
  return createMenuAction<StyleAction>(
55
80
  `style--${styleValue}`,
@@ -67,6 +92,7 @@ const createStyleActions = (model: SheetModel, state: StyleState, cursorFallback
67
92
  key: 'style',
68
93
  value: styleValue as StyleValue,
69
94
  };
95
+ const currentState = registry.get(stateAtom);
70
96
  if (
71
97
  model.sheet.ranges
72
98
  .filter(
@@ -77,32 +103,36 @@ const createStyleActions = (model: SheetModel, state: StyleState, cursorFallback
77
103
  ) {
78
104
  // this value should be unset
79
105
  if (index >= 0) {
80
- model.sheet.ranges?.splice(index, 1);
106
+ Obj.update(model.sheet, (obj) => {
107
+ obj.ranges?.splice(index, 1);
108
+ });
81
109
  }
82
- state[nextRangeEntity.value] = false;
110
+ registry.set(stateAtom, { ...currentState, [nextRangeEntity.value]: false });
83
111
  } else {
84
- model.sheet.ranges?.push(nextRangeEntity);
85
- state[nextRangeEntity.value] = true;
112
+ Obj.update(model.sheet, (obj) => {
113
+ obj.ranges?.push(nextRangeEntity);
114
+ });
115
+ registry.set(stateAtom, { ...currentState, [nextRangeEntity.value]: true });
86
116
  }
87
117
  },
88
118
  {
89
119
  key: 'style',
90
120
  value: styleValue as StyleValue,
91
121
  icon,
92
- label: [`range value ${styleValue} label`, { ns: SHEET_PLUGIN }],
122
+ label: [`range-value.${styleValue}.label`, { ns: meta.id }],
93
123
  checked: !!state[styleValue as StyleValue],
94
124
  },
95
125
  );
96
126
  });
97
127
 
98
- export const createStyle = (model: SheetModel, state: StyleState, cursorFallbackRange?: CompleteCellRange) => {
99
- const styleGroupAction = createStyleGroup(state);
100
- const styleActions = createStyleActions(model, state, cursorFallbackRange);
128
+ export const createStyle = (context: StyleActionsContext): ActionGraphProps => {
129
+ const styleGroupAction = createStyleGroup(context.state);
130
+ const styleActions = createStyleActions(context);
101
131
  return {
102
132
  nodes: [styleGroupAction, ...styleActions],
103
133
  edges: [
104
- { source: 'root', target: 'style' },
105
- ...styleActions.map(({ id }) => ({ source: styleGroupAction.id, target: id })),
134
+ { source: 'root', target: 'style', relation: 'child' },
135
+ ...styleActions.map(({ id }) => ({ source: styleGroupAction.id, target: id, relation: 'child' })),
106
136
  ],
107
137
  };
108
138
  };
@@ -2,15 +2,32 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { useMemo } from 'react';
6
-
7
- import { live } from '@dxos/live-object';
5
+ import { Atom, type Registry, RegistryContext, useAtomValue } from '@effect-atom/atom-react';
6
+ import { useContext, useMemo } from 'react';
8
7
 
9
8
  import { type AlignState } from './align';
10
9
  import { type StyleState } from './style';
11
10
 
12
11
  export type ToolbarState = Partial<StyleState & AlignState>;
12
+ export type ToolbarStateAtom = Atom.Writable<ToolbarState>;
13
+
14
+ /**
15
+ * Creates a reactive toolbar state Atom.
16
+ */
17
+ export const useToolbarState = (initialState: ToolbarState = {}): ToolbarStateAtom => {
18
+ return useMemo(() => Atom.make<ToolbarState>(initialState).pipe(Atom.keepAlive), []);
19
+ };
20
+
21
+ /**
22
+ * Hook to read the current toolbar state value.
23
+ */
24
+ export const useToolbarStateValue = (stateAtom: ToolbarStateAtom): ToolbarState => {
25
+ return useAtomValue(stateAtom);
26
+ };
13
27
 
14
- export const useToolbarState = (initialState: ToolbarState = {}) => {
15
- return useMemo(() => live<ToolbarState>(initialState), []);
28
+ /**
29
+ * Hook to get the registry for updating toolbar state.
30
+ */
31
+ export const useToolbarStateRegistry = (): Registry.Registry => {
32
+ return useContext(RegistryContext);
16
33
  };
@@ -2,11 +2,5 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { lazy } from 'react';
6
-
7
5
  export * from './ComputeGraph';
8
- export * from './GridSheet';
9
- export * from './RangeList';
10
- export * from './SheetContext';
11
-
12
- export const SheetContainer = lazy(() => import('./SheetContainer'));
6
+ export * from './Sheet';
@@ -0,0 +1,65 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+ import React, { useCallback } from 'react';
7
+
8
+ import { rangeToA1Notation } from '@dxos/compute-hyperformula';
9
+ import { useObject } from '@dxos/echo-react';
10
+ import { Input, Message, useTranslation } from '@dxos/react-ui';
11
+ import { List } from '@dxos/react-ui-list';
12
+
13
+ import { meta } from '#meta';
14
+ import { rangeFromIndex } from '#types';
15
+ import { Sheet } from '#types';
16
+
17
+ export type RangeListProps = {
18
+ sheet: Sheet.Sheet;
19
+ };
20
+
21
+ export const RangeList = ({ sheet: sheetProp }: RangeListProps) => {
22
+ const { t } = useTranslation(meta.id);
23
+ const [sheet, updateSheet] = useObject(sheetProp);
24
+ // TODO(thure): Implement similar to comments, #8121
25
+ const handleSelectRange = (range: Sheet.Range) => {};
26
+ const handleDeleteRange = useCallback(
27
+ (range: Sheet.Range) => {
28
+ const index = sheet.ranges.findIndex((sheetRange) => sheetRange === range);
29
+ updateSheet((sheet) => {
30
+ sheet.ranges.splice(index, 1);
31
+ });
32
+ },
33
+ [sheet, updateSheet],
34
+ );
35
+ return (
36
+ <>
37
+ <Input.Root>
38
+ <Input.Label>{t('range-list.heading')}</Input.Label>
39
+ </Input.Root>
40
+ {sheet.ranges.length < 1 ? (
41
+ <Message.Root>
42
+ <Message.Title>{t('no-ranges.message')}</Message.Title>
43
+ </Message.Root>
44
+ ) : (
45
+ <List.Root<Sheet.Range> items={sheet.ranges} isItem={Schema.is(Sheet.Range)}>
46
+ {({ items: ranges }) =>
47
+ ranges.map((range, i) => (
48
+ <List.Item key={i} item={range}>
49
+ <List.ItemDragHandle />
50
+ <List.ItemTitle onClick={() => handleSelectRange(range)}>
51
+ {t('range.title', {
52
+ position: rangeToA1Notation(rangeFromIndex(sheetProp, range.range)),
53
+ key: t(`range-key.${range.key}.label`),
54
+ value: t(`range-value.${range.value}.label`),
55
+ })}
56
+ </List.ItemTitle>
57
+ <List.ItemDeleteButton onClick={() => handleDeleteRange(range)} />
58
+ </List.Item>
59
+ ))
60
+ }
61
+ </List.Root>
62
+ )}
63
+ </>
64
+ );
65
+ };
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ export { RangeList as default } from './RangeList';
@@ -0,0 +1,110 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import { type Meta } from '@storybook/react-vite';
6
+ import * as Effect from 'effect/Effect';
7
+ import React, { useContext } from 'react';
8
+
9
+ import { Capabilities, Capability } from '@dxos/app-framework';
10
+ import { withPluginManager } from '@dxos/app-framework/testing';
11
+ import { Operation, OperationHandlerSet } from '@dxos/compute';
12
+ import { Obj } from '@dxos/echo';
13
+ import { corePlugins } from '@dxos/plugin-testing';
14
+ import { useSpaces } from '@dxos/react-client/echo';
15
+ import { withClientProvider } from '@dxos/react-client/testing';
16
+ import { AttendableContainer } from '@dxos/react-ui-attention';
17
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
18
+
19
+ import { ComputeGraphContext, useComputeGraph } from '#components';
20
+ import { createTestCells, useTestSheet, withComputeGraphDecorator } from '#testing';
21
+ import { translations } from '#translations';
22
+ import { SheetOperation } from '#types';
23
+ import { Sheet } from '#types';
24
+
25
+ import RangeList from '../RangeList';
26
+ import { SheetArticle } from './SheetArticle';
27
+
28
+ const meta = {
29
+ title: 'plugins/plugin-sheet/containers/SheetArticle',
30
+ component: SheetArticle,
31
+ decorators: [
32
+ withTheme(),
33
+ withLayout({ layout: 'fullscreen' }),
34
+ withClientProvider({ types: [Sheet.Sheet], createSpace: true }),
35
+ withComputeGraphDecorator(),
36
+ withPluginManager({
37
+ plugins: [...corePlugins()],
38
+ capabilities: [
39
+ Capability.contributes(
40
+ Capabilities.OperationHandler,
41
+ OperationHandlerSet.make(
42
+ Operation.withHandler(SheetOperation.DropAxis, ({ model, axis, axisIndex }) =>
43
+ Effect.sync(() => {
44
+ model[axis === 'col' ? 'dropColumn' : 'dropRow'](axisIndex);
45
+ return { axis, axisIndex, index: 0, axisMeta: null, values: [] };
46
+ }),
47
+ ),
48
+ ),
49
+ ),
50
+ ],
51
+ }),
52
+ ],
53
+ parameters: {
54
+ layout: 'fullscreen',
55
+ translations,
56
+ },
57
+ } satisfies Meta<typeof SheetArticle>;
58
+
59
+ export default meta;
60
+
61
+ export const Default = () => {
62
+ const [space] = useSpaces();
63
+ const graph = useComputeGraph(space);
64
+ const { registry } = useContext(ComputeGraphContext) ?? {};
65
+ const sheet = useTestSheet(space, graph, { cells: createTestCells() });
66
+ if (!sheet || !space || !registry) {
67
+ return null;
68
+ }
69
+
70
+ return (
71
+ <AttendableContainer id={Obj.getURI(sheet)} classNames='contents'>
72
+ <SheetArticle
73
+ role='article'
74
+ space={space}
75
+ subject={sheet}
76
+ attendableId='test'
77
+ registry={registry}
78
+ ignoreAttention
79
+ />
80
+ </AttendableContainer>
81
+ );
82
+ };
83
+
84
+ export const Spec = () => {
85
+ const [space] = useSpaces();
86
+ const graph = useComputeGraph(space);
87
+ const { registry } = useContext(ComputeGraphContext) ?? {};
88
+ const sheet = useTestSheet(space, graph, { cells: { A1: { value: 'Ready' } } });
89
+ if (!sheet || !space || !registry) {
90
+ return null;
91
+ }
92
+
93
+ return (
94
+ <AttendableContainer id={Obj.getURI(sheet)} classNames='contents'>
95
+ <div className='w-full grid grid-cols-[1fr_20rem]'>
96
+ <SheetArticle
97
+ role='article'
98
+ space={space}
99
+ subject={sheet}
100
+ attendableId='test'
101
+ registry={registry}
102
+ ignoreAttention
103
+ />
104
+ <div data-testid='grid.range-list'>
105
+ <RangeList sheet={sheet} />
106
+ </div>
107
+ </div>
108
+ </AttendableContainer>
109
+ );
110
+ };