@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,1765 +0,0 @@
1
- "use strict";
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var SheetContainer_AXQV3ZT5_exports = {};
30
- __export(SheetContainer_AXQV3ZT5_exports, {
31
- default: () => SheetContainer_default
32
- });
33
- module.exports = __toCommonJS(SheetContainer_AXQV3ZT5_exports);
34
- var import_chunk_CN3RPESU = require("./chunk-CN3RPESU.cjs");
35
- var import_chunk_5KKJ4NPP = require("./chunk-5KKJ4NPP.cjs");
36
- var import_chunk_DSYKOI4E = require("./chunk-DSYKOI4E.cjs");
37
- var import_chunk_BJ6ZD7MN = require("./chunk-BJ6ZD7MN.cjs");
38
- var import_react = __toESM(require("react"));
39
- var import_react_ui_theme = require("@dxos/react-ui-theme");
40
- var import_core = require("@dnd-kit/core");
41
- var import_modifiers = require("@dnd-kit/modifiers");
42
- var import_utilities = require("@dnd-kit/utilities");
43
- var import_react2 = require("@phosphor-icons/react");
44
- var import_re_resizable = require("re-resizable");
45
- var import_react3 = __toESM(require("react"));
46
- var import_react_dom = require("react-dom");
47
- var import_react_resize_detector = require("react-resize-detector");
48
- var import_async = require("@dxos/async");
49
- var import_echo = require("@dxos/client/echo");
50
- var import_log = require("@dxos/log");
51
- var import_react_ui_attention = require("@dxos/react-ui-attention");
52
- var import_react_ui_theme2 = require("@dxos/react-ui-theme");
53
- var import_react4 = require("react");
54
- var import_react5 = require("react");
55
- var import_react6 = __toESM(require("react"));
56
- var import_invariant = require("@dxos/invariant");
57
- var import_echo2 = require("@dxos/react-client/echo");
58
- var import_view = require("@codemirror/view");
59
- var import_react7 = __toESM(require("react"));
60
- var import_react_ui = require("@dxos/react-ui");
61
- var import_react_ui_editor = require("@dxos/react-ui-editor");
62
- var import_autocomplete = require("@codemirror/autocomplete");
63
- var import_language = require("@codemirror/language");
64
- var import_state = require("@codemirror/state");
65
- var import_view2 = require("@codemirror/view");
66
- var import_highlight = require("@lezer/highlight");
67
- var import_codemirror_lang_spreadsheet = require("codemirror-lang-spreadsheet");
68
- var import_react_ui_theme3 = require("@dxos/react-ui-theme");
69
- var axisWidth = "calc(var(--rail-size)-2px)";
70
- var axisHeight = 34;
71
- var minWidth = 40;
72
- var maxWidth = 800;
73
- var minHeight = axisHeight;
74
- var maxHeight = 400;
75
- var defaultWidth = 200;
76
- var defaultHeight = minHeight;
77
- var CELL_DATA_KEY = "cell";
78
- var useGridLayout = ({ scroller, size, rows, columns, rowSizes, columnSizes }) => {
79
- const [rowPositions, setRowPositions] = (0, import_react4.useState)([]);
80
- (0, import_react4.useEffect)(() => {
81
- if (!rowSizes) {
82
- return;
83
- }
84
- let y = 0;
85
- setRowPositions(rows.map((idx, i) => {
86
- const height2 = rowSizes?.[idx] ?? defaultHeight;
87
- const top = y;
88
- y += height2 - 1;
89
- return {
90
- row: i,
91
- top,
92
- height: height2
93
- };
94
- }));
95
- }, [
96
- rows,
97
- rowSizes
98
- ]);
99
- const [columnPositions, setColumnPositions] = (0, import_react4.useState)([]);
100
- (0, import_react4.useEffect)(() => {
101
- if (!columns) {
102
- return;
103
- }
104
- let x = 0;
105
- setColumnPositions(columns.map((idx, i) => {
106
- const width2 = columnSizes?.[idx] ?? defaultWidth;
107
- const left = x;
108
- x += width2 - 1;
109
- return {
110
- column: i,
111
- left,
112
- width: width2
113
- };
114
- }));
115
- }, [
116
- columns,
117
- columnSizes
118
- ]);
119
- const height = rowPositions.length ? rowPositions[rowPositions.length - 1].top + rowPositions[rowPositions.length - 1].height : 0;
120
- const width = columnPositions.length ? columnPositions[columnPositions.length - 1].left + columnPositions[columnPositions.length - 1].width : 0;
121
- const [{ rowRange, columnRange }, setWindow] = (0, import_react4.useState)({
122
- rowRange: [],
123
- columnRange: []
124
- });
125
- (0, import_react4.useEffect)(() => {
126
- const handleScroll = () => {
127
- if (!scroller) {
128
- return;
129
- }
130
- const { scrollLeft: left, scrollTop: top, clientWidth: width2, clientHeight: height2 } = scroller;
131
- let rowStart = 0;
132
- let rowEnd = 0;
133
- for (let i = 0; i < rowPositions.length; i++) {
134
- const row = rowPositions[i];
135
- if (row.top <= top) {
136
- rowStart = i;
137
- }
138
- if (row.top + row.height >= top + height2) {
139
- rowEnd = i;
140
- break;
141
- }
142
- }
143
- let columnStart = 0;
144
- let columnEnd = 0;
145
- for (let i = 0; i < columnPositions.length; i++) {
146
- const column = columnPositions[i];
147
- if (column.left <= left) {
148
- columnStart = i;
149
- }
150
- if (column.left + column.width >= left + width2) {
151
- columnEnd = i;
152
- break;
153
- }
154
- }
155
- const overscan = 5;
156
- setWindow({
157
- rowRange: rowPositions.slice(Math.max(0, rowStart - overscan), Math.min(rowPositions.length, rowEnd + overscan)),
158
- columnRange: columnPositions.slice(Math.max(0, columnStart - overscan), Math.min(columnPositions.length, columnEnd + overscan))
159
- });
160
- };
161
- scroller?.addEventListener("scroll", handleScroll);
162
- handleScroll();
163
- return () => {
164
- scroller?.removeEventListener("scroll", handleScroll);
165
- };
166
- }, [
167
- size.width,
168
- size.height,
169
- rowPositions,
170
- columnPositions
171
- ]);
172
- return {
173
- width,
174
- height,
175
- rowRange,
176
- columnRange
177
- };
178
- };
179
- var getCellAtPointer = (event) => {
180
- const element = document.elementFromPoint(event.clientX, event.clientY);
181
- const root = element?.closest(`[data-${CELL_DATA_KEY}]`);
182
- if (root) {
183
- const value = root.dataset[CELL_DATA_KEY];
184
- if (value) {
185
- return (0, import_chunk_5KKJ4NPP.addressFromA1Notation)(value);
186
- }
187
- }
188
- };
189
- var getCellElement = (root, cell) => {
190
- const pos = (0, import_chunk_5KKJ4NPP.addressToA1Notation)(cell);
191
- return root.querySelector(`[data-${CELL_DATA_KEY}="${pos}"]`);
192
- };
193
- var handleNav = (ev, cursor, range, size) => {
194
- if (cursor && ev.shiftKey) {
195
- const opposite = range?.to ?? {
196
- ...cursor
197
- };
198
- switch (ev.key) {
199
- case "ArrowUp": {
200
- if (opposite.row > 0) {
201
- opposite.row -= 1;
202
- }
203
- break;
204
- }
205
- case "ArrowDown": {
206
- if (opposite.row < size.numRows - 1) {
207
- opposite.row += 1;
208
- }
209
- break;
210
- }
211
- case "ArrowLeft": {
212
- if (opposite.column > 0) {
213
- opposite.column -= 1;
214
- }
215
- break;
216
- }
217
- case "ArrowRight": {
218
- if (opposite.column < size.numColumns - 1) {
219
- opposite.column += 1;
220
- }
221
- break;
222
- }
223
- }
224
- return {
225
- cursor,
226
- range: {
227
- from: cursor,
228
- to: opposite
229
- }
230
- };
231
- }
232
- const next = handleArrowNav(ev, cursor, size);
233
- return {
234
- cursor: next
235
- };
236
- };
237
- var handleArrowNav = (ev, cursor, { numRows, numColumns }) => {
238
- switch (ev.key) {
239
- case "ArrowUp":
240
- if (cursor === void 0) {
241
- return {
242
- row: 0,
243
- column: 0
244
- };
245
- } else if (cursor.row > 0) {
246
- return {
247
- row: ev.metaKey ? 0 : cursor.row - 1,
248
- column: cursor.column
249
- };
250
- }
251
- break;
252
- case "ArrowDown":
253
- if (cursor === void 0) {
254
- return {
255
- row: 0,
256
- column: 0
257
- };
258
- } else if (cursor.row < numRows - 1) {
259
- return {
260
- row: ev.metaKey ? numRows - 1 : cursor.row + 1,
261
- column: cursor.column
262
- };
263
- }
264
- break;
265
- case "ArrowLeft":
266
- if (cursor === void 0) {
267
- return {
268
- row: 0,
269
- column: 0
270
- };
271
- } else if (cursor.column > 0) {
272
- return {
273
- row: cursor.row,
274
- column: ev.metaKey ? 0 : cursor.column - 1
275
- };
276
- }
277
- break;
278
- case "ArrowRight":
279
- if (cursor === void 0) {
280
- return {
281
- row: 0,
282
- column: 0
283
- };
284
- } else if (cursor.column < numColumns - 1) {
285
- return {
286
- row: cursor.row,
287
- column: ev.metaKey ? numColumns - 1 : cursor.column + 1
288
- };
289
- }
290
- break;
291
- case "Home":
292
- return {
293
- row: 0,
294
- column: 0
295
- };
296
- case "End":
297
- return {
298
- row: numRows - 1,
299
- column: numColumns - 1
300
- };
301
- }
302
- };
303
- var useRangeSelect = (cb) => {
304
- const [from, setFrom] = (0, import_react5.useState)();
305
- const [to, setTo] = (0, import_react5.useState)();
306
- const onMouseDown = (ev) => {
307
- const current = getCellAtPointer(ev);
308
- setFrom(current);
309
- if (current) {
310
- setTimeout(() => cb("start", {
311
- from: current
312
- }));
313
- }
314
- };
315
- const onMouseMove = (ev) => {
316
- if (from) {
317
- let current = getCellAtPointer(ev);
318
- if ((0, import_chunk_5KKJ4NPP.posEquals)(current, from)) {
319
- current = void 0;
320
- }
321
- setTo(current);
322
- setTimeout(() => cb("move", {
323
- from,
324
- to: current
325
- }));
326
- }
327
- };
328
- const onMouseUp = (ev) => {
329
- if (from) {
330
- let current = getCellAtPointer(ev);
331
- if ((0, import_chunk_5KKJ4NPP.posEquals)(current, from)) {
332
- current = void 0;
333
- }
334
- setFrom(void 0);
335
- setTo(void 0);
336
- setTimeout(() => cb("end", current ? {
337
- from,
338
- to: current
339
- } : void 0));
340
- }
341
- };
342
- return {
343
- range: from ? {
344
- from,
345
- to
346
- } : void 0,
347
- handlers: {
348
- onMouseDown,
349
- onMouseMove,
350
- onMouseUp
351
- }
352
- };
353
- };
354
- var FormattingModel = class {
355
- constructor(model) {
356
- this.model = model;
357
- }
358
- /**
359
- * Get formatted string value and className for cell.
360
- */
361
- getFormatting(cell) {
362
- const value = this.model.getValue(cell);
363
- if (value === void 0 || value === null) {
364
- return {};
365
- }
366
- const locales = void 0;
367
- const idx = this.model.addressToIndex(cell);
368
- let formatting = this.model.sheet.formatting?.[idx] ?? {};
369
- const classNames = [
370
- ...formatting?.classNames ?? []
371
- ];
372
- for (const [idx2, _formatting] of Object.entries(this.model.sheet.formatting)) {
373
- const range = this.model.rangeFromIndex(idx2);
374
- if ((0, import_chunk_5KKJ4NPP.inRange)(range, cell)) {
375
- if (_formatting.classNames) {
376
- classNames.push(..._formatting.classNames);
377
- }
378
- if (_formatting.type) {
379
- formatting = _formatting;
380
- }
381
- }
382
- }
383
- const defaultNumber = "justify-end font-mono";
384
- const type = formatting?.type ?? this.model.getValueType(cell);
385
- switch (type) {
386
- case import_chunk_DSYKOI4E.ValueTypeEnum.Boolean: {
387
- return {
388
- value: value.toLocaleString().toUpperCase(),
389
- classNames: [
390
- ...classNames,
391
- value ? "!text-greenText" : "!text-orangeText"
392
- ]
393
- };
394
- }
395
- //
396
- // Numbers.
397
- //
398
- case import_chunk_DSYKOI4E.ValueTypeEnum.Number: {
399
- return {
400
- value: value.toLocaleString(locales),
401
- classNames: [
402
- ...classNames,
403
- defaultNumber
404
- ]
405
- };
406
- }
407
- case import_chunk_DSYKOI4E.ValueTypeEnum.Percent: {
408
- return {
409
- value: value * 100 + "%",
410
- classNames: [
411
- ...classNames,
412
- defaultNumber
413
- ]
414
- };
415
- }
416
- case import_chunk_DSYKOI4E.ValueTypeEnum.Currency: {
417
- return {
418
- value: value.toLocaleString(locales, {
419
- style: "currency",
420
- currency: "USD",
421
- minimumFractionDigits: 2,
422
- maximumFractionDigits: 2
423
- }),
424
- classNames: [
425
- ...classNames,
426
- defaultNumber
427
- ]
428
- };
429
- }
430
- //
431
- // Dates.
432
- //
433
- case import_chunk_DSYKOI4E.ValueTypeEnum.DateTime: {
434
- const date = this.model.toLocalDate(value);
435
- return {
436
- value: date.toLocaleString(locales),
437
- classNames
438
- };
439
- }
440
- case import_chunk_DSYKOI4E.ValueTypeEnum.Date: {
441
- const date = this.model.toLocalDate(value);
442
- return {
443
- value: date.toLocaleDateString(locales),
444
- classNames
445
- };
446
- }
447
- case import_chunk_DSYKOI4E.ValueTypeEnum.Time: {
448
- const date = this.model.toLocalDate(value);
449
- return {
450
- value: date.toLocaleTimeString(locales),
451
- classNames
452
- };
453
- }
454
- default: {
455
- return {
456
- value: String(value),
457
- classNames
458
- };
459
- }
460
- }
461
- }
462
- };
463
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/components/Sheet/sheet-context.tsx";
464
- var OBJECT_ID_LENGTH = 60;
465
- var SheetContext = /* @__PURE__ */ (0, import_react6.createContext)(null);
466
- var useSheetContext = () => {
467
- const context = (0, import_react6.useContext)(SheetContext);
468
- (0, import_invariant.invariant)(context, void 0, {
469
- F: __dxlog_file,
470
- L: 45,
471
- S: void 0,
472
- A: [
473
- "context",
474
- ""
475
- ]
476
- });
477
- return context;
478
- };
479
- var mapFormulaBindingToId = (functions) => (formula) => {
480
- return formula.replace(/([a-zA-Z0-9]+)\((.*)\)/g, (match, binding, args) => {
481
- if (import_chunk_5KKJ4NPP.defaultFunctions.find((fn2) => fn2.name === binding) || binding === "EDGE") {
482
- return match;
483
- }
484
- const fn = functions.find((fn2) => fn2.binding === binding);
485
- if (fn) {
486
- return `${(0, import_echo2.fullyQualifiedId)(fn)}(${args})`;
487
- } else {
488
- return match;
489
- }
490
- });
491
- };
492
- var mapFormulaBindingFromId = (functions) => (formula) => {
493
- return formula.replace(/([a-zA-Z0-9]+):([a-zA-Z0-9]+)\((.*)\)/g, (match, spaceId, objectId, args) => {
494
- const id = `${spaceId}:${objectId}`;
495
- if (id.length !== OBJECT_ID_LENGTH) {
496
- return match;
497
- }
498
- const fn = functions.find((fn2) => (0, import_echo2.fullyQualifiedId)(fn2) === id);
499
- if (fn?.binding) {
500
- return `${fn.binding}(${args})`;
501
- } else {
502
- return match;
503
- }
504
- });
505
- };
506
- var SheetContextProvider = ({ children, sheet, space, readonly, onInfo, ...options }) => {
507
- const graph = (0, import_chunk_CN3RPESU.useComputeGraph)(space, options);
508
- const [cursor, setCursor] = (0, import_react6.useState)();
509
- const [range, setRange] = (0, import_react6.useState)();
510
- const [editing, setEditing] = (0, import_react6.useState)(false);
511
- const [[model, formatting] = [], setModels] = (0, import_react6.useState)(void 0);
512
- (0, import_react6.useEffect)(() => {
513
- let model2;
514
- let formatting2;
515
- const t = setTimeout(async () => {
516
- model2 = new import_chunk_5KKJ4NPP.SheetModel(graph, sheet, space, {
517
- readonly,
518
- mapFormulaBindingToId,
519
- mapFormulaBindingFromId
520
- });
521
- await model2.initialize();
522
- formatting2 = new FormattingModel(model2);
523
- setModels([
524
- model2,
525
- formatting2
526
- ]);
527
- });
528
- return () => {
529
- clearTimeout(t);
530
- void model2?.destroy();
531
- };
532
- }, [
533
- graph,
534
- readonly
535
- ]);
536
- if (!model || !formatting) {
537
- return null;
538
- }
539
- return /* @__PURE__ */ import_react6.default.createElement(SheetContext.Provider, {
540
- value: {
541
- model,
542
- formatting,
543
- cursor,
544
- setCursor,
545
- range,
546
- setRange,
547
- editing,
548
- setEditing,
549
- // TODO(burdon): Change to event.
550
- onInfo
551
- }
552
- }, children);
553
- };
554
- var getRelativeClientRect = (root, element) => {
555
- const rootRect = root.getBoundingClientRect();
556
- const elementRect = element.getBoundingClientRect();
557
- return new DOMRect(elementRect.left - rootRect.left + root.scrollLeft, elementRect.top - rootRect.top + root.scrollTop, elementRect.width, elementRect.height);
558
- };
559
- var getRectUnion = (b1, b2) => {
560
- return {
561
- left: Math.min(b1.left, b2.left),
562
- top: Math.min(b1.top, b2.top),
563
- width: Math.abs(b1.left - b2.left) + (b1.left > b2.left ? b1.width : b2.width),
564
- height: Math.abs(b1.top - b2.top) + (b1.height > b2.height ? b1.height : b2.height)
565
- };
566
- };
567
- var scrollIntoView = (scrollContainer, el) => {
568
- el.scrollIntoView({
569
- block: "nearest",
570
- inline: "nearest"
571
- });
572
- const cellBounds = el.getBoundingClientRect();
573
- const scrollerBounds = scrollContainer.getBoundingClientRect();
574
- if (cellBounds.top < scrollerBounds.top) {
575
- scrollContainer.scrollTop -= scrollerBounds.top - cellBounds.top;
576
- } else if (cellBounds.bottom >= scrollerBounds.bottom - 1) {
577
- scrollContainer.scrollTop += 2 + scrollerBounds.bottom - cellBounds.bottom;
578
- }
579
- if (cellBounds.left < scrollerBounds.left) {
580
- scrollContainer.scrollLeft -= scrollerBounds.left - cellBounds.left;
581
- } else if (cellBounds.right >= scrollerBounds.right) {
582
- scrollContainer.scrollLeft += 2 + scrollerBounds.right - cellBounds.right;
583
- }
584
- };
585
- var editorKeys = ({ onNav, onClose }) => {
586
- return import_view.keymap.of([
587
- {
588
- key: "ArrowUp",
589
- run: (editor) => {
590
- const value = editor.state.doc.toString();
591
- onNav?.(value, {
592
- key: "ArrowUp"
593
- });
594
- return !!onNav;
595
- }
596
- },
597
- {
598
- key: "ArrowDown",
599
- run: (editor) => {
600
- const value = editor.state.doc.toString();
601
- onNav?.(value, {
602
- key: "ArrowDown"
603
- });
604
- return !!onNav;
605
- }
606
- },
607
- {
608
- key: "ArrowLeft",
609
- run: (editor) => {
610
- const value = editor.state.doc.toString();
611
- onNav?.(value, {
612
- key: "ArrowLeft"
613
- });
614
- return !!onNav;
615
- }
616
- },
617
- {
618
- key: "ArrowRight",
619
- run: (editor) => {
620
- const value = editor.state.doc.toString();
621
- onNav?.(value, {
622
- key: "ArrowRight"
623
- });
624
- return !!onNav;
625
- }
626
- },
627
- {
628
- key: "Enter",
629
- run: (editor) => {
630
- onClose(editor.state.doc.toString());
631
- return true;
632
- }
633
- },
634
- {
635
- key: "Escape",
636
- run: () => {
637
- onClose(void 0);
638
- return true;
639
- }
640
- }
641
- ]);
642
- };
643
- var CellEditor = ({ value, extension, autoFocus, onBlur }) => {
644
- const { themeMode } = (0, import_react_ui.useThemeContext)();
645
- const { parentRef } = (0, import_react_ui_editor.useTextEditor)(() => {
646
- return {
647
- autoFocus,
648
- initialValue: value,
649
- selection: {
650
- anchor: value?.length ?? 0
651
- },
652
- extensions: [
653
- extension ?? [],
654
- import_react_ui_editor.preventNewline,
655
- import_view.EditorView.focusChangeEffect.of((_, focusing) => {
656
- if (!focusing) {
657
- onBlur?.({
658
- type: "blur"
659
- });
660
- }
661
- return null;
662
- }),
663
- (0, import_react_ui_editor.createBasicExtensions)({
664
- lineWrapping: false
665
- }),
666
- (0, import_react_ui_editor.createThemeExtensions)({
667
- themeMode,
668
- slots: {
669
- editor: {
670
- className: "flex w-full [&>.cm-scroller]:scrollbar-none"
671
- },
672
- content: {
673
- className: "!px-2 !py-1"
674
- }
675
- }
676
- })
677
- ]
678
- };
679
- }, [
680
- extension
681
- ]);
682
- return /* @__PURE__ */ import_react7.default.createElement("div", {
683
- ref: parentRef,
684
- className: "flex w-full"
685
- });
686
- };
687
- var highlightStyles = import_language.HighlightStyle.define([
688
- // Function.
689
- {
690
- tag: import_highlight.tags.name,
691
- class: "text-accentText"
692
- },
693
- // Range.
694
- {
695
- tag: import_highlight.tags.tagName,
696
- class: "text-pinkText"
697
- },
698
- // Values.
699
- {
700
- tag: import_highlight.tags.number,
701
- class: "text-tealText"
702
- },
703
- {
704
- tag: import_highlight.tags.bool,
705
- class: "text-tealText"
706
- },
707
- {
708
- tag: import_highlight.tags.string,
709
- class: "text-tealText"
710
- },
711
- // Error.
712
- {
713
- tag: import_highlight.tags.invalid,
714
- class: "text-unAccent"
715
- }
716
- ]);
717
- var languageFacet = import_state.Facet.define();
718
- var sheetExtension = ({ functions = [] }) => {
719
- const { extension, language } = (0, import_codemirror_lang_spreadsheet.spreadsheet)({
720
- idiom: "en-US",
721
- decimalSeparator: "."
722
- });
723
- const createCompletion = (name) => {
724
- const { section = "Custom", description, syntax } = functions.find((value) => value.name === name) ?? {};
725
- return {
726
- section,
727
- label: name,
728
- info: () => {
729
- if (!description && !syntax) {
730
- return null;
731
- }
732
- const root = document.createElement("div");
733
- root.className = "flex flex-col gap-2 text-sm";
734
- const title = document.createElement("h2");
735
- title.innerText = name;
736
- title.className = "text-lg font-mono text-accentText";
737
- root.appendChild(title);
738
- if (description) {
739
- const info = document.createElement("p");
740
- info.innerText = description;
741
- info.className = "text-subdued";
742
- root.appendChild(info);
743
- }
744
- if (syntax) {
745
- const detail = document.createElement("pre");
746
- detail.innerText = syntax;
747
- detail.className = "whitespace-pre-wrap text-greenText";
748
- root.appendChild(detail);
749
- }
750
- return root;
751
- },
752
- apply: (view, completion, from, to) => {
753
- const insertParens = to === view.state.doc.toString().length;
754
- view.dispatch(view.state.update({
755
- changes: {
756
- from,
757
- to,
758
- insert: completion.label + (insertParens ? "()" : "")
759
- },
760
- selection: {
761
- anchor: from + completion.label.length + 1
762
- }
763
- }));
764
- }
765
- };
766
- };
767
- return [
768
- extension,
769
- languageFacet.of(language),
770
- language.data.of({
771
- autocomplete: (context) => {
772
- if (context.state.doc.toString()[0] !== "=") {
773
- return null;
774
- }
775
- const match = context.matchBefore(/\w*/);
776
- if (!match || match.from === match.to) {
777
- return null;
778
- }
779
- const text = match.text.toUpperCase();
780
- if (!context.explicit && match.text.length < 2) {
781
- return null;
782
- }
783
- return {
784
- from: match.from,
785
- options: functions?.filter(({ name }) => name.startsWith(text)).map(({ name }) => createCompletion(name)) ?? []
786
- };
787
- }
788
- }),
789
- (0, import_language.syntaxHighlighting)(highlightStyles),
790
- (0, import_autocomplete.autocompletion)({
791
- aboveCursor: false,
792
- defaultKeymap: true,
793
- activateOnTyping: true,
794
- // NOTE: Useful for debugging.
795
- closeOnBlur: false,
796
- icons: false,
797
- tooltipClass: () => (0, import_react_ui_theme3.mx)(
798
- // TODO(burdon): Factor out fragments.
799
- // TODO(burdon): Size to make width same as column.
800
- "!-left-[1px] !top-[33px] !-m-0 border !border-t-0 [&>ul]:!min-w-[198px]",
801
- "[&>ul>li[aria-selected]]:!bg-accentSurface",
802
- "border-separator"
803
- )
804
- }),
805
- import_view2.keymap.of([
806
- {
807
- key: "Tab",
808
- run: (view) => {
809
- return (0, import_autocomplete.completionStatus)(view.state) === "active" ? (0, import_autocomplete.acceptCompletion)(view) : (0, import_autocomplete.startCompletion)(view);
810
- }
811
- }
812
- ])
813
- ];
814
- };
815
- var rangeExtension = (onInit) => {
816
- let view;
817
- let activeRange;
818
- const provider = (range) => {
819
- if (activeRange) {
820
- view.dispatch(view.state.update({
821
- changes: {
822
- ...activeRange,
823
- insert: range.toString()
824
- },
825
- selection: {
826
- anchor: activeRange.from + range.length
827
- }
828
- }));
829
- }
830
- view.focus();
831
- };
832
- return import_view2.ViewPlugin.fromClass(class {
833
- constructor(_view) {
834
- view = _view;
835
- onInit(provider);
836
- }
837
- update(view2) {
838
- const { anchor } = view2.state.selection.ranges[0];
839
- activeRange = void 0;
840
- const [language] = view2.state.facet(languageFacet);
841
- const { topNode } = language.parser.parse(view2.state.doc.toString());
842
- visitTree(topNode, ({ type, from, to }) => {
843
- if (from <= anchor && to >= anchor) {
844
- switch (type.name) {
845
- case "Function": {
846
- activeRange = {
847
- from: to,
848
- to
849
- };
850
- break;
851
- }
852
- case "CloseParen": {
853
- activeRange = {
854
- from,
855
- to: from
856
- };
857
- break;
858
- }
859
- case "RangeToken":
860
- case "CellToken":
861
- activeRange = {
862
- from,
863
- to
864
- };
865
- return true;
866
- }
867
- }
868
- return false;
869
- });
870
- if (!activeRange && view2.state.doc.toString()[0] === "=") {
871
- activeRange = {
872
- from: 1,
873
- to: view2.state.doc.toString().length
874
- };
875
- }
876
- }
877
- });
878
- };
879
- var visitTree = (node, callback) => {
880
- if (callback(node)) {
881
- return true;
882
- }
883
- for (let child = node.firstChild; child !== null; child = child.nextSibling) {
884
- if (visitTree(child, callback)) {
885
- return true;
886
- }
887
- }
888
- return false;
889
- };
890
- var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/components/Sheet/Sheet.tsx";
891
- var fragments = {
892
- axis: "bg-axisSurface text-axisText text-xs select-none",
893
- axisSelected: "bg-attention text-baseText",
894
- cell: "bg-gridCell",
895
- cellSelected: "bg-gridCellSelected text-baseText border !border-accentSurface"
896
- };
897
- var SheetRoot = ({ children, ...props }) => {
898
- return /* @__PURE__ */ import_react3.default.createElement(SheetContextProvider, props, children);
899
- };
900
- var SheetMain = /* @__PURE__ */ (0, import_react3.forwardRef)(({ classNames, numRows, numColumns }, forwardRef2) => {
901
- const { model, cursor, setCursor, setRange, setEditing } = useSheetContext();
902
- const { rowsRef, columnsRef, contentRef } = useScrollHandlers();
903
- const [rows, setRows] = (0, import_react3.useState)([
904
- ...model.sheet.rows
905
- ]);
906
- const [columns, setColumns] = (0, import_react3.useState)([
907
- ...model.sheet.columns
908
- ]);
909
- (0, import_react3.useEffect)(() => {
910
- const rowsAccessor = (0, import_echo.createDocAccessor)(model.sheet, [
911
- "rows"
912
- ]);
913
- const columnsAccessor = (0, import_echo.createDocAccessor)(model.sheet, [
914
- "columns"
915
- ]);
916
- const handleUpdate = (0, import_async.debounce)(() => {
917
- setRows([
918
- ...model.sheet.rows
919
- ]);
920
- setColumns([
921
- ...model.sheet.columns
922
- ]);
923
- }, 100);
924
- rowsAccessor.handle.addListener("change", handleUpdate);
925
- columnsAccessor.handle.addListener("change", handleUpdate);
926
- handleUpdate();
927
- return () => {
928
- rowsAccessor.handle.removeListener("change", handleUpdate);
929
- columnsAccessor.handle.removeListener("change", handleUpdate);
930
- };
931
- }, [
932
- model
933
- ]);
934
- (0, import_react3.useEffect)(() => {
935
- model.reset();
936
- }, [
937
- rows,
938
- columns
939
- ]);
940
- const handleMoveRows = (from, to, num = 1) => {
941
- const cursorIdx = cursor ? model.addressToIndex(cursor) : void 0;
942
- const [rows2] = model.sheet.rows.splice(from, num);
943
- model.sheet.rows.splice(to, 0, rows2);
944
- if (cursorIdx) {
945
- setCursor(model.addressFromIndex(cursorIdx));
946
- }
947
- setRows([
948
- ...model.sheet.rows
949
- ]);
950
- };
951
- const handleMoveColumns = (from, to, num = 1) => {
952
- const cursorIdx = cursor ? model.addressToIndex(cursor) : void 0;
953
- const columns2 = model.sheet.columns.splice(from, num);
954
- model.sheet.columns.splice(to, 0, ...columns2);
955
- if (cursorIdx) {
956
- setCursor(model.addressFromIndex(cursorIdx));
957
- }
958
- setColumns([
959
- ...model.sheet.columns
960
- ]);
961
- };
962
- const [rowSizes, setRowSizes] = (0, import_react3.useState)();
963
- const [columnSizes, setColumnSizes] = (0, import_react3.useState)();
964
- (0, import_react3.useEffect)(() => {
965
- const rowAccessor = (0, import_echo.createDocAccessor)(model.sheet, [
966
- "rowMeta"
967
- ]);
968
- const columnAccessor = (0, import_echo.createDocAccessor)(model.sheet, [
969
- "columnMeta"
970
- ]);
971
- const handleUpdate = (0, import_async.debounce)(() => {
972
- const mapSizes = (values) => values.reduce((map, [idx, meta]) => {
973
- if (meta.size) {
974
- map[idx] = meta.size;
975
- }
976
- return map;
977
- }, {});
978
- setRowSizes(mapSizes(Object.entries(model.sheet.rowMeta)));
979
- setColumnSizes(mapSizes(Object.entries(model.sheet.columnMeta)));
980
- }, 100);
981
- rowAccessor.handle.addListener("change", handleUpdate);
982
- columnAccessor.handle.addListener("change", handleUpdate);
983
- handleUpdate();
984
- return () => {
985
- rowAccessor.handle.removeListener("change", handleUpdate);
986
- columnAccessor.handle.removeListener("change", handleUpdate);
987
- };
988
- }, [
989
- model
990
- ]);
991
- const handleResizeRow = (idx, size, save) => {
992
- if (save) {
993
- model.sheet.rowMeta[idx] ??= {};
994
- model.sheet.rowMeta[idx].size = size;
995
- } else {
996
- setRowSizes((sizes) => ({
997
- ...sizes,
998
- [idx]: size
999
- }));
1000
- }
1001
- };
1002
- const handleResizeColumn = (idx, size, save) => {
1003
- if (save) {
1004
- model.sheet.columnMeta[idx] ??= {};
1005
- model.sheet.columnMeta[idx].size = size;
1006
- } else {
1007
- setColumnSizes((sizes) => ({
1008
- ...sizes,
1009
- [idx]: size
1010
- }));
1011
- }
1012
- };
1013
- return /* @__PURE__ */ import_react3.default.createElement("div", {
1014
- role: "none",
1015
- className: (0, import_react_ui_theme2.mx)("grid grid-cols-[calc(var(--rail-size)-2px)_1fr] grid-rows-[32px_1fr_32px] bs-full is-full overflow-hidden", classNames)
1016
- }, /* @__PURE__ */ import_react3.default.createElement(GridCorner, {
1017
- onClick: () => {
1018
- setCursor(void 0);
1019
- setRange(void 0);
1020
- setEditing(false);
1021
- }
1022
- }), /* @__PURE__ */ import_react3.default.createElement(SheetColumns, {
1023
- ref: columnsRef,
1024
- columns,
1025
- sizes: columnSizes,
1026
- selected: cursor?.column,
1027
- onSelect: (column) => setCursor(cursor?.column === column ? void 0 : {
1028
- row: -1,
1029
- column
1030
- }),
1031
- onResize: handleResizeColumn,
1032
- onMove: handleMoveColumns
1033
- }), /* @__PURE__ */ import_react3.default.createElement(SheetRows, {
1034
- ref: rowsRef,
1035
- rows,
1036
- sizes: rowSizes,
1037
- selected: cursor?.row,
1038
- onSelect: (row) => setCursor(cursor?.row === row ? void 0 : {
1039
- row,
1040
- column: -1
1041
- }),
1042
- onResize: handleResizeRow,
1043
- onMove: handleMoveRows
1044
- }), /* @__PURE__ */ import_react3.default.createElement(SheetGrid, {
1045
- ref: contentRef,
1046
- size: {
1047
- numRows: numRows ?? rows.length,
1048
- numColumns: numColumns ?? columns.length
1049
- },
1050
- rows,
1051
- columns,
1052
- rowSizes,
1053
- columnSizes
1054
- }), /* @__PURE__ */ import_react3.default.createElement(GridCorner, null), /* @__PURE__ */ import_react3.default.createElement(SheetStatusBar, null));
1055
- });
1056
- var useScrollHandlers = () => {
1057
- const rowsRef = (0, import_react3.useRef)(null);
1058
- const columnsRef = (0, import_react3.useRef)(null);
1059
- const contentRef = (0, import_react3.useRef)(null);
1060
- (0, import_react3.useEffect)(() => {
1061
- const handleRowsScroll = (ev) => {
1062
- const { scrollTop } = ev.target;
1063
- if (!rowsRef.current.dataset.locked) {
1064
- contentRef.current.scrollTop = scrollTop;
1065
- }
1066
- };
1067
- const handleColumnsScroll = (ev) => {
1068
- const { scrollLeft } = ev.target;
1069
- if (!columnsRef.current.dataset.locked) {
1070
- contentRef.current.scrollLeft = scrollLeft;
1071
- }
1072
- };
1073
- const handleContentScroll = (ev) => {
1074
- const { scrollTop, scrollLeft } = ev.target;
1075
- rowsRef.current.scrollTop = scrollTop;
1076
- columnsRef.current.scrollLeft = scrollLeft;
1077
- };
1078
- const rows = rowsRef.current;
1079
- const columns = columnsRef.current;
1080
- const content = contentRef.current;
1081
- rows.addEventListener("scroll", handleRowsScroll);
1082
- columns.addEventListener("scroll", handleColumnsScroll);
1083
- content.addEventListener("scroll", handleContentScroll);
1084
- return () => {
1085
- rows.removeEventListener("scroll", handleRowsScroll);
1086
- columns.removeEventListener("scroll", handleColumnsScroll);
1087
- content.removeEventListener("scroll", handleContentScroll);
1088
- };
1089
- }, []);
1090
- return {
1091
- rowsRef,
1092
- columnsRef,
1093
- contentRef
1094
- };
1095
- };
1096
- var GridCorner = (props) => {
1097
- return /* @__PURE__ */ import_react3.default.createElement("div", {
1098
- className: fragments.axis,
1099
- ...props
1100
- });
1101
- };
1102
- var MovingOverlay = ({ label }) => {
1103
- return /* @__PURE__ */ import_react3.default.createElement("div", {
1104
- className: "flex w-full h-full justify-center items-center text-sm p-1 bg-gridOverlay cursor-pointer"
1105
- }, label);
1106
- };
1107
- var mouseConstraints = {
1108
- distance: 10
1109
- };
1110
- var touchConstraints = {
1111
- delay: 250,
1112
- tolerance: 5
1113
- };
1114
- var SheetRows = /* @__PURE__ */ (0, import_react3.forwardRef)(({ rows, sizes, selected, onSelect, onResize, onMove }, forwardRef2) => {
1115
- const mouseSensor = (0, import_core.useSensor)(import_core.MouseSensor, {
1116
- activationConstraint: mouseConstraints
1117
- });
1118
- const touchSensor = (0, import_core.useSensor)(import_core.TouchSensor, {
1119
- activationConstraint: touchConstraints
1120
- });
1121
- const keyboardSensor = (0, import_core.useSensor)(import_core.KeyboardSensor, {});
1122
- const sensors = (0, import_core.useSensors)(mouseSensor, touchSensor, keyboardSensor);
1123
- const [active, setActive] = (0, import_react3.useState)(null);
1124
- const handleDragStart = ({ active: active2 }) => {
1125
- setActive(active2);
1126
- };
1127
- const handleDragEnd = ({ over, active: active2 }) => {
1128
- if (over && over.id !== active2.id) {
1129
- setActive(null);
1130
- onMove?.(active2.data.current.index, over.data.current.index);
1131
- }
1132
- };
1133
- const snapToCenter = ({ activatorEvent, draggingNodeRect, transform }) => {
1134
- if (draggingNodeRect && activatorEvent) {
1135
- const activatorCoordinates = (0, import_utilities.getEventCoordinates)(activatorEvent);
1136
- if (!activatorCoordinates) {
1137
- return transform;
1138
- }
1139
- const offset = activatorCoordinates.y - draggingNodeRect.top;
1140
- return {
1141
- ...transform,
1142
- y: transform.y + offset - draggingNodeRect.height / 2
1143
- };
1144
- }
1145
- return transform;
1146
- };
1147
- return /* @__PURE__ */ import_react3.default.createElement("div", {
1148
- className: "relative flex grow overflow-hidden"
1149
- }, /* @__PURE__ */ import_react3.default.createElement("div", {
1150
- className: (0, import_react_ui_theme2.mx)("z-20 absolute inset-0 border-y border-gridLine pointer-events-none"),
1151
- style: {
1152
- width: axisWidth
1153
- }
1154
- }), /* @__PURE__ */ import_react3.default.createElement("div", {
1155
- ref: forwardRef2,
1156
- role: "rowheader",
1157
- className: "grow overflow-y-auto scrollbar-none"
1158
- }, /* @__PURE__ */ import_react3.default.createElement(import_core.DndContext, {
1159
- sensors,
1160
- modifiers: [
1161
- import_modifiers.restrictToVerticalAxis,
1162
- snapToCenter
1163
- ],
1164
- onDragStart: handleDragStart,
1165
- onDragEnd: handleDragEnd
1166
- }, /* @__PURE__ */ import_react3.default.createElement("div", {
1167
- className: "flex flex-col",
1168
- style: {
1169
- width: axisWidth
1170
- }
1171
- }, rows.map((idx, index) => /* @__PURE__ */ import_react3.default.createElement(GridRowCell, {
1172
- key: idx,
1173
- idx,
1174
- index,
1175
- label: String(index + 1),
1176
- size: sizes?.[idx] ?? defaultHeight,
1177
- resize: index < rows.length - 1,
1178
- selected: selected === index,
1179
- onResize,
1180
- onSelect
1181
- }))), /* @__PURE__ */ (0, import_react_dom.createPortal)(/* @__PURE__ */ import_react3.default.createElement(import_core.DragOverlay, null, active && /* @__PURE__ */ import_react3.default.createElement(MovingOverlay, {
1182
- label: String(active.data.current.index + 1)
1183
- })), document.body))));
1184
- });
1185
- var GridRowCell = ({ idx, index, label, size, resize, selected, onSelect, onResize }) => {
1186
- const { setNodeRef: setDroppableNodeRef } = (0, import_core.useDroppable)({
1187
- id: idx,
1188
- data: {
1189
- index
1190
- }
1191
- });
1192
- const { setNodeRef: setDraggableNodeRef, attributes, listeners, isDragging, over } = (0, import_core.useDraggable)({
1193
- id: idx,
1194
- data: {
1195
- index
1196
- }
1197
- });
1198
- const setNodeRef = (0, import_utilities.useCombinedRefs)(setDroppableNodeRef, setDraggableNodeRef);
1199
- const [initialSize, setInitialSize] = (0, import_react3.useState)(size);
1200
- const [resizing, setResizing] = (0, import_react3.useState)(false);
1201
- const scrollHandler = (0, import_react3.useRef)();
1202
- const handleResizeStart = (_ev, _dir, elementRef) => {
1203
- const scrollContainer = elementRef.closest('[role="rowheader"]');
1204
- const scrollTop = scrollContainer.scrollTop;
1205
- scrollHandler.current = (ev) => ev.target.scrollTop = scrollTop;
1206
- scrollContainer.addEventListener("scroll", scrollHandler.current);
1207
- scrollContainer.dataset.locked = "true";
1208
- setResizing(true);
1209
- };
1210
- const handleResize = (_ev, _dir, _elementRef, { height }) => {
1211
- onResize?.(idx, initialSize + height);
1212
- };
1213
- const handleResizeStop = (_ev, _dir, elementRef, { height }) => {
1214
- const scrollContainer = elementRef.closest('[role="rowheader"]');
1215
- scrollContainer.removeEventListener("scroll", scrollHandler.current);
1216
- delete scrollContainer.dataset.locked;
1217
- scrollHandler.current = void 0;
1218
- setInitialSize(initialSize + height);
1219
- onResize?.(idx, initialSize + height, true);
1220
- setResizing(false);
1221
- };
1222
- return /* @__PURE__ */ import_react3.default.createElement(import_re_resizable.Resizable, {
1223
- enable: {
1224
- bottom: resize
1225
- },
1226
- size: {
1227
- height: size - 1
1228
- },
1229
- minHeight: minHeight - 1,
1230
- maxHeight,
1231
- onResizeStart: handleResizeStart,
1232
- onResize: handleResize,
1233
- onResizeStop: handleResizeStop
1234
- }, /* @__PURE__ */ import_react3.default.createElement("div", {
1235
- ref: setNodeRef,
1236
- ...attributes,
1237
- ...listeners,
1238
- className: (0, import_react_ui_theme2.mx)("flex h-full items-center justify-center cursor-pointer", "border-t border-gridLine focus-visible:outline-none", fragments.axis, selected && fragments.axisSelected, isDragging && fragments.axisSelected),
1239
- onClick: () => onSelect?.(index)
1240
- }, /* @__PURE__ */ import_react3.default.createElement("span", {
1241
- className: "flex w-full justify-center"
1242
- }, label), over?.id === idx && !isDragging && /* @__PURE__ */ import_react3.default.createElement("div", {
1243
- className: "z-20 absolute top-0 w-full min-h-[4px] border-b-4 border-accentSurface"
1244
- }), resizing && /* @__PURE__ */ import_react3.default.createElement("div", {
1245
- className: "z-20 absolute bottom-0 w-full min-h-[4px] border-b-4 border-accentSurface"
1246
- })));
1247
- };
1248
- var SheetColumns = /* @__PURE__ */ (0, import_react3.forwardRef)(({ columns, sizes, selected, onSelect, onResize, onMove }, forwardRef2) => {
1249
- const mouseSensor = (0, import_core.useSensor)(import_core.MouseSensor, {
1250
- activationConstraint: mouseConstraints
1251
- });
1252
- const touchSensor = (0, import_core.useSensor)(import_core.TouchSensor, {
1253
- activationConstraint: touchConstraints
1254
- });
1255
- const keyboardSensor = (0, import_core.useSensor)(import_core.KeyboardSensor, {});
1256
- const sensors = (0, import_core.useSensors)(mouseSensor, touchSensor, keyboardSensor);
1257
- const [active, setActive] = (0, import_react3.useState)(null);
1258
- const handleDragStart = ({ active: active2 }) => {
1259
- setActive(active2);
1260
- };
1261
- const handleDragEnd = ({ active: active2, over }) => {
1262
- if (over && over.id !== active2.id) {
1263
- setActive(null);
1264
- onMove?.(active2.data.current.index, over.data.current.index);
1265
- }
1266
- };
1267
- const snapToCenter = ({ activatorEvent, draggingNodeRect, transform }) => {
1268
- if (draggingNodeRect && activatorEvent) {
1269
- const activatorCoordinates = (0, import_utilities.getEventCoordinates)(activatorEvent);
1270
- if (!activatorCoordinates) {
1271
- return transform;
1272
- }
1273
- const offset = activatorCoordinates.x - draggingNodeRect.left;
1274
- return {
1275
- ...transform,
1276
- x: transform.x + offset - draggingNodeRect.width / 2
1277
- };
1278
- }
1279
- return transform;
1280
- };
1281
- return /* @__PURE__ */ import_react3.default.createElement("div", {
1282
- className: "relative flex grow overflow-hidden"
1283
- }, /* @__PURE__ */ import_react3.default.createElement("div", {
1284
- className: (0, import_react_ui_theme2.mx)("z-20 absolute inset-0 border-x border-gridLine pointer-events-none"),
1285
- style: {
1286
- height: axisHeight
1287
- }
1288
- }), /* @__PURE__ */ import_react3.default.createElement("div", {
1289
- ref: forwardRef2,
1290
- role: "columnheader",
1291
- className: "grow overflow-x-auto scrollbar-none"
1292
- }, /* @__PURE__ */ import_react3.default.createElement(import_core.DndContext, {
1293
- autoScroll: {
1294
- enabled: true
1295
- },
1296
- sensors,
1297
- modifiers: [
1298
- import_modifiers.restrictToHorizontalAxis,
1299
- snapToCenter
1300
- ],
1301
- onDragStart: handleDragStart,
1302
- onDragEnd: handleDragEnd
1303
- }, /* @__PURE__ */ import_react3.default.createElement("div", {
1304
- className: "flex h-full",
1305
- style: {
1306
- height: axisHeight
1307
- }
1308
- }, columns.map((idx, index) => /* @__PURE__ */ import_react3.default.createElement(GridColumnCell, {
1309
- key: idx,
1310
- idx,
1311
- index,
1312
- label: (0, import_chunk_5KKJ4NPP.columnLetter)(index),
1313
- size: sizes?.[idx] ?? defaultWidth,
1314
- resize: index < columns.length - 1,
1315
- selected: selected === index,
1316
- onResize,
1317
- onSelect
1318
- }))), /* @__PURE__ */ (0, import_react_dom.createPortal)(/* @__PURE__ */ import_react3.default.createElement(import_core.DragOverlay, null, active && /* @__PURE__ */ import_react3.default.createElement(MovingOverlay, {
1319
- label: (0, import_chunk_5KKJ4NPP.columnLetter)(active.data.current.index)
1320
- })), document.body))));
1321
- });
1322
- var GridColumnCell = ({ idx, index, label, size, resize, selected, onSelect, onResize }) => {
1323
- const { setNodeRef: setDroppableNodeRef } = (0, import_core.useDroppable)({
1324
- id: idx,
1325
- data: {
1326
- index
1327
- }
1328
- });
1329
- const { setNodeRef: setDraggableNodeRef, attributes, listeners, over, isDragging } = (0, import_core.useDraggable)({
1330
- id: idx,
1331
- data: {
1332
- index
1333
- }
1334
- });
1335
- const setNodeRef = (0, import_utilities.useCombinedRefs)(setDroppableNodeRef, setDraggableNodeRef);
1336
- const [initialSize, setInitialSize] = (0, import_react3.useState)(size);
1337
- const [resizing, setResizing] = (0, import_react3.useState)(false);
1338
- const scrollHandler = (0, import_react3.useRef)();
1339
- const handleResizeStart = (_ev, _dir, elementRef) => {
1340
- const scrollContainer = elementRef.closest('[role="columnheader"]');
1341
- const scrollLeft = scrollContainer.scrollLeft;
1342
- scrollHandler.current = (ev) => ev.target.scrollLeft = scrollLeft;
1343
- scrollContainer.addEventListener("scroll", scrollHandler.current);
1344
- scrollContainer.dataset.locked = "true";
1345
- setResizing(true);
1346
- };
1347
- const handleResize = (_ev, _dir, _elementRef, { width }) => {
1348
- onResize?.(idx, initialSize + width);
1349
- };
1350
- const handleResizeStop = (_ev, _dir, elementRef, { width }) => {
1351
- const scrollContainer = elementRef.closest('[role="columnheader"]');
1352
- scrollContainer.removeEventListener("scroll", scrollHandler.current);
1353
- delete scrollContainer.dataset.locked;
1354
- scrollHandler.current = void 0;
1355
- setInitialSize(initialSize + width);
1356
- onResize?.(idx, initialSize + width, true);
1357
- setResizing(false);
1358
- };
1359
- return /* @__PURE__ */ import_react3.default.createElement(import_re_resizable.Resizable, {
1360
- enable: {
1361
- right: resize
1362
- },
1363
- size: {
1364
- width: size - 1
1365
- },
1366
- minWidth: minWidth - 1,
1367
- maxWidth,
1368
- onResizeStart: handleResizeStart,
1369
- onResize: handleResize,
1370
- onResizeStop: handleResizeStop
1371
- }, /* @__PURE__ */ import_react3.default.createElement("div", {
1372
- ref: setNodeRef,
1373
- ...attributes,
1374
- ...listeners,
1375
- className: (0, import_react_ui_theme2.mx)("flex h-full items-center justify-center cursor-pointer", "border-l border-gridLine focus-visible:outline-none", fragments.axis, selected && fragments.axisSelected, isDragging && fragments.axisSelected),
1376
- onClick: () => onSelect?.(index)
1377
- }, /* @__PURE__ */ import_react3.default.createElement("span", {
1378
- className: "flex w-full justify-center"
1379
- }, label), over?.id === idx && !isDragging && /* @__PURE__ */ import_react3.default.createElement("div", {
1380
- className: "z-20 absolute left-0 h-full min-w-[4px] border-l-4 border-accentSurface"
1381
- }), resizing && /* @__PURE__ */ import_react3.default.createElement("div", {
1382
- className: "z-20 absolute right-0 h-full min-h-[4px] border-l-4 border-accentSurface"
1383
- })));
1384
- };
1385
- var SheetGrid = /* @__PURE__ */ (0, import_react3.forwardRef)(({ size, rows, columns, rowSizes, columnSizes }, forwardRef2) => {
1386
- const { ref: containerRef, width: containerWidth = 0, height: containerHeight = 0 } = (0, import_react_resize_detector.useResizeDetector)({
1387
- refreshRate: 200
1388
- });
1389
- const scrollerRef = (0, import_react3.useRef)(null);
1390
- (0, import_react3.useImperativeHandle)(forwardRef2, () => scrollerRef.current);
1391
- const { model, cursor, range, editing, setCursor, setRange, setEditing, onInfo } = useSheetContext();
1392
- const initialText = (0, import_react3.useRef)();
1393
- const quickEdit = (0, import_react3.useRef)(false);
1394
- const [, forceUpdate] = (0, import_react3.useState)({});
1395
- (0, import_react3.useEffect)(() => {
1396
- const unsubscribe = model.update.on(() => {
1397
- (0, import_log.log)("updated", {
1398
- id: model.id
1399
- }, {
1400
- F: __dxlog_file2,
1401
- L: 730,
1402
- S: void 0,
1403
- C: (f, a) => f(...a)
1404
- });
1405
- forceUpdate({});
1406
- });
1407
- return () => {
1408
- unsubscribe();
1409
- };
1410
- }, [
1411
- model
1412
- ]);
1413
- const inputRef = (0, import_react3.useRef)(null);
1414
- const handleKeyDown = (ev) => {
1415
- const isMacOS = /Mac|iPhone|iPod|iPad/.test(navigator.userAgent);
1416
- if (cursor && (isMacOS && ev.metaKey || ev.ctrlKey)) {
1417
- switch (ev.key) {
1418
- case "x": {
1419
- model.cut(range ?? {
1420
- from: cursor
1421
- });
1422
- return;
1423
- }
1424
- case "c": {
1425
- model.copy(range ?? {
1426
- from: cursor
1427
- });
1428
- return;
1429
- }
1430
- case "v": {
1431
- model.paste(cursor);
1432
- return;
1433
- }
1434
- case "z": {
1435
- if (ev.shiftKey) {
1436
- model.redo();
1437
- } else {
1438
- model.undo();
1439
- }
1440
- return;
1441
- }
1442
- }
1443
- }
1444
- switch (ev.key) {
1445
- case "ArrowUp":
1446
- case "ArrowDown":
1447
- case "ArrowLeft":
1448
- case "ArrowRight":
1449
- case "Home":
1450
- case "End": {
1451
- const next = handleNav(ev, cursor, range, size);
1452
- setRange(next.range);
1453
- if (next.cursor) {
1454
- setCursor(next.cursor);
1455
- const element = getCellElement(scrollerRef.current, next.cursor);
1456
- if (element) {
1457
- scrollIntoView(scrollerRef.current, element);
1458
- }
1459
- }
1460
- break;
1461
- }
1462
- case "Backspace": {
1463
- if (cursor) {
1464
- if (range) {
1465
- model.clear(range);
1466
- } else {
1467
- model.setValue(cursor, null);
1468
- }
1469
- }
1470
- break;
1471
- }
1472
- case "Escape": {
1473
- setRange(void 0);
1474
- break;
1475
- }
1476
- case "Enter": {
1477
- ev.stopPropagation();
1478
- if (cursor) {
1479
- setEditing(true);
1480
- }
1481
- break;
1482
- }
1483
- case "?": {
1484
- onInfo?.();
1485
- break;
1486
- }
1487
- default: {
1488
- if (ev.key.length === 1) {
1489
- initialText.current = ev.key;
1490
- quickEdit.current = true;
1491
- setEditing(true);
1492
- }
1493
- }
1494
- }
1495
- };
1496
- const { handlers } = useRangeSelect((event, range2) => {
1497
- switch (event) {
1498
- case "start": {
1499
- setRange(void 0);
1500
- break;
1501
- }
1502
- default: {
1503
- setRange(range2);
1504
- }
1505
- }
1506
- });
1507
- const { width, height, rowRange, columnRange } = useGridLayout({
1508
- scroller: scrollerRef.current,
1509
- size: {
1510
- width: containerWidth,
1511
- height: containerHeight
1512
- },
1513
- rows,
1514
- columns,
1515
- rowSizes,
1516
- columnSizes
1517
- });
1518
- const id = (0, import_echo.fullyQualifiedId)(model.sheet);
1519
- const attendableAttrs = (0, import_react_ui_attention.createAttendableAttributes)(id);
1520
- const hasAttention = (0, import_react_ui_attention.useHasAttention)(id);
1521
- return /* @__PURE__ */ import_react3.default.createElement("div", {
1522
- ref: containerRef,
1523
- role: "grid",
1524
- className: "relative flex grow overflow-hidden"
1525
- }, /* @__PURE__ */ import_react3.default.createElement("div", {
1526
- className: (0, import_react_ui_theme2.mx)("z-20 absolute inset-0 border border-gridLine pointer-events-none")
1527
- }), /* @__PURE__ */ import_react3.default.createElement("div", {
1528
- ref: scrollerRef,
1529
- className: (0, import_react_ui_theme2.mx)("grow", hasAttention && "overflow-auto scrollbar-thin")
1530
- }, /* @__PURE__ */ import_react3.default.createElement("div", {
1531
- className: "relative select-none",
1532
- style: {
1533
- width,
1534
- height
1535
- },
1536
- onClick: () => inputRef.current?.focus(),
1537
- ...handlers
1538
- }, scrollerRef.current && /* @__PURE__ */ import_react3.default.createElement(SelectionOverlay, {
1539
- root: scrollerRef.current
1540
- }), rowRange.map(({ row, top, height: height2 }) => {
1541
- return columnRange.map(({ column, left, width: width2 }) => {
1542
- const style = {
1543
- position: "absolute",
1544
- top,
1545
- left,
1546
- width: width2,
1547
- height: height2
1548
- };
1549
- const cell = {
1550
- row,
1551
- column
1552
- };
1553
- const id2 = (0, import_chunk_5KKJ4NPP.addressToA1Notation)(cell);
1554
- const idx = model.addressToIndex(cell);
1555
- const active = (0, import_chunk_5KKJ4NPP.posEquals)(cursor, cell);
1556
- if (active && editing) {
1557
- const value = initialText.current ?? model.getCellText(cell) ?? "";
1558
- const handleClose = (value2) => {
1559
- initialText.current = void 0;
1560
- quickEdit.current = false;
1561
- if (value2 !== void 0) {
1562
- model.setValue(cell, value2);
1563
- const next = handleArrowNav({
1564
- key: "ArrowDown",
1565
- metaKey: false
1566
- }, cursor, size);
1567
- if (next) {
1568
- setCursor(next);
1569
- }
1570
- }
1571
- inputRef.current?.focus();
1572
- setEditing(false);
1573
- };
1574
- const handleNav2 = (value2, { key }) => {
1575
- initialText.current = void 0;
1576
- model.setValue(cell, value2 ?? null);
1577
- const next = handleArrowNav({
1578
- key,
1579
- metaKey: false
1580
- }, cursor, size);
1581
- if (next) {
1582
- setCursor(next);
1583
- }
1584
- inputRef.current?.focus();
1585
- setEditing(false);
1586
- };
1587
- return /* @__PURE__ */ import_react3.default.createElement(GridCellEditor, {
1588
- key: idx,
1589
- value,
1590
- style,
1591
- onNav: quickEdit.current ? handleNav2 : void 0,
1592
- onClose: handleClose
1593
- });
1594
- }
1595
- return /* @__PURE__ */ import_react3.default.createElement(SheetCell, {
1596
- key: id2,
1597
- id: id2,
1598
- cell,
1599
- active,
1600
- style,
1601
- onSelect: (cell2, edit) => {
1602
- setEditing(edit);
1603
- setCursor(cell2);
1604
- }
1605
- });
1606
- });
1607
- }))), /* @__PURE__ */ (0, import_react_dom.createPortal)(/* @__PURE__ */ import_react3.default.createElement("input", {
1608
- ref: inputRef,
1609
- autoFocus: true,
1610
- className: "absolute w-[1px] h-[1px] bg-transparent outline-none border-none caret-transparent",
1611
- onKeyDown: handleKeyDown,
1612
- ...attendableAttrs
1613
- }), document.body));
1614
- });
1615
- var SelectionOverlay = ({ root }) => {
1616
- const { range } = useSheetContext();
1617
- if (!range) {
1618
- return null;
1619
- }
1620
- const c1 = getCellElement(root, range.from);
1621
- const c2 = range.to ? getCellElement(root, range.to) : c1;
1622
- if (!c1 || !c2) {
1623
- return null;
1624
- }
1625
- const b1 = getRelativeClientRect(root, c1);
1626
- const b2 = getRelativeClientRect(root, c2);
1627
- const bounds = getRectUnion(b1, b2);
1628
- return /* @__PURE__ */ import_react3.default.createElement("div", {
1629
- role: "none",
1630
- style: bounds,
1631
- className: "z-10 absolute pointer-events-none bg-gridSelectionOverlay border border-gridOverlay"
1632
- });
1633
- };
1634
- var SheetCell = ({ id, cell, style, active, onSelect }) => {
1635
- const { formatting, editing, setRange } = useSheetContext();
1636
- const { value, classNames } = formatting.getFormatting(cell);
1637
- return /* @__PURE__ */ import_react3.default.createElement("div", {
1638
- [`data-${CELL_DATA_KEY}`]: id,
1639
- role: "cell",
1640
- style,
1641
- className: (0, import_react_ui_theme2.mx)("flex w-full h-full px-2 py-1 truncate items-center border border-gridLine cursor-pointer", fragments.cell, active && [
1642
- "z-20",
1643
- fragments.cellSelected
1644
- ], classNames),
1645
- onClick: () => {
1646
- if (editing) {
1647
- setRange?.({
1648
- from: cell
1649
- });
1650
- } else {
1651
- onSelect?.(cell, false);
1652
- }
1653
- },
1654
- onDoubleClick: () => onSelect?.(cell, true)
1655
- }, value);
1656
- };
1657
- var GridCellEditor = ({ style, value, onNav, onClose }) => {
1658
- const { model, range } = useSheetContext();
1659
- const notifier = (0, import_react3.useRef)();
1660
- (0, import_react3.useEffect)(() => {
1661
- if (range) {
1662
- notifier.current?.((0, import_chunk_5KKJ4NPP.rangeToA1Notation)(range));
1663
- }
1664
- }, [
1665
- range
1666
- ]);
1667
- const extension = (0, import_react3.useMemo)(() => [
1668
- editorKeys({
1669
- onNav,
1670
- onClose
1671
- }),
1672
- sheetExtension({
1673
- functions: model.functions
1674
- }),
1675
- rangeExtension((fn) => notifier.current = fn)
1676
- ], [
1677
- model
1678
- ]);
1679
- return /* @__PURE__ */ import_react3.default.createElement("div", {
1680
- role: "cell",
1681
- style,
1682
- className: (0, import_react_ui_theme2.mx)("z-20 flex", fragments.cellSelected),
1683
- onClick: (ev) => ev.stopPropagation()
1684
- }, /* @__PURE__ */ import_react3.default.createElement(CellEditor, {
1685
- autoFocus: true,
1686
- value,
1687
- extension
1688
- }));
1689
- };
1690
- var SheetStatusBar = () => {
1691
- const { model, cursor, range } = useSheetContext();
1692
- let value;
1693
- let isFormula = false;
1694
- if (cursor) {
1695
- value = model.getCellValue(cursor);
1696
- if (typeof value === "string" && value.charAt(0) === "=") {
1697
- value = model.mapFormulaBindingFromId(model.mapFormulaIndicesToRefs(value));
1698
- isFormula = true;
1699
- } else if (value != null) {
1700
- value = String(value);
1701
- }
1702
- }
1703
- return /* @__PURE__ */ import_react3.default.createElement("div", {
1704
- className: (0, import_react_ui_theme2.mx)("flex shrink-0 justify-between items-center px-4 py-1 text-sm border-x border-gridLine")
1705
- }, /* @__PURE__ */ import_react3.default.createElement("div", {
1706
- className: "flex gap-4 items-center"
1707
- }, /* @__PURE__ */ import_react3.default.createElement("div", {
1708
- className: "flex w-16 items-center font-mono"
1709
- }, range && (0, import_chunk_5KKJ4NPP.rangeToA1Notation)(range) || cursor && (0, import_chunk_5KKJ4NPP.addressToA1Notation)(cursor)), /* @__PURE__ */ import_react3.default.createElement("div", {
1710
- className: "flex gap-2 items-center"
1711
- }, /* @__PURE__ */ import_react3.default.createElement(import_react2.Function, {
1712
- className: (0, import_react_ui_theme2.mx)("text-greenText", isFormula ? "visible" : "invisible")
1713
- }), /* @__PURE__ */ import_react3.default.createElement("span", {
1714
- className: "font-mono"
1715
- }, value))));
1716
- };
1717
- var SheetDebug = () => {
1718
- const { model, cursor, range } = useSheetContext();
1719
- const [, forceUpdate] = (0, import_react3.useState)({});
1720
- (0, import_react3.useEffect)(() => {
1721
- const accessor = (0, import_echo.createDocAccessor)(model.sheet, []);
1722
- const handleUpdate = () => forceUpdate({});
1723
- accessor.handle.addListener("change", handleUpdate);
1724
- handleUpdate();
1725
- return () => {
1726
- accessor.handle.removeListener("change", handleUpdate);
1727
- };
1728
- }, [
1729
- model
1730
- ]);
1731
- return /* @__PURE__ */ import_react3.default.createElement("div", {
1732
- className: (0, import_react_ui_theme2.mx)("z-20 absolute right-0 top-20 bottom-20 w-[30rem] overflow-auto scrollbar-thin", "border border-gridLine text-xs bg-neutral-50 dark:bg-black text-cyan-500 font-mono p-1 opacity-80")
1733
- }, /* @__PURE__ */ import_react3.default.createElement("pre", {
1734
- className: "whitespace-pre-wrap"
1735
- }, JSON.stringify({
1736
- cursor,
1737
- range,
1738
- cells: model.sheet.cells,
1739
- rowMeta: model.sheet.rowMeta,
1740
- columnMeta: model.sheet.columnMeta,
1741
- formatting: model.sheet.formatting
1742
- }, void 0, 2)));
1743
- };
1744
- var Sheet = {
1745
- Root: SheetRoot,
1746
- Main: SheetMain,
1747
- Rows: SheetRows,
1748
- Columns: SheetColumns,
1749
- Grid: SheetGrid,
1750
- Cell: SheetCell,
1751
- StatusBar: SheetStatusBar,
1752
- Debug: SheetDebug
1753
- };
1754
- var SheetContainer = ({ sheet, space, role, remoteFunctionUrl }) => {
1755
- return /* @__PURE__ */ import_react.default.createElement("div", {
1756
- role: "none",
1757
- className: (0, import_react_ui_theme.mx)("flex", role === "article" && "row-span-2", role === "section" && "aspect-square border-y border-is border-separator")
1758
- }, /* @__PURE__ */ import_react.default.createElement(Sheet.Root, {
1759
- sheet,
1760
- space,
1761
- remoteFunctionUrl
1762
- }, /* @__PURE__ */ import_react.default.createElement(Sheet.Main, null)));
1763
- };
1764
- var SheetContainer_default = SheetContainer;
1765
- //# sourceMappingURL=SheetContainer-AXQV3ZT5.cjs.map