@dxos/plugin-sheet 0.6.12 → 0.6.13-main.548ca8d

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 (325) hide show
  1. package/dist/lib/browser/SheetContainer-NDNIS44E.mjs +265 -0
  2. package/dist/lib/browser/SheetContainer-NDNIS44E.mjs.map +7 -0
  3. package/dist/lib/browser/chunk-AQSGDA4X.mjs +1614 -0
  4. package/dist/lib/browser/chunk-AQSGDA4X.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-D3QTX46O.mjs +14 -0
  6. package/dist/lib/browser/chunk-D3QTX46O.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-GKI67SEF.mjs +69 -0
  8. package/dist/lib/browser/chunk-GKI67SEF.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-GSV5QNLD.mjs +2966 -0
  10. package/dist/lib/browser/chunk-GSV5QNLD.mjs.map +7 -0
  11. package/dist/lib/browser/graph-M4IQ76QX.mjs +33 -0
  12. package/dist/lib/browser/graph-M4IQ76QX.mjs.map +7 -0
  13. package/dist/lib/browser/index.mjs +93 -62
  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/types.mjs +4 -10
  18. package/dist/lib/node/SheetContainer-YSQGJD7K.cjs +276 -0
  19. package/dist/lib/node/SheetContainer-YSQGJD7K.cjs.map +7 -0
  20. package/dist/lib/node/{chunk-5KKJ4NPP.cjs → chunk-5XPK2V4A.cjs} +418 -678
  21. package/dist/lib/node/chunk-5XPK2V4A.cjs.map +7 -0
  22. package/dist/lib/node/chunk-6F43RV45.cjs +1610 -0
  23. package/dist/lib/node/chunk-6F43RV45.cjs.map +7 -0
  24. package/dist/lib/node/{chunk-DSYKOI4E.cjs → chunk-ER3PM7GD.cjs} +29 -45
  25. package/dist/lib/node/chunk-ER3PM7GD.cjs.map +7 -0
  26. package/dist/lib/node/chunk-QIFIGEKV.cjs +37 -0
  27. package/dist/lib/node/chunk-QIFIGEKV.cjs.map +7 -0
  28. package/dist/lib/node/graph-Q3N2X26H.cjs +55 -0
  29. package/dist/lib/node/graph-Q3N2X26H.cjs.map +7 -0
  30. package/dist/lib/node/index.cjs +105 -69
  31. package/dist/lib/node/index.cjs.map +3 -3
  32. package/dist/lib/node/meta.cjs +3 -3
  33. package/dist/lib/node/meta.cjs.map +1 -1
  34. package/dist/lib/node/meta.json +1 -1
  35. package/dist/lib/node/types.cjs +8 -14
  36. package/dist/lib/node/types.cjs.map +2 -2
  37. package/dist/lib/node-esm/SheetContainer-M7WRMZDU.mjs +266 -0
  38. package/dist/lib/node-esm/SheetContainer-M7WRMZDU.mjs.map +7 -0
  39. package/dist/lib/{browser/chunk-D5AGLXJP.mjs → node-esm/chunk-5WPZCXNS.mjs} +411 -678
  40. package/dist/lib/node-esm/chunk-5WPZCXNS.mjs.map +7 -0
  41. package/dist/lib/node-esm/chunk-ELTFPX5B.mjs +1615 -0
  42. package/dist/lib/node-esm/chunk-ELTFPX5B.mjs.map +7 -0
  43. package/dist/lib/node-esm/chunk-VCYJWE3O.mjs +16 -0
  44. package/dist/lib/node-esm/chunk-VCYJWE3O.mjs.map +7 -0
  45. package/dist/lib/node-esm/chunk-ZVLLQ2PJ.mjs +70 -0
  46. package/dist/lib/node-esm/chunk-ZVLLQ2PJ.mjs.map +7 -0
  47. package/dist/lib/node-esm/graph-SMPUMOV2.mjs +34 -0
  48. package/dist/lib/node-esm/graph-SMPUMOV2.mjs.map +7 -0
  49. package/dist/lib/node-esm/index.mjs +280 -0
  50. package/dist/lib/node-esm/index.mjs.map +7 -0
  51. package/dist/lib/node-esm/meta.json +1 -0
  52. package/dist/lib/node-esm/meta.mjs +10 -0
  53. package/dist/lib/node-esm/meta.mjs.map +7 -0
  54. package/dist/lib/node-esm/types.mjs +17 -0
  55. package/dist/lib/node-esm/types.mjs.map +7 -0
  56. package/dist/types/src/SheetPlugin.d.ts.map +1 -1
  57. package/dist/types/src/components/ComputeGraph/ComputeGraphContextProvider.d.ts +11 -0
  58. package/dist/types/src/components/ComputeGraph/ComputeGraphContextProvider.d.ts.map +1 -0
  59. package/dist/types/src/components/ComputeGraph/index.d.ts +1 -3
  60. package/dist/types/src/components/ComputeGraph/index.d.ts.map +1 -1
  61. package/dist/types/src/components/FunctionEditor/FunctionEditor.d.ts +3 -0
  62. package/dist/types/src/components/FunctionEditor/FunctionEditor.d.ts.map +1 -0
  63. package/dist/types/src/components/FunctionEditor/index.d.ts +2 -0
  64. package/dist/types/src/components/FunctionEditor/index.d.ts.map +1 -0
  65. package/dist/types/src/components/GridSheet/GridSheet.d.ts +3 -0
  66. package/dist/types/src/components/GridSheet/GridSheet.d.ts.map +1 -0
  67. package/dist/types/src/components/GridSheet/GridSheet.stories.d.ts +9 -0
  68. package/dist/types/src/components/GridSheet/GridSheet.stories.d.ts.map +1 -0
  69. package/dist/types/src/components/{CellEditor/CellEditor.stories.d.ts → GridSheet/SheetCellEditor.stories.d.ts} +4 -4
  70. package/dist/types/src/components/GridSheet/SheetCellEditor.stories.d.ts.map +1 -0
  71. package/dist/types/src/components/GridSheet/index.d.ts +2 -0
  72. package/dist/types/src/components/GridSheet/index.d.ts.map +1 -0
  73. package/dist/types/src/components/GridSheet/util.d.ts +16 -0
  74. package/dist/types/src/components/GridSheet/util.d.ts.map +1 -0
  75. package/dist/types/src/components/SheetContainer/SheetContainer.d.ts +6 -0
  76. package/dist/types/src/components/SheetContainer/SheetContainer.d.ts.map +1 -0
  77. package/dist/types/src/components/SheetContainer/SheetContainer.stories.d.ts +11 -0
  78. package/dist/types/src/components/SheetContainer/SheetContainer.stories.d.ts.map +1 -0
  79. package/dist/types/src/components/SheetContainer/index.d.ts +3 -0
  80. package/dist/types/src/components/SheetContainer/index.d.ts.map +1 -0
  81. package/dist/types/src/components/SheetContext/SheetContext.d.ts +27 -0
  82. package/dist/types/src/components/SheetContext/SheetContext.d.ts.map +1 -0
  83. package/dist/types/src/components/SheetContext/index.d.ts +2 -0
  84. package/dist/types/src/components/SheetContext/index.d.ts.map +1 -0
  85. package/dist/types/src/components/Toolbar/Toolbar.d.ts +36 -6
  86. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  87. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts +19 -14
  88. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  89. package/dist/types/src/components/index.d.ts +3 -2
  90. package/dist/types/src/components/index.d.ts.map +1 -1
  91. package/dist/types/src/defs/index.d.ts +3 -0
  92. package/dist/types/src/defs/index.d.ts.map +1 -0
  93. package/dist/types/src/{model → defs}/types.d.ts +8 -3
  94. package/dist/types/src/defs/types.d.ts.map +1 -0
  95. package/dist/types/src/defs/types.test.d.ts.map +1 -0
  96. package/dist/types/src/defs/util.d.ts +43 -0
  97. package/dist/types/src/defs/util.d.ts.map +1 -0
  98. package/dist/types/src/extensions/compute.d.ts +6 -0
  99. package/dist/types/src/extensions/compute.d.ts.map +1 -0
  100. package/dist/types/src/extensions/compute.stories.d.ts +26 -0
  101. package/dist/types/src/extensions/compute.stories.d.ts.map +1 -0
  102. package/dist/types/src/{components/CellEditor → extensions/editor}/extension.d.ts +1 -1
  103. package/dist/types/src/extensions/editor/extension.d.ts.map +1 -0
  104. package/dist/types/src/extensions/editor/extension.test.d.ts.map +1 -0
  105. package/dist/types/src/extensions/editor/index.d.ts +2 -0
  106. package/dist/types/src/extensions/editor/index.d.ts.map +1 -0
  107. package/dist/types/src/extensions/index.d.ts +3 -0
  108. package/dist/types/src/extensions/index.d.ts.map +1 -0
  109. package/dist/types/src/graph/compute-graph-registry.d.ts +34 -0
  110. package/dist/types/src/graph/compute-graph-registry.d.ts.map +1 -0
  111. package/dist/types/src/graph/compute-graph.d.ts +64 -0
  112. package/dist/types/src/graph/compute-graph.d.ts.map +1 -0
  113. package/dist/types/src/graph/compute-graph.stories.d.ts +10 -0
  114. package/dist/types/src/graph/compute-graph.stories.d.ts.map +1 -0
  115. package/dist/types/src/graph/compute-graph.test.d.ts +2 -0
  116. package/dist/types/src/graph/compute-graph.test.d.ts.map +1 -0
  117. package/dist/types/src/graph/compute-node.d.ts +26 -0
  118. package/dist/types/src/graph/compute-node.d.ts.map +1 -0
  119. package/dist/types/src/{components/ComputeGraph → graph/functions}/async-function.d.ts +14 -5
  120. package/dist/types/src/graph/functions/async-function.d.ts.map +1 -0
  121. package/dist/types/src/graph/functions/edge-function.d.ts +21 -0
  122. package/dist/types/src/graph/functions/edge-function.d.ts.map +1 -0
  123. package/dist/types/src/{model/functions.d.ts → graph/functions/function-defs.d.ts} +1 -1
  124. package/dist/types/src/graph/functions/function-defs.d.ts.map +1 -0
  125. package/dist/types/src/graph/functions/index.d.ts +4 -0
  126. package/dist/types/src/graph/functions/index.d.ts.map +1 -0
  127. package/dist/types/src/graph/hyperformula.test.d.ts +2 -0
  128. package/dist/types/src/graph/hyperformula.test.d.ts.map +1 -0
  129. package/dist/types/src/graph/index.d.ts +5 -0
  130. package/dist/types/src/graph/index.d.ts.map +1 -0
  131. package/dist/types/src/graph/testing/index.d.ts +3 -0
  132. package/dist/types/src/graph/testing/index.d.ts.map +1 -0
  133. package/dist/types/src/graph/testing/test-builder.d.ts +15 -0
  134. package/dist/types/src/graph/testing/test-builder.d.ts.map +1 -0
  135. package/dist/types/src/graph/testing/test-plugin.d.ts +36 -0
  136. package/dist/types/src/graph/testing/test-plugin.d.ts.map +1 -0
  137. package/dist/types/src/graph/util.d.ts +2 -0
  138. package/dist/types/src/graph/util.d.ts.map +1 -0
  139. package/dist/types/src/hooks/hooks.stories.d.ts +11 -0
  140. package/dist/types/src/hooks/hooks.stories.d.ts.map +1 -0
  141. package/dist/types/src/hooks/index.d.ts +5 -0
  142. package/dist/types/src/hooks/index.d.ts.map +1 -0
  143. package/dist/types/src/hooks/threads.d.ts +8 -0
  144. package/dist/types/src/hooks/threads.d.ts.map +1 -0
  145. package/dist/types/src/hooks/useComputeGraph.d.ts +7 -0
  146. package/dist/types/src/hooks/useComputeGraph.d.ts.map +1 -0
  147. package/dist/types/src/hooks/useFormattingModel.d.ts +3 -0
  148. package/dist/types/src/hooks/useFormattingModel.d.ts.map +1 -0
  149. package/dist/types/src/hooks/useSheetModel.d.ts +8 -0
  150. package/dist/types/src/hooks/useSheetModel.d.ts.map +1 -0
  151. package/dist/types/src/meta.d.ts +3 -9
  152. package/dist/types/src/meta.d.ts.map +1 -1
  153. package/dist/types/src/model/decorations.d.ts +25 -0
  154. package/dist/types/src/model/decorations.d.ts.map +1 -0
  155. package/dist/types/src/model/formatting-model.d.ts +19 -0
  156. package/dist/types/src/model/formatting-model.d.ts.map +1 -0
  157. package/dist/types/src/model/index.d.ts +3 -3
  158. package/dist/types/src/model/index.d.ts.map +1 -1
  159. package/dist/types/src/model/{model.d.ts → sheet-model.d.ts} +13 -67
  160. package/dist/types/src/model/sheet-model.d.ts.map +1 -0
  161. package/dist/types/src/model/sheet-model.test.d.ts +2 -0
  162. package/dist/types/src/model/sheet-model.test.d.ts.map +1 -0
  163. package/dist/types/src/sanity.test.d.ts +2 -0
  164. package/dist/types/src/sanity.test.d.ts.map +1 -0
  165. package/dist/types/src/testing/index.d.ts +2 -0
  166. package/dist/types/src/testing/index.d.ts.map +1 -0
  167. package/dist/types/src/testing/testing.d.ts +8 -0
  168. package/dist/types/src/testing/testing.d.ts.map +1 -0
  169. package/dist/types/src/translations.d.ts +17 -12
  170. package/dist/types/src/translations.d.ts.map +1 -1
  171. package/dist/types/src/types.d.ts +98 -32
  172. package/dist/types/src/types.d.ts.map +1 -1
  173. package/dist/vendor/hyperformula.mjs +37145 -0
  174. package/package.json +57 -52
  175. package/src/SheetPlugin.tsx +52 -74
  176. package/src/components/ComputeGraph/ComputeGraphContextProvider.tsx +20 -0
  177. package/src/components/ComputeGraph/index.ts +1 -3
  178. package/src/components/FunctionEditor/FunctionEditor.tsx +45 -0
  179. package/src/components/FunctionEditor/index.ts +5 -0
  180. package/src/components/GridSheet/GridSheet.stories.tsx +41 -0
  181. package/src/components/GridSheet/GridSheet.tsx +161 -0
  182. package/src/components/{CellEditor/CellEditor.stories.tsx → GridSheet/SheetCellEditor.stories.tsx} +8 -8
  183. package/src/components/GridSheet/index.ts +5 -0
  184. package/src/components/GridSheet/util.ts +144 -0
  185. package/src/components/SheetContainer/SheetContainer.stories.tsx +40 -0
  186. package/src/components/SheetContainer/SheetContainer.tsx +52 -0
  187. package/src/components/SheetContainer/index.ts +7 -0
  188. package/src/components/SheetContext/SheetContext.tsx +108 -0
  189. package/src/components/SheetContext/index.ts +5 -0
  190. package/src/components/Toolbar/Toolbar.tsx +167 -85
  191. package/src/components/index.ts +2 -0
  192. package/src/defs/index.ts +6 -0
  193. package/src/{model → defs}/types.test.ts +8 -9
  194. package/src/{model → defs}/types.ts +24 -14
  195. package/src/defs/util.ts +151 -0
  196. package/src/extensions/compute.stories.tsx +151 -0
  197. package/src/extensions/compute.ts +147 -0
  198. package/src/{components/CellEditor → extensions/editor}/extension.test.ts +4 -6
  199. package/src/{components/CellEditor → extensions/editor}/extension.ts +5 -6
  200. package/src/{components/CellEditor → extensions/editor}/index.ts +0 -1
  201. package/src/extensions/index.ts +6 -0
  202. package/src/graph/compute-graph-registry.ts +90 -0
  203. package/src/graph/compute-graph.stories.tsx +93 -0
  204. package/src/graph/compute-graph.test.ts +87 -0
  205. package/src/graph/compute-graph.ts +242 -0
  206. package/src/graph/compute-node.ts +63 -0
  207. package/src/{components/ComputeGraph → graph/functions}/async-function.ts +25 -15
  208. package/src/{components/ComputeGraph → graph/functions}/edge-function.ts +16 -14
  209. package/src/graph/functions/index.ts +7 -0
  210. package/src/graph/hyperformula.test.ts +14 -0
  211. package/src/graph/index.ts +8 -0
  212. package/src/graph/testing/index.ts +6 -0
  213. package/src/graph/testing/test-builder.ts +54 -0
  214. package/src/{components/ComputeGraph/custom.ts → graph/testing/test-plugin.ts} +44 -14
  215. package/src/graph/util.ts +8 -0
  216. package/src/hooks/hooks.stories.tsx +50 -0
  217. package/src/hooks/index.ts +8 -0
  218. package/src/hooks/threads.ts +147 -0
  219. package/src/hooks/useComputeGraph.ts +28 -0
  220. package/src/hooks/useFormattingModel.ts +11 -0
  221. package/src/hooks/useSheetModel.ts +40 -0
  222. package/src/meta.ts +14 -0
  223. package/src/model/decorations.ts +64 -0
  224. package/src/{components/Sheet/formatting.ts → model/formatting-model.ts} +30 -20
  225. package/src/model/index.ts +3 -3
  226. package/src/model/sheet-model.test.ts +57 -0
  227. package/src/model/sheet-model.ts +418 -0
  228. package/src/sanity.test.ts +40 -0
  229. package/src/{components/Sheet → testing}/index.ts +1 -1
  230. package/src/testing/testing.tsx +68 -0
  231. package/src/translations.ts +6 -1
  232. package/src/types.ts +40 -41
  233. package/dist/lib/browser/SheetContainer-U4H5D34A.mjs +0 -1772
  234. package/dist/lib/browser/SheetContainer-U4H5D34A.mjs.map +0 -7
  235. package/dist/lib/browser/chunk-APHOLYUB.mjs +0 -175
  236. package/dist/lib/browser/chunk-APHOLYUB.mjs.map +0 -7
  237. package/dist/lib/browser/chunk-D5AGLXJP.mjs.map +0 -7
  238. package/dist/lib/browser/chunk-FUAGSXA4.mjs +0 -82
  239. package/dist/lib/browser/chunk-FUAGSXA4.mjs.map +0 -7
  240. package/dist/lib/browser/chunk-JRL5LGCE.mjs +0 -18
  241. package/dist/lib/browser/chunk-JRL5LGCE.mjs.map +0 -7
  242. package/dist/lib/browser/chunk-NU4PBN33.mjs +0 -8
  243. package/dist/lib/browser/chunk-NU4PBN33.mjs.map +0 -7
  244. package/dist/lib/browser/testing.mjs +0 -92
  245. package/dist/lib/browser/testing.mjs.map +0 -7
  246. package/dist/lib/node/SheetContainer-AXQV3ZT5.cjs +0 -1765
  247. package/dist/lib/node/SheetContainer-AXQV3ZT5.cjs.map +0 -7
  248. package/dist/lib/node/chunk-5KKJ4NPP.cjs.map +0 -7
  249. package/dist/lib/node/chunk-BJ6ZD7MN.cjs +0 -51
  250. package/dist/lib/node/chunk-BJ6ZD7MN.cjs.map +0 -7
  251. package/dist/lib/node/chunk-CN3RPESU.cjs +0 -202
  252. package/dist/lib/node/chunk-CN3RPESU.cjs.map +0 -7
  253. package/dist/lib/node/chunk-DSYKOI4E.cjs.map +0 -7
  254. package/dist/lib/node/chunk-PYXHNAAK.cjs +0 -40
  255. package/dist/lib/node/chunk-PYXHNAAK.cjs.map +0 -7
  256. package/dist/lib/node/testing.cjs +0 -111
  257. package/dist/lib/node/testing.cjs.map +0 -7
  258. package/dist/types/src/components/CellEditor/CellEditor.d.ts +0 -14
  259. package/dist/types/src/components/CellEditor/CellEditor.d.ts.map +0 -1
  260. package/dist/types/src/components/CellEditor/CellEditor.stories.d.ts.map +0 -1
  261. package/dist/types/src/components/CellEditor/extension.d.ts.map +0 -1
  262. package/dist/types/src/components/CellEditor/extension.test.d.ts.map +0 -1
  263. package/dist/types/src/components/CellEditor/index.d.ts +0 -3
  264. package/dist/types/src/components/CellEditor/index.d.ts.map +0 -1
  265. package/dist/types/src/components/ComputeGraph/async-function.d.ts.map +0 -1
  266. package/dist/types/src/components/ComputeGraph/custom.d.ts +0 -21
  267. package/dist/types/src/components/ComputeGraph/custom.d.ts.map +0 -1
  268. package/dist/types/src/components/ComputeGraph/edge-function.d.ts +0 -20
  269. package/dist/types/src/components/ComputeGraph/edge-function.d.ts.map +0 -1
  270. package/dist/types/src/components/ComputeGraph/graph-context.d.ts +0 -12
  271. package/dist/types/src/components/ComputeGraph/graph-context.d.ts.map +0 -1
  272. package/dist/types/src/components/ComputeGraph/graph.browser.test.d.ts +0 -2
  273. package/dist/types/src/components/ComputeGraph/graph.browser.test.d.ts.map +0 -1
  274. package/dist/types/src/components/ComputeGraph/graph.d.ts +0 -26
  275. package/dist/types/src/components/ComputeGraph/graph.d.ts.map +0 -1
  276. package/dist/types/src/components/Sheet/Sheet.d.ts +0 -55
  277. package/dist/types/src/components/Sheet/Sheet.d.ts.map +0 -1
  278. package/dist/types/src/components/Sheet/Sheet.stories.d.ts +0 -54
  279. package/dist/types/src/components/Sheet/Sheet.stories.d.ts.map +0 -1
  280. package/dist/types/src/components/Sheet/formatting.d.ts +0 -14
  281. package/dist/types/src/components/Sheet/formatting.d.ts.map +0 -1
  282. package/dist/types/src/components/Sheet/grid.d.ts +0 -52
  283. package/dist/types/src/components/Sheet/grid.d.ts.map +0 -1
  284. package/dist/types/src/components/Sheet/index.d.ts +0 -2
  285. package/dist/types/src/components/Sheet/index.d.ts.map +0 -1
  286. package/dist/types/src/components/Sheet/nav.d.ts +0 -29
  287. package/dist/types/src/components/Sheet/nav.d.ts.map +0 -1
  288. package/dist/types/src/components/Sheet/sheet-context.d.ts +0 -25
  289. package/dist/types/src/components/Sheet/sheet-context.d.ts.map +0 -1
  290. package/dist/types/src/components/Sheet/util.d.ts +0 -18
  291. package/dist/types/src/components/Sheet/util.d.ts.map +0 -1
  292. package/dist/types/src/components/SheetContainer.d.ts +0 -9
  293. package/dist/types/src/components/SheetContainer.d.ts.map +0 -1
  294. package/dist/types/src/components/Toolbar/common.d.ts +0 -20
  295. package/dist/types/src/components/Toolbar/common.d.ts.map +0 -1
  296. package/dist/types/src/model/functions.d.ts.map +0 -1
  297. package/dist/types/src/model/model.browser.test.d.ts +0 -2
  298. package/dist/types/src/model/model.browser.test.d.ts.map +0 -1
  299. package/dist/types/src/model/model.d.ts.map +0 -1
  300. package/dist/types/src/model/types.d.ts.map +0 -1
  301. package/dist/types/src/model/types.test.d.ts.map +0 -1
  302. package/dist/types/src/model/util.d.ts +0 -15
  303. package/dist/types/src/model/util.d.ts.map +0 -1
  304. package/dist/types/src/testing.d.ts +0 -9
  305. package/dist/types/src/testing.d.ts.map +0 -1
  306. package/src/components/CellEditor/CellEditor.tsx +0 -113
  307. package/src/components/ComputeGraph/graph-context.tsx +0 -50
  308. package/src/components/ComputeGraph/graph.browser.test.ts +0 -50
  309. package/src/components/ComputeGraph/graph.ts +0 -62
  310. package/src/components/Sheet/Sheet.stories.tsx +0 -287
  311. package/src/components/Sheet/Sheet.tsx +0 -1160
  312. package/src/components/Sheet/grid.ts +0 -191
  313. package/src/components/Sheet/nav.ts +0 -157
  314. package/src/components/Sheet/sheet-context.tsx +0 -150
  315. package/src/components/Sheet/util.ts +0 -56
  316. package/src/components/SheetContainer.tsx +0 -34
  317. package/src/components/Toolbar/common.tsx +0 -72
  318. package/src/meta.tsx +0 -18
  319. package/src/model/model.browser.test.ts +0 -100
  320. package/src/model/model.ts +0 -550
  321. package/src/model/util.ts +0 -36
  322. package/src/testing.ts +0 -50
  323. /package/dist/types/src/{model → defs}/types.test.d.ts +0 -0
  324. /package/dist/types/src/{components/CellEditor → extensions/editor}/extension.test.d.ts +0 -0
  325. /package/src/{model/functions.ts → graph/functions/function-defs.ts} +0 -0
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/components/SheetContainer.tsx", "../../../src/components/Sheet/Sheet.tsx", "../../../src/components/Sheet/grid.ts", "../../../src/components/Sheet/nav.ts", "../../../src/components/Sheet/sheet-context.tsx", "../../../src/components/Sheet/formatting.ts", "../../../src/components/Sheet/util.ts", "../../../src/components/CellEditor/CellEditor.tsx", "../../../src/components/CellEditor/extension.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type LayoutCoordinate } from '@dxos/app-framework';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { Sheet, type SheetRootProps } from './Sheet';\n\nconst SheetContainer = ({\n sheet,\n space,\n role,\n remoteFunctionUrl,\n}: SheetRootProps & { role?: string; coordinate?: LayoutCoordinate }) => {\n return (\n <div\n role='none'\n className={mx(\n 'flex',\n role === 'article' && 'row-span-2',\n role === 'section' && 'aspect-square border-y border-is border-separator',\n )}\n >\n <Sheet.Root sheet={sheet} space={space} remoteFunctionUrl={remoteFunctionUrl}>\n <Sheet.Main />\n </Sheet.Root>\n </div>\n );\n};\n\nexport default SheetContainer;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport {\n type Active,\n DndContext,\n type DragEndEvent,\n DragOverlay,\n type DragStartEvent,\n KeyboardSensor,\n type Modifier,\n MouseSensor,\n type PointerActivationConstraint,\n TouchSensor,\n useDraggable,\n useDroppable,\n useSensor,\n useSensors,\n} from '@dnd-kit/core';\nimport { restrictToHorizontalAxis, restrictToVerticalAxis } from '@dnd-kit/modifiers';\nimport { getEventCoordinates, useCombinedRefs } from '@dnd-kit/utilities';\nimport { Function as FunctionIcon } from '@phosphor-icons/react';\nimport { Resizable, type ResizeCallback, type ResizeStartCallback } from 're-resizable';\nimport React, {\n type CSSProperties,\n type DOMAttributes,\n type PropsWithChildren,\n forwardRef,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { useResizeDetector } from 'react-resize-detector';\n\nimport { debounce } from '@dxos/async';\nimport { fullyQualifiedId, createDocAccessor } from '@dxos/client/echo';\nimport { log } from '@dxos/log';\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { createAttendableAttributes, useHasAttention } from '@dxos/react-ui-attention';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport {\n type GridLayoutProps,\n type SizeMap,\n CELL_DATA_KEY,\n axisHeight,\n axisWidth,\n defaultHeight,\n defaultWidth,\n maxWidth,\n maxHeight,\n minWidth,\n minHeight,\n getCellElement,\n useGridLayout,\n} from './grid';\nimport { type GridSize, handleArrowNav, handleNav, useRangeSelect } from './nav';\nimport { type SheetContextProps, SheetContextProvider, useSheetContext } from './sheet-context';\nimport { getRectUnion, getRelativeClientRect, scrollIntoView } from './util';\nimport {\n type CellIndex,\n type CellAddress,\n addressToA1Notation,\n columnLetter,\n posEquals,\n rangeToA1Notation,\n} from '../../model';\nimport {\n CellEditor,\n type CellRangeNotifier,\n type EditorKeysProps,\n editorKeys,\n rangeExtension,\n sheetExtension,\n} from '../CellEditor';\n\n// TODO(burdon): Virtualization bug.\n// TODO(burdon): Toolbar styles and formatting.\n// TODO(burdon): Insert/delete rows/columns (menu).\n// TODO(burdon): Scroll to position if off screen.\n// TODO(burdon): Don't render until sizes were updated (otherwise, flickers).\n\n// TODO(burdon): Model multiple sheets (e.g., documents). And cross sheet references.\n// TODO(burdon): Factor out react-ui-sheet.\n// TODO(burdon): Comments (josiah).\n// TODO(burdon): Realtime long text.\n// TODO(burdon): Search.\n\n// TODO(burdon): Virtualization:\n// https://github.com/TanStack/virtual/blob/main/examples/react/dynamic/src/main.tsx#L171\n// https://tanstack.com/virtual/v3/docs/framework/react/examples/variable\n// https://canvas-grid-demo.vercel.app\n// https://sheet.brianhung.me\n// https://github.com/BrianHung\n// https://daybrush.com/moveable\n\n/**\n * Features:\n * - Move rows/columns.\n * - Insert/delete rows/columns.\n * - Copy/paste.\n * - Undo/redo.\n * - Comments.\n * - Real time collaborative editing of large text cells.\n * - Select range.\n * - Format cells.\n * - Formulae.\n * - Update formula ranges by selection.\n */\n\nconst fragments = {\n axis: 'bg-axisSurface text-axisText text-xs select-none',\n axisSelected: 'bg-attention text-baseText',\n cell: 'bg-gridCell',\n cellSelected: 'bg-gridCellSelected text-baseText border !border-accentSurface',\n};\n\n//\n// Root\n//\n\ntype SheetRootProps = SheetContextProps;\n\nconst SheetRoot = ({ children, ...props }: PropsWithChildren<SheetContextProps>) => {\n return <SheetContextProvider {...props}>{children}</SheetContextProvider>;\n};\n\n//\n// Main\n//\n\ntype SheetMainProps = ThemedClassName<Partial<GridSize>>;\n\nconst SheetMain = forwardRef<HTMLDivElement, SheetMainProps>(({ classNames, numRows, numColumns }, forwardRef) => {\n const { model, cursor, setCursor, setRange, setEditing } = useSheetContext();\n\n // Scrolling.\n const { rowsRef, columnsRef, contentRef } = useScrollHandlers();\n\n //\n // Order of Row/columns.\n //\n const [rows, setRows] = useState([...model.sheet.rows]);\n const [columns, setColumns] = useState([...model.sheet.columns]);\n useEffect(() => {\n const rowsAccessor = createDocAccessor(model.sheet, ['rows']);\n const columnsAccessor = createDocAccessor(model.sheet, ['columns']);\n const handleUpdate = debounce(() => {\n setRows([...model.sheet.rows]);\n setColumns([...model.sheet.columns]);\n }, 100);\n\n rowsAccessor.handle.addListener('change', handleUpdate);\n columnsAccessor.handle.addListener('change', handleUpdate);\n handleUpdate();\n return () => {\n rowsAccessor.handle.removeListener('change', handleUpdate);\n columnsAccessor.handle.removeListener('change', handleUpdate);\n };\n }, [model]);\n\n // Refresh the model.\n // TODO(burdon): Breaks undo.\n useEffect(() => {\n model.reset();\n }, [rows, columns]);\n\n const handleMoveRows: SheetRowsProps['onMove'] = (from, to, num = 1) => {\n const cursorIdx = cursor ? model.addressToIndex(cursor) : undefined;\n const [rows] = model.sheet.rows.splice(from, num);\n model.sheet.rows.splice(to, 0, rows);\n if (cursorIdx) {\n setCursor(model.addressFromIndex(cursorIdx));\n }\n setRows([...model.sheet.rows]);\n };\n\n const handleMoveColumns: SheetColumnsProps['onMove'] = (from, to, num = 1) => {\n const cursorIdx = cursor ? model.addressToIndex(cursor) : undefined;\n const columns = model.sheet.columns.splice(from, num);\n model.sheet.columns.splice(to, 0, ...columns);\n if (cursorIdx) {\n setCursor(model.addressFromIndex(cursorIdx));\n }\n setColumns([...model.sheet.columns]);\n };\n\n //\n // Row/column sizes.\n //\n const [rowSizes, setRowSizes] = useState<SizeMap>();\n const [columnSizes, setColumnSizes] = useState<SizeMap>();\n useEffect(() => {\n const rowAccessor = createDocAccessor(model.sheet, ['rowMeta']);\n const columnAccessor = createDocAccessor(model.sheet, ['columnMeta']);\n const handleUpdate = debounce(() => {\n const mapSizes = (values: [string, { size?: number | undefined }][]) =>\n values.reduce<SizeMap>((map, [idx, meta]) => {\n if (meta.size) {\n map[idx] = meta.size;\n }\n return map;\n }, {});\n\n setRowSizes(mapSizes(Object.entries(model.sheet.rowMeta)));\n setColumnSizes(mapSizes(Object.entries(model.sheet.columnMeta)));\n }, 100);\n\n rowAccessor.handle.addListener('change', handleUpdate);\n columnAccessor.handle.addListener('change', handleUpdate);\n handleUpdate();\n return () => {\n rowAccessor.handle.removeListener('change', handleUpdate);\n columnAccessor.handle.removeListener('change', handleUpdate);\n };\n }, [model]);\n\n const handleResizeRow: SheetRowsProps['onResize'] = (idx, size, save) => {\n if (save) {\n model.sheet.rowMeta[idx] ??= {};\n model.sheet.rowMeta[idx].size = size;\n } else {\n setRowSizes((sizes) => ({ ...sizes, [idx]: size }));\n }\n };\n\n const handleResizeColumn: SheetColumnsProps['onResize'] = (idx, size, save) => {\n if (save) {\n model.sheet.columnMeta[idx] ??= {};\n model.sheet.columnMeta[idx].size = size;\n } else {\n setColumnSizes((sizes) => ({ ...sizes, [idx]: size }));\n }\n };\n\n return (\n <div\n role='none'\n className={mx(\n 'grid grid-cols-[calc(var(--rail-size)-2px)_1fr] grid-rows-[32px_1fr_32px] bs-full is-full overflow-hidden',\n classNames,\n )}\n >\n <GridCorner\n onClick={() => {\n setCursor(undefined);\n setRange(undefined);\n setEditing(false);\n }}\n />\n <SheetColumns\n ref={columnsRef}\n columns={columns}\n sizes={columnSizes}\n selected={cursor?.column}\n onSelect={(column) => setCursor(cursor?.column === column ? undefined : { row: -1, column })}\n onResize={handleResizeColumn}\n onMove={handleMoveColumns}\n />\n\n <SheetRows\n ref={rowsRef}\n rows={rows}\n sizes={rowSizes}\n selected={cursor?.row}\n onSelect={(row) => setCursor(cursor?.row === row ? undefined : { row, column: -1 })}\n onResize={handleResizeRow}\n onMove={handleMoveRows}\n />\n <SheetGrid\n ref={contentRef}\n size={{ numRows: numRows ?? rows.length, numColumns: numColumns ?? columns.length }}\n rows={rows}\n columns={columns}\n rowSizes={rowSizes}\n columnSizes={columnSizes}\n />\n\n <GridCorner />\n <SheetStatusBar />\n </div>\n );\n});\n\n/**\n * Coordinate scrolling across components.\n */\nconst useScrollHandlers = () => {\n const rowsRef = useRef<HTMLDivElement>(null);\n const columnsRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handleRowsScroll = (ev: Event) => {\n const { scrollTop } = ev.target as HTMLDivElement;\n if (!rowsRef.current!.dataset.locked) {\n contentRef.current!.scrollTop = scrollTop;\n }\n };\n\n const handleColumnsScroll = (ev: Event) => {\n const { scrollLeft } = ev.target as HTMLDivElement;\n if (!columnsRef.current!.dataset.locked) {\n contentRef.current!.scrollLeft = scrollLeft;\n }\n };\n\n const handleContentScroll = (ev: Event) => {\n const { scrollTop, scrollLeft } = ev.target as HTMLDivElement;\n rowsRef.current!.scrollTop = scrollTop;\n columnsRef.current!.scrollLeft = scrollLeft;\n };\n\n const rows = rowsRef.current!;\n const columns = columnsRef.current!;\n const content = contentRef.current!;\n\n rows.addEventListener('scroll', handleRowsScroll);\n columns.addEventListener('scroll', handleColumnsScroll);\n content.addEventListener('scroll', handleContentScroll);\n return () => {\n rows.removeEventListener('scroll', handleRowsScroll);\n columns.removeEventListener('scroll', handleColumnsScroll);\n content.removeEventListener('scroll', handleContentScroll);\n };\n }, []);\n\n return { rowsRef, columnsRef, contentRef };\n};\n\n//\n// Row/Column\n//\n\nconst GridCorner = (props: { className?: string } & Pick<DOMAttributes<HTMLDivElement>, 'onClick'>) => {\n return <div className={fragments.axis} {...props} />;\n};\n\nconst MovingOverlay = ({ label }: { label: string }) => {\n return (\n <div className='flex w-full h-full justify-center items-center text-sm p-1 bg-gridOverlay cursor-pointer'>\n {label}\n </div>\n );\n};\n\n// https://docs.dndkit.com/api-documentation/sensors/pointer#activation-constraints\nconst mouseConstraints: PointerActivationConstraint = { distance: 10 };\nconst touchConstraints: PointerActivationConstraint = { delay: 250, tolerance: 5 };\n\ntype ResizeProps = {\n sizes?: SizeMap;\n onResize?: (idx: CellIndex, size: number, save?: boolean) => void;\n};\n\ntype MoveProps = {\n onMove?: (from: number, to: number) => void;\n};\n\ntype RowColumnSelection = {\n selected?: number;\n onSelect?: (selected: number) => void;\n};\n\ntype RowColumnProps = {\n idx: CellIndex;\n index: number;\n label: string;\n size: number;\n resize: boolean;\n selected: boolean;\n} & Pick<ResizeProps, 'onResize'> &\n Pick<RowColumnSelection, 'onSelect'>;\n\n//\n// Rows\n//\n\ntype SheetRowsProps = { rows: CellIndex[] } & RowColumnSelection & ResizeProps & MoveProps;\n\nconst SheetRows = forwardRef<HTMLDivElement, SheetRowsProps>(\n ({ rows, sizes, selected, onSelect, onResize, onMove }, forwardRef) => {\n const mouseSensor = useSensor(MouseSensor, { activationConstraint: mouseConstraints });\n const touchSensor = useSensor(TouchSensor, { activationConstraint: touchConstraints });\n const keyboardSensor = useSensor(KeyboardSensor, {});\n const sensors = useSensors(mouseSensor, touchSensor, keyboardSensor);\n\n const [active, setActive] = useState<Active | null>(null);\n const handleDragStart = ({ active }: DragStartEvent) => {\n setActive(active);\n };\n\n const handleDragEnd = ({ over, active }: DragEndEvent) => {\n if (over && over.id !== active.id) {\n setActive(null);\n onMove?.(active.data.current!.index, over.data.current!.index);\n }\n };\n\n const snapToCenter: Modifier = ({ activatorEvent, draggingNodeRect, transform }) => {\n if (draggingNodeRect && activatorEvent) {\n const activatorCoordinates = getEventCoordinates(activatorEvent);\n if (!activatorCoordinates) {\n return transform;\n }\n\n const offset = activatorCoordinates.y - draggingNodeRect.top;\n return {\n ...transform,\n y: transform.y + offset - draggingNodeRect.height / 2,\n };\n }\n\n return transform;\n };\n\n return (\n <div className='relative flex grow overflow-hidden'>\n {/* Fixed border. */}\n <div\n className={mx('z-20 absolute inset-0 border-y border-gridLine pointer-events-none')}\n style={{ width: axisWidth }}\n />\n\n {/* Scrollbar. */}\n <div ref={forwardRef} role='rowheader' className='grow overflow-y-auto scrollbar-none'>\n <DndContext\n sensors={sensors}\n modifiers={[restrictToVerticalAxis, snapToCenter]}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n >\n <div className='flex flex-col' style={{ width: axisWidth }}>\n {rows.map((idx, index) => (\n <GridRowCell\n key={idx}\n idx={idx}\n index={index}\n label={String(index + 1)}\n size={sizes?.[idx] ?? defaultHeight}\n resize={index < rows.length - 1}\n selected={selected === index}\n onResize={onResize}\n onSelect={onSelect}\n />\n ))}\n </div>\n\n {createPortal(\n <DragOverlay>{active && <MovingOverlay label={String(active.data.current!.index + 1)} />}</DragOverlay>,\n document.body,\n )}\n </DndContext>\n </div>\n </div>\n );\n },\n);\n\nconst GridRowCell = ({ idx, index, label, size, resize, selected, onSelect, onResize }: RowColumnProps) => {\n const { setNodeRef: setDroppableNodeRef } = useDroppable({ id: idx, data: { index } });\n const {\n setNodeRef: setDraggableNodeRef,\n attributes,\n listeners,\n isDragging,\n over,\n } = useDraggable({ id: idx, data: { index } });\n const setNodeRef = useCombinedRefs(setDroppableNodeRef, setDraggableNodeRef);\n const [initialSize, setInitialSize] = useState(size);\n const [resizing, setResizing] = useState(false);\n\n // Lock scroll container while resizing (fixes scroll bug).\n // https://github.com/bokuweb/re-resizable/issues/727\n const scrollHandler = useRef<any>();\n const handleResizeStart: ResizeStartCallback = (_ev, _dir, elementRef) => {\n const scrollContainer = elementRef.closest<HTMLDivElement>('[role=\"rowheader\"]')!;\n const scrollTop = scrollContainer.scrollTop;\n scrollHandler.current = (ev: Event) => ((ev.target as HTMLElement).scrollTop = scrollTop);\n scrollContainer.addEventListener('scroll', scrollHandler.current);\n scrollContainer.dataset.locked = 'true';\n setResizing(true);\n };\n\n const handleResize: ResizeCallback = (_ev, _dir, _elementRef, { height }) => {\n onResize?.(idx, initialSize + height);\n };\n\n const handleResizeStop: ResizeCallback = (_ev, _dir, elementRef, { height }) => {\n const scrollContainer = elementRef.closest<HTMLDivElement>('[role=\"rowheader\"]')!;\n scrollContainer.removeEventListener('scroll', scrollHandler.current!);\n delete scrollContainer.dataset.locked;\n scrollHandler.current = undefined;\n setInitialSize(initialSize + height);\n onResize?.(idx, initialSize + height, true);\n setResizing(false);\n };\n\n // Row.\n return (\n <Resizable\n enable={{ bottom: resize }}\n size={{ height: size - 1 }}\n minHeight={minHeight - 1}\n maxHeight={maxHeight}\n onResizeStart={handleResizeStart}\n onResize={handleResize}\n onResizeStop={handleResizeStop}\n >\n <div\n ref={setNodeRef}\n {...attributes}\n {...listeners}\n className={mx(\n 'flex h-full items-center justify-center cursor-pointer',\n 'border-t border-gridLine focus-visible:outline-none',\n fragments.axis,\n selected && fragments.axisSelected,\n isDragging && fragments.axisSelected,\n )}\n onClick={() => onSelect?.(index)}\n >\n <span className='flex w-full justify-center'>{label}</span>\n\n {/* Drop indicator. */}\n {over?.id === idx && !isDragging && (\n <div className='z-20 absolute top-0 w-full min-h-[4px] border-b-4 border-accentSurface' />\n )}\n\n {/* Resize indicator. */}\n {resizing && <div className='z-20 absolute bottom-0 w-full min-h-[4px] border-b-4 border-accentSurface' />}\n </div>\n </Resizable>\n );\n};\n\n//\n// Columns\n//\n\ntype SheetColumnsProps = { columns: CellIndex[] } & RowColumnSelection & ResizeProps & MoveProps;\n\nconst SheetColumns = forwardRef<HTMLDivElement, SheetColumnsProps>(\n ({ columns, sizes, selected, onSelect, onResize, onMove }, forwardRef) => {\n const mouseSensor = useSensor(MouseSensor, { activationConstraint: mouseConstraints });\n const touchSensor = useSensor(TouchSensor, { activationConstraint: touchConstraints });\n const keyboardSensor = useSensor(KeyboardSensor, {});\n const sensors = useSensors(mouseSensor, touchSensor, keyboardSensor);\n\n const [active, setActive] = useState<Active | null>(null);\n const handleDragStart = ({ active }: DragStartEvent) => {\n setActive(active);\n };\n\n const handleDragEnd = ({ active, over }: DragEndEvent) => {\n if (over && over.id !== active.id) {\n setActive(null);\n onMove?.(active.data.current!.index, over.data.current!.index);\n }\n };\n\n const snapToCenter: Modifier = ({ activatorEvent, draggingNodeRect, transform }) => {\n if (draggingNodeRect && activatorEvent) {\n const activatorCoordinates = getEventCoordinates(activatorEvent);\n if (!activatorCoordinates) {\n return transform;\n }\n\n const offset = activatorCoordinates.x - draggingNodeRect.left;\n return {\n ...transform,\n x: transform.x + offset - draggingNodeRect.width / 2,\n };\n }\n\n return transform;\n };\n\n return (\n <div className='relative flex grow overflow-hidden'>\n {/* Fixed border. */}\n <div\n className={mx('z-20 absolute inset-0 border-x border-gridLine pointer-events-none')}\n style={{ height: axisHeight }}\n />\n\n {/* Scrollbar. */}\n <div ref={forwardRef} role='columnheader' className='grow overflow-x-auto scrollbar-none'>\n <DndContext\n autoScroll={{ enabled: true }}\n sensors={sensors}\n modifiers={[restrictToHorizontalAxis, snapToCenter]}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n >\n <div className='flex h-full' style={{ height: axisHeight }}>\n {columns.map((idx, index) => (\n <GridColumnCell\n key={idx}\n idx={idx}\n index={index}\n label={columnLetter(index)}\n size={sizes?.[idx] ?? defaultWidth}\n resize={index < columns.length - 1}\n selected={selected === index}\n onResize={onResize}\n onSelect={onSelect}\n />\n ))}\n </div>\n\n {createPortal(\n <DragOverlay>{active && <MovingOverlay label={columnLetter(active.data.current!.index)} />}</DragOverlay>,\n document.body,\n )}\n </DndContext>\n </div>\n </div>\n );\n },\n);\n\nconst GridColumnCell = ({ idx, index, label, size, resize, selected, onSelect, onResize }: RowColumnProps) => {\n const { setNodeRef: setDroppableNodeRef } = useDroppable({ id: idx, data: { index } });\n const {\n setNodeRef: setDraggableNodeRef,\n attributes,\n listeners,\n over,\n isDragging,\n } = useDraggable({ id: idx, data: { index } });\n const setNodeRef = useCombinedRefs(setDroppableNodeRef, setDraggableNodeRef);\n const [initialSize, setInitialSize] = useState(size);\n const [resizing, setResizing] = useState(false);\n\n // Lock scroll container while resizing (fixes scroll bug).\n // https://github.com/bokuweb/re-resizable/issues/727\n const scrollHandler = useRef<any>();\n const handleResizeStart: ResizeStartCallback = (_ev, _dir, elementRef) => {\n const scrollContainer = elementRef.closest<HTMLDivElement>('[role=\"columnheader\"]')!;\n const scrollLeft = scrollContainer.scrollLeft;\n scrollHandler.current = (ev: Event) => ((ev.target as HTMLElement).scrollLeft = scrollLeft);\n scrollContainer.addEventListener('scroll', scrollHandler.current);\n scrollContainer.dataset.locked = 'true';\n setResizing(true);\n };\n\n const handleResize: ResizeCallback = (_ev, _dir, _elementRef, { width }) => {\n onResize?.(idx, initialSize + width);\n };\n\n const handleResizeStop: ResizeCallback = (_ev, _dir, elementRef, { width }) => {\n const scrollContainer = elementRef.closest<HTMLDivElement>('[role=\"columnheader\"]')!;\n scrollContainer.removeEventListener('scroll', scrollHandler.current!);\n delete scrollContainer.dataset.locked;\n scrollHandler.current = undefined;\n setInitialSize(initialSize + width);\n onResize?.(idx, initialSize + width, true);\n setResizing(false);\n };\n\n // Column.\n return (\n <Resizable\n enable={{ right: resize }}\n size={{ width: size - 1 }}\n minWidth={minWidth - 1}\n maxWidth={maxWidth}\n onResizeStart={handleResizeStart}\n onResize={handleResize}\n onResizeStop={handleResizeStop}\n >\n <div\n ref={setNodeRef}\n {...attributes}\n {...listeners}\n className={mx(\n 'flex h-full items-center justify-center cursor-pointer',\n 'border-l border-gridLine focus-visible:outline-none',\n fragments.axis,\n selected && fragments.axisSelected,\n isDragging && fragments.axisSelected,\n )}\n onClick={() => onSelect?.(index)}\n >\n <span className='flex w-full justify-center'>{label}</span>\n\n {/* Drop indicator. */}\n {over?.id === idx && !isDragging && (\n <div className='z-20 absolute left-0 h-full min-w-[4px] border-l-4 border-accentSurface' />\n )}\n\n {/* Resize indicator. */}\n {resizing && <div className='z-20 absolute right-0 h-full min-h-[4px] border-l-4 border-accentSurface' />}\n </div>\n </Resizable>\n );\n};\n\n//\n// Content\n//\n\ntype SheetGridProps = GridLayoutProps & {\n size: GridSize;\n};\n\nconst SheetGrid = forwardRef<HTMLDivElement, SheetGridProps>(\n ({ size, rows, columns, rowSizes, columnSizes }, forwardRef) => {\n const {\n ref: containerRef,\n width: containerWidth = 0,\n height: containerHeight = 0,\n } = useResizeDetector({ refreshRate: 200 });\n const scrollerRef = useRef<HTMLDivElement>(null);\n useImperativeHandle(forwardRef, () => scrollerRef.current!);\n\n const { model, cursor, range, editing, setCursor, setRange, setEditing, onInfo } = useSheetContext();\n const initialText = useRef<string>();\n const quickEdit = useRef(false);\n\n // Listen for async calculation updates.\n const [, forceUpdate] = useState({});\n useEffect(() => {\n const unsubscribe = model.update.on(() => {\n log('updated', { id: model.id });\n forceUpdate({});\n });\n\n return () => {\n unsubscribe();\n };\n }, [model]);\n\n //\n // Event handling.\n //\n\n const inputRef = useRef<HTMLInputElement>(null);\n const handleKeyDown: DOMAttributes<HTMLInputElement>['onKeyDown'] = (ev) => {\n // Cut-and-paste.\n const isMacOS = /Mac|iPhone|iPod|iPad/.test(navigator.userAgent);\n if (cursor && ((isMacOS && ev.metaKey) || ev.ctrlKey)) {\n switch (ev.key) {\n case 'x': {\n model.cut(range ?? { from: cursor });\n return;\n }\n case 'c': {\n model.copy(range ?? { from: cursor });\n return;\n }\n case 'v': {\n model.paste(cursor);\n return;\n }\n case 'z': {\n if (ev.shiftKey) {\n model.redo();\n } else {\n model.undo();\n }\n return;\n }\n }\n }\n\n switch (ev.key) {\n case 'ArrowUp':\n case 'ArrowDown':\n case 'ArrowLeft':\n case 'ArrowRight':\n case 'Home':\n case 'End': {\n const next = handleNav(ev, cursor, range, size);\n setRange(next.range);\n if (next.cursor) {\n setCursor(next.cursor);\n const element = getCellElement(scrollerRef.current!, next.cursor);\n if (element) {\n scrollIntoView(scrollerRef.current!, element);\n }\n }\n break;\n }\n\n case 'Backspace': {\n if (cursor) {\n if (range) {\n model.clear(range);\n } else {\n model.setValue(cursor, null);\n }\n }\n break;\n }\n\n case 'Escape': {\n setRange(undefined);\n break;\n }\n\n case 'Enter': {\n ev.stopPropagation();\n if (cursor) {\n setEditing(true);\n }\n break;\n }\n\n case '?': {\n onInfo?.();\n break;\n }\n\n default: {\n if (ev.key.length === 1) {\n initialText.current = ev.key;\n quickEdit.current = true;\n setEditing(true);\n }\n }\n }\n };\n\n // Mouse handlers for selection.\n const { handlers } = useRangeSelect((event, range) => {\n switch (event) {\n case 'start': {\n // if (!editing) {\n // setCursor(range?.from);\n // }\n setRange(undefined);\n break;\n }\n\n default: {\n setRange(range);\n }\n }\n });\n\n // Calculate visible grid.\n const { width, height, rowRange, columnRange } = useGridLayout({\n scroller: scrollerRef.current,\n size: { width: containerWidth, height: containerHeight },\n rows,\n columns,\n rowSizes,\n columnSizes,\n });\n\n // TODO(burdon): Prevent scroll if not attended.\n const id = fullyQualifiedId(model.sheet);\n const attendableAttrs = createAttendableAttributes(id);\n const hasAttention = useHasAttention(id);\n\n return (\n <div ref={containerRef} role='grid' className='relative flex grow overflow-hidden'>\n {/* Fixed border. */}\n <div className={mx('z-20 absolute inset-0 border border-gridLine pointer-events-none')} />\n\n {/* Grid scroll container. */}\n <div ref={scrollerRef} className={mx('grow', hasAttention && 'overflow-auto scrollbar-thin')}>\n {/* Scroll content. */}\n <div\n className='relative select-none'\n style={{ width, height }}\n onClick={() => inputRef.current?.focus()}\n {...handlers}\n >\n {/* Selection. */}\n {scrollerRef.current && <SelectionOverlay root={scrollerRef.current} />}\n\n {/* Grid cells. */}\n {rowRange.map(({ row, top, height }) => {\n return columnRange.map(({ column, left, width }) => {\n const style: CSSProperties = { position: 'absolute', top, left, width, height };\n const cell = { row, column };\n const id = addressToA1Notation(cell);\n const idx = model.addressToIndex(cell);\n const active = posEquals(cursor, cell);\n if (active && editing) {\n const value = initialText.current ?? model.getCellText(cell) ?? '';\n\n // TODO(burdon): Validate formula before closing: hf.validateFormula();\n const handleClose: GridCellEditorProps['onClose'] = (value) => {\n initialText.current = undefined;\n quickEdit.current = false;\n if (value !== undefined) {\n model.setValue(cell, value);\n // Auto-advance to next cell.\n const next = handleArrowNav({ key: 'ArrowDown', metaKey: false }, cursor, size);\n if (next) {\n setCursor(next);\n }\n }\n inputRef.current?.focus();\n setEditing(false);\n };\n\n // Quick entry mode: i.e., typing to enter cell.\n const handleNav: GridCellEditorProps['onNav'] = (value, { key }) => {\n initialText.current = undefined;\n model.setValue(cell, value ?? null);\n const next = handleArrowNav({ key, metaKey: false }, cursor, size);\n if (next) {\n setCursor(next);\n }\n inputRef.current?.focus();\n setEditing(false);\n };\n\n return (\n <GridCellEditor\n key={idx}\n value={value}\n style={style}\n onNav={quickEdit.current ? handleNav : undefined}\n onClose={handleClose}\n />\n );\n }\n\n return (\n <SheetCell\n key={id}\n id={id}\n cell={cell}\n active={active}\n style={style}\n onSelect={(cell, edit) => {\n setEditing(edit);\n setCursor(cell);\n }}\n />\n );\n });\n })}\n </div>\n </div>\n\n {/* Hidden input for key navigation. */}\n {createPortal(\n <input\n ref={inputRef}\n autoFocus\n className='absolute w-[1px] h-[1px] bg-transparent outline-none border-none caret-transparent'\n onKeyDown={handleKeyDown}\n {...attendableAttrs}\n />,\n document.body,\n )}\n </div>\n );\n },\n);\n\n//\n// Selection\n//\n\nconst SelectionOverlay = ({ root }: { root: HTMLDivElement }) => {\n const { range } = useSheetContext();\n if (!range) {\n return null;\n }\n\n const c1 = getCellElement(root, range.from);\n const c2 = range.to ? getCellElement(root, range.to)! : c1;\n if (!c1 || !c2) {\n return null;\n }\n\n // TODO(burdon): Instead of measuring cells, get from grid layout?\n const b1 = getRelativeClientRect(root, c1);\n const b2 = getRelativeClientRect(root, c2);\n const bounds = getRectUnion(b1, b2);\n\n return (\n <div\n role='none'\n style={bounds}\n className='z-10 absolute pointer-events-none bg-gridSelectionOverlay border border-gridOverlay'\n />\n );\n};\n\n//\n// Cell\n//\n\ntype SheetCellProps = {\n id: string; // TODO(burdon): Should this be the index?\n cell: CellAddress;\n style: CSSProperties;\n active: boolean;\n onSelect?: (selected: CellAddress, edit: boolean) => void;\n};\n\nconst SheetCell = ({ id, cell, style, active, onSelect }: SheetCellProps) => {\n const { formatting, editing, setRange } = useSheetContext();\n const { value, classNames } = formatting.getFormatting(cell);\n\n return (\n <div\n {...{ [`data-${CELL_DATA_KEY}`]: id }}\n role='cell'\n style={style}\n className={mx(\n 'flex w-full h-full px-2 py-1 truncate items-center border border-gridLine cursor-pointer',\n fragments.cell,\n active && ['z-20', fragments.cellSelected],\n classNames,\n )}\n onClick={() => {\n if (editing) {\n setRange?.({ from: cell });\n } else {\n onSelect?.(cell, false);\n }\n }}\n onDoubleClick={() => onSelect?.(cell, true)}\n >\n {value}\n </div>\n );\n};\n\ntype GridCellEditorProps = {\n style: CSSProperties;\n value: string;\n} & EditorKeysProps;\n\nconst GridCellEditor = ({ style, value, onNav, onClose }: GridCellEditorProps) => {\n const { model, range } = useSheetContext();\n const notifier = useRef<CellRangeNotifier>();\n useEffect(() => {\n if (range) {\n // Update range selection in formula.\n notifier.current?.(rangeToA1Notation(range));\n }\n }, [range]);\n const extension = useMemo(\n () => [\n editorKeys({ onNav, onClose }),\n sheetExtension({ functions: model.functions }),\n rangeExtension((fn) => (notifier.current = fn)),\n ],\n [model],\n );\n\n return (\n <div\n role='cell'\n style={style}\n className={mx('z-20 flex', fragments.cellSelected)}\n onClick={(ev) => ev.stopPropagation()}\n >\n <CellEditor autoFocus value={value} extension={extension} />\n </div>\n );\n};\n\n//\n// StatusBar\n//\n\nconst SheetStatusBar = () => {\n const { model, cursor, range } = useSheetContext();\n let value;\n let isFormula = false;\n if (cursor) {\n value = model.getCellValue(cursor);\n if (typeof value === 'string' && value.charAt(0) === '=') {\n value = model.mapFormulaBindingFromId(model.mapFormulaIndicesToRefs(value));\n isFormula = true;\n } else if (value != null) {\n value = String(value);\n }\n }\n\n return (\n <div className={mx('flex shrink-0 justify-between items-center px-4 py-1 text-sm border-x border-gridLine')}>\n <div className='flex gap-4 items-center'>\n <div className='flex w-16 items-center font-mono'>\n {(range && rangeToA1Notation(range)) || (cursor && addressToA1Notation(cursor))}\n </div>\n <div className='flex gap-2 items-center'>\n <FunctionIcon className={mx('text-greenText', isFormula ? 'visible' : 'invisible')} />\n <span className='font-mono'>{value}</span>\n </div>\n </div>\n </div>\n );\n};\n\n//\n// Debug\n//\n\nconst SheetDebug = () => {\n const { model, cursor, range } = useSheetContext();\n const [, forceUpdate] = useState({});\n useEffect(() => {\n // TODO(burdon): This is called without registering a listener.\n const accessor = createDocAccessor(model.sheet, []);\n const handleUpdate = () => forceUpdate({});\n accessor.handle.addListener('change', handleUpdate);\n handleUpdate();\n return () => {\n accessor.handle.removeListener('change', handleUpdate);\n };\n }, [model]);\n\n return (\n <div\n className={mx(\n 'z-20 absolute right-0 top-20 bottom-20 w-[30rem] overflow-auto scrollbar-thin',\n 'border border-gridLine text-xs bg-neutral-50 dark:bg-black text-cyan-500 font-mono p-1 opacity-80',\n )}\n >\n <pre className='whitespace-pre-wrap'>\n {JSON.stringify(\n {\n cursor,\n range,\n cells: model.sheet.cells,\n rowMeta: model.sheet.rowMeta,\n columnMeta: model.sheet.columnMeta,\n formatting: model.sheet.formatting,\n },\n undefined,\n 2,\n )}\n </pre>\n </div>\n );\n};\n\n//\n// Grid\n//\n\nexport const Sheet = {\n Root: SheetRoot,\n Main: SheetMain,\n Rows: SheetRows,\n Columns: SheetColumns,\n Grid: SheetGrid,\n Cell: SheetCell,\n StatusBar: SheetStatusBar,\n Debug: SheetDebug,\n};\n\nexport type { SheetRootProps, SheetMainProps, SheetRowsProps, SheetColumnsProps, SheetGridProps, SheetCellProps };\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type MouseEvent, useEffect, useState } from 'react';\n\nimport { type CellAddress, type CellIndex, addressFromA1Notation, addressToA1Notation } from '../../model';\n\n// export type Bounds = Pick<DOMRect, 'left' | 'top' | 'width' | 'height'>;\n// export type Dimension = Pick<DOMRect, 'width' | 'height'>;\n\nexport type SizeMap = Record<string, number>;\n\nexport type RowPosition = { row: number } & Pick<DOMRect, 'top' | 'height'>;\nexport type ColumnPosition = { column: number } & Pick<DOMRect, 'left' | 'width'>;\n\nexport const axisWidth = 'calc(var(--rail-size)-2px)';\nexport const axisHeight = 34;\n\nexport const minWidth = 40;\nexport const maxWidth = 800;\n\nexport const minHeight = axisHeight;\nexport const maxHeight = 400;\n\nexport const defaultWidth = 200;\nexport const defaultHeight = minHeight;\n\n/**\n * Cell nodes are identified by their A1 notation.\n */\nexport const CELL_DATA_KEY = 'cell';\n\nexport type GridLayoutProps = {\n rows: CellIndex[];\n columns: CellIndex[];\n rowSizes?: SizeMap;\n columnSizes?: SizeMap;\n};\n\nexport type GridLayout = {\n width: number;\n height: number;\n rowRange: RowPosition[];\n columnRange: ColumnPosition[];\n};\n\n/**\n * Calculates the grid geometry for the current viewport.\n */\nexport const useGridLayout = ({\n scroller,\n size,\n rows,\n columns,\n rowSizes,\n columnSizes,\n}: GridLayoutProps & {\n scroller: HTMLDivElement | null;\n size: { width: number; height: number };\n}): GridLayout => {\n const [rowPositions, setRowPositions] = useState<RowPosition[]>([]);\n useEffect(() => {\n if (!rowSizes) {\n return;\n }\n\n let y = 0;\n setRowPositions(\n rows.map((idx, i) => {\n const height = rowSizes?.[idx] ?? defaultHeight;\n const top = y;\n y += height - 1;\n return { row: i, top, height };\n }),\n );\n }, [rows, rowSizes]);\n\n const [columnPositions, setColumnPositions] = useState<ColumnPosition[]>([]);\n useEffect(() => {\n if (!columns) {\n return;\n }\n\n let x = 0;\n setColumnPositions(\n columns.map((idx, i) => {\n const width = columnSizes?.[idx] ?? defaultWidth;\n const left = x;\n x += width - 1;\n return { column: i, left, width };\n }),\n );\n }, [columns, columnSizes]);\n\n const height = rowPositions.length\n ? rowPositions[rowPositions.length - 1].top + rowPositions[rowPositions.length - 1].height\n : 0;\n\n const width = columnPositions.length\n ? columnPositions[columnPositions.length - 1].left + columnPositions[columnPositions.length - 1].width\n : 0;\n\n //\n // Virtual window.\n // TODO(burdon): Preserve edit state, selection.\n // TODO(burdon): BUG: Doesn't scroll to cursor if jump to end.\n //\n\n const [{ rowRange, columnRange }, setWindow] = useState<{\n rowRange: RowPosition[];\n columnRange: ColumnPosition[];\n }>({ rowRange: [], columnRange: [] });\n useEffect(() => {\n const handleScroll = () => {\n if (!scroller) {\n return;\n }\n\n const { scrollLeft: left, scrollTop: top, clientWidth: width, clientHeight: height } = scroller;\n\n let rowStart = 0;\n let rowEnd = 0;\n for (let i = 0; i < rowPositions.length; i++) {\n const row = rowPositions[i];\n if (row.top <= top) {\n rowStart = i;\n }\n if (row.top + row.height >= top + height) {\n rowEnd = i;\n break;\n }\n }\n\n let columnStart = 0;\n let columnEnd = 0;\n for (let i = 0; i < columnPositions.length; i++) {\n const column = columnPositions[i];\n if (column.left <= left) {\n columnStart = i;\n }\n if (column.left + column.width >= left + width) {\n columnEnd = i;\n break;\n }\n }\n\n const overscan = 5;\n setWindow({\n rowRange: rowPositions.slice(\n Math.max(0, rowStart - overscan),\n Math.min(rowPositions.length, rowEnd + overscan),\n ),\n columnRange: columnPositions.slice(\n Math.max(0, columnStart - overscan),\n Math.min(columnPositions.length, columnEnd + overscan),\n ),\n });\n };\n\n scroller?.addEventListener('scroll', handleScroll);\n handleScroll();\n return () => {\n scroller?.removeEventListener('scroll', handleScroll);\n };\n }, [size.width, size.height, rowPositions, columnPositions]);\n\n return { width, height, rowRange, columnRange };\n};\n\n/**\n * Find child node at mouse pointer.\n */\nexport const getCellAtPointer = (event: MouseEvent): CellAddress | undefined => {\n const element = document.elementFromPoint(event.clientX, event.clientY);\n const root = element?.closest<HTMLDivElement>(`[data-${CELL_DATA_KEY}]`);\n if (root) {\n const value = root.dataset[CELL_DATA_KEY];\n if (value) {\n return addressFromA1Notation(value);\n }\n }\n};\n\n/**\n * Get element.\n */\nexport const getCellElement = (root: HTMLElement, cell: CellAddress): HTMLElement | null => {\n const pos = addressToA1Notation(cell);\n return root.querySelector(`[data-${CELL_DATA_KEY}=\"${pos}\"]`);\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type KeyboardEvent, type MouseEventHandler, useState } from 'react';\n\nimport { getCellAtPointer } from './grid';\nimport { type CellAddress, type CellRange, posEquals } from '../../model';\n\nexport type GridSize = {\n numRows: number;\n numColumns: number;\n};\n\n/**\n * Calculate next range based on arrow keys.\n */\nexport const handleNav = (\n ev: KeyboardEvent<HTMLInputElement>,\n cursor: CellAddress | undefined,\n range: CellRange | undefined,\n size: GridSize,\n): { cursor?: CellAddress; range?: CellRange } => {\n if (cursor && ev.shiftKey) {\n // Navigate from the furthest point.\n const opposite = range?.to ?? { ...cursor };\n switch (ev.key) {\n case 'ArrowUp': {\n if (opposite.row > 0) {\n opposite.row -= 1;\n }\n break;\n }\n case 'ArrowDown': {\n if (opposite.row < size.numRows - 1) {\n opposite.row += 1;\n }\n break;\n }\n case 'ArrowLeft': {\n if (opposite.column > 0) {\n opposite.column -= 1;\n }\n break;\n }\n case 'ArrowRight': {\n if (opposite.column < size.numColumns - 1) {\n opposite.column += 1;\n }\n break;\n }\n }\n\n return { cursor, range: { from: cursor, to: opposite } };\n }\n\n const next = handleArrowNav(ev, cursor, size);\n return { cursor: next };\n};\n\n/**\n * Calculate next cell based on arrow keys.\n */\nexport const handleArrowNav = (\n ev: Pick<KeyboardEvent<HTMLInputElement>, 'key' | 'metaKey'>,\n cursor: CellAddress | undefined,\n { numRows, numColumns }: GridSize,\n): CellAddress | undefined => {\n switch (ev.key) {\n case 'ArrowUp':\n if (cursor === undefined) {\n return { row: 0, column: 0 };\n } else if (cursor.row > 0) {\n return { row: ev.metaKey ? 0 : cursor.row - 1, column: cursor.column };\n }\n break;\n case 'ArrowDown':\n if (cursor === undefined) {\n return { row: 0, column: 0 };\n } else if (cursor.row < numRows - 1) {\n return { row: ev.metaKey ? numRows - 1 : cursor.row + 1, column: cursor.column };\n }\n break;\n case 'ArrowLeft':\n if (cursor === undefined) {\n return { row: 0, column: 0 };\n } else if (cursor.column > 0) {\n return { row: cursor.row, column: ev.metaKey ? 0 : cursor.column - 1 };\n }\n break;\n case 'ArrowRight':\n if (cursor === undefined) {\n return { row: 0, column: 0 };\n } else if (cursor.column < numColumns - 1) {\n return { row: cursor.row, column: ev.metaKey ? numColumns - 1 : cursor.column + 1 };\n }\n break;\n case 'Home':\n return { row: 0, column: 0 };\n case 'End':\n return { row: numRows - 1, column: numColumns - 1 };\n }\n};\n\n/**\n * Hook to manage range drag handlers.\n */\n// TODO(burdon): Memoize callbacks?\nexport const useRangeSelect = (\n cb: (event: 'start' | 'move' | 'end', range: CellRange | undefined) => void,\n): {\n range: CellRange | undefined;\n handlers: {\n onMouseDown: MouseEventHandler<HTMLDivElement>;\n onMouseMove: MouseEventHandler<HTMLDivElement>;\n onMouseUp: MouseEventHandler<HTMLDivElement>;\n };\n} => {\n const [from, setFrom] = useState<CellAddress | undefined>();\n const [to, setTo] = useState<CellAddress | undefined>();\n\n const onMouseDown: MouseEventHandler<HTMLDivElement> = (ev) => {\n const current = getCellAtPointer(ev);\n setFrom(current);\n if (current) {\n setTimeout(() => cb('start', { from: current }));\n }\n };\n\n const onMouseMove: MouseEventHandler<HTMLDivElement> = (ev) => {\n if (from) {\n let current = getCellAtPointer(ev);\n if (posEquals(current, from)) {\n current = undefined;\n }\n setTo(current);\n setTimeout(() => cb('move', { from, to: current }));\n }\n };\n\n const onMouseUp: MouseEventHandler<HTMLDivElement> = (ev) => {\n if (from) {\n let current = getCellAtPointer(ev);\n if (posEquals(current, from)) {\n current = undefined;\n }\n setFrom(undefined);\n setTo(undefined);\n setTimeout(() => cb('end', current ? { from, to: current } : undefined));\n }\n };\n\n return {\n range: from ? { from, to } : undefined,\n handlers: { onMouseDown, onMouseMove, onMouseUp },\n };\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { type PropsWithChildren, createContext, useContext, useState, useEffect } from 'react';\n\nimport { invariant } from '@dxos/invariant';\nimport { type FunctionType } from '@dxos/plugin-script';\nimport { fullyQualifiedId, type Space } from '@dxos/react-client/echo';\n\nimport { FormattingModel } from './formatting';\nimport { type CellAddress, type CellRange, defaultFunctions, SheetModel } from '../../model';\nimport { type SheetType } from '../../types';\nimport { type FunctionContextOptions } from '../ComputeGraph';\n// TODO(wittjosiah): Refactor. This is not exported from ./components due to depending on ECHO.\nimport { useComputeGraph } from '../ComputeGraph/graph-context';\n\n// TODO(wittjosiah): Factor out.\nconst OBJECT_ID_LENGTH = 60; // 33 (space id) + 26 (object id) + 1 (separator).\n\nexport type SheetContextType = {\n model: SheetModel;\n formatting: FormattingModel;\n\n // Cursor state.\n // TODO(burdon): Cursor and range should use indices.\n cursor?: CellAddress;\n setCursor: (cell: CellAddress | undefined) => void;\n range?: CellRange;\n setRange: (range: CellRange | undefined) => void;\n\n // Editing state (undefined if not editing).\n editing: boolean;\n setEditing: (editing: boolean) => void;\n\n // Events.\n // TODO(burdon): Generalize.\n onInfo?: () => void;\n};\n\nconst SheetContext = createContext<SheetContextType | null>(null);\n\nexport const useSheetContext = (): SheetContextType => {\n const context = useContext(SheetContext);\n invariant(context);\n return context;\n};\n\nexport type SheetContextProps = {\n sheet: SheetType;\n space: Space;\n readonly?: boolean;\n} & Pick<SheetContextType, 'onInfo'> &\n Partial<FunctionContextOptions>;\n\n/**\n * Map from binding to fully qualified ECHO ID.\n */\nconst mapFormulaBindingToId =\n (functions: FunctionType[]) =>\n (formula: string): string => {\n return formula.replace(/([a-zA-Z0-9]+)\\((.*)\\)/g, (match, binding, args) => {\n if (defaultFunctions.find((fn) => fn.name === binding) || binding === 'EDGE') {\n return match;\n }\n\n const fn = functions.find((fn) => fn.binding === binding);\n if (fn) {\n return `${fullyQualifiedId(fn)}(${args})`;\n } else {\n return match;\n }\n });\n };\n\n/**\n * Map from fully qualified ECHO ID to binding.\n */\nconst mapFormulaBindingFromId =\n (functions: FunctionType[]) =>\n (formula: string): string => {\n return formula.replace(/([a-zA-Z0-9]+):([a-zA-Z0-9]+)\\((.*)\\)/g, (match, spaceId, objectId, args) => {\n const id = `${spaceId}:${objectId}`;\n if (id.length !== OBJECT_ID_LENGTH) {\n return match;\n }\n\n const fn = functions.find((fn) => fullyQualifiedId(fn) === id);\n if (fn?.binding) {\n return `${fn.binding}(${args})`;\n } else {\n return match;\n }\n });\n };\n\nexport const SheetContextProvider = ({\n children,\n sheet,\n space,\n readonly,\n onInfo,\n ...options\n}: PropsWithChildren<SheetContextProps>) => {\n const graph = useComputeGraph(space, options);\n\n const [cursor, setCursor] = useState<CellAddress>();\n const [range, setRange] = useState<CellRange>();\n const [editing, setEditing] = useState<boolean>(false);\n\n const [[model, formatting] = [], setModels] = useState<[SheetModel, FormattingModel] | undefined>(undefined);\n useEffect(() => {\n let model: SheetModel | undefined;\n let formatting;\n const t = setTimeout(async () => {\n model = new SheetModel(graph, sheet, space, { readonly, mapFormulaBindingToId, mapFormulaBindingFromId });\n await model.initialize();\n formatting = new FormattingModel(model);\n setModels([model, formatting]);\n });\n\n return () => {\n clearTimeout(t);\n void model?.destroy();\n };\n }, [graph, readonly]);\n\n if (!model || !formatting) {\n return null;\n }\n\n return (\n <SheetContext.Provider\n value={{\n model,\n formatting,\n cursor,\n setCursor,\n range,\n setRange,\n editing,\n setEditing,\n // TODO(burdon): Change to event.\n onInfo,\n }}\n >\n {children}\n </SheetContext.Provider>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type ClassNameValue } from '@dxos/react-ui-types';\n\nimport { type SheetModel, type CellAddress, inRange } from '../../model';\nimport { ValueTypeEnum } from '../../types';\n\nexport class FormattingModel {\n constructor(private readonly model: SheetModel) {}\n\n /**\n * Get formatted string value and className for cell.\n */\n getFormatting(cell: CellAddress): { value?: string; classNames?: ClassNameValue } {\n const value = this.model.getValue(cell);\n if (value === undefined || value === null) {\n return {};\n }\n\n // TODO(burdon): Locale.\n const locales = undefined;\n\n // Cell-specific formatting.\n const idx = this.model.addressToIndex(cell);\n let formatting = this.model.sheet.formatting?.[idx] ?? {};\n const classNames = [...(formatting?.classNames ?? [])];\n\n // Range formatting.\n // TODO(burdon): NOTE: D0 means the D column.\n // TODO(burdon): Cache model formatting (e.g., for ranges). Create class out of this function.\n for (const [idx, _formatting] of Object.entries(this.model.sheet.formatting)) {\n const range = this.model.rangeFromIndex(idx);\n if (inRange(range, cell)) {\n if (_formatting.classNames) {\n classNames.push(..._formatting.classNames);\n }\n\n // TODO(burdon): Last wins.\n if (_formatting.type) {\n formatting = _formatting;\n }\n }\n }\n\n const defaultNumber = 'justify-end font-mono';\n\n const type = formatting?.type ?? this.model.getValueType(cell);\n switch (type) {\n case ValueTypeEnum.Boolean: {\n return {\n value: (value as boolean).toLocaleString().toUpperCase(),\n classNames: [...classNames, value ? '!text-greenText' : '!text-orangeText'],\n };\n }\n\n //\n // Numbers.\n //\n\n case ValueTypeEnum.Number: {\n return { value: value.toLocaleString(locales), classNames: [...classNames, defaultNumber] };\n }\n\n case ValueTypeEnum.Percent: {\n return { value: (value as number) * 100 + '%', classNames: [...classNames, defaultNumber] };\n }\n\n case ValueTypeEnum.Currency: {\n return {\n value: (value as number).toLocaleString(locales, {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }),\n classNames: [...classNames, defaultNumber],\n };\n }\n\n //\n // Dates.\n //\n\n case ValueTypeEnum.DateTime: {\n const date = this.model.toLocalDate(value as number);\n return { value: date.toLocaleString(locales), classNames };\n }\n\n case ValueTypeEnum.Date: {\n const date = this.model.toLocalDate(value as number);\n return { value: date.toLocaleDateString(locales), classNames };\n }\n\n case ValueTypeEnum.Time: {\n const date = this.model.toLocalDate(value as number);\n return { value: date.toLocaleTimeString(locales), classNames };\n }\n\n default: {\n return { value: String(value), classNames };\n }\n }\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\n/**\n * Gets the relative client rect of an element within a parent container.\n * NOTE: This is stable even when the parent is scrolling.\n * https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect\n * @param root Parent container (e.g., scrollable container).\n * @param element\n */\nexport const getRelativeClientRect = (root: HTMLElement, element: HTMLElement): DOMRect => {\n const rootRect = root.getBoundingClientRect();\n const elementRect = element.getBoundingClientRect();\n return new DOMRect(\n elementRect.left - rootRect.left + root.scrollLeft,\n elementRect.top - rootRect.top + root.scrollTop,\n elementRect.width,\n elementRect.height,\n );\n};\n\n/**\n * Union of two rectangles.\n */\nexport const getRectUnion = (b1: DOMRect, b2: DOMRect): Pick<DOMRect, 'left' | 'top' | 'width' | 'height'> => {\n return {\n left: Math.min(b1.left, b2.left),\n top: Math.min(b1.top, b2.top),\n width: Math.abs(b1.left - b2.left) + (b1.left > b2.left ? b1.width : b2.width),\n height: Math.abs(b1.top - b2.top) + (b1.height > b2.height ? b1.height : b2.height),\n };\n};\n\n/**\n * Scroll to cell.\n * We need to correct for the DOM `scrollIntoView` function which doesn't show the border.\n */\nexport const scrollIntoView = (scrollContainer: HTMLElement, el: HTMLElement) => {\n el.scrollIntoView({ block: 'nearest', inline: 'nearest' });\n\n const cellBounds = el.getBoundingClientRect();\n const scrollerBounds = scrollContainer.getBoundingClientRect();\n\n if (cellBounds.top < scrollerBounds.top) {\n scrollContainer.scrollTop -= scrollerBounds.top - cellBounds.top;\n } else if (cellBounds.bottom >= scrollerBounds.bottom - 1) {\n scrollContainer.scrollTop += 2 + scrollerBounds.bottom - cellBounds.bottom;\n }\n\n if (cellBounds.left < scrollerBounds.left) {\n scrollContainer.scrollLeft -= scrollerBounds.left - cellBounds.left;\n } else if (cellBounds.right >= scrollerBounds.right) {\n scrollContainer.scrollLeft += 2 + scrollerBounds.right - cellBounds.right;\n }\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type Extension } from '@codemirror/state';\nimport { EditorView, keymap } from '@codemirror/view';\nimport React, { type DOMAttributes, type KeyboardEvent } from 'react';\n\nimport { useThemeContext } from '@dxos/react-ui';\nimport {\n type UseTextEditorProps,\n createBasicExtensions,\n createThemeExtensions,\n preventNewline,\n useTextEditor,\n} from '@dxos/react-ui-editor';\n\nexport type EditorKeysProps = {\n onClose: (value: string | undefined) => void;\n onNav?: (value: string | undefined, ev: Pick<KeyboardEvent<HTMLInputElement>, 'key'>) => void;\n};\n\nexport const editorKeys = ({ onNav, onClose }: EditorKeysProps): Extension => {\n return keymap.of([\n {\n key: 'ArrowUp',\n run: (editor) => {\n const value = editor.state.doc.toString();\n onNav?.(value, { key: 'ArrowUp' });\n return !!onNav;\n },\n },\n {\n key: 'ArrowDown',\n run: (editor) => {\n const value = editor.state.doc.toString();\n onNav?.(value, { key: 'ArrowDown' });\n return !!onNav;\n },\n },\n {\n key: 'ArrowLeft',\n run: (editor) => {\n const value = editor.state.doc.toString();\n onNav?.(value, { key: 'ArrowLeft' });\n return !!onNav;\n },\n },\n {\n key: 'ArrowRight',\n run: (editor) => {\n const value = editor.state.doc.toString();\n onNav?.(value, { key: 'ArrowRight' });\n return !!onNav;\n },\n },\n {\n key: 'Enter',\n run: (editor) => {\n onClose(editor.state.doc.toString());\n return true;\n },\n },\n {\n key: 'Escape',\n run: () => {\n onClose(undefined);\n return true;\n },\n },\n ]);\n};\n\nexport type CellEditorProps = {\n value?: string;\n extension?: Extension;\n} & Pick<UseTextEditorProps, 'autoFocus'> &\n Pick<DOMAttributes<HTMLInputElement>, 'onBlur' | 'onKeyDown'>;\n\nexport const CellEditor = ({ value, extension, autoFocus, onBlur }: CellEditorProps) => {\n const { themeMode } = useThemeContext();\n const { parentRef } = useTextEditor(() => {\n return {\n autoFocus,\n initialValue: value,\n selection: { anchor: value?.length ?? 0 },\n extensions: [\n extension ?? [],\n preventNewline,\n EditorView.focusChangeEffect.of((_, focusing) => {\n if (!focusing) {\n onBlur?.({ type: 'blur' } as any);\n }\n return null;\n }),\n createBasicExtensions({ lineWrapping: false }),\n createThemeExtensions({\n themeMode,\n slots: {\n editor: {\n className: 'flex w-full [&>.cm-scroller]:scrollbar-none',\n },\n content: {\n className: '!px-2 !py-1',\n },\n },\n }),\n ],\n };\n }, [extension]);\n\n return <div ref={parentRef} className='flex w-full' />;\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport {\n type Completion,\n type CompletionContext,\n type CompletionResult,\n acceptCompletion,\n autocompletion,\n completionStatus,\n startCompletion,\n} from '@codemirror/autocomplete';\nimport { HighlightStyle, type Language, syntaxHighlighting } from '@codemirror/language';\nimport { type Extension, Facet } from '@codemirror/state';\nimport { type EditorView, ViewPlugin, type ViewUpdate, keymap } from '@codemirror/view';\nimport { type SyntaxNode } from '@lezer/common';\nimport { tags } from '@lezer/highlight';\nimport { spreadsheet } from 'codemirror-lang-spreadsheet';\n\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { type FunctionDefinition } from '../../model';\n\n/**\n * https://codemirror.net/examples/styling\n * https://lezer.codemirror.net/docs/ref/#highlight\n * https://github.com/luizzappa/codemirror-lang-spreadsheet/blob/main/src/index.ts#L28 (mapping)\n */\n// TODO(burdon): Define light/dark.\nconst highlightStyles = HighlightStyle.define([\n // Function.\n {\n tag: tags.name,\n class: 'text-accentText',\n },\n // Range.\n {\n tag: tags.tagName,\n class: 'text-pinkText',\n },\n // Values.\n {\n tag: tags.number,\n class: 'text-tealText',\n },\n {\n tag: tags.bool,\n class: 'text-tealText',\n },\n {\n tag: tags.string,\n class: 'text-tealText',\n },\n // Error.\n {\n tag: tags.invalid,\n class: 'text-unAccent',\n },\n]);\n\nconst languageFacet = Facet.define<Language>();\n\nexport type SheetExtensionOptions = {\n functions?: FunctionDefinition[];\n};\n\n/**\n * Spreadsheet formula extension and parser.\n * https://github.com/luizzappa/codemirror-lang-spreadsheet\n * https://github.com/luizzappa/codemirror-app-spreadsheet/blob/master/src/editor.ts\n * https://github.com/codemirror/lang-example\n * https://hyperformula.handsontable.com/guide/key-concepts.html#grammar\n */\nexport const sheetExtension = ({ functions = [] }: SheetExtensionOptions): Extension => {\n const { extension, language } = spreadsheet({ idiom: 'en-US', decimalSeparator: '.' });\n\n const createCompletion = (name: string) => {\n const { section = 'Custom', description, syntax } = functions.find((value) => value.name === name) ?? {};\n\n return {\n section,\n label: name,\n info: () => {\n if (!description && !syntax) {\n return null;\n }\n\n // TODO(burdon): Standardize color styles.\n const root = document.createElement('div');\n root.className = 'flex flex-col gap-2 text-sm';\n\n const title = document.createElement('h2');\n title.innerText = name;\n title.className = 'text-lg font-mono text-accentText';\n root.appendChild(title);\n\n if (description) {\n const info = document.createElement('p');\n info.innerText = description;\n info.className = 'text-subdued';\n root.appendChild(info);\n }\n\n if (syntax) {\n const detail = document.createElement('pre');\n detail.innerText = syntax;\n detail.className = 'whitespace-pre-wrap text-greenText';\n root.appendChild(detail);\n }\n\n return root;\n },\n apply: (view, completion, from, to) => {\n const insertParens = to === view.state.doc.toString().length;\n view.dispatch(\n view.state.update({\n changes: {\n from,\n to,\n insert: completion.label + (insertParens ? '()' : ''),\n },\n selection: {\n anchor: from + completion.label.length + 1,\n },\n }),\n );\n },\n } satisfies Completion;\n };\n\n return [\n extension,\n languageFacet.of(language),\n language.data.of({\n autocomplete: (context: CompletionContext): CompletionResult | null => {\n if (context.state.doc.toString()[0] !== '=') {\n return null;\n }\n const match = context.matchBefore(/\\w*/);\n if (!match || match.from === match.to) {\n return null;\n }\n\n const text = match.text.toUpperCase();\n if (!context.explicit && match.text.length < 2) {\n return null;\n }\n\n return {\n from: match.from,\n options:\n functions?.filter(({ name }) => name.startsWith(text)).map(({ name }) => createCompletion(name)) ?? [],\n };\n },\n }),\n\n syntaxHighlighting(highlightStyles),\n autocompletion({\n aboveCursor: false,\n defaultKeymap: true,\n activateOnTyping: true,\n // NOTE: Useful for debugging.\n closeOnBlur: false,\n icons: false,\n tooltipClass: () =>\n mx(\n // TODO(burdon): Factor out fragments.\n // TODO(burdon): Size to make width same as column.\n '!-left-[1px] !top-[33px] !-m-0 border !border-t-0 [&>ul]:!min-w-[198px]',\n '[&>ul>li[aria-selected]]:!bg-accentSurface',\n 'border-separator',\n ),\n }),\n keymap.of([\n {\n key: 'Tab',\n run: (view) => {\n return completionStatus(view.state) === 'active' ? acceptCompletion(view) : startCompletion(view);\n },\n },\n ]),\n\n // Parsing.\n // StateField.define({\n // create: (state) => {},\n // update: (value, tr) => {\n // log.info('update');\n // syntaxTree(tr.state).iterate({\n // enter: ({ type, from, to }) => {\n // log.info('node', { type: type.name, from, to });\n // },\n // });\n // },\n // }),\n ];\n};\n\nexport type CellRangeNotifier = (range: string) => void;\n\ntype Range = { from: number; to: number };\n\n/**\n * Tracks the currently active cell within a formula and provides a callback to modify it.\n */\nexport const rangeExtension = (onInit: (notifier: CellRangeNotifier) => void): Extension => {\n let view: EditorView;\n let activeRange: Range | undefined;\n const provider: CellRangeNotifier = (range: string) => {\n if (activeRange) {\n view.dispatch(\n view.state.update({\n changes: { ...activeRange, insert: range.toString() },\n selection: { anchor: activeRange.from + range.length },\n }),\n );\n }\n\n view.focus();\n };\n\n return ViewPlugin.fromClass(\n class {\n constructor(_view: EditorView) {\n view = _view;\n onInit(provider);\n }\n\n update(view: ViewUpdate) {\n const { anchor } = view.state.selection.ranges[0];\n\n // Find first Range or cell at cursor.\n activeRange = undefined;\n const [language] = view.state.facet(languageFacet);\n const { topNode } = language.parser.parse(view.state.doc.toString());\n visitTree(topNode, ({ type, from, to }) => {\n if (from <= anchor && to >= anchor) {\n switch (type.name) {\n case 'Function': {\n // Mark but keep looking.\n activeRange = { from: to, to };\n break;\n }\n\n case 'CloseParen': {\n // Mark but keep looking.\n activeRange = { from, to: from };\n break;\n }\n\n case 'RangeToken':\n case 'CellToken':\n activeRange = { from, to };\n return true;\n }\n }\n\n return false;\n });\n\n // Allow start of formula.\n if (!activeRange && view.state.doc.toString()[0] === '=') {\n activeRange = { from: 1, to: view.state.doc.toString().length };\n }\n }\n },\n );\n};\n\n/**\n * Lezer parse result visitor.\n */\nconst visitTree = (node: SyntaxNode, callback: (node: SyntaxNode) => boolean): boolean => {\n if (callback(node)) {\n return true;\n }\n\n for (let child = node.firstChild; child !== null; child = child.nextSibling) {\n if (visitTree(child, callback)) {\n return true;\n }\n }\n\n return false;\n};\n"],
5
- "mappings": "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",
6
- "names": ["import_react", "import_react_ui_theme", "import_echo", "import_view", "axisWidth", "axisHeight", "minWidth", "maxWidth", "minHeight", "maxHeight", "defaultWidth", "defaultHeight", "CELL_DATA_KEY", "useGridLayout", "scroller", "size", "rows", "columns", "rowSizes", "columnSizes", "rowPositions", "setRowPositions", "useState", "useEffect", "y", "map", "idx", "i", "height", "top", "row", "columnPositions", "setColumnPositions", "x", "width", "left", "column", "length", "rowRange", "columnRange", "setWindow", "handleScroll", "scrollLeft", "scrollTop", "clientWidth", "clientHeight", "rowStart", "rowEnd", "columnStart", "columnEnd", "overscan", "slice", "Math", "max", "min", "addEventListener", "removeEventListener", "getCellAtPointer", "event", "element", "document", "elementFromPoint", "clientX", "clientY", "root", "closest", "value", "dataset", "addressFromA1Notation", "getCellElement", "cell", "pos", "addressToA1Notation", "querySelector", "handleNav", "ev", "cursor", "range", "shiftKey", "opposite", "to", "key", "numRows", "numColumns", "from", "next", "handleArrowNav", "undefined", "metaKey", "useRangeSelect", "cb", "setFrom", "setTo", "onMouseDown", "current", "setTimeout", "onMouseMove", "posEquals", "onMouseUp", "handlers", "FormattingModel", "constructor", "model", "getFormatting", "getValue", "locales", "addressToIndex", "formatting", "sheet", "classNames", "_formatting", "Object", "entries", "rangeFromIndex", "inRange", "push", "type", "defaultNumber", "getValueType", "ValueTypeEnum", "Boolean", "toLocaleString", "toUpperCase", "Number", "Percent", "Currency", "style", "currency", "minimumFractionDigits", "maximumFractionDigits", "DateTime", "date", "toLocalDate", "Date", "toLocaleDateString", "Time", "toLocaleTimeString", "String", "OBJECT_ID_LENGTH", "SheetContext", "createContext", "useSheetContext", "context", "useContext", "invariant", "mapFormulaBindingToId", "functions", "formula", "replace", "match", "binding", "args", "defaultFunctions", "find", "fn", "name", "fullyQualifiedId", "mapFormulaBindingFromId", "spaceId", "objectId", "id", "SheetContextProvider", "children", "space", "readonly", "onInfo", "options", "graph", "useComputeGraph", "setCursor", "setRange", "editing", "setEditing", "setModels", "t", "SheetModel", "initialize", "clearTimeout", "destroy", "React", "Provider", "getRelativeClientRect", "rootRect", "getBoundingClientRect", "elementRect", "DOMRect", "getRectUnion", "b1", "b2", "abs", "scrollIntoView", "scrollContainer", "el", "block", "inline", "cellBounds", "scrollerBounds", "bottom", "right", "editorKeys", "onNav", "onClose", "keymap", "of", "run", "editor", "state", "doc", "toString", "CellEditor", "extension", "autoFocus", "onBlur", "themeMode", "useThemeContext", "parentRef", "useTextEditor", "initialValue", "selection", "anchor", "extensions", "preventNewline", "EditorView", "focusChangeEffect", "_", "focusing", "createBasicExtensions", "lineWrapping", "createThemeExtensions", "slots", "className", "content", "div", "ref", "highlightStyles", "HighlightStyle", "define", "tag", "tags", "class", "tagName", "number", "bool", "string", "invalid", "languageFacet", "Facet", "sheetExtension", "language", "spreadsheet", "idiom", "decimalSeparator", "createCompletion", "section", "description", "syntax", "label", "info", "createElement", "title", "innerText", "appendChild", "detail", "apply", "view", "completion", "insertParens", "dispatch", "update", "changes", "insert", "data", "autocomplete", "matchBefore", "text", "explicit", "filter", "startsWith", "syntaxHighlighting", "autocompletion", "aboveCursor", "defaultKeymap", "activateOnTyping", "closeOnBlur", "icons", "tooltipClass", "mx", "completionStatus", "acceptCompletion", "startCompletion", "rangeExtension", "onInit", "activeRange", "provider", "focus", "ViewPlugin", "fromClass", "_view", "ranges", "facet", "topNode", "parser", "parse", "visitTree", "node", "callback", "child", "firstChild", "nextSibling", "fragments", "axis", "axisSelected", "cellSelected", "SheetRoot", "props", "SheetMain", "forwardRef", "rowsRef", "columnsRef", "contentRef", "useScrollHandlers", "setRows", "setColumns", "rowsAccessor", "createDocAccessor", "columnsAccessor", "handleUpdate", "debounce", "handle", "addListener", "removeListener", "reset", "handleMoveRows", "num", "cursorIdx", "splice", "addressFromIndex", "handleMoveColumns", "setRowSizes", "setColumnSizes", "rowAccessor", "columnAccessor", "mapSizes", "values", "reduce", "meta", "rowMeta", "columnMeta", "handleResizeRow", "save", "sizes", "handleResizeColumn", "role", "GridCorner", "onClick", "SheetColumns", "selected", "onSelect", "onResize", "onMove", "SheetRows", "SheetGrid", "SheetStatusBar", "useRef", "handleRowsScroll", "target", "locked", "handleColumnsScroll", "handleContentScroll", "MovingOverlay", "mouseConstraints", "distance", "touchConstraints", "delay", "tolerance", "mouseSensor", "useSensor", "MouseSensor", "activationConstraint", "touchSensor", "TouchSensor", "keyboardSensor", "KeyboardSensor", "sensors", "useSensors", "active", "setActive", "handleDragStart", "handleDragEnd", "over", "index", "snapToCenter", "activatorEvent", "draggingNodeRect", "transform", "activatorCoordinates", "getEventCoordinates", "offset", "DndContext", "modifiers", "restrictToVerticalAxis", "onDragStart", "onDragEnd", "GridRowCell", "resize", "createPortal", "DragOverlay", "body", "setNodeRef", "setDroppableNodeRef", "useDroppable", "setDraggableNodeRef", "attributes", "listeners", "isDragging", "useDraggable", "useCombinedRefs", "initialSize", "setInitialSize", "resizing", "setResizing", "scrollHandler", "handleResizeStart", "_ev", "_dir", "elementRef", "handleResize", "_elementRef", "handleResizeStop", "Resizable", "enable", "onResizeStart", "onResizeStop", "span", "autoScroll", "enabled", "restrictToHorizontalAxis", "GridColumnCell", "columnLetter", "containerRef", "containerWidth", "containerHeight", "useResizeDetector", "refreshRate", "scrollerRef", "useImperativeHandle", "initialText", "quickEdit", "forceUpdate", "unsubscribe", "on", "log", "inputRef", "handleKeyDown", "isMacOS", "test", "navigator", "userAgent", "ctrlKey", "cut", "copy", "paste", "redo", "undo", "clear", "setValue", "stopPropagation", "attendableAttrs", "createAttendableAttributes", "hasAttention", "useHasAttention", "SelectionOverlay", "position", "getCellText", "handleClose", "GridCellEditor", "SheetCell", "edit", "input", "onKeyDown", "c1", "c2", "bounds", "onDoubleClick", "notifier", "rangeToA1Notation", "useMemo", "isFormula", "getCellValue", "charAt", "mapFormulaIndicesToRefs", "FunctionIcon", "SheetDebug", "accessor", "pre", "JSON", "stringify", "cells", "Sheet", "Root", "Main", "Rows", "Columns", "Grid", "Cell", "StatusBar", "Debug", "SheetContainer", "remoteFunctionUrl"]
7
- }