@dxos/plugin-sheet 0.6.13 → 0.6.14-main.69511f5

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 (330) hide show
  1. package/dist/lib/browser/SheetContainer-R65IDJHN.mjs +286 -0
  2. package/dist/lib/browser/SheetContainer-R65IDJHN.mjs.map +7 -0
  3. package/dist/lib/browser/chunk-5KVQ5IPW.mjs +65 -0
  4. package/dist/lib/browser/chunk-5KVQ5IPW.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-I2DKJ72A.mjs +1471 -0
  8. package/dist/lib/browser/chunk-I2DKJ72A.mjs.map +7 -0
  9. package/dist/lib/browser/{chunk-D5AGLXJP.mjs → chunk-KCYJSOFB.mjs} +625 -675
  10. package/dist/lib/browser/chunk-KCYJSOFB.mjs.map +7 -0
  11. package/dist/lib/browser/compute-graph-SJT67236.mjs +35 -0
  12. package/dist/lib/browser/compute-graph-SJT67236.mjs.map +7 -0
  13. package/dist/lib/browser/index.mjs +140 -67
  14. package/dist/lib/browser/index.mjs.map +4 -4
  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 +6 -12
  18. package/dist/lib/node/SheetContainer-6BO4C5X2.cjs +290 -0
  19. package/dist/lib/node/SheetContainer-6BO4C5X2.cjs.map +7 -0
  20. package/dist/lib/node/{chunk-DSYKOI4E.cjs → chunk-2XJ5I4UF.cjs} +32 -52
  21. package/dist/lib/node/chunk-2XJ5I4UF.cjs.map +7 -0
  22. package/dist/lib/node/chunk-DEPJHN47.cjs +1457 -0
  23. package/dist/lib/node/chunk-DEPJHN47.cjs.map +7 -0
  24. package/dist/lib/node/{chunk-5KKJ4NPP.cjs → chunk-JF5XNTF3.cjs} +643 -674
  25. package/dist/lib/node/chunk-JF5XNTF3.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/compute-graph-AQBDL7HO.cjs +57 -0
  29. package/dist/lib/node/compute-graph-AQBDL7HO.cjs.map +7 -0
  30. package/dist/lib/node/index.cjs +150 -75
  31. package/dist/lib/node/index.cjs.map +4 -4
  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 +9 -15
  36. package/dist/lib/node/types.cjs.map +2 -2
  37. package/dist/lib/node-esm/SheetContainer-MJXC5E3P.mjs +287 -0
  38. package/dist/lib/node-esm/SheetContainer-MJXC5E3P.mjs.map +7 -0
  39. package/dist/lib/node-esm/chunk-25V7WY4R.mjs +1472 -0
  40. package/dist/lib/node-esm/chunk-25V7WY4R.mjs.map +7 -0
  41. package/dist/lib/node-esm/chunk-5TXLF6PL.mjs +66 -0
  42. package/dist/lib/node-esm/chunk-5TXLF6PL.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-XBEHKYO7.mjs +3186 -0
  46. package/dist/lib/node-esm/chunk-XBEHKYO7.mjs.map +7 -0
  47. package/dist/lib/node-esm/compute-graph-FRCKXEYK.mjs +36 -0
  48. package/dist/lib/node-esm/compute-graph-FRCKXEYK.mjs.map +7 -0
  49. package/dist/lib/node-esm/index.mjs +322 -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 +13 -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 +6 -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} +5 -9
  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 +15 -0
  74. package/dist/types/src/components/GridSheet/util.d.ts.map +1 -0
  75. package/dist/types/src/components/RangeList/RangeList.d.ts +7 -0
  76. package/dist/types/src/components/RangeList/RangeList.d.ts.map +1 -0
  77. package/dist/types/src/components/RangeList/index.d.ts +2 -0
  78. package/dist/types/src/components/RangeList/index.d.ts.map +1 -0
  79. package/dist/types/src/components/SheetContainer/SheetContainer.d.ts +9 -0
  80. package/dist/types/src/components/SheetContainer/SheetContainer.d.ts.map +1 -0
  81. package/dist/types/src/components/SheetContainer/SheetContainer.stories.d.ts +6 -0
  82. package/dist/types/src/components/SheetContainer/SheetContainer.stories.d.ts.map +1 -0
  83. package/dist/types/src/components/SheetContainer/index.d.ts +3 -0
  84. package/dist/types/src/components/SheetContainer/index.d.ts.map +1 -0
  85. package/dist/types/src/components/SheetContext/SheetContext.d.ts +28 -0
  86. package/dist/types/src/components/SheetContext/SheetContext.d.ts.map +1 -0
  87. package/dist/types/src/components/SheetContext/index.d.ts +2 -0
  88. package/dist/types/src/components/SheetContext/index.d.ts.map +1 -0
  89. package/dist/types/src/components/Toolbar/Toolbar.d.ts +33 -9
  90. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  91. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts +4 -32
  92. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  93. package/dist/types/src/components/index.d.ts +7 -4
  94. package/dist/types/src/components/index.d.ts.map +1 -1
  95. package/dist/types/src/compute-graph/compute-graph-registry.d.ts +34 -0
  96. package/dist/types/src/compute-graph/compute-graph-registry.d.ts.map +1 -0
  97. package/dist/types/src/compute-graph/compute-graph.d.ts +64 -0
  98. package/dist/types/src/compute-graph/compute-graph.d.ts.map +1 -0
  99. package/dist/types/src/compute-graph/compute-graph.stories.d.ts +6 -0
  100. package/dist/types/src/compute-graph/compute-graph.stories.d.ts.map +1 -0
  101. package/dist/types/src/compute-graph/compute-graph.test.d.ts +2 -0
  102. package/dist/types/src/compute-graph/compute-graph.test.d.ts.map +1 -0
  103. package/dist/types/src/compute-graph/compute-node.d.ts +26 -0
  104. package/dist/types/src/compute-graph/compute-node.d.ts.map +1 -0
  105. package/dist/types/src/{components/ComputeGraph → compute-graph/functions}/async-function.d.ts +14 -5
  106. package/dist/types/src/compute-graph/functions/async-function.d.ts.map +1 -0
  107. package/dist/types/src/compute-graph/functions/edge-function.d.ts +21 -0
  108. package/dist/types/src/compute-graph/functions/edge-function.d.ts.map +1 -0
  109. package/dist/types/src/{model/functions.d.ts → compute-graph/functions/function-defs.d.ts} +1 -1
  110. package/dist/types/src/compute-graph/functions/function-defs.d.ts.map +1 -0
  111. package/dist/types/src/compute-graph/functions/index.d.ts +4 -0
  112. package/dist/types/src/compute-graph/functions/index.d.ts.map +1 -0
  113. package/dist/types/src/compute-graph/hyperformula.test.d.ts +2 -0
  114. package/dist/types/src/compute-graph/hyperformula.test.d.ts.map +1 -0
  115. package/dist/types/src/compute-graph/index.d.ts +5 -0
  116. package/dist/types/src/compute-graph/index.d.ts.map +1 -0
  117. package/dist/types/src/compute-graph/testing/index.d.ts +3 -0
  118. package/dist/types/src/compute-graph/testing/index.d.ts.map +1 -0
  119. package/dist/types/src/compute-graph/testing/test-builder.d.ts +15 -0
  120. package/dist/types/src/compute-graph/testing/test-builder.d.ts.map +1 -0
  121. package/dist/types/src/compute-graph/testing/test-plugin.d.ts +36 -0
  122. package/dist/types/src/compute-graph/testing/test-plugin.d.ts.map +1 -0
  123. package/dist/types/src/compute-graph/util.d.ts +2 -0
  124. package/dist/types/src/compute-graph/util.d.ts.map +1 -0
  125. package/dist/types/src/defs/index.d.ts +4 -0
  126. package/dist/types/src/defs/index.d.ts.map +1 -0
  127. package/dist/types/src/defs/sheet-range-types.d.ts +13 -0
  128. package/dist/types/src/defs/sheet-range-types.d.ts.map +1 -0
  129. package/dist/types/src/defs/types.d.ts +28 -0
  130. package/dist/types/src/defs/types.d.ts.map +1 -0
  131. package/dist/types/src/defs/types.test.d.ts.map +1 -0
  132. package/dist/types/src/defs/util.d.ts +39 -0
  133. package/dist/types/src/defs/util.d.ts.map +1 -0
  134. package/dist/types/src/extensions/compute.d.ts +6 -0
  135. package/dist/types/src/extensions/compute.d.ts.map +1 -0
  136. package/dist/types/src/extensions/compute.stories.d.ts +21 -0
  137. package/dist/types/src/extensions/compute.stories.d.ts.map +1 -0
  138. package/dist/types/src/extensions/editor/extension.d.ts +39 -0
  139. package/dist/types/src/extensions/editor/extension.d.ts.map +1 -0
  140. package/dist/types/src/extensions/editor/extension.test.d.ts.map +1 -0
  141. package/dist/types/src/extensions/editor/index.d.ts +2 -0
  142. package/dist/types/src/extensions/editor/index.d.ts.map +1 -0
  143. package/dist/types/src/extensions/index.d.ts +3 -0
  144. package/dist/types/src/extensions/index.d.ts.map +1 -0
  145. package/dist/types/src/index.d.ts +1 -1
  146. package/dist/types/src/index.d.ts.map +1 -1
  147. package/dist/types/src/integrations/index.d.ts +2 -0
  148. package/dist/types/src/integrations/index.d.ts.map +1 -0
  149. package/dist/types/src/integrations/thread-ranges.d.ts +7 -0
  150. package/dist/types/src/integrations/thread-ranges.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/index.d.ts +2 -3
  154. package/dist/types/src/model/index.d.ts.map +1 -1
  155. package/dist/types/src/model/{model.d.ts → sheet-model.d.ts} +13 -67
  156. package/dist/types/src/model/sheet-model.d.ts.map +1 -0
  157. package/dist/types/src/model/sheet-model.test.d.ts +2 -0
  158. package/dist/types/src/model/sheet-model.test.d.ts.map +1 -0
  159. package/dist/types/src/model/useSheetModel.d.ts +8 -0
  160. package/dist/types/src/model/useSheetModel.d.ts.map +1 -0
  161. package/dist/types/src/sanity.test.d.ts +2 -0
  162. package/dist/types/src/sanity.test.d.ts.map +1 -0
  163. package/dist/types/src/serializer.d.ts +4 -0
  164. package/dist/types/src/serializer.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 +27 -12
  170. package/dist/types/src/translations.d.ts.map +1 -1
  171. package/dist/types/src/types.d.ts +100 -41
  172. package/dist/types/src/types.d.ts.map +1 -1
  173. package/dist/vendor/hyperformula.mjs +37145 -0
  174. package/package.json +60 -61
  175. package/src/SheetPlugin.tsx +69 -78
  176. package/src/components/ComputeGraph/ComputeGraphContextProvider.tsx +37 -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 +46 -0
  181. package/src/components/GridSheet/GridSheet.tsx +297 -0
  182. package/src/components/{CellEditor/CellEditor.stories.tsx → GridSheet/SheetCellEditor.stories.tsx} +18 -15
  183. package/src/components/GridSheet/index.ts +5 -0
  184. package/src/components/GridSheet/util.ts +164 -0
  185. package/src/components/RangeList/RangeList.tsx +53 -0
  186. package/src/components/RangeList/index.ts +5 -0
  187. package/src/components/SheetContainer/SheetContainer.stories.tsx +43 -0
  188. package/src/components/SheetContainer/SheetContainer.tsx +33 -0
  189. package/src/components/SheetContainer/index.ts +7 -0
  190. package/src/components/SheetContext/SheetContext.tsx +127 -0
  191. package/src/components/SheetContext/index.ts +5 -0
  192. package/src/components/Toolbar/Toolbar.stories.tsx +9 -6
  193. package/src/components/Toolbar/Toolbar.tsx +245 -112
  194. package/src/components/index.ts +5 -3
  195. package/src/compute-graph/compute-graph-registry.ts +90 -0
  196. package/src/compute-graph/compute-graph.stories.tsx +97 -0
  197. package/src/compute-graph/compute-graph.test.ts +87 -0
  198. package/src/compute-graph/compute-graph.ts +245 -0
  199. package/src/compute-graph/compute-node.ts +62 -0
  200. package/src/{components/ComputeGraph → compute-graph/functions}/async-function.ts +25 -15
  201. package/src/{components/ComputeGraph → compute-graph/functions}/edge-function.ts +16 -14
  202. package/src/compute-graph/functions/index.ts +7 -0
  203. package/src/compute-graph/hyperformula.test.ts +14 -0
  204. package/src/compute-graph/index.ts +8 -0
  205. package/src/compute-graph/testing/index.ts +6 -0
  206. package/src/compute-graph/testing/test-builder.ts +54 -0
  207. package/src/{components/ComputeGraph/custom.ts → compute-graph/testing/test-plugin.ts} +44 -14
  208. package/src/compute-graph/util.ts +8 -0
  209. package/src/defs/index.ts +7 -0
  210. package/src/defs/sheet-range-types.ts +47 -0
  211. package/src/{model → defs}/types.test.ts +8 -9
  212. package/src/defs/types.ts +86 -0
  213. package/src/defs/util.ts +135 -0
  214. package/src/extensions/compute.stories.tsx +155 -0
  215. package/src/extensions/compute.ts +147 -0
  216. package/src/{components/CellEditor → extensions/editor}/extension.test.ts +4 -6
  217. package/src/{components/CellEditor → extensions/editor}/extension.ts +51 -27
  218. package/src/{components/CellEditor → extensions/editor}/index.ts +0 -1
  219. package/src/extensions/index.ts +6 -0
  220. package/src/index.ts +2 -2
  221. package/src/integrations/index.ts +5 -0
  222. package/src/integrations/thread-ranges.ts +101 -0
  223. package/src/meta.ts +14 -0
  224. package/src/model/index.ts +2 -3
  225. package/src/model/sheet-model.test.ts +57 -0
  226. package/src/model/sheet-model.ts +423 -0
  227. package/src/model/useSheetModel.ts +40 -0
  228. package/src/sanity.test.ts +40 -0
  229. package/src/serializer.ts +27 -0
  230. package/src/{components/Sheet → testing}/index.ts +1 -1
  231. package/src/testing/testing.tsx +68 -0
  232. package/src/translations.ts +19 -4
  233. package/src/types.ts +42 -47
  234. package/dist/lib/browser/SheetContainer-U4H5D34A.mjs +0 -1772
  235. package/dist/lib/browser/SheetContainer-U4H5D34A.mjs.map +0 -7
  236. package/dist/lib/browser/chunk-APHOLYUB.mjs +0 -175
  237. package/dist/lib/browser/chunk-APHOLYUB.mjs.map +0 -7
  238. package/dist/lib/browser/chunk-D5AGLXJP.mjs.map +0 -7
  239. package/dist/lib/browser/chunk-FUAGSXA4.mjs +0 -82
  240. package/dist/lib/browser/chunk-FUAGSXA4.mjs.map +0 -7
  241. package/dist/lib/browser/chunk-JRL5LGCE.mjs +0 -18
  242. package/dist/lib/browser/chunk-JRL5LGCE.mjs.map +0 -7
  243. package/dist/lib/browser/chunk-NU4PBN33.mjs +0 -8
  244. package/dist/lib/browser/chunk-NU4PBN33.mjs.map +0 -7
  245. package/dist/lib/browser/testing.mjs +0 -92
  246. package/dist/lib/browser/testing.mjs.map +0 -7
  247. package/dist/lib/node/SheetContainer-AXQV3ZT5.cjs +0 -1765
  248. package/dist/lib/node/SheetContainer-AXQV3ZT5.cjs.map +0 -7
  249. package/dist/lib/node/chunk-5KKJ4NPP.cjs.map +0 -7
  250. package/dist/lib/node/chunk-BJ6ZD7MN.cjs +0 -51
  251. package/dist/lib/node/chunk-BJ6ZD7MN.cjs.map +0 -7
  252. package/dist/lib/node/chunk-CN3RPESU.cjs +0 -202
  253. package/dist/lib/node/chunk-CN3RPESU.cjs.map +0 -7
  254. package/dist/lib/node/chunk-DSYKOI4E.cjs.map +0 -7
  255. package/dist/lib/node/chunk-PYXHNAAK.cjs +0 -40
  256. package/dist/lib/node/chunk-PYXHNAAK.cjs.map +0 -7
  257. package/dist/lib/node/testing.cjs +0 -111
  258. package/dist/lib/node/testing.cjs.map +0 -7
  259. package/dist/types/src/components/CellEditor/CellEditor.d.ts +0 -14
  260. package/dist/types/src/components/CellEditor/CellEditor.d.ts.map +0 -1
  261. package/dist/types/src/components/CellEditor/CellEditor.stories.d.ts.map +0 -1
  262. package/dist/types/src/components/CellEditor/extension.d.ts +0 -19
  263. package/dist/types/src/components/CellEditor/extension.d.ts.map +0 -1
  264. package/dist/types/src/components/CellEditor/extension.test.d.ts.map +0 -1
  265. package/dist/types/src/components/CellEditor/index.d.ts +0 -3
  266. package/dist/types/src/components/CellEditor/index.d.ts.map +0 -1
  267. package/dist/types/src/components/ComputeGraph/async-function.d.ts.map +0 -1
  268. package/dist/types/src/components/ComputeGraph/custom.d.ts +0 -21
  269. package/dist/types/src/components/ComputeGraph/custom.d.ts.map +0 -1
  270. package/dist/types/src/components/ComputeGraph/edge-function.d.ts +0 -20
  271. package/dist/types/src/components/ComputeGraph/edge-function.d.ts.map +0 -1
  272. package/dist/types/src/components/ComputeGraph/graph-context.d.ts +0 -12
  273. package/dist/types/src/components/ComputeGraph/graph-context.d.ts.map +0 -1
  274. package/dist/types/src/components/ComputeGraph/graph.browser.test.d.ts +0 -2
  275. package/dist/types/src/components/ComputeGraph/graph.browser.test.d.ts.map +0 -1
  276. package/dist/types/src/components/ComputeGraph/graph.d.ts +0 -26
  277. package/dist/types/src/components/ComputeGraph/graph.d.ts.map +0 -1
  278. package/dist/types/src/components/Sheet/Sheet.d.ts +0 -55
  279. package/dist/types/src/components/Sheet/Sheet.d.ts.map +0 -1
  280. package/dist/types/src/components/Sheet/Sheet.stories.d.ts +0 -54
  281. package/dist/types/src/components/Sheet/Sheet.stories.d.ts.map +0 -1
  282. package/dist/types/src/components/Sheet/formatting.d.ts +0 -14
  283. package/dist/types/src/components/Sheet/formatting.d.ts.map +0 -1
  284. package/dist/types/src/components/Sheet/grid.d.ts +0 -52
  285. package/dist/types/src/components/Sheet/grid.d.ts.map +0 -1
  286. package/dist/types/src/components/Sheet/index.d.ts +0 -2
  287. package/dist/types/src/components/Sheet/index.d.ts.map +0 -1
  288. package/dist/types/src/components/Sheet/nav.d.ts +0 -29
  289. package/dist/types/src/components/Sheet/nav.d.ts.map +0 -1
  290. package/dist/types/src/components/Sheet/sheet-context.d.ts +0 -25
  291. package/dist/types/src/components/Sheet/sheet-context.d.ts.map +0 -1
  292. package/dist/types/src/components/Sheet/util.d.ts +0 -18
  293. package/dist/types/src/components/Sheet/util.d.ts.map +0 -1
  294. package/dist/types/src/components/SheetContainer.d.ts +0 -9
  295. package/dist/types/src/components/SheetContainer.d.ts.map +0 -1
  296. package/dist/types/src/components/Toolbar/common.d.ts +0 -20
  297. package/dist/types/src/components/Toolbar/common.d.ts.map +0 -1
  298. package/dist/types/src/model/functions.d.ts.map +0 -1
  299. package/dist/types/src/model/model.browser.test.d.ts +0 -2
  300. package/dist/types/src/model/model.browser.test.d.ts.map +0 -1
  301. package/dist/types/src/model/model.d.ts.map +0 -1
  302. package/dist/types/src/model/types.d.ts +0 -17
  303. package/dist/types/src/model/types.d.ts.map +0 -1
  304. package/dist/types/src/model/types.test.d.ts.map +0 -1
  305. package/dist/types/src/model/util.d.ts +0 -15
  306. package/dist/types/src/model/util.d.ts.map +0 -1
  307. package/dist/types/src/testing.d.ts +0 -9
  308. package/dist/types/src/testing.d.ts.map +0 -1
  309. package/src/components/CellEditor/CellEditor.tsx +0 -113
  310. package/src/components/ComputeGraph/graph-context.tsx +0 -50
  311. package/src/components/ComputeGraph/graph.browser.test.ts +0 -50
  312. package/src/components/ComputeGraph/graph.ts +0 -62
  313. package/src/components/Sheet/Sheet.stories.tsx +0 -287
  314. package/src/components/Sheet/Sheet.tsx +0 -1160
  315. package/src/components/Sheet/formatting.ts +0 -106
  316. package/src/components/Sheet/grid.ts +0 -191
  317. package/src/components/Sheet/nav.ts +0 -157
  318. package/src/components/Sheet/sheet-context.tsx +0 -150
  319. package/src/components/Sheet/util.ts +0 -56
  320. package/src/components/SheetContainer.tsx +0 -34
  321. package/src/components/Toolbar/common.tsx +0 -72
  322. package/src/meta.tsx +0 -18
  323. package/src/model/model.browser.test.ts +0 -100
  324. package/src/model/model.ts +0 -550
  325. package/src/model/types.ts +0 -71
  326. package/src/model/util.ts +0 -36
  327. package/src/testing.ts +0 -50
  328. /package/dist/types/src/{model → defs}/types.test.d.ts +0 -0
  329. /package/dist/types/src/{components/CellEditor → extensions/editor}/extension.test.d.ts +0 -0
  330. /package/src/{model/functions.ts → compute-graph/functions/function-defs.ts} +0 -0
@@ -0,0 +1,1471 @@
1
+ import {
2
+ DEFAULT_COLUMNS,
3
+ DEFAULT_ROWS,
4
+ MAX_COLUMNS,
5
+ MAX_ROWS,
6
+ RANGE_NOTATION,
7
+ ReadonlyException,
8
+ addressFromA1Notation,
9
+ addressFromIndex,
10
+ addressToA1Notation,
11
+ addressToIndex,
12
+ cellClassNameForRange,
13
+ createSheetName,
14
+ inRange,
15
+ initialize,
16
+ insertIndices,
17
+ isFormula,
18
+ rangeFromIndex,
19
+ rangeToA1Notation
20
+ } from "./chunk-KCYJSOFB.mjs";
21
+ import {
22
+ Range
23
+ } from "./chunk-5KVQ5IPW.mjs";
24
+ import {
25
+ SHEET_PLUGIN
26
+ } from "./chunk-D3QTX46O.mjs";
27
+
28
+ // packages/plugins/plugin-sheet/src/components/ComputeGraph/ComputeGraphContextProvider.tsx
29
+ import React, { createContext, useContext } from "react";
30
+ import { raise } from "@dxos/debug";
31
+ import { useAsyncState } from "@dxos/react-hooks";
32
+ var ComputeGraphContext = /* @__PURE__ */ createContext(void 0);
33
+ var ComputeGraphContextProvider = ({ registry, children }) => {
34
+ return /* @__PURE__ */ React.createElement(ComputeGraphContext.Provider, {
35
+ value: {
36
+ registry
37
+ }
38
+ }, children);
39
+ };
40
+ var useComputeGraph = (space) => {
41
+ const { registry } = useContext(ComputeGraphContext) ?? raise(new Error("Missing ComputeGraphContext"));
42
+ const [graph] = useAsyncState(async () => {
43
+ if (space) {
44
+ const graph2 = registry.getOrCreateGraph(space);
45
+ await graph2.open();
46
+ return graph2;
47
+ }
48
+ }, [
49
+ space,
50
+ registry
51
+ ]);
52
+ return graph;
53
+ };
54
+
55
+ // packages/plugins/plugin-sheet/src/extensions/compute.ts
56
+ import { syntaxTree } from "@codemirror/language";
57
+ import { RangeSetBuilder, StateEffect, StateField } from "@codemirror/state";
58
+ import { Decoration, EditorView, ViewPlugin, WidgetType } from "@codemirror/view";
59
+ import { debounce } from "@dxos/async";
60
+ import { invariant } from "@dxos/invariant";
61
+ import { documentId, singleValueFacet } from "@dxos/react-ui-editor";
62
+ var updateAllDecorations = StateEffect.define();
63
+ var computeGraphFacet = singleValueFacet();
64
+
65
+ // packages/plugins/plugin-sheet/src/extensions/editor/extension.ts
66
+ import { acceptCompletion, autocompletion, completionStatus, startCompletion } from "@codemirror/autocomplete";
67
+ import { HighlightStyle, syntaxHighlighting } from "@codemirror/language";
68
+ import { ViewPlugin as ViewPlugin2, keymap } from "@codemirror/view";
69
+ import { tags } from "@lezer/highlight";
70
+ import { spreadsheet } from "codemirror-lang-spreadsheet";
71
+ import { singleValueFacet as singleValueFacet2 } from "@dxos/react-ui-editor";
72
+ import { mx } from "@dxos/react-ui-theme";
73
+ var highlightStyles = HighlightStyle.define([
74
+ // Function.
75
+ {
76
+ tag: tags.name,
77
+ class: "text-accentText"
78
+ },
79
+ // Range.
80
+ {
81
+ tag: tags.tagName,
82
+ class: "text-pinkText"
83
+ },
84
+ // Values.
85
+ {
86
+ tag: tags.number,
87
+ class: "text-tealText"
88
+ },
89
+ {
90
+ tag: tags.bool,
91
+ class: "text-tealText"
92
+ },
93
+ {
94
+ tag: tags.string,
95
+ class: "text-tealText"
96
+ },
97
+ // Error.
98
+ {
99
+ tag: tags.invalid,
100
+ class: "text-unAccent"
101
+ }
102
+ ]);
103
+ var languageFacet = singleValueFacet2();
104
+ var sheetExtension = ({ functions = [] }) => {
105
+ const { extension, language } = spreadsheet({
106
+ idiom: "en-US",
107
+ decimalSeparator: "."
108
+ });
109
+ const createCompletion = (name) => {
110
+ const { section = "Custom", description, syntax } = functions.find((value) => value.name === name) ?? {};
111
+ return {
112
+ section,
113
+ label: name,
114
+ info: () => {
115
+ if (!description && !syntax) {
116
+ return null;
117
+ }
118
+ const root = document.createElement("div");
119
+ root.className = "flex flex-col gap-2 text-sm";
120
+ const title = document.createElement("h2");
121
+ title.innerText = name;
122
+ title.className = "text-lg font-mono text-accentText";
123
+ root.appendChild(title);
124
+ if (description) {
125
+ const info = document.createElement("p");
126
+ info.innerText = description;
127
+ info.className = "text-subdued";
128
+ root.appendChild(info);
129
+ }
130
+ if (syntax) {
131
+ const detail = document.createElement("pre");
132
+ detail.innerText = syntax;
133
+ detail.className = "whitespace-pre-wrap text-greenText";
134
+ root.appendChild(detail);
135
+ }
136
+ return root;
137
+ },
138
+ apply: (view, completion, from, to) => {
139
+ const insertParens = to === view.state.doc.toString().length;
140
+ view.dispatch(view.state.update({
141
+ changes: {
142
+ from,
143
+ to,
144
+ insert: completion.label + (insertParens ? "()" : "")
145
+ },
146
+ selection: {
147
+ anchor: from + completion.label.length + 1
148
+ }
149
+ }));
150
+ }
151
+ };
152
+ };
153
+ return [
154
+ extension,
155
+ languageFacet.of(language),
156
+ language.data.of({
157
+ autocomplete: (context) => {
158
+ if (context.state.doc.toString()[0] !== "=") {
159
+ return null;
160
+ }
161
+ const match = context.matchBefore(/\w*/);
162
+ if (!match || match.from === match.to) {
163
+ return null;
164
+ }
165
+ const text = match.text.toUpperCase();
166
+ if (!context.explicit && match.text.length < 2) {
167
+ return null;
168
+ }
169
+ return {
170
+ from: match.from,
171
+ options: functions?.filter(({ name }) => name.startsWith(text)).map(({ name }) => createCompletion(name)) ?? []
172
+ };
173
+ }
174
+ }),
175
+ syntaxHighlighting(highlightStyles),
176
+ autocompletion({
177
+ aboveCursor: false,
178
+ defaultKeymap: true,
179
+ activateOnTyping: true,
180
+ // NOTE: Useful for debugging.
181
+ closeOnBlur: false,
182
+ icons: false,
183
+ tooltipClass: () => mx("!-left-[1px] !top-[33px] !-m-0 border !border-t-0 [&>ul]:!min-w-[198px]", "[&>ul>li[aria-selected]]:!bg-accentSurface", "border-separator")
184
+ }),
185
+ keymap.of([
186
+ {
187
+ key: "Tab",
188
+ run: (view) => {
189
+ return completionStatus(view.state) === "active" ? acceptCompletion(view) : startCompletion(view);
190
+ }
191
+ }
192
+ ])
193
+ ];
194
+ };
195
+ var rangeExtension = ({ onInit, onStateChange }) => {
196
+ let view;
197
+ let activeRange;
198
+ const notifier = {
199
+ setRange: (range) => {
200
+ if (activeRange) {
201
+ view.dispatch(view.state.update({
202
+ changes: {
203
+ ...activeRange,
204
+ insert: range.toString()
205
+ },
206
+ selection: {
207
+ anchor: activeRange.from + range.length
208
+ }
209
+ }));
210
+ }
211
+ view.focus();
212
+ }
213
+ };
214
+ return ViewPlugin2.fromClass(class {
215
+ constructor(_view) {
216
+ view = _view;
217
+ onInit?.(notifier);
218
+ }
219
+ update(view2) {
220
+ const { anchor } = view2.state.selection.ranges[0];
221
+ activeRange = void 0;
222
+ const language = view2.state.facet(languageFacet);
223
+ const { topNode } = language.parser.parse(view2.state.doc.toString());
224
+ visitTree(topNode, ({ type, from, to }) => {
225
+ if (from <= anchor && to >= anchor) {
226
+ switch (type.name) {
227
+ case "Function":
228
+ activeRange = {
229
+ from: to,
230
+ to
231
+ };
232
+ break;
233
+ case "CloseParen":
234
+ activeRange = {
235
+ from,
236
+ to: from
237
+ };
238
+ break;
239
+ case "RangeToken":
240
+ case "CellToken":
241
+ activeRange = {
242
+ from,
243
+ to
244
+ };
245
+ return true;
246
+ }
247
+ }
248
+ return false;
249
+ });
250
+ if (!activeRange && view2.state.doc.toString()[0] === "=") {
251
+ const str = view2.state.doc.sliceString(1);
252
+ if (RANGE_NOTATION.test(str)) {
253
+ activeRange = {
254
+ from: 1,
255
+ to: str.length + 1
256
+ };
257
+ }
258
+ }
259
+ onStateChange?.({
260
+ activeRange: activeRange ? view2.state.doc.sliceString(activeRange.from, activeRange.to) : void 0
261
+ });
262
+ }
263
+ });
264
+ };
265
+ var visitTree = (node, callback) => {
266
+ if (callback(node)) {
267
+ return true;
268
+ }
269
+ for (let child = node.firstChild; child !== null; child = child.nextSibling) {
270
+ if (visitTree(child, callback)) {
271
+ return true;
272
+ }
273
+ }
274
+ return false;
275
+ };
276
+
277
+ // packages/plugins/plugin-sheet/src/components/SheetContext/SheetContext.tsx
278
+ import React2, { createContext as createContext2, useCallback, useContext as useContext2, useState as useState2 } from "react";
279
+ import { invariant as invariant3 } from "@dxos/invariant";
280
+ import { fullyQualifiedId } from "@dxos/react-client/echo";
281
+ import { Grid, useGridContext } from "@dxos/react-ui-grid";
282
+
283
+ // packages/plugins/plugin-sheet/src/model/sheet-model.ts
284
+ import { Event } from "@dxos/async";
285
+ import { Resource } from "@dxos/context";
286
+ import { getTypename } from "@dxos/echo-schema";
287
+ import { invariant as invariant2 } from "@dxos/invariant";
288
+ import { PublicKey } from "@dxos/keys";
289
+ import { log } from "@dxos/log";
290
+ import { FieldValueType } from "@dxos/schema";
291
+ import { DetailedCellError, ExportedCellChange } from "#hyperformula";
292
+ var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/model/sheet-model.ts";
293
+ var typeMap = {
294
+ BOOLEAN: FieldValueType.Boolean,
295
+ NUMBER_RAW: FieldValueType.Number,
296
+ NUMBER_PERCENT: FieldValueType.Percent,
297
+ NUMBER_CURRENCY: FieldValueType.Currency,
298
+ NUMBER_DATETIME: FieldValueType.DateTime,
299
+ NUMBER_DATE: FieldValueType.Date,
300
+ NUMBER_TIME: FieldValueType.Time
301
+ };
302
+ var getTopLeft = (range) => {
303
+ const to = range.to ?? range.from;
304
+ return {
305
+ row: Math.min(range.from.row, to.row),
306
+ col: Math.min(range.from.col, to.col)
307
+ };
308
+ };
309
+ var toSimpleCellAddress = (sheet, cell) => ({
310
+ sheet,
311
+ row: cell.row,
312
+ col: cell.col
313
+ });
314
+ var toModelRange = (sheet, range) => ({
315
+ start: toSimpleCellAddress(sheet, range.from),
316
+ end: toSimpleCellAddress(sheet, range.to ?? range.from)
317
+ });
318
+ var SheetModel = class extends Resource {
319
+ constructor(_graph, _sheet, _options = {}) {
320
+ super();
321
+ this._graph = _graph;
322
+ this._sheet = _sheet;
323
+ this._options = _options;
324
+ this.id = `model-${PublicKey.random().truncate()}`;
325
+ this.update = new Event();
326
+ }
327
+ get graph() {
328
+ return this._graph;
329
+ }
330
+ get sheet() {
331
+ return this._sheet;
332
+ }
333
+ get readonly() {
334
+ return this._options.readonly;
335
+ }
336
+ get bounds() {
337
+ return {
338
+ rows: this._sheet.rows.length,
339
+ columns: this._sheet.columns.length
340
+ };
341
+ }
342
+ /**
343
+ * Initialize sheet and engine.
344
+ */
345
+ async _open() {
346
+ log("initialize", {
347
+ id: this.id
348
+ }, {
349
+ F: __dxlog_file,
350
+ L: 111,
351
+ S: this,
352
+ C: (f, a) => f(...a)
353
+ });
354
+ initialize(this._sheet);
355
+ this._node = this._graph.getOrCreateNode(createSheetName({
356
+ type: getTypename(this._sheet),
357
+ id: this._sheet.id
358
+ }));
359
+ await this._node.open();
360
+ const unsubscribe = this._node.update.on((event) => this.update.emit(event));
361
+ this._ctx.onDispose(unsubscribe);
362
+ this.reset();
363
+ }
364
+ /**
365
+ * Update engine.
366
+ * NOTE: This resets the undo history.
367
+ * @deprecated
368
+ */
369
+ reset() {
370
+ invariant2(this._node, void 0, {
371
+ F: __dxlog_file,
372
+ L: 131,
373
+ S: this,
374
+ A: [
375
+ "this._node",
376
+ ""
377
+ ]
378
+ });
379
+ this._node.graph.hf.clearSheet(this._node.sheetId);
380
+ Object.entries(this._sheet.cells).forEach(([key, { value }]) => {
381
+ invariant2(this._node, void 0, {
382
+ F: __dxlog_file,
383
+ L: 134,
384
+ S: this,
385
+ A: [
386
+ "this._node",
387
+ ""
388
+ ]
389
+ });
390
+ const { col, row } = addressFromIndex(this._sheet, key);
391
+ if (isFormula(value)) {
392
+ value = this._graph.mapFormulaToNative(this._graph.mapFunctionBindingFromId(this.mapFormulaIndicesToRefs(value)));
393
+ }
394
+ this._node.graph.hf.setCellContents({
395
+ sheet: this._node.sheetId,
396
+ row,
397
+ col
398
+ }, value);
399
+ });
400
+ }
401
+ /**
402
+ * Recalculate formulas.
403
+ * NOTE: This resets the undo history.
404
+ * https://hyperformula.handsontable.com/guide/volatile-functions.html#volatile-actions
405
+ * @deprecated
406
+ */
407
+ // TODO(burdon): Remove.
408
+ recalculate() {
409
+ this._node?.graph.hf.rebuildAndRecalculate();
410
+ }
411
+ insertRows(i, n = 1) {
412
+ insertIndices(this._sheet.rows, i, n, MAX_ROWS);
413
+ this.reset();
414
+ }
415
+ insertColumns(i, n = 1) {
416
+ insertIndices(this._sheet.columns, i, n, MAX_COLUMNS);
417
+ this.reset();
418
+ }
419
+ //
420
+ // Undoable actions.
421
+ // TODO(burdon): Group undoable methods; consistently update hf/sheet.
422
+ //
423
+ /**
424
+ * Clear range of values.
425
+ */
426
+ clear(range) {
427
+ invariant2(this._node, void 0, {
428
+ F: __dxlog_file,
429
+ L: 176,
430
+ S: this,
431
+ A: [
432
+ "this._node",
433
+ ""
434
+ ]
435
+ });
436
+ const topLeft = getTopLeft(range);
437
+ const values = this._iterRange(range, () => null);
438
+ this._node.graph.hf.setCellContents(toSimpleCellAddress(this._node.sheetId, topLeft), values);
439
+ this._iterRange(range, (cell) => {
440
+ const idx = addressToIndex(this._sheet, cell);
441
+ delete this._sheet.cells[idx];
442
+ });
443
+ }
444
+ cut(range) {
445
+ invariant2(this._node, void 0, {
446
+ F: __dxlog_file,
447
+ L: 187,
448
+ S: this,
449
+ A: [
450
+ "this._node",
451
+ ""
452
+ ]
453
+ });
454
+ this._node.graph.hf.cut(toModelRange(this._node.sheetId, range));
455
+ this._iterRange(range, (cell) => {
456
+ const idx = addressToIndex(this._sheet, cell);
457
+ delete this._sheet.cells[idx];
458
+ });
459
+ }
460
+ copy(range) {
461
+ invariant2(this._node, void 0, {
462
+ F: __dxlog_file,
463
+ L: 196,
464
+ S: this,
465
+ A: [
466
+ "this._node",
467
+ ""
468
+ ]
469
+ });
470
+ this._node.graph.hf.copy(toModelRange(this._node.sheetId, range));
471
+ }
472
+ paste(cell) {
473
+ invariant2(this._node, void 0, {
474
+ F: __dxlog_file,
475
+ L: 201,
476
+ S: this,
477
+ A: [
478
+ "this._node",
479
+ ""
480
+ ]
481
+ });
482
+ if (!this._node.graph.hf.isClipboardEmpty()) {
483
+ const changes = this._node.graph.hf.paste(toSimpleCellAddress(this._node.sheetId, cell));
484
+ for (const change of changes) {
485
+ if (change instanceof ExportedCellChange) {
486
+ const { address, newValue } = change;
487
+ const idx = addressToIndex(this._sheet, {
488
+ row: address.row,
489
+ col: address.col
490
+ });
491
+ this._sheet.cells[idx] = {
492
+ value: newValue
493
+ };
494
+ }
495
+ }
496
+ }
497
+ }
498
+ // TODO(burdon): Display undo/redo state.
499
+ undo() {
500
+ invariant2(this._node, void 0, {
501
+ F: __dxlog_file,
502
+ L: 216,
503
+ S: this,
504
+ A: [
505
+ "this._node",
506
+ ""
507
+ ]
508
+ });
509
+ if (this._node.graph.hf.isThereSomethingToUndo()) {
510
+ this._node.graph.hf.undo();
511
+ }
512
+ }
513
+ redo() {
514
+ invariant2(this._node, void 0, {
515
+ F: __dxlog_file,
516
+ L: 224,
517
+ S: this,
518
+ A: [
519
+ "this._node",
520
+ ""
521
+ ]
522
+ });
523
+ if (this._node.graph.hf.isThereSomethingToRedo()) {
524
+ this._node.graph.hf.redo();
525
+ }
526
+ }
527
+ /**
528
+ * Get value from sheet.
529
+ */
530
+ getCellValue(cell) {
531
+ const idx = addressToIndex(this._sheet, cell);
532
+ return this._sheet.cells[idx]?.value ?? null;
533
+ }
534
+ /**
535
+ * Get value as a string for editing.
536
+ */
537
+ getCellText(cell) {
538
+ const value = this.getCellValue(cell);
539
+ if (value == null) {
540
+ return void 0;
541
+ }
542
+ if (isFormula(value)) {
543
+ return this._graph.mapFunctionBindingFromId(this.mapFormulaIndicesToRefs(value));
544
+ } else {
545
+ return String(value);
546
+ }
547
+ }
548
+ /**
549
+ * Get array of raw values from sheet.
550
+ */
551
+ getCellValues(range) {
552
+ return this._iterRange(range, (cell) => this.getCellValue(cell));
553
+ }
554
+ /**
555
+ * Gets the regular or computed value from the engine.
556
+ */
557
+ getValue(cell) {
558
+ invariant2(this._node, void 0, {
559
+ F: __dxlog_file,
560
+ L: 267,
561
+ S: this,
562
+ A: [
563
+ "this._node",
564
+ ""
565
+ ]
566
+ });
567
+ const value = this._node.graph.hf.getCellValue(toSimpleCellAddress(this._node.sheetId, cell));
568
+ if (value instanceof DetailedCellError) {
569
+ return value.toString();
570
+ }
571
+ return value;
572
+ }
573
+ /**
574
+ * Get value type.
575
+ */
576
+ getValueType(cell) {
577
+ invariant2(this._node, void 0, {
578
+ F: __dxlog_file,
579
+ L: 280,
580
+ S: this,
581
+ A: [
582
+ "this._node",
583
+ ""
584
+ ]
585
+ });
586
+ const addr = toSimpleCellAddress(this._node.sheetId, cell);
587
+ const type = this._node.graph.hf.getCellValueDetailedType(addr);
588
+ return typeMap[type];
589
+ }
590
+ /**
591
+ * Sets the value, updating the sheet and engine.
592
+ */
593
+ setValue(cell, value) {
594
+ invariant2(this._node, void 0, {
595
+ F: __dxlog_file,
596
+ L: 290,
597
+ S: this,
598
+ A: [
599
+ "this._node",
600
+ ""
601
+ ]
602
+ });
603
+ if (this._options.readonly) {
604
+ throw new ReadonlyException();
605
+ }
606
+ let refresh = false;
607
+ if (cell.row >= this._sheet.rows.length) {
608
+ insertIndices(this._sheet.rows, cell.row, 1, MAX_ROWS);
609
+ refresh = true;
610
+ }
611
+ if (cell.col >= this._sheet.columns.length) {
612
+ insertIndices(this._sheet.columns, cell.col, 1, MAX_COLUMNS);
613
+ refresh = true;
614
+ }
615
+ if (refresh) {
616
+ this.reset();
617
+ }
618
+ this._node.graph.hf.setCellContents({
619
+ sheet: this._node.sheetId,
620
+ row: cell.row,
621
+ col: cell.col
622
+ }, [
623
+ [
624
+ isFormula(value) ? this._graph.mapFormulaToNative(value) : value
625
+ ]
626
+ ]);
627
+ const idx = addressToIndex(this._sheet, cell);
628
+ if (value === void 0 || value === null) {
629
+ delete this._sheet.cells[idx];
630
+ } else {
631
+ if (isFormula(value)) {
632
+ value = this._graph.mapFunctionBindingToId(this.mapFormulaRefsToIndices(value));
633
+ }
634
+ this._sheet.cells[idx] = {
635
+ value
636
+ };
637
+ }
638
+ }
639
+ /**
640
+ * Sets values from a simple map.
641
+ */
642
+ setValues(values) {
643
+ Object.entries(values).forEach(([key, { value }]) => {
644
+ this.setValue(addressFromA1Notation(key), value);
645
+ });
646
+ }
647
+ /**
648
+ * Iterate range.
649
+ */
650
+ _iterRange(range, cb) {
651
+ const to = range.to ?? range.from;
652
+ const rowRange = [
653
+ Math.min(range.from.row, to.row),
654
+ Math.max(range.from.row, to.row)
655
+ ];
656
+ const columnRange = [
657
+ Math.min(range.from.col, to.col),
658
+ Math.max(range.from.col, to.col)
659
+ ];
660
+ const rows = [];
661
+ for (let row = rowRange[0]; row <= rowRange[1]; row++) {
662
+ const rowCells = [];
663
+ for (let column = columnRange[0]; column <= columnRange[1]; column++) {
664
+ const value = cb({
665
+ row,
666
+ col: column
667
+ });
668
+ if (value !== void 0) {
669
+ rowCells.push(value);
670
+ }
671
+ }
672
+ rows.push(rowCells);
673
+ }
674
+ return rows;
675
+ }
676
+ // TODO(burdon): Delete index.
677
+ _deleteIndices(indices, i, n) {
678
+ throw new Error("Not implemented");
679
+ }
680
+ // TODO(burdon): Move. Cannot use fractional without changing. Switch back to using unique IDs?
681
+ _moveIndices(indices, i, j, n) {
682
+ throw new Error("Not implemented");
683
+ }
684
+ //
685
+ // Indices.
686
+ //
687
+ /**
688
+ * Map from A1 notation to indices.
689
+ */
690
+ mapFormulaRefsToIndices(formula) {
691
+ invariant2(isFormula(formula), void 0, {
692
+ F: __dxlog_file,
693
+ L: 379,
694
+ S: this,
695
+ A: [
696
+ "isFormula(formula)",
697
+ ""
698
+ ]
699
+ });
700
+ return formula.replace(/([a-zA-Z]+)([0-9]+)/g, (match) => {
701
+ return addressToIndex(this._sheet, addressFromA1Notation(match));
702
+ });
703
+ }
704
+ /**
705
+ * Map from indices to A1 notation.
706
+ */
707
+ mapFormulaIndicesToRefs(formula) {
708
+ invariant2(isFormula(formula), void 0, {
709
+ F: __dxlog_file,
710
+ L: 389,
711
+ S: this,
712
+ A: [
713
+ "isFormula(formula)",
714
+ ""
715
+ ]
716
+ });
717
+ return formula.replace(/([a-zA-Z0-9]+)@([a-zA-Z0-9]+)/g, (idx) => {
718
+ return addressToA1Notation(addressFromIndex(this._sheet, idx));
719
+ });
720
+ }
721
+ //
722
+ // Values
723
+ //
724
+ /**
725
+ * https://hyperformula.handsontable.com/guide/date-and-time-handling.html#example
726
+ * https://hyperformula.handsontable.com/api/interfaces/configparams.html#nulldate
727
+ * NOTE: TODAY() is number of FULL days since nullDate. It will typically be -1 days from NOW().
728
+ */
729
+ toLocalDate(num) {
730
+ const { year, month, day, hours, minutes, seconds } = this.toDateTime(num);
731
+ return new Date(year, month - 1, day, hours, minutes, seconds);
732
+ }
733
+ toDateTime(num) {
734
+ invariant2(this._node, void 0, {
735
+ F: __dxlog_file,
736
+ L: 410,
737
+ S: this,
738
+ A: [
739
+ "this._node",
740
+ ""
741
+ ]
742
+ });
743
+ return this._node.graph.hf.numberToDateTime(num);
744
+ }
745
+ toDate(num) {
746
+ invariant2(this._node, void 0, {
747
+ F: __dxlog_file,
748
+ L: 415,
749
+ S: this,
750
+ A: [
751
+ "this._node",
752
+ ""
753
+ ]
754
+ });
755
+ return this._node.graph.hf.numberToDate(num);
756
+ }
757
+ toTime(num) {
758
+ invariant2(this._node, void 0, {
759
+ F: __dxlog_file,
760
+ L: 420,
761
+ S: this,
762
+ A: [
763
+ "this._node",
764
+ ""
765
+ ]
766
+ });
767
+ return this._node.graph.hf.numberToTime(num);
768
+ }
769
+ };
770
+
771
+ // packages/plugins/plugin-sheet/src/model/useSheetModel.ts
772
+ import { useEffect, useState } from "react";
773
+ var useSheetModel = (graph, sheet, { readonly } = {}) => {
774
+ const [model, setModel] = useState();
775
+ useEffect(() => {
776
+ if (!graph || !sheet) {
777
+ return;
778
+ }
779
+ let model2;
780
+ const t = setTimeout(async () => {
781
+ model2 = new SheetModel(graph, sheet, {
782
+ readonly
783
+ });
784
+ await model2.open();
785
+ setModel(model2);
786
+ });
787
+ return () => {
788
+ clearTimeout(t);
789
+ void model2?.close();
790
+ };
791
+ }, [
792
+ graph,
793
+ sheet,
794
+ readonly
795
+ ]);
796
+ return model;
797
+ };
798
+
799
+ // packages/plugins/plugin-sheet/src/components/SheetContext/SheetContext.tsx
800
+ var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/components/SheetContext/SheetContext.tsx";
801
+ var SheetContext = /* @__PURE__ */ createContext2(void 0);
802
+ var useSheetContext = () => {
803
+ const context = useContext2(SheetContext);
804
+ invariant3(context, void 0, {
805
+ F: __dxlog_file2,
806
+ L: 52,
807
+ S: void 0,
808
+ A: [
809
+ "context",
810
+ ""
811
+ ]
812
+ });
813
+ return context;
814
+ };
815
+ var SheetProviderImpl = ({ model, onInfo, children, __gridScope }) => {
816
+ const { id, editing, setEditing } = useGridContext("SheetProvider", __gridScope);
817
+ const [cursor, setCursorInternal] = useState2();
818
+ const [range, setRangeInternal] = useState2();
819
+ const [cursorFallbackRange, setCursorFallbackRange] = useState2();
820
+ const [activeRefs, setActiveRefs] = useState2("");
821
+ const setCursor = useCallback((nextCursor) => {
822
+ setCursorInternal(nextCursor);
823
+ setCursorFallbackRange(range?.to ? range : nextCursor ? {
824
+ from: nextCursor,
825
+ to: nextCursor
826
+ } : void 0);
827
+ }, [
828
+ range
829
+ ]);
830
+ const setRange = useCallback((nextRange) => {
831
+ setRangeInternal(nextRange);
832
+ setCursorFallbackRange(nextRange?.to ? nextRange : cursor ? {
833
+ from: cursor,
834
+ to: cursor
835
+ } : void 0);
836
+ }, [
837
+ cursor
838
+ ]);
839
+ return /* @__PURE__ */ React2.createElement(SheetContext.Provider, {
840
+ value: {
841
+ id,
842
+ model,
843
+ editing,
844
+ setEditing,
845
+ cursor,
846
+ setCursor,
847
+ range,
848
+ setRange,
849
+ cursorFallbackRange,
850
+ activeRefs,
851
+ setActiveRefs,
852
+ // TODO(burdon): Change to event.
853
+ onInfo
854
+ }
855
+ }, children);
856
+ };
857
+ var SheetProvider = ({ children, graph, sheet, readonly, onInfo }) => {
858
+ const model = useSheetModel(graph, sheet, {
859
+ readonly
860
+ });
861
+ return !model ? null : /* @__PURE__ */ React2.createElement(Grid.Root, {
862
+ id: fullyQualifiedId(sheet)
863
+ }, /* @__PURE__ */ React2.createElement(SheetProviderImpl, {
864
+ model,
865
+ onInfo
866
+ }, children));
867
+ };
868
+
869
+ // packages/plugins/plugin-sheet/src/components/GridSheet/GridSheet.tsx
870
+ import React4, { useCallback as useCallback4, useMemo as useMemo2, useRef, useState as useState4 } from "react";
871
+ import { DropdownMenu, Icon, useTranslation as useTranslation2 } from "@dxos/react-ui";
872
+ import { useAttention } from "@dxos/react-ui-attention";
873
+ import { closestCell, editorKeys, Grid as Grid2, GridCellEditor } from "@dxos/react-ui-grid";
874
+
875
+ // packages/plugins/plugin-sheet/src/components/GridSheet/util.ts
876
+ import { useEffect as useEffect3, useState as useState3 } from "react";
877
+ import { createDocAccessor, fullyQualifiedId as fullyQualifiedId3 } from "@dxos/react-client/echo";
878
+ import { parseValue, cellClassesForFieldType } from "@dxos/react-ui-data";
879
+ import { colToA1Notation, rowToA1Notation, commentedClassName } from "@dxos/react-ui-grid";
880
+ import { mx as mx2 } from "@dxos/react-ui-theme";
881
+
882
+ // packages/plugins/plugin-sheet/src/integrations/thread-ranges.ts
883
+ import { useCallback as useCallback3, useEffect as useEffect2, useMemo } from "react";
884
+ import { LayoutAction, useIntentDispatcher, useIntentResolver } from "@dxos/app-framework";
885
+ import { debounce as debounce2 } from "@dxos/async";
886
+ import { fullyQualifiedId as fullyQualifiedId2 } from "@dxos/react-client/echo";
887
+
888
+ // packages/plugins/plugin-sheet/src/components/index.ts
889
+ import { lazy } from "react";
890
+
891
+ // packages/plugins/plugin-sheet/src/components/RangeList/RangeList.tsx
892
+ import React3, { useCallback as useCallback2 } from "react";
893
+ import { S } from "@dxos/echo-schema";
894
+ import { useTranslation } from "@dxos/react-ui";
895
+ import { List } from "@dxos/react-ui-list";
896
+ import { ghostHover } from "@dxos/react-ui-theme";
897
+ var RangeList = ({ sheet }) => {
898
+ const { t } = useTranslation(SHEET_PLUGIN);
899
+ const handleSelectRange = (range) => {
900
+ };
901
+ const handleDeleteRange = useCallback2((range) => {
902
+ const index = sheet.ranges.findIndex((sheetRange) => sheetRange === range);
903
+ sheet.ranges.splice(index, 1);
904
+ }, [
905
+ sheet
906
+ ]);
907
+ return /* @__PURE__ */ React3.createElement(React3.Fragment, null, /* @__PURE__ */ React3.createElement("h2", {
908
+ className: "p-2 text-sm font-semibold"
909
+ }, t("range list heading")), /* @__PURE__ */ React3.createElement(List.Root, {
910
+ items: sheet.ranges,
911
+ isItem: S.is(Range)
912
+ }, ({ items: ranges }) => ranges.map((range, i) => /* @__PURE__ */ React3.createElement(List.Item, {
913
+ key: i,
914
+ item: range,
915
+ classNames: [
916
+ "p-2",
917
+ ghostHover
918
+ ]
919
+ }, /* @__PURE__ */ React3.createElement(List.ItemDragHandle, null), /* @__PURE__ */ React3.createElement(List.ItemTitle, {
920
+ onClick: () => handleSelectRange(range)
921
+ }, t("range title", {
922
+ position: rangeToA1Notation(rangeFromIndex(sheet, range.range)),
923
+ key: t(`range key ${range.key} label`),
924
+ value: t(`range value ${range.value} label`)
925
+ })), /* @__PURE__ */ React3.createElement(List.ItemDeleteButton, {
926
+ onClick: () => handleDeleteRange(range)
927
+ })))));
928
+ };
929
+
930
+ // packages/plugins/plugin-sheet/src/components/index.ts
931
+ var SheetContainer = lazy(() => import("./SheetContainer-R65IDJHN.mjs"));
932
+
933
+ // packages/plugins/plugin-sheet/src/integrations/thread-ranges.ts
934
+ var completeCellRangeToThreadCursor = (range) => {
935
+ return `${range.from.col},${range.from.row},${range.to.col},${range.to.row}`;
936
+ };
937
+ var parseThreadAnchorAsCellRange = (cursor) => {
938
+ const coords = cursor.split(",");
939
+ if (coords.length !== 4) {
940
+ return null;
941
+ } else {
942
+ const [fromCol, fromRow, toCol, toRow] = coords;
943
+ return {
944
+ from: {
945
+ col: parseInt(fromCol),
946
+ row: parseInt(fromRow)
947
+ },
948
+ to: {
949
+ col: parseInt(toCol),
950
+ row: parseInt(toRow)
951
+ }
952
+ };
953
+ }
954
+ };
955
+ var useUpdateFocusedCellOnThreadSelection = (grid) => {
956
+ const { model, setActiveRefs } = useSheetContext();
957
+ const handleScrollIntoView = useCallback3(({ action, data }) => {
958
+ switch (action) {
959
+ case LayoutAction.SCROLL_INTO_VIEW: {
960
+ if (!data?.id || data?.cursor === void 0 || data?.id !== fullyQualifiedId2(model.sheet)) {
961
+ return;
962
+ }
963
+ setActiveRefs(data.thread);
964
+ const range = parseThreadAnchorAsCellRange(data.cursor);
965
+ range && grid?.setFocus({
966
+ ...range.to,
967
+ plane: "grid"
968
+ }, true);
969
+ }
970
+ }
971
+ }, [
972
+ model.sheet,
973
+ setActiveRefs
974
+ ]);
975
+ useIntentResolver(SHEET_PLUGIN, handleScrollIntoView);
976
+ };
977
+ var useSelectThreadOnCellFocus = () => {
978
+ const { model, cursor } = useSheetContext();
979
+ const dispatch = useIntentDispatcher();
980
+ const threads = useMemo(() => model.sheet.threads?.filter((thread) => !!thread) ?? [], [
981
+ // TODO(thure): Surely we can find a better dependency for this…
982
+ JSON.stringify(model.sheet.threads)
983
+ ]);
984
+ const selectClosestThread = useCallback3((cellAddress) => {
985
+ if (!cellAddress || !threads) {
986
+ return;
987
+ }
988
+ const closestThread = threads?.find(({ anchor }) => {
989
+ if (anchor) {
990
+ const range = parseThreadAnchorAsCellRange(anchor);
991
+ return range ? inRange(range, cellAddress) : false;
992
+ } else {
993
+ return false;
994
+ }
995
+ });
996
+ if (closestThread) {
997
+ void dispatch([
998
+ {
999
+ action: "dxos.org/plugin/thread/action/select",
1000
+ data: {
1001
+ current: fullyQualifiedId2(closestThread)
1002
+ }
1003
+ }
1004
+ ]);
1005
+ }
1006
+ }, [
1007
+ dispatch,
1008
+ threads
1009
+ ]);
1010
+ const debounced = useMemo(() => {
1011
+ return debounce2((cellCoords) => requestAnimationFrame(() => selectClosestThread(cellCoords)), 50);
1012
+ }, [
1013
+ selectClosestThread
1014
+ ]);
1015
+ useEffect2(() => {
1016
+ if (!cursor) {
1017
+ return;
1018
+ }
1019
+ debounced(cursor);
1020
+ }, [
1021
+ cursor,
1022
+ debounced
1023
+ ]);
1024
+ };
1025
+
1026
+ // packages/plugins/plugin-sheet/src/components/GridSheet/util.ts
1027
+ var dxGridCellIndexToSheetCellAddress = (index) => {
1028
+ const [colStr, rowStr] = index.split(",");
1029
+ return {
1030
+ col: parseInt(colStr),
1031
+ row: parseInt(rowStr)
1032
+ };
1033
+ };
1034
+ var createDxGridColumns = (model) => {
1035
+ return model.sheet.columns.reduce((acc, columnId, numericIndex) => {
1036
+ if (model.sheet.columnMeta[columnId] && model.sheet.columnMeta[columnId].size) {
1037
+ acc.grid[numericIndex] = {
1038
+ size: model.sheet.columnMeta[columnId].size,
1039
+ resizeable: true
1040
+ };
1041
+ }
1042
+ return acc;
1043
+ }, {
1044
+ grid: {}
1045
+ });
1046
+ };
1047
+ var createDxGridRows = (model) => {
1048
+ return model.sheet.rows.reduce((acc, rowId, numericIndex) => {
1049
+ if (model.sheet.rowMeta[rowId] && model.sheet.rowMeta[rowId].size) {
1050
+ acc.grid[numericIndex] = {
1051
+ size: model.sheet.rowMeta[rowId].size,
1052
+ resizeable: true
1053
+ };
1054
+ }
1055
+ return acc;
1056
+ }, {
1057
+ grid: {}
1058
+ });
1059
+ };
1060
+ var projectCellProps = (model, col, row) => {
1061
+ const address = {
1062
+ col,
1063
+ row
1064
+ };
1065
+ const rawValue = model.getValue(address);
1066
+ const ranges = model.sheet.ranges?.filter(({ range }) => inRange(rangeFromIndex(model.sheet, range), address));
1067
+ const threadRefs = model.sheet.threads?.filter((thread) => {
1068
+ const range = thread?.anchor && parseThreadAnchorAsCellRange(thread.anchor);
1069
+ return thread && range ? inRange(range, address) : false;
1070
+ }).map((thread) => fullyQualifiedId3(thread)).join(" ");
1071
+ const type = model.getValueType(address);
1072
+ const classNames = ranges?.map(cellClassNameForRange).reverse();
1073
+ return {
1074
+ value: parseValue(type, rawValue),
1075
+ className: mx2(cellClassesForFieldType(type), threadRefs && commentedClassName, classNames),
1076
+ dataRefs: threadRefs
1077
+ };
1078
+ };
1079
+ var gridCellGetter = (model) => {
1080
+ const cachedGridCells = {};
1081
+ return (nextBounds) => {
1082
+ [
1083
+ ...Array(nextBounds.end.col - nextBounds.start.col)
1084
+ ].forEach((_, c0) => {
1085
+ return [
1086
+ ...Array(nextBounds.end.row - nextBounds.start.row)
1087
+ ].forEach((_2, r0) => {
1088
+ const col = nextBounds.start.col + c0;
1089
+ const row = nextBounds.start.row + r0;
1090
+ cachedGridCells[`${col},${row}`] = projectCellProps(model, col, row);
1091
+ });
1092
+ });
1093
+ return cachedGridCells;
1094
+ };
1095
+ };
1096
+ var rowLabelCell = (row) => ({
1097
+ value: rowToA1Notation(row),
1098
+ className: "text-end !pie-1",
1099
+ resizeHandle: "row"
1100
+ });
1101
+ var colLabelCell = (col) => ({
1102
+ value: colToA1Notation(col),
1103
+ resizeHandle: "col"
1104
+ });
1105
+ var cellGetter = (model) => {
1106
+ const getGridCells = gridCellGetter(model);
1107
+ return (nextBounds, plane) => {
1108
+ switch (plane) {
1109
+ case "grid":
1110
+ return getGridCells(nextBounds);
1111
+ case "frozenColsStart":
1112
+ return [
1113
+ ...Array(nextBounds.end.row - nextBounds.start.row)
1114
+ ].reduce((acc, _, r0) => {
1115
+ const r = nextBounds.start.row + r0;
1116
+ acc[`0,${r}`] = rowLabelCell(r);
1117
+ return acc;
1118
+ }, {});
1119
+ case "frozenRowsStart":
1120
+ return [
1121
+ ...Array(nextBounds.end.col - nextBounds.start.col)
1122
+ ].reduce((acc, _, c0) => {
1123
+ const c = nextBounds.start.col + c0;
1124
+ acc[`${c},0`] = colLabelCell(c);
1125
+ return acc;
1126
+ }, {});
1127
+ default:
1128
+ return {};
1129
+ }
1130
+ };
1131
+ };
1132
+ var useSheetModelDxGridProps = (dxGrid, model) => {
1133
+ const [columns, setColumns] = useState3(createDxGridColumns(model));
1134
+ const [rows, setRows] = useState3(createDxGridColumns(model));
1135
+ useEffect3(() => {
1136
+ const cellsAccessor = createDocAccessor(model.sheet, [
1137
+ "cells"
1138
+ ]);
1139
+ if (dxGrid) {
1140
+ dxGrid.getCells = cellGetter(model);
1141
+ }
1142
+ const handleCellsUpdate = () => {
1143
+ dxGrid?.requestUpdate("initialCells");
1144
+ };
1145
+ cellsAccessor.handle.addListener("change", handleCellsUpdate);
1146
+ return () => cellsAccessor.handle.removeListener("change", handleCellsUpdate);
1147
+ }, [
1148
+ model,
1149
+ dxGrid
1150
+ ]);
1151
+ useEffect3(() => {
1152
+ const columnMetaAccessor = createDocAccessor(model.sheet, [
1153
+ "columnMeta"
1154
+ ]);
1155
+ const rowMetaAccessor = createDocAccessor(model.sheet, [
1156
+ "rowMeta"
1157
+ ]);
1158
+ const handleColumnMetaUpdate = () => {
1159
+ setColumns(createDxGridColumns(model));
1160
+ };
1161
+ const handleRowMetaUpdate = () => {
1162
+ setRows(createDxGridRows(model));
1163
+ };
1164
+ columnMetaAccessor.handle.addListener("change", handleColumnMetaUpdate);
1165
+ rowMetaAccessor.handle.addListener("change", handleRowMetaUpdate);
1166
+ return () => {
1167
+ columnMetaAccessor.handle.removeListener("change", handleColumnMetaUpdate);
1168
+ rowMetaAccessor.handle.removeListener("change", handleRowMetaUpdate);
1169
+ };
1170
+ }, [
1171
+ model
1172
+ ]);
1173
+ return {
1174
+ columns,
1175
+ rows
1176
+ };
1177
+ };
1178
+
1179
+ // packages/plugins/plugin-sheet/src/components/GridSheet/GridSheet.tsx
1180
+ var inertPosition = {
1181
+ plane: "grid",
1182
+ col: 0,
1183
+ row: 0
1184
+ };
1185
+ var initialCells = {
1186
+ grid: {},
1187
+ frozenColsStart: [
1188
+ ...Array(64)
1189
+ ].reduce((acc, _, i) => {
1190
+ acc[`0,${i}`] = rowLabelCell(i);
1191
+ return acc;
1192
+ }, {}),
1193
+ frozenRowsStart: [
1194
+ ...Array(12)
1195
+ ].reduce((acc, _, i) => {
1196
+ acc[`${i},0`] = colLabelCell(i);
1197
+ return acc;
1198
+ }, {})
1199
+ };
1200
+ var frozen = {
1201
+ frozenColsStart: 1,
1202
+ frozenRowsStart: 1
1203
+ };
1204
+ var sheetRowDefault = {
1205
+ frozenRowsStart: {
1206
+ size: 32,
1207
+ readonly: true
1208
+ },
1209
+ grid: {
1210
+ size: 32,
1211
+ resizeable: true
1212
+ }
1213
+ };
1214
+ var sheetColDefault = {
1215
+ frozenColsStart: {
1216
+ size: 48,
1217
+ readonly: true
1218
+ },
1219
+ grid: {
1220
+ size: 180,
1221
+ resizeable: true
1222
+ }
1223
+ };
1224
+ var GridSheet = () => {
1225
+ const { t } = useTranslation2(SHEET_PLUGIN);
1226
+ const { id, model, editing, setEditing, setCursor, setRange, cursor, cursorFallbackRange, activeRefs } = useSheetContext();
1227
+ const [dxGrid, setDxGrid] = useState4(null);
1228
+ const rangeController = useRef();
1229
+ const { hasAttention } = useAttention(id);
1230
+ const handleFocus = useCallback4((event) => {
1231
+ if (!editing) {
1232
+ const cell = closestCell(event.target);
1233
+ if (cell && cell.plane === "grid") {
1234
+ setCursor({
1235
+ col: cell.col,
1236
+ row: cell.row
1237
+ });
1238
+ }
1239
+ }
1240
+ }, [
1241
+ editing
1242
+ ]);
1243
+ const handleClose = useCallback4((value, { key, shift }) => {
1244
+ if (value !== void 0) {
1245
+ model.setValue(dxGridCellIndexToSheetCellAddress(editing.index), value);
1246
+ }
1247
+ setEditing(null);
1248
+ const axis = [
1249
+ "Enter",
1250
+ "ArrowUp",
1251
+ "ArrowDown"
1252
+ ].includes(key) ? "row" : [
1253
+ "Tab",
1254
+ "ArrowLeft",
1255
+ "ArrowRight"
1256
+ ].includes(key) ? "col" : void 0;
1257
+ const delta = key.startsWith("Arrow") ? [
1258
+ "ArrowUp",
1259
+ "ArrowLeft"
1260
+ ].includes(key) ? -1 : 1 : shift ? -1 : 1;
1261
+ dxGrid?.refocus(axis, delta);
1262
+ }, [
1263
+ model,
1264
+ editing,
1265
+ dxGrid
1266
+ ]);
1267
+ const handleBlur = useCallback4((value) => {
1268
+ if (value !== void 0) {
1269
+ model.setValue(dxGridCellIndexToSheetCellAddress(editing.index), value);
1270
+ }
1271
+ setEditing(null);
1272
+ }, [
1273
+ model,
1274
+ editing
1275
+ ]);
1276
+ const handleAxisResize = useCallback4(({ axis, size, index: numericIndex }) => {
1277
+ if (axis === "row") {
1278
+ const rowId = model.sheet.rows[parseInt(numericIndex)];
1279
+ model.sheet.rowMeta[rowId] ??= {};
1280
+ model.sheet.rowMeta[rowId].size = size;
1281
+ } else {
1282
+ const columnId = model.sheet.columns[parseInt(numericIndex)];
1283
+ model.sheet.columnMeta[columnId] ??= {};
1284
+ model.sheet.columnMeta[columnId].size = size;
1285
+ }
1286
+ }, [
1287
+ model
1288
+ ]);
1289
+ const handleSelect = useCallback4(({ minCol, maxCol, minRow, maxRow }) => {
1290
+ const range = {
1291
+ from: {
1292
+ col: minCol,
1293
+ row: minRow
1294
+ }
1295
+ };
1296
+ if (minCol !== maxCol || minRow !== maxRow) {
1297
+ range.to = {
1298
+ col: maxCol,
1299
+ row: maxRow
1300
+ };
1301
+ }
1302
+ if (editing) {
1303
+ rangeController.current?.setRange(rangeToA1Notation(range));
1304
+ } else {
1305
+ setRange(range.to ? range : void 0);
1306
+ }
1307
+ }, [
1308
+ editing
1309
+ ]);
1310
+ const handleWheel = useCallback4((event) => {
1311
+ if (!hasAttention) {
1312
+ event.stopPropagation();
1313
+ }
1314
+ }, [
1315
+ hasAttention
1316
+ ]);
1317
+ const handleKeyDown = useCallback4((event) => {
1318
+ switch (event.key) {
1319
+ case "Backspace":
1320
+ case "Delete":
1321
+ event.preventDefault();
1322
+ return cursorFallbackRange && model.clear(cursorFallbackRange);
1323
+ }
1324
+ if (event.metaKey || event.ctrlKey) {
1325
+ switch (event.key) {
1326
+ case "x":
1327
+ case "X":
1328
+ event.preventDefault();
1329
+ return cursorFallbackRange && model.cut(cursorFallbackRange);
1330
+ case "c":
1331
+ case "C":
1332
+ event.preventDefault();
1333
+ return cursorFallbackRange && model.copy(cursorFallbackRange);
1334
+ case "v":
1335
+ case "V":
1336
+ event.preventDefault();
1337
+ return cursor && model.paste(cursor);
1338
+ case "z":
1339
+ event.preventDefault();
1340
+ return event.shiftKey ? model.redo() : model.undo();
1341
+ case "Z":
1342
+ case "y":
1343
+ event.preventDefault();
1344
+ return model.redo();
1345
+ }
1346
+ }
1347
+ }, [
1348
+ cursorFallbackRange,
1349
+ model,
1350
+ cursor
1351
+ ]);
1352
+ const contextMenuAnchorRef = useRef(null);
1353
+ const [contextMenuOpen, setContextMenuOpen] = useState4(null);
1354
+ const contextMenuAxis = contextMenuOpen?.plane.startsWith("frozenRows") ? "col" : "row";
1355
+ const handleContextMenu = useCallback4((event) => {
1356
+ const cell = closestCell(event.target);
1357
+ if (cell && cell.plane.startsWith("frozen")) {
1358
+ event.preventDefault();
1359
+ contextMenuAnchorRef.current = event.target;
1360
+ setContextMenuOpen(cell);
1361
+ }
1362
+ }, []);
1363
+ const handleAxisMenuAction = useCallback4((operation) => {
1364
+ switch (operation) {
1365
+ case "add-before":
1366
+ case "add-after":
1367
+ model[contextMenuAxis === "col" ? "insertColumns" : "insertRows"](contextMenuOpen[contextMenuAxis] + (operation === "add-before" ? 0 : 1), 1);
1368
+ break;
1369
+ case "remove":
1370
+ }
1371
+ }, [
1372
+ contextMenuAxis,
1373
+ contextMenuOpen,
1374
+ model
1375
+ ]);
1376
+ const { columns, rows } = useSheetModelDxGridProps(dxGrid, model);
1377
+ const extension = useMemo2(() => [
1378
+ editorKeys({
1379
+ onClose: handleClose,
1380
+ ...editing?.initialContent && {
1381
+ onNav: handleClose
1382
+ }
1383
+ }),
1384
+ sheetExtension({
1385
+ functions: model.graph.getFunctions()
1386
+ }),
1387
+ rangeExtension({
1388
+ onInit: (fn) => rangeController.current = fn,
1389
+ onStateChange: (state) => {
1390
+ if (dxGrid) {
1391
+ dxGrid.mode = typeof state.activeRange === "undefined" ? "edit" : "edit-select";
1392
+ }
1393
+ }
1394
+ })
1395
+ ], [
1396
+ model,
1397
+ handleClose,
1398
+ editing
1399
+ ]);
1400
+ const getCellContent = useCallback4((index) => {
1401
+ const cell = dxGridCellIndexToSheetCellAddress(index);
1402
+ return model.getCellText(cell);
1403
+ }, [
1404
+ model
1405
+ ]);
1406
+ useUpdateFocusedCellOnThreadSelection(dxGrid);
1407
+ useSelectThreadOnCellFocus();
1408
+ return /* @__PURE__ */ React4.createElement(React4.Fragment, null, /* @__PURE__ */ React4.createElement(GridCellEditor, {
1409
+ getCellContent,
1410
+ extension,
1411
+ onBlur: handleBlur
1412
+ }), /* @__PURE__ */ React4.createElement(Grid2.Content, {
1413
+ initialCells,
1414
+ limitColumns: DEFAULT_COLUMNS,
1415
+ limitRows: DEFAULT_ROWS,
1416
+ columns,
1417
+ rows,
1418
+ onAxisResize: handleAxisResize,
1419
+ onSelect: handleSelect,
1420
+ rowDefault: sheetRowDefault,
1421
+ columnDefault: sheetColDefault,
1422
+ frozen,
1423
+ onFocus: handleFocus,
1424
+ onWheelCapture: handleWheel,
1425
+ onKeyDown: handleKeyDown,
1426
+ onContextMenu: handleContextMenu,
1427
+ overscroll: "inline",
1428
+ className: "[--dx-grid-base:var(--surface-bg)]",
1429
+ activeRefs,
1430
+ ref: setDxGrid
1431
+ }), /* @__PURE__ */ React4.createElement(DropdownMenu.Root, {
1432
+ modal: false,
1433
+ open: !!contextMenuOpen,
1434
+ onOpenChange: (nextOpen) => setContextMenuOpen(nextOpen ? inertPosition : null)
1435
+ }, /* @__PURE__ */ React4.createElement(DropdownMenu.VirtualTrigger, {
1436
+ virtualRef: contextMenuAnchorRef
1437
+ }), /* @__PURE__ */ React4.createElement(DropdownMenu.Content, {
1438
+ side: contextMenuAxis === "col" ? "bottom" : "right",
1439
+ sideOffset: 4,
1440
+ collisionPadding: 8
1441
+ }, /* @__PURE__ */ React4.createElement(DropdownMenu.Viewport, null, /* @__PURE__ */ React4.createElement(DropdownMenu.Item, {
1442
+ onClick: () => handleAxisMenuAction("add-before")
1443
+ }, /* @__PURE__ */ React4.createElement(Icon, {
1444
+ size: 5,
1445
+ icon: contextMenuAxis === "col" ? "ph--columns-plus-left--regular" : "ph--rows-plus-top--regular"
1446
+ }), /* @__PURE__ */ React4.createElement("span", null, t(`add ${contextMenuAxis} before label`))), /* @__PURE__ */ React4.createElement(DropdownMenu.Item, {
1447
+ onClick: () => handleAxisMenuAction("add-after")
1448
+ }, /* @__PURE__ */ React4.createElement(Icon, {
1449
+ size: 5,
1450
+ icon: contextMenuAxis === "col" ? "ph--columns-plus-right--regular" : "ph--rows-plus-bottom--regular"
1451
+ }), /* @__PURE__ */ React4.createElement("span", null, t(`add ${contextMenuAxis} after label`))), /* @__PURE__ */ React4.createElement(DropdownMenu.Item, {
1452
+ disabled: true,
1453
+ onClick: () => handleAxisMenuAction("remove")
1454
+ }, /* @__PURE__ */ React4.createElement(Icon, {
1455
+ size: 5,
1456
+ icon: "ph--backspace--regular"
1457
+ }), /* @__PURE__ */ React4.createElement("span", null, t(`delete ${contextMenuAxis} label`)))), /* @__PURE__ */ React4.createElement(DropdownMenu.Arrow, null))));
1458
+ };
1459
+
1460
+ export {
1461
+ ComputeGraphContextProvider,
1462
+ useComputeGraph,
1463
+ completeCellRangeToThreadCursor,
1464
+ computeGraphFacet,
1465
+ useSheetContext,
1466
+ SheetProvider,
1467
+ GridSheet,
1468
+ RangeList,
1469
+ SheetContainer
1470
+ };
1471
+ //# sourceMappingURL=chunk-I2DKJ72A.mjs.map