@dxos/plugin-sheet 0.6.13-main.ed424a1 → 0.6.13

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 (323) hide show
  1. package/dist/lib/browser/SheetContainer-U4H5D34A.mjs +1772 -0
  2. package/dist/lib/browser/SheetContainer-U4H5D34A.mjs.map +7 -0
  3. package/dist/lib/browser/chunk-APHOLYUB.mjs +175 -0
  4. package/dist/lib/browser/chunk-APHOLYUB.mjs.map +7 -0
  5. package/dist/lib/{node-esm/chunk-5WPZCXNS.mjs → browser/chunk-D5AGLXJP.mjs} +678 -411
  6. package/dist/lib/browser/chunk-D5AGLXJP.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-FUAGSXA4.mjs +82 -0
  8. package/dist/lib/browser/chunk-FUAGSXA4.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-JRL5LGCE.mjs +18 -0
  10. package/dist/lib/browser/chunk-JRL5LGCE.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-NU4PBN33.mjs +8 -0
  12. package/dist/lib/browser/chunk-NU4PBN33.mjs.map +7 -0
  13. package/dist/lib/browser/index.mjs +62 -93
  14. package/dist/lib/browser/index.mjs.map +3 -3
  15. package/dist/lib/browser/meta.json +1 -1
  16. package/dist/lib/browser/meta.mjs +1 -1
  17. package/dist/lib/browser/testing.mjs +92 -0
  18. package/dist/lib/browser/testing.mjs.map +7 -0
  19. package/dist/lib/browser/types.mjs +12 -6
  20. package/dist/lib/node/SheetContainer-AXQV3ZT5.cjs +1765 -0
  21. package/dist/lib/node/SheetContainer-AXQV3ZT5.cjs.map +7 -0
  22. package/dist/lib/node/{chunk-5XPK2V4A.cjs → chunk-5KKJ4NPP.cjs} +678 -418
  23. package/dist/lib/node/chunk-5KKJ4NPP.cjs.map +7 -0
  24. package/dist/lib/node/chunk-BJ6ZD7MN.cjs +51 -0
  25. package/dist/lib/node/chunk-BJ6ZD7MN.cjs.map +7 -0
  26. package/dist/lib/node/chunk-CN3RPESU.cjs +202 -0
  27. package/dist/lib/node/chunk-CN3RPESU.cjs.map +7 -0
  28. package/dist/lib/node/{chunk-NZARD7UP.cjs → chunk-DSYKOI4E.cjs} +51 -40
  29. package/dist/lib/node/chunk-DSYKOI4E.cjs.map +7 -0
  30. package/dist/lib/node/chunk-PYXHNAAK.cjs +40 -0
  31. package/dist/lib/node/chunk-PYXHNAAK.cjs.map +7 -0
  32. package/dist/lib/node/index.cjs +69 -105
  33. package/dist/lib/node/index.cjs.map +3 -3
  34. package/dist/lib/node/meta.cjs +3 -3
  35. package/dist/lib/node/meta.cjs.map +1 -1
  36. package/dist/lib/node/meta.json +1 -1
  37. package/dist/lib/node/testing.cjs +111 -0
  38. package/dist/lib/node/testing.cjs.map +7 -0
  39. package/dist/lib/node/types.cjs +15 -9
  40. package/dist/lib/node/types.cjs.map +2 -2
  41. package/dist/types/src/SheetPlugin.d.ts.map +1 -1
  42. package/dist/types/src/components/CellEditor/CellEditor.d.ts +14 -0
  43. package/dist/types/src/components/CellEditor/CellEditor.d.ts.map +1 -0
  44. package/dist/types/src/components/{GridSheet/SheetCellEditor.stories.d.ts → CellEditor/CellEditor.stories.d.ts} +4 -4
  45. package/dist/types/src/components/CellEditor/CellEditor.stories.d.ts.map +1 -0
  46. package/dist/types/src/{extensions/editor → components/CellEditor}/extension.d.ts +1 -1
  47. package/dist/types/src/components/CellEditor/extension.d.ts.map +1 -0
  48. package/dist/types/src/components/CellEditor/extension.test.d.ts.map +1 -0
  49. package/dist/types/src/components/CellEditor/index.d.ts +3 -0
  50. package/dist/types/src/components/CellEditor/index.d.ts.map +1 -0
  51. package/dist/types/src/{graph/functions → components/ComputeGraph}/async-function.d.ts +5 -14
  52. package/dist/types/src/components/ComputeGraph/async-function.d.ts.map +1 -0
  53. package/dist/types/src/components/ComputeGraph/custom.d.ts +21 -0
  54. package/dist/types/src/components/ComputeGraph/custom.d.ts.map +1 -0
  55. package/dist/types/src/components/ComputeGraph/edge-function.d.ts +20 -0
  56. package/dist/types/src/components/ComputeGraph/edge-function.d.ts.map +1 -0
  57. package/dist/types/src/components/ComputeGraph/graph-context.d.ts +12 -0
  58. package/dist/types/src/components/ComputeGraph/graph-context.d.ts.map +1 -0
  59. package/dist/types/src/components/ComputeGraph/graph.browser.test.d.ts +2 -0
  60. package/dist/types/src/components/ComputeGraph/graph.browser.test.d.ts.map +1 -0
  61. package/dist/types/src/components/ComputeGraph/graph.d.ts +26 -0
  62. package/dist/types/src/components/ComputeGraph/graph.d.ts.map +1 -0
  63. package/dist/types/src/components/ComputeGraph/index.d.ts +3 -1
  64. package/dist/types/src/components/ComputeGraph/index.d.ts.map +1 -1
  65. package/dist/types/src/components/Sheet/Sheet.d.ts +55 -0
  66. package/dist/types/src/components/Sheet/Sheet.d.ts.map +1 -0
  67. package/dist/types/src/components/Sheet/Sheet.stories.d.ts +54 -0
  68. package/dist/types/src/components/Sheet/Sheet.stories.d.ts.map +1 -0
  69. package/dist/types/src/components/Sheet/formatting.d.ts +14 -0
  70. package/dist/types/src/components/Sheet/formatting.d.ts.map +1 -0
  71. package/dist/types/src/components/Sheet/grid.d.ts +52 -0
  72. package/dist/types/src/components/Sheet/grid.d.ts.map +1 -0
  73. package/dist/types/src/components/Sheet/index.d.ts +2 -0
  74. package/dist/types/src/components/Sheet/index.d.ts.map +1 -0
  75. package/dist/types/src/components/Sheet/nav.d.ts +29 -0
  76. package/dist/types/src/components/Sheet/nav.d.ts.map +1 -0
  77. package/dist/types/src/components/Sheet/sheet-context.d.ts +25 -0
  78. package/dist/types/src/components/Sheet/sheet-context.d.ts.map +1 -0
  79. package/dist/types/src/components/Sheet/util.d.ts +18 -0
  80. package/dist/types/src/components/Sheet/util.d.ts.map +1 -0
  81. package/dist/types/src/components/SheetContainer.d.ts +9 -0
  82. package/dist/types/src/components/SheetContainer.d.ts.map +1 -0
  83. package/dist/types/src/components/Toolbar/Toolbar.d.ts +9 -33
  84. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  85. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts +15 -19
  86. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  87. package/dist/types/src/components/Toolbar/common.d.ts +20 -0
  88. package/dist/types/src/components/Toolbar/common.d.ts.map +1 -0
  89. package/dist/types/src/components/index.d.ts +2 -3
  90. package/dist/types/src/components/index.d.ts.map +1 -1
  91. package/dist/types/src/meta.d.ts +9 -3
  92. package/dist/types/src/meta.d.ts.map +1 -1
  93. package/dist/types/src/{graph/functions/function-defs.d.ts → model/functions.d.ts} +1 -1
  94. package/dist/types/src/model/functions.d.ts.map +1 -0
  95. package/dist/types/src/model/index.d.ts +3 -2
  96. package/dist/types/src/model/index.d.ts.map +1 -1
  97. package/dist/types/src/model/model.browser.test.d.ts +2 -0
  98. package/dist/types/src/model/model.browser.test.d.ts.map +1 -0
  99. package/dist/types/src/model/{sheet-model.d.ts → model.d.ts} +67 -13
  100. package/dist/types/src/model/model.d.ts.map +1 -0
  101. package/dist/types/src/{defs → model}/types.d.ts +3 -8
  102. package/dist/types/src/model/types.d.ts.map +1 -0
  103. package/dist/types/src/model/types.test.d.ts.map +1 -0
  104. package/dist/types/src/model/util.d.ts +15 -0
  105. package/dist/types/src/model/util.d.ts.map +1 -0
  106. package/dist/types/src/testing.d.ts +9 -0
  107. package/dist/types/src/testing.d.ts.map +1 -0
  108. package/dist/types/src/translations.d.ts +12 -17
  109. package/dist/types/src/translations.d.ts.map +1 -1
  110. package/dist/types/src/types.d.ts +40 -125
  111. package/dist/types/src/types.d.ts.map +1 -1
  112. package/package.json +52 -58
  113. package/src/SheetPlugin.tsx +74 -52
  114. package/src/components/{GridSheet/SheetCellEditor.stories.tsx → CellEditor/CellEditor.stories.tsx} +8 -8
  115. package/src/components/CellEditor/CellEditor.tsx +113 -0
  116. package/src/{extensions/editor → components/CellEditor}/extension.test.ts +6 -4
  117. package/src/{extensions/editor → components/CellEditor}/extension.ts +6 -5
  118. package/src/{extensions/editor → components/CellEditor}/index.ts +1 -0
  119. package/src/{graph/functions → components/ComputeGraph}/async-function.ts +15 -25
  120. package/src/{graph/testing/test-plugin.ts → components/ComputeGraph/custom.ts} +14 -44
  121. package/src/{graph/functions → components/ComputeGraph}/edge-function.ts +14 -16
  122. package/src/components/ComputeGraph/graph-context.tsx +50 -0
  123. package/src/components/ComputeGraph/graph.browser.test.ts +50 -0
  124. package/src/components/ComputeGraph/graph.ts +62 -0
  125. package/src/components/ComputeGraph/index.ts +3 -1
  126. package/src/components/Sheet/Sheet.stories.tsx +287 -0
  127. package/src/components/Sheet/Sheet.tsx +1160 -0
  128. package/src/components/Sheet/formatting.ts +106 -0
  129. package/src/components/Sheet/grid.ts +191 -0
  130. package/src/{testing → components/Sheet}/index.ts +1 -1
  131. package/src/components/Sheet/nav.ts +157 -0
  132. package/src/components/Sheet/sheet-context.tsx +150 -0
  133. package/src/components/Sheet/util.ts +56 -0
  134. package/src/components/SheetContainer.tsx +34 -0
  135. package/src/components/Toolbar/Toolbar.tsx +112 -242
  136. package/src/components/Toolbar/common.tsx +72 -0
  137. package/src/components/index.ts +0 -2
  138. package/src/meta.tsx +18 -0
  139. package/src/model/index.ts +3 -2
  140. package/src/model/model.browser.test.ts +100 -0
  141. package/src/model/model.ts +550 -0
  142. package/src/{defs → model}/types.test.ts +9 -8
  143. package/src/{defs → model}/types.ts +14 -24
  144. package/src/model/util.ts +36 -0
  145. package/src/testing.ts +50 -0
  146. package/src/translations.ts +1 -6
  147. package/src/types.ts +47 -40
  148. package/dist/lib/browser/SheetContainer-RVRACGCZ.mjs +0 -290
  149. package/dist/lib/browser/SheetContainer-RVRACGCZ.mjs.map +0 -7
  150. package/dist/lib/browser/chunk-BWN5DZWZ.mjs +0 -74
  151. package/dist/lib/browser/chunk-BWN5DZWZ.mjs.map +0 -7
  152. package/dist/lib/browser/chunk-D3QTX46O.mjs +0 -14
  153. package/dist/lib/browser/chunk-D3QTX46O.mjs.map +0 -7
  154. package/dist/lib/browser/chunk-GSV5QNLD.mjs +0 -2966
  155. package/dist/lib/browser/chunk-GSV5QNLD.mjs.map +0 -7
  156. package/dist/lib/browser/chunk-HOG37RYS.mjs +0 -1528
  157. package/dist/lib/browser/chunk-HOG37RYS.mjs.map +0 -7
  158. package/dist/lib/browser/graph-M4IQ76QX.mjs +0 -33
  159. package/dist/lib/browser/graph-M4IQ76QX.mjs.map +0 -7
  160. package/dist/lib/node/SheetContainer-J7XROAMN.cjs +0 -300
  161. package/dist/lib/node/SheetContainer-J7XROAMN.cjs.map +0 -7
  162. package/dist/lib/node/chunk-5XPK2V4A.cjs.map +0 -7
  163. package/dist/lib/node/chunk-AXQZA2YS.cjs +0 -1527
  164. package/dist/lib/node/chunk-AXQZA2YS.cjs.map +0 -7
  165. package/dist/lib/node/chunk-NZARD7UP.cjs.map +0 -7
  166. package/dist/lib/node/chunk-QIFIGEKV.cjs +0 -37
  167. package/dist/lib/node/chunk-QIFIGEKV.cjs.map +0 -7
  168. package/dist/lib/node/graph-Q3N2X26H.cjs +0 -55
  169. package/dist/lib/node/graph-Q3N2X26H.cjs.map +0 -7
  170. package/dist/lib/node-esm/SheetContainer-YWQVKHQB.mjs +0 -291
  171. package/dist/lib/node-esm/SheetContainer-YWQVKHQB.mjs.map +0 -7
  172. package/dist/lib/node-esm/chunk-5WPZCXNS.mjs.map +0 -7
  173. package/dist/lib/node-esm/chunk-BPXXIAOQ.mjs +0 -1529
  174. package/dist/lib/node-esm/chunk-BPXXIAOQ.mjs.map +0 -7
  175. package/dist/lib/node-esm/chunk-VCYJWE3O.mjs +0 -16
  176. package/dist/lib/node-esm/chunk-VCYJWE3O.mjs.map +0 -7
  177. package/dist/lib/node-esm/chunk-WFDTY3IC.mjs +0 -75
  178. package/dist/lib/node-esm/chunk-WFDTY3IC.mjs.map +0 -7
  179. package/dist/lib/node-esm/graph-SMPUMOV2.mjs +0 -34
  180. package/dist/lib/node-esm/graph-SMPUMOV2.mjs.map +0 -7
  181. package/dist/lib/node-esm/index.mjs +0 -280
  182. package/dist/lib/node-esm/index.mjs.map +0 -7
  183. package/dist/lib/node-esm/meta.json +0 -1
  184. package/dist/lib/node-esm/meta.mjs +0 -10
  185. package/dist/lib/node-esm/meta.mjs.map +0 -7
  186. package/dist/lib/node-esm/types.mjs +0 -17
  187. package/dist/lib/node-esm/types.mjs.map +0 -7
  188. package/dist/types/src/components/ComputeGraph/ComputeGraphContextProvider.d.ts +0 -11
  189. package/dist/types/src/components/ComputeGraph/ComputeGraphContextProvider.d.ts.map +0 -1
  190. package/dist/types/src/components/FunctionEditor/FunctionEditor.d.ts +0 -3
  191. package/dist/types/src/components/FunctionEditor/FunctionEditor.d.ts.map +0 -1
  192. package/dist/types/src/components/FunctionEditor/index.d.ts +0 -2
  193. package/dist/types/src/components/FunctionEditor/index.d.ts.map +0 -1
  194. package/dist/types/src/components/GridSheet/GridSheet.d.ts +0 -3
  195. package/dist/types/src/components/GridSheet/GridSheet.d.ts.map +0 -1
  196. package/dist/types/src/components/GridSheet/GridSheet.stories.d.ts +0 -9
  197. package/dist/types/src/components/GridSheet/GridSheet.stories.d.ts.map +0 -1
  198. package/dist/types/src/components/GridSheet/SheetCellEditor.stories.d.ts.map +0 -1
  199. package/dist/types/src/components/GridSheet/index.d.ts +0 -2
  200. package/dist/types/src/components/GridSheet/index.d.ts.map +0 -1
  201. package/dist/types/src/components/GridSheet/util.d.ts +0 -16
  202. package/dist/types/src/components/GridSheet/util.d.ts.map +0 -1
  203. package/dist/types/src/components/SheetContainer/SheetContainer.d.ts +0 -6
  204. package/dist/types/src/components/SheetContainer/SheetContainer.d.ts.map +0 -1
  205. package/dist/types/src/components/SheetContainer/SheetContainer.stories.d.ts +0 -11
  206. package/dist/types/src/components/SheetContainer/SheetContainer.stories.d.ts.map +0 -1
  207. package/dist/types/src/components/SheetContainer/index.d.ts +0 -3
  208. package/dist/types/src/components/SheetContainer/index.d.ts.map +0 -1
  209. package/dist/types/src/components/SheetContext/SheetContext.d.ts +0 -26
  210. package/dist/types/src/components/SheetContext/SheetContext.d.ts.map +0 -1
  211. package/dist/types/src/components/SheetContext/index.d.ts +0 -2
  212. package/dist/types/src/components/SheetContext/index.d.ts.map +0 -1
  213. package/dist/types/src/defs/index.d.ts +0 -4
  214. package/dist/types/src/defs/index.d.ts.map +0 -1
  215. package/dist/types/src/defs/sheet-range-types.d.ts +0 -13
  216. package/dist/types/src/defs/sheet-range-types.d.ts.map +0 -1
  217. package/dist/types/src/defs/types.d.ts.map +0 -1
  218. package/dist/types/src/defs/types.test.d.ts.map +0 -1
  219. package/dist/types/src/defs/util.d.ts +0 -43
  220. package/dist/types/src/defs/util.d.ts.map +0 -1
  221. package/dist/types/src/extensions/compute.d.ts +0 -6
  222. package/dist/types/src/extensions/compute.d.ts.map +0 -1
  223. package/dist/types/src/extensions/compute.stories.d.ts +0 -26
  224. package/dist/types/src/extensions/compute.stories.d.ts.map +0 -1
  225. package/dist/types/src/extensions/editor/extension.d.ts.map +0 -1
  226. package/dist/types/src/extensions/editor/extension.test.d.ts.map +0 -1
  227. package/dist/types/src/extensions/editor/index.d.ts +0 -2
  228. package/dist/types/src/extensions/editor/index.d.ts.map +0 -1
  229. package/dist/types/src/extensions/index.d.ts +0 -3
  230. package/dist/types/src/extensions/index.d.ts.map +0 -1
  231. package/dist/types/src/graph/compute-graph-registry.d.ts +0 -34
  232. package/dist/types/src/graph/compute-graph-registry.d.ts.map +0 -1
  233. package/dist/types/src/graph/compute-graph.d.ts +0 -64
  234. package/dist/types/src/graph/compute-graph.d.ts.map +0 -1
  235. package/dist/types/src/graph/compute-graph.stories.d.ts +0 -10
  236. package/dist/types/src/graph/compute-graph.stories.d.ts.map +0 -1
  237. package/dist/types/src/graph/compute-graph.test.d.ts +0 -2
  238. package/dist/types/src/graph/compute-graph.test.d.ts.map +0 -1
  239. package/dist/types/src/graph/compute-node.d.ts +0 -26
  240. package/dist/types/src/graph/compute-node.d.ts.map +0 -1
  241. package/dist/types/src/graph/functions/async-function.d.ts.map +0 -1
  242. package/dist/types/src/graph/functions/edge-function.d.ts +0 -21
  243. package/dist/types/src/graph/functions/edge-function.d.ts.map +0 -1
  244. package/dist/types/src/graph/functions/function-defs.d.ts.map +0 -1
  245. package/dist/types/src/graph/functions/index.d.ts +0 -4
  246. package/dist/types/src/graph/functions/index.d.ts.map +0 -1
  247. package/dist/types/src/graph/hyperformula.test.d.ts +0 -2
  248. package/dist/types/src/graph/hyperformula.test.d.ts.map +0 -1
  249. package/dist/types/src/graph/index.d.ts +0 -5
  250. package/dist/types/src/graph/index.d.ts.map +0 -1
  251. package/dist/types/src/graph/testing/index.d.ts +0 -3
  252. package/dist/types/src/graph/testing/index.d.ts.map +0 -1
  253. package/dist/types/src/graph/testing/test-builder.d.ts +0 -15
  254. package/dist/types/src/graph/testing/test-builder.d.ts.map +0 -1
  255. package/dist/types/src/graph/testing/test-plugin.d.ts +0 -36
  256. package/dist/types/src/graph/testing/test-plugin.d.ts.map +0 -1
  257. package/dist/types/src/graph/util.d.ts +0 -2
  258. package/dist/types/src/graph/util.d.ts.map +0 -1
  259. package/dist/types/src/hooks/hooks.stories.d.ts +0 -11
  260. package/dist/types/src/hooks/hooks.stories.d.ts.map +0 -1
  261. package/dist/types/src/hooks/index.d.ts +0 -4
  262. package/dist/types/src/hooks/index.d.ts.map +0 -1
  263. package/dist/types/src/hooks/threads.d.ts +0 -8
  264. package/dist/types/src/hooks/threads.d.ts.map +0 -1
  265. package/dist/types/src/hooks/useComputeGraph.d.ts +0 -7
  266. package/dist/types/src/hooks/useComputeGraph.d.ts.map +0 -1
  267. package/dist/types/src/hooks/useSheetModel.d.ts +0 -8
  268. package/dist/types/src/hooks/useSheetModel.d.ts.map +0 -1
  269. package/dist/types/src/model/decorations.d.ts +0 -25
  270. package/dist/types/src/model/decorations.d.ts.map +0 -1
  271. package/dist/types/src/model/sheet-model.d.ts.map +0 -1
  272. package/dist/types/src/model/sheet-model.test.d.ts +0 -2
  273. package/dist/types/src/model/sheet-model.test.d.ts.map +0 -1
  274. package/dist/types/src/sanity.test.d.ts +0 -2
  275. package/dist/types/src/sanity.test.d.ts.map +0 -1
  276. package/dist/types/src/testing/index.d.ts +0 -2
  277. package/dist/types/src/testing/index.d.ts.map +0 -1
  278. package/dist/types/src/testing/testing.d.ts +0 -8
  279. package/dist/types/src/testing/testing.d.ts.map +0 -1
  280. package/dist/vendor/hyperformula.mjs +0 -37145
  281. package/src/components/ComputeGraph/ComputeGraphContextProvider.tsx +0 -20
  282. package/src/components/FunctionEditor/FunctionEditor.tsx +0 -45
  283. package/src/components/FunctionEditor/index.ts +0 -5
  284. package/src/components/GridSheet/GridSheet.stories.tsx +0 -41
  285. package/src/components/GridSheet/GridSheet.tsx +0 -163
  286. package/src/components/GridSheet/index.ts +0 -5
  287. package/src/components/GridSheet/util.ts +0 -158
  288. package/src/components/SheetContainer/SheetContainer.stories.tsx +0 -40
  289. package/src/components/SheetContainer/SheetContainer.tsx +0 -27
  290. package/src/components/SheetContainer/index.ts +0 -7
  291. package/src/components/SheetContext/SheetContext.tsx +0 -104
  292. package/src/components/SheetContext/index.ts +0 -5
  293. package/src/defs/index.ts +0 -7
  294. package/src/defs/sheet-range-types.ts +0 -46
  295. package/src/defs/util.ts +0 -151
  296. package/src/extensions/compute.stories.tsx +0 -151
  297. package/src/extensions/compute.ts +0 -147
  298. package/src/extensions/index.ts +0 -6
  299. package/src/graph/compute-graph-registry.ts +0 -90
  300. package/src/graph/compute-graph.stories.tsx +0 -93
  301. package/src/graph/compute-graph.test.ts +0 -87
  302. package/src/graph/compute-graph.ts +0 -242
  303. package/src/graph/compute-node.ts +0 -63
  304. package/src/graph/functions/index.ts +0 -7
  305. package/src/graph/hyperformula.test.ts +0 -14
  306. package/src/graph/index.ts +0 -8
  307. package/src/graph/testing/index.ts +0 -6
  308. package/src/graph/testing/test-builder.ts +0 -54
  309. package/src/graph/util.ts +0 -8
  310. package/src/hooks/hooks.stories.tsx +0 -50
  311. package/src/hooks/index.ts +0 -7
  312. package/src/hooks/threads.ts +0 -147
  313. package/src/hooks/useComputeGraph.ts +0 -28
  314. package/src/hooks/useSheetModel.ts +0 -40
  315. package/src/meta.ts +0 -14
  316. package/src/model/decorations.ts +0 -64
  317. package/src/model/sheet-model.test.ts +0 -57
  318. package/src/model/sheet-model.ts +0 -418
  319. package/src/sanity.test.ts +0 -40
  320. package/src/testing/testing.tsx +0 -68
  321. /package/dist/types/src/{extensions/editor → components/CellEditor}/extension.test.d.ts +0 -0
  322. /package/dist/types/src/{defs → model}/types.test.d.ts +0 -0
  323. /package/src/{graph/functions/function-defs.ts → model/functions.ts} +0 -0
@@ -0,0 +1,106 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import { type ClassNameValue } from '@dxos/react-ui-types';
6
+
7
+ import { type SheetModel, type CellAddress, inRange } from '../../model';
8
+ import { ValueTypeEnum } from '../../types';
9
+
10
+ export class FormattingModel {
11
+ constructor(private readonly model: SheetModel) {}
12
+
13
+ /**
14
+ * Get formatted string value and className for cell.
15
+ */
16
+ getFormatting(cell: CellAddress): { value?: string; classNames?: ClassNameValue } {
17
+ const value = this.model.getValue(cell);
18
+ if (value === undefined || value === null) {
19
+ return {};
20
+ }
21
+
22
+ // TODO(burdon): Locale.
23
+ const locales = undefined;
24
+
25
+ // Cell-specific formatting.
26
+ const idx = this.model.addressToIndex(cell);
27
+ let formatting = this.model.sheet.formatting?.[idx] ?? {};
28
+ const classNames = [...(formatting?.classNames ?? [])];
29
+
30
+ // Range formatting.
31
+ // TODO(burdon): NOTE: D0 means the D column.
32
+ // TODO(burdon): Cache model formatting (e.g., for ranges). Create class out of this function.
33
+ for (const [idx, _formatting] of Object.entries(this.model.sheet.formatting)) {
34
+ const range = this.model.rangeFromIndex(idx);
35
+ if (inRange(range, cell)) {
36
+ if (_formatting.classNames) {
37
+ classNames.push(..._formatting.classNames);
38
+ }
39
+
40
+ // TODO(burdon): Last wins.
41
+ if (_formatting.type) {
42
+ formatting = _formatting;
43
+ }
44
+ }
45
+ }
46
+
47
+ const defaultNumber = 'justify-end font-mono';
48
+
49
+ const type = formatting?.type ?? this.model.getValueType(cell);
50
+ switch (type) {
51
+ case ValueTypeEnum.Boolean: {
52
+ return {
53
+ value: (value as boolean).toLocaleString().toUpperCase(),
54
+ classNames: [...classNames, value ? '!text-greenText' : '!text-orangeText'],
55
+ };
56
+ }
57
+
58
+ //
59
+ // Numbers.
60
+ //
61
+
62
+ case ValueTypeEnum.Number: {
63
+ return { value: value.toLocaleString(locales), classNames: [...classNames, defaultNumber] };
64
+ }
65
+
66
+ case ValueTypeEnum.Percent: {
67
+ return { value: (value as number) * 100 + '%', classNames: [...classNames, defaultNumber] };
68
+ }
69
+
70
+ case ValueTypeEnum.Currency: {
71
+ return {
72
+ value: (value as number).toLocaleString(locales, {
73
+ style: 'currency',
74
+ currency: 'USD',
75
+ minimumFractionDigits: 2,
76
+ maximumFractionDigits: 2,
77
+ }),
78
+ classNames: [...classNames, defaultNumber],
79
+ };
80
+ }
81
+
82
+ //
83
+ // Dates.
84
+ //
85
+
86
+ case ValueTypeEnum.DateTime: {
87
+ const date = this.model.toLocalDate(value as number);
88
+ return { value: date.toLocaleString(locales), classNames };
89
+ }
90
+
91
+ case ValueTypeEnum.Date: {
92
+ const date = this.model.toLocalDate(value as number);
93
+ return { value: date.toLocaleDateString(locales), classNames };
94
+ }
95
+
96
+ case ValueTypeEnum.Time: {
97
+ const date = this.model.toLocalDate(value as number);
98
+ return { value: date.toLocaleTimeString(locales), classNames };
99
+ }
100
+
101
+ default: {
102
+ return { value: String(value), classNames };
103
+ }
104
+ }
105
+ }
106
+ }
@@ -0,0 +1,191 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import { type MouseEvent, useEffect, useState } from 'react';
6
+
7
+ import { type CellAddress, type CellIndex, addressFromA1Notation, addressToA1Notation } from '../../model';
8
+
9
+ // export type Bounds = Pick<DOMRect, 'left' | 'top' | 'width' | 'height'>;
10
+ // export type Dimension = Pick<DOMRect, 'width' | 'height'>;
11
+
12
+ export type SizeMap = Record<string, number>;
13
+
14
+ export type RowPosition = { row: number } & Pick<DOMRect, 'top' | 'height'>;
15
+ export type ColumnPosition = { column: number } & Pick<DOMRect, 'left' | 'width'>;
16
+
17
+ export const axisWidth = 'calc(var(--rail-size)-2px)';
18
+ export const axisHeight = 34;
19
+
20
+ export const minWidth = 40;
21
+ export const maxWidth = 800;
22
+
23
+ export const minHeight = axisHeight;
24
+ export const maxHeight = 400;
25
+
26
+ export const defaultWidth = 200;
27
+ export const defaultHeight = minHeight;
28
+
29
+ /**
30
+ * Cell nodes are identified by their A1 notation.
31
+ */
32
+ export const CELL_DATA_KEY = 'cell';
33
+
34
+ export type GridLayoutProps = {
35
+ rows: CellIndex[];
36
+ columns: CellIndex[];
37
+ rowSizes?: SizeMap;
38
+ columnSizes?: SizeMap;
39
+ };
40
+
41
+ export type GridLayout = {
42
+ width: number;
43
+ height: number;
44
+ rowRange: RowPosition[];
45
+ columnRange: ColumnPosition[];
46
+ };
47
+
48
+ /**
49
+ * Calculates the grid geometry for the current viewport.
50
+ */
51
+ export const useGridLayout = ({
52
+ scroller,
53
+ size,
54
+ rows,
55
+ columns,
56
+ rowSizes,
57
+ columnSizes,
58
+ }: GridLayoutProps & {
59
+ scroller: HTMLDivElement | null;
60
+ size: { width: number; height: number };
61
+ }): GridLayout => {
62
+ const [rowPositions, setRowPositions] = useState<RowPosition[]>([]);
63
+ useEffect(() => {
64
+ if (!rowSizes) {
65
+ return;
66
+ }
67
+
68
+ let y = 0;
69
+ setRowPositions(
70
+ rows.map((idx, i) => {
71
+ const height = rowSizes?.[idx] ?? defaultHeight;
72
+ const top = y;
73
+ y += height - 1;
74
+ return { row: i, top, height };
75
+ }),
76
+ );
77
+ }, [rows, rowSizes]);
78
+
79
+ const [columnPositions, setColumnPositions] = useState<ColumnPosition[]>([]);
80
+ useEffect(() => {
81
+ if (!columns) {
82
+ return;
83
+ }
84
+
85
+ let x = 0;
86
+ setColumnPositions(
87
+ columns.map((idx, i) => {
88
+ const width = columnSizes?.[idx] ?? defaultWidth;
89
+ const left = x;
90
+ x += width - 1;
91
+ return { column: i, left, width };
92
+ }),
93
+ );
94
+ }, [columns, columnSizes]);
95
+
96
+ const height = rowPositions.length
97
+ ? rowPositions[rowPositions.length - 1].top + rowPositions[rowPositions.length - 1].height
98
+ : 0;
99
+
100
+ const width = columnPositions.length
101
+ ? columnPositions[columnPositions.length - 1].left + columnPositions[columnPositions.length - 1].width
102
+ : 0;
103
+
104
+ //
105
+ // Virtual window.
106
+ // TODO(burdon): Preserve edit state, selection.
107
+ // TODO(burdon): BUG: Doesn't scroll to cursor if jump to end.
108
+ //
109
+
110
+ const [{ rowRange, columnRange }, setWindow] = useState<{
111
+ rowRange: RowPosition[];
112
+ columnRange: ColumnPosition[];
113
+ }>({ rowRange: [], columnRange: [] });
114
+ useEffect(() => {
115
+ const handleScroll = () => {
116
+ if (!scroller) {
117
+ return;
118
+ }
119
+
120
+ const { scrollLeft: left, scrollTop: top, clientWidth: width, clientHeight: height } = scroller;
121
+
122
+ let rowStart = 0;
123
+ let rowEnd = 0;
124
+ for (let i = 0; i < rowPositions.length; i++) {
125
+ const row = rowPositions[i];
126
+ if (row.top <= top) {
127
+ rowStart = i;
128
+ }
129
+ if (row.top + row.height >= top + height) {
130
+ rowEnd = i;
131
+ break;
132
+ }
133
+ }
134
+
135
+ let columnStart = 0;
136
+ let columnEnd = 0;
137
+ for (let i = 0; i < columnPositions.length; i++) {
138
+ const column = columnPositions[i];
139
+ if (column.left <= left) {
140
+ columnStart = i;
141
+ }
142
+ if (column.left + column.width >= left + width) {
143
+ columnEnd = i;
144
+ break;
145
+ }
146
+ }
147
+
148
+ const overscan = 5;
149
+ setWindow({
150
+ rowRange: rowPositions.slice(
151
+ Math.max(0, rowStart - overscan),
152
+ Math.min(rowPositions.length, rowEnd + overscan),
153
+ ),
154
+ columnRange: columnPositions.slice(
155
+ Math.max(0, columnStart - overscan),
156
+ Math.min(columnPositions.length, columnEnd + overscan),
157
+ ),
158
+ });
159
+ };
160
+
161
+ scroller?.addEventListener('scroll', handleScroll);
162
+ handleScroll();
163
+ return () => {
164
+ scroller?.removeEventListener('scroll', handleScroll);
165
+ };
166
+ }, [size.width, size.height, rowPositions, columnPositions]);
167
+
168
+ return { width, height, rowRange, columnRange };
169
+ };
170
+
171
+ /**
172
+ * Find child node at mouse pointer.
173
+ */
174
+ export const getCellAtPointer = (event: MouseEvent): CellAddress | undefined => {
175
+ const element = document.elementFromPoint(event.clientX, event.clientY);
176
+ const root = element?.closest<HTMLDivElement>(`[data-${CELL_DATA_KEY}]`);
177
+ if (root) {
178
+ const value = root.dataset[CELL_DATA_KEY];
179
+ if (value) {
180
+ return addressFromA1Notation(value);
181
+ }
182
+ }
183
+ };
184
+
185
+ /**
186
+ * Get element.
187
+ */
188
+ export const getCellElement = (root: HTMLElement, cell: CellAddress): HTMLElement | null => {
189
+ const pos = addressToA1Notation(cell);
190
+ return root.querySelector(`[data-${CELL_DATA_KEY}="${pos}"]`);
191
+ };
@@ -2,4 +2,4 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- export * from './testing';
5
+ export * from './Sheet';
@@ -0,0 +1,157 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import { type KeyboardEvent, type MouseEventHandler, useState } from 'react';
6
+
7
+ import { getCellAtPointer } from './grid';
8
+ import { type CellAddress, type CellRange, posEquals } from '../../model';
9
+
10
+ export type GridSize = {
11
+ numRows: number;
12
+ numColumns: number;
13
+ };
14
+
15
+ /**
16
+ * Calculate next range based on arrow keys.
17
+ */
18
+ export const handleNav = (
19
+ ev: KeyboardEvent<HTMLInputElement>,
20
+ cursor: CellAddress | undefined,
21
+ range: CellRange | undefined,
22
+ size: GridSize,
23
+ ): { cursor?: CellAddress; range?: CellRange } => {
24
+ if (cursor && ev.shiftKey) {
25
+ // Navigate from the furthest point.
26
+ const opposite = range?.to ?? { ...cursor };
27
+ switch (ev.key) {
28
+ case 'ArrowUp': {
29
+ if (opposite.row > 0) {
30
+ opposite.row -= 1;
31
+ }
32
+ break;
33
+ }
34
+ case 'ArrowDown': {
35
+ if (opposite.row < size.numRows - 1) {
36
+ opposite.row += 1;
37
+ }
38
+ break;
39
+ }
40
+ case 'ArrowLeft': {
41
+ if (opposite.column > 0) {
42
+ opposite.column -= 1;
43
+ }
44
+ break;
45
+ }
46
+ case 'ArrowRight': {
47
+ if (opposite.column < size.numColumns - 1) {
48
+ opposite.column += 1;
49
+ }
50
+ break;
51
+ }
52
+ }
53
+
54
+ return { cursor, range: { from: cursor, to: opposite } };
55
+ }
56
+
57
+ const next = handleArrowNav(ev, cursor, size);
58
+ return { cursor: next };
59
+ };
60
+
61
+ /**
62
+ * Calculate next cell based on arrow keys.
63
+ */
64
+ export const handleArrowNav = (
65
+ ev: Pick<KeyboardEvent<HTMLInputElement>, 'key' | 'metaKey'>,
66
+ cursor: CellAddress | undefined,
67
+ { numRows, numColumns }: GridSize,
68
+ ): CellAddress | undefined => {
69
+ switch (ev.key) {
70
+ case 'ArrowUp':
71
+ if (cursor === undefined) {
72
+ return { row: 0, column: 0 };
73
+ } else if (cursor.row > 0) {
74
+ return { row: ev.metaKey ? 0 : cursor.row - 1, column: cursor.column };
75
+ }
76
+ break;
77
+ case 'ArrowDown':
78
+ if (cursor === undefined) {
79
+ return { row: 0, column: 0 };
80
+ } else if (cursor.row < numRows - 1) {
81
+ return { row: ev.metaKey ? numRows - 1 : cursor.row + 1, column: cursor.column };
82
+ }
83
+ break;
84
+ case 'ArrowLeft':
85
+ if (cursor === undefined) {
86
+ return { row: 0, column: 0 };
87
+ } else if (cursor.column > 0) {
88
+ return { row: cursor.row, column: ev.metaKey ? 0 : cursor.column - 1 };
89
+ }
90
+ break;
91
+ case 'ArrowRight':
92
+ if (cursor === undefined) {
93
+ return { row: 0, column: 0 };
94
+ } else if (cursor.column < numColumns - 1) {
95
+ return { row: cursor.row, column: ev.metaKey ? numColumns - 1 : cursor.column + 1 };
96
+ }
97
+ break;
98
+ case 'Home':
99
+ return { row: 0, column: 0 };
100
+ case 'End':
101
+ return { row: numRows - 1, column: numColumns - 1 };
102
+ }
103
+ };
104
+
105
+ /**
106
+ * Hook to manage range drag handlers.
107
+ */
108
+ // TODO(burdon): Memoize callbacks?
109
+ export const useRangeSelect = (
110
+ cb: (event: 'start' | 'move' | 'end', range: CellRange | undefined) => void,
111
+ ): {
112
+ range: CellRange | undefined;
113
+ handlers: {
114
+ onMouseDown: MouseEventHandler<HTMLDivElement>;
115
+ onMouseMove: MouseEventHandler<HTMLDivElement>;
116
+ onMouseUp: MouseEventHandler<HTMLDivElement>;
117
+ };
118
+ } => {
119
+ const [from, setFrom] = useState<CellAddress | undefined>();
120
+ const [to, setTo] = useState<CellAddress | undefined>();
121
+
122
+ const onMouseDown: MouseEventHandler<HTMLDivElement> = (ev) => {
123
+ const current = getCellAtPointer(ev);
124
+ setFrom(current);
125
+ if (current) {
126
+ setTimeout(() => cb('start', { from: current }));
127
+ }
128
+ };
129
+
130
+ const onMouseMove: MouseEventHandler<HTMLDivElement> = (ev) => {
131
+ if (from) {
132
+ let current = getCellAtPointer(ev);
133
+ if (posEquals(current, from)) {
134
+ current = undefined;
135
+ }
136
+ setTo(current);
137
+ setTimeout(() => cb('move', { from, to: current }));
138
+ }
139
+ };
140
+
141
+ const onMouseUp: MouseEventHandler<HTMLDivElement> = (ev) => {
142
+ if (from) {
143
+ let current = getCellAtPointer(ev);
144
+ if (posEquals(current, from)) {
145
+ current = undefined;
146
+ }
147
+ setFrom(undefined);
148
+ setTo(undefined);
149
+ setTimeout(() => cb('end', current ? { from, to: current } : undefined));
150
+ }
151
+ };
152
+
153
+ return {
154
+ range: from ? { from, to } : undefined,
155
+ handlers: { onMouseDown, onMouseMove, onMouseUp },
156
+ };
157
+ };
@@ -0,0 +1,150 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import React, { type PropsWithChildren, createContext, useContext, useState, useEffect } from 'react';
6
+
7
+ import { invariant } from '@dxos/invariant';
8
+ import { type FunctionType } from '@dxos/plugin-script';
9
+ import { fullyQualifiedId, type Space } from '@dxos/react-client/echo';
10
+
11
+ import { FormattingModel } from './formatting';
12
+ import { type CellAddress, type CellRange, defaultFunctions, SheetModel } from '../../model';
13
+ import { type SheetType } from '../../types';
14
+ import { type FunctionContextOptions } from '../ComputeGraph';
15
+ // TODO(wittjosiah): Refactor. This is not exported from ./components due to depending on ECHO.
16
+ import { useComputeGraph } from '../ComputeGraph/graph-context';
17
+
18
+ // TODO(wittjosiah): Factor out.
19
+ const OBJECT_ID_LENGTH = 60; // 33 (space id) + 26 (object id) + 1 (separator).
20
+
21
+ export type SheetContextType = {
22
+ model: SheetModel;
23
+ formatting: FormattingModel;
24
+
25
+ // Cursor state.
26
+ // TODO(burdon): Cursor and range should use indices.
27
+ cursor?: CellAddress;
28
+ setCursor: (cell: CellAddress | undefined) => void;
29
+ range?: CellRange;
30
+ setRange: (range: CellRange | undefined) => void;
31
+
32
+ // Editing state (undefined if not editing).
33
+ editing: boolean;
34
+ setEditing: (editing: boolean) => void;
35
+
36
+ // Events.
37
+ // TODO(burdon): Generalize.
38
+ onInfo?: () => void;
39
+ };
40
+
41
+ const SheetContext = createContext<SheetContextType | null>(null);
42
+
43
+ export const useSheetContext = (): SheetContextType => {
44
+ const context = useContext(SheetContext);
45
+ invariant(context);
46
+ return context;
47
+ };
48
+
49
+ export type SheetContextProps = {
50
+ sheet: SheetType;
51
+ space: Space;
52
+ readonly?: boolean;
53
+ } & Pick<SheetContextType, 'onInfo'> &
54
+ Partial<FunctionContextOptions>;
55
+
56
+ /**
57
+ * Map from binding to fully qualified ECHO ID.
58
+ */
59
+ const mapFormulaBindingToId =
60
+ (functions: FunctionType[]) =>
61
+ (formula: string): string => {
62
+ return formula.replace(/([a-zA-Z0-9]+)\((.*)\)/g, (match, binding, args) => {
63
+ if (defaultFunctions.find((fn) => fn.name === binding) || binding === 'EDGE') {
64
+ return match;
65
+ }
66
+
67
+ const fn = functions.find((fn) => fn.binding === binding);
68
+ if (fn) {
69
+ return `${fullyQualifiedId(fn)}(${args})`;
70
+ } else {
71
+ return match;
72
+ }
73
+ });
74
+ };
75
+
76
+ /**
77
+ * Map from fully qualified ECHO ID to binding.
78
+ */
79
+ const mapFormulaBindingFromId =
80
+ (functions: FunctionType[]) =>
81
+ (formula: string): string => {
82
+ return formula.replace(/([a-zA-Z0-9]+):([a-zA-Z0-9]+)\((.*)\)/g, (match, spaceId, objectId, args) => {
83
+ const id = `${spaceId}:${objectId}`;
84
+ if (id.length !== OBJECT_ID_LENGTH) {
85
+ return match;
86
+ }
87
+
88
+ const fn = functions.find((fn) => fullyQualifiedId(fn) === id);
89
+ if (fn?.binding) {
90
+ return `${fn.binding}(${args})`;
91
+ } else {
92
+ return match;
93
+ }
94
+ });
95
+ };
96
+
97
+ export const SheetContextProvider = ({
98
+ children,
99
+ sheet,
100
+ space,
101
+ readonly,
102
+ onInfo,
103
+ ...options
104
+ }: PropsWithChildren<SheetContextProps>) => {
105
+ const graph = useComputeGraph(space, options);
106
+
107
+ const [cursor, setCursor] = useState<CellAddress>();
108
+ const [range, setRange] = useState<CellRange>();
109
+ const [editing, setEditing] = useState<boolean>(false);
110
+
111
+ const [[model, formatting] = [], setModels] = useState<[SheetModel, FormattingModel] | undefined>(undefined);
112
+ useEffect(() => {
113
+ let model: SheetModel | undefined;
114
+ let formatting;
115
+ const t = setTimeout(async () => {
116
+ model = new SheetModel(graph, sheet, space, { readonly, mapFormulaBindingToId, mapFormulaBindingFromId });
117
+ await model.initialize();
118
+ formatting = new FormattingModel(model);
119
+ setModels([model, formatting]);
120
+ });
121
+
122
+ return () => {
123
+ clearTimeout(t);
124
+ void model?.destroy();
125
+ };
126
+ }, [graph, readonly]);
127
+
128
+ if (!model || !formatting) {
129
+ return null;
130
+ }
131
+
132
+ return (
133
+ <SheetContext.Provider
134
+ value={{
135
+ model,
136
+ formatting,
137
+ cursor,
138
+ setCursor,
139
+ range,
140
+ setRange,
141
+ editing,
142
+ setEditing,
143
+ // TODO(burdon): Change to event.
144
+ onInfo,
145
+ }}
146
+ >
147
+ {children}
148
+ </SheetContext.Provider>
149
+ );
150
+ };
@@ -0,0 +1,56 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ /**
6
+ * Gets the relative client rect of an element within a parent container.
7
+ * NOTE: This is stable even when the parent is scrolling.
8
+ * https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect
9
+ * @param root Parent container (e.g., scrollable container).
10
+ * @param element
11
+ */
12
+ export const getRelativeClientRect = (root: HTMLElement, element: HTMLElement): DOMRect => {
13
+ const rootRect = root.getBoundingClientRect();
14
+ const elementRect = element.getBoundingClientRect();
15
+ return new DOMRect(
16
+ elementRect.left - rootRect.left + root.scrollLeft,
17
+ elementRect.top - rootRect.top + root.scrollTop,
18
+ elementRect.width,
19
+ elementRect.height,
20
+ );
21
+ };
22
+
23
+ /**
24
+ * Union of two rectangles.
25
+ */
26
+ export const getRectUnion = (b1: DOMRect, b2: DOMRect): Pick<DOMRect, 'left' | 'top' | 'width' | 'height'> => {
27
+ return {
28
+ left: Math.min(b1.left, b2.left),
29
+ top: Math.min(b1.top, b2.top),
30
+ width: Math.abs(b1.left - b2.left) + (b1.left > b2.left ? b1.width : b2.width),
31
+ height: Math.abs(b1.top - b2.top) + (b1.height > b2.height ? b1.height : b2.height),
32
+ };
33
+ };
34
+
35
+ /**
36
+ * Scroll to cell.
37
+ * We need to correct for the DOM `scrollIntoView` function which doesn't show the border.
38
+ */
39
+ export const scrollIntoView = (scrollContainer: HTMLElement, el: HTMLElement) => {
40
+ el.scrollIntoView({ block: 'nearest', inline: 'nearest' });
41
+
42
+ const cellBounds = el.getBoundingClientRect();
43
+ const scrollerBounds = scrollContainer.getBoundingClientRect();
44
+
45
+ if (cellBounds.top < scrollerBounds.top) {
46
+ scrollContainer.scrollTop -= scrollerBounds.top - cellBounds.top;
47
+ } else if (cellBounds.bottom >= scrollerBounds.bottom - 1) {
48
+ scrollContainer.scrollTop += 2 + scrollerBounds.bottom - cellBounds.bottom;
49
+ }
50
+
51
+ if (cellBounds.left < scrollerBounds.left) {
52
+ scrollContainer.scrollLeft -= scrollerBounds.left - cellBounds.left;
53
+ } else if (cellBounds.right >= scrollerBounds.right) {
54
+ scrollContainer.scrollLeft += 2 + scrollerBounds.right - cellBounds.right;
55
+ }
56
+ };
@@ -0,0 +1,34 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import React from 'react';
6
+
7
+ import { type LayoutCoordinate } from '@dxos/app-framework';
8
+ import { mx } from '@dxos/react-ui-theme';
9
+
10
+ import { Sheet, type SheetRootProps } from './Sheet';
11
+
12
+ const SheetContainer = ({
13
+ sheet,
14
+ space,
15
+ role,
16
+ remoteFunctionUrl,
17
+ }: SheetRootProps & { role?: string; coordinate?: LayoutCoordinate }) => {
18
+ return (
19
+ <div
20
+ role='none'
21
+ className={mx(
22
+ 'flex',
23
+ role === 'article' && 'row-span-2',
24
+ role === 'section' && 'aspect-square border-y border-is border-separator',
25
+ )}
26
+ >
27
+ <Sheet.Root sheet={sheet} space={space} remoteFunctionUrl={remoteFunctionUrl}>
28
+ <Sheet.Main />
29
+ </Sheet.Root>
30
+ </div>
31
+ );
32
+ };
33
+
34
+ export default SheetContainer;