@dxos/plugin-sheet 0.6.14-main.7bd9c89 → 0.6.14-staging.54a8bab

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 (231) hide show
  1. package/dist/lib/browser/{SheetContainer-AKWROARP.mjs → SheetContainer-JZEKRM4Z.mjs} +83 -76
  2. package/dist/lib/browser/SheetContainer-JZEKRM4Z.mjs.map +7 -0
  3. package/dist/lib/browser/{chunk-BWN5DZWZ.mjs → chunk-BVUN7SHF.mjs} +6 -13
  4. package/dist/lib/browser/chunk-BVUN7SHF.mjs.map +7 -0
  5. package/dist/lib/browser/{chunk-FGMFOW6U.mjs → chunk-G2FUL6PK.mjs} +791 -690
  6. package/dist/lib/browser/chunk-G2FUL6PK.mjs.map +7 -0
  7. package/dist/lib/browser/{chunk-D3QTX46O.mjs → chunk-RABELMEQ.mjs} +3 -2
  8. package/dist/lib/browser/{chunk-D3QTX46O.mjs.map → chunk-RABELMEQ.mjs.map} +3 -3
  9. package/dist/lib/browser/{chunk-GSV5QNLD.mjs → chunk-VMSX6Z4X.mjs} +297 -44
  10. package/dist/lib/browser/chunk-VMSX6Z4X.mjs.map +7 -0
  11. package/dist/lib/browser/{graph-M4IQ76QX.mjs → compute-graph-GGWUX644.mjs} +4 -2
  12. package/dist/lib/browser/index.mjs +91 -21
  13. package/dist/lib/browser/index.mjs.map +4 -4
  14. package/dist/lib/browser/meta.json +1 -1
  15. package/dist/lib/browser/meta.mjs +1 -1
  16. package/dist/lib/browser/types.mjs +2 -2
  17. package/dist/lib/node/{SheetContainer-N5IQGEFL.cjs → SheetContainer-PJE74VO4.cjs} +81 -81
  18. package/dist/lib/node/SheetContainer-PJE74VO4.cjs.map +7 -0
  19. package/dist/lib/node/{chunk-QIFIGEKV.cjs → chunk-2ZVZI2KJ.cjs} +6 -5
  20. package/dist/lib/node/{chunk-QIFIGEKV.cjs.map → chunk-2ZVZI2KJ.cjs.map} +3 -3
  21. package/dist/lib/node/{chunk-NZARD7UP.cjs → chunk-AWKOWDMI.cjs} +10 -17
  22. package/dist/lib/node/chunk-AWKOWDMI.cjs.map +7 -0
  23. package/dist/lib/node/{chunk-5XPK2V4A.cjs → chunk-O7XR4R7Y.cjs} +306 -42
  24. package/dist/lib/node/chunk-O7XR4R7Y.cjs.map +7 -0
  25. package/dist/lib/node/{chunk-53BMSUIK.cjs → chunk-STZ7S7RF.cjs} +755 -668
  26. package/dist/lib/node/chunk-STZ7S7RF.cjs.map +7 -0
  27. package/dist/lib/node/{graph-Q3N2X26H.cjs → compute-graph-KGWA2QLE.cjs} +21 -19
  28. package/dist/lib/node/compute-graph-KGWA2QLE.cjs.map +7 -0
  29. package/dist/lib/node/index.cjs +109 -42
  30. package/dist/lib/node/index.cjs.map +4 -4
  31. package/dist/lib/node/meta.cjs +3 -3
  32. package/dist/lib/node/meta.cjs.map +1 -1
  33. package/dist/lib/node/meta.json +1 -1
  34. package/dist/lib/node/types.cjs +7 -7
  35. package/dist/lib/node/types.cjs.map +1 -1
  36. package/dist/lib/node-esm/{SheetContainer-46PBMF2E.mjs → SheetContainer-R73XEXHU.mjs} +83 -76
  37. package/dist/lib/node-esm/SheetContainer-R73XEXHU.mjs.map +7 -0
  38. package/dist/lib/node-esm/{chunk-VCYJWE3O.mjs → chunk-BM2Q3FFC.mjs} +3 -2
  39. package/dist/lib/node-esm/{chunk-VCYJWE3O.mjs.map → chunk-BM2Q3FFC.mjs.map} +3 -3
  40. package/dist/lib/node-esm/{chunk-5WPZCXNS.mjs → chunk-CR4K75EL.mjs} +296 -44
  41. package/dist/lib/node-esm/chunk-CR4K75EL.mjs.map +7 -0
  42. package/dist/lib/node-esm/{chunk-WFDTY3IC.mjs → chunk-UIBWRHW7.mjs} +6 -13
  43. package/dist/lib/node-esm/chunk-UIBWRHW7.mjs.map +7 -0
  44. package/dist/lib/node-esm/{chunk-T3PRH7QS.mjs → chunk-V5N3Y2O5.mjs} +791 -690
  45. package/dist/lib/node-esm/chunk-V5N3Y2O5.mjs.map +7 -0
  46. package/dist/lib/node-esm/{graph-SMPUMOV2.mjs → compute-graph-2SCZT7N5.mjs} +4 -2
  47. package/dist/lib/node-esm/index.mjs +91 -21
  48. package/dist/lib/node-esm/index.mjs.map +4 -4
  49. package/dist/lib/node-esm/meta.json +1 -1
  50. package/dist/lib/node-esm/meta.mjs +1 -1
  51. package/dist/lib/node-esm/types.mjs +2 -2
  52. package/dist/types/src/SheetPlugin.d.ts.map +1 -1
  53. package/dist/types/src/components/ComputeGraph/ComputeGraphContextProvider.d.ts +3 -1
  54. package/dist/types/src/components/ComputeGraph/ComputeGraphContextProvider.d.ts.map +1 -1
  55. package/dist/types/src/components/GridSheet/GridSheet.d.ts.map +1 -1
  56. package/dist/types/src/components/GridSheet/GridSheet.stories.d.ts.map +1 -1
  57. package/dist/types/src/components/GridSheet/util.d.ts +1 -2
  58. package/dist/types/src/components/GridSheet/util.d.ts.map +1 -1
  59. package/dist/types/src/components/RangeList/RangeList.d.ts +7 -0
  60. package/dist/types/src/components/RangeList/RangeList.d.ts.map +1 -0
  61. package/dist/types/src/components/RangeList/index.d.ts +2 -0
  62. package/dist/types/src/components/RangeList/index.d.ts.map +1 -0
  63. package/dist/types/src/components/SheetContainer/SheetContainer.d.ts +6 -3
  64. package/dist/types/src/components/SheetContainer/SheetContainer.d.ts.map +1 -1
  65. package/dist/types/src/components/SheetContainer/SheetContainer.stories.d.ts.map +1 -1
  66. package/dist/types/src/components/SheetContext/SheetContext.d.ts +7 -5
  67. package/dist/types/src/components/SheetContext/SheetContext.d.ts.map +1 -1
  68. package/dist/types/src/components/Toolbar/Toolbar.d.ts +6 -3
  69. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  70. package/dist/types/src/components/index.d.ts +5 -2
  71. package/dist/types/src/components/index.d.ts.map +1 -1
  72. package/dist/types/src/compute-graph/compute-graph-registry.d.ts.map +1 -0
  73. package/dist/types/src/{graph → compute-graph}/compute-graph.d.ts +3 -3
  74. package/dist/types/src/compute-graph/compute-graph.d.ts.map +1 -0
  75. package/dist/types/src/compute-graph/compute-graph.stories.d.ts.map +1 -0
  76. package/dist/types/src/compute-graph/compute-graph.test.d.ts.map +1 -0
  77. package/dist/types/src/compute-graph/compute-node.d.ts.map +1 -0
  78. package/dist/types/src/compute-graph/functions/async-function.d.ts.map +1 -0
  79. package/dist/types/src/compute-graph/functions/edge-function.d.ts.map +1 -0
  80. package/dist/types/src/compute-graph/functions/function-defs.d.ts.map +1 -0
  81. package/dist/types/src/compute-graph/functions/index.d.ts.map +1 -0
  82. package/dist/types/src/compute-graph/hyperformula.test.d.ts.map +1 -0
  83. package/dist/types/src/compute-graph/index.d.ts.map +1 -0
  84. package/dist/types/src/compute-graph/testing/index.d.ts.map +1 -0
  85. package/dist/types/src/compute-graph/testing/test-builder.d.ts.map +1 -0
  86. package/dist/types/src/compute-graph/testing/test-plugin.d.ts.map +1 -0
  87. package/dist/types/src/compute-graph/util.d.ts.map +1 -0
  88. package/dist/types/src/defs/index.d.ts +1 -1
  89. package/dist/types/src/defs/index.d.ts.map +1 -1
  90. package/dist/types/src/defs/sheet-range-types.d.ts +2 -2
  91. package/dist/types/src/defs/sheet-range-types.d.ts.map +1 -1
  92. package/dist/types/src/defs/types.d.ts +6 -0
  93. package/dist/types/src/defs/types.d.ts.map +1 -1
  94. package/dist/types/src/defs/util.d.ts +3 -7
  95. package/dist/types/src/defs/util.d.ts.map +1 -1
  96. package/dist/types/src/extensions/compute.d.ts +1 -1
  97. package/dist/types/src/extensions/compute.d.ts.map +1 -1
  98. package/dist/types/src/extensions/editor/extension.d.ts +23 -3
  99. package/dist/types/src/extensions/editor/extension.d.ts.map +1 -1
  100. package/dist/types/src/index.d.ts +1 -1
  101. package/dist/types/src/index.d.ts.map +1 -1
  102. package/dist/types/src/integrations/index.d.ts +2 -0
  103. package/dist/types/src/integrations/index.d.ts.map +1 -0
  104. package/dist/types/src/integrations/thread-ranges.d.ts +7 -0
  105. package/dist/types/src/integrations/thread-ranges.d.ts.map +1 -0
  106. package/dist/types/src/meta.d.ts +1 -0
  107. package/dist/types/src/meta.d.ts.map +1 -1
  108. package/dist/types/src/model/index.d.ts +1 -1
  109. package/dist/types/src/model/index.d.ts.map +1 -1
  110. package/dist/types/src/model/sheet-model.d.ts +13 -6
  111. package/dist/types/src/model/sheet-model.d.ts.map +1 -1
  112. package/dist/types/src/{hooks → model}/useSheetModel.d.ts +1 -1
  113. package/dist/types/src/model/useSheetModel.d.ts.map +1 -0
  114. package/dist/types/src/serializer.d.ts +4 -0
  115. package/dist/types/src/serializer.d.ts.map +1 -0
  116. package/dist/types/src/testing/testing.d.ts +1 -1
  117. package/dist/types/src/testing/testing.d.ts.map +1 -1
  118. package/dist/types/src/translations.d.ts +18 -3
  119. package/dist/types/src/translations.d.ts.map +1 -1
  120. package/dist/types/src/types.d.ts +37 -33
  121. package/dist/types/src/types.d.ts.map +1 -1
  122. package/package.json +43 -50
  123. package/src/SheetPlugin.tsx +45 -12
  124. package/src/components/ComputeGraph/ComputeGraphContextProvider.tsx +19 -2
  125. package/src/components/FunctionEditor/FunctionEditor.tsx +5 -5
  126. package/src/components/GridSheet/GridSheet.stories.tsx +3 -1
  127. package/src/components/GridSheet/GridSheet.tsx +181 -24
  128. package/src/components/GridSheet/SheetCellEditor.stories.tsx +1 -1
  129. package/src/components/GridSheet/util.ts +34 -18
  130. package/src/components/RangeList/RangeList.tsx +53 -0
  131. package/src/components/RangeList/index.ts +5 -0
  132. package/src/components/SheetContainer/SheetContainer.stories.tsx +5 -3
  133. package/src/components/SheetContainer/SheetContainer.tsx +10 -4
  134. package/src/components/SheetContext/SheetContext.tsx +43 -20
  135. package/src/components/Toolbar/Toolbar.tsx +98 -74
  136. package/src/components/index.ts +1 -0
  137. package/src/{graph → compute-graph}/compute-graph.stories.tsx +2 -1
  138. package/src/{graph → compute-graph}/compute-graph.ts +27 -9
  139. package/src/{graph → compute-graph}/compute-node.ts +2 -3
  140. package/src/{graph → compute-graph}/functions/async-function.ts +1 -0
  141. package/src/{graph → compute-graph}/functions/edge-function.ts +5 -3
  142. package/src/defs/index.ts +1 -1
  143. package/src/defs/sheet-range-types.ts +9 -6
  144. package/src/defs/types.ts +6 -1
  145. package/src/defs/util.ts +4 -19
  146. package/src/extensions/compute.stories.tsx +2 -2
  147. package/src/extensions/compute.ts +2 -2
  148. package/src/extensions/editor/extension.test.ts +1 -1
  149. package/src/extensions/editor/extension.ts +48 -23
  150. package/src/index.ts +2 -2
  151. package/src/integrations/index.ts +5 -0
  152. package/src/integrations/thread-ranges.ts +101 -0
  153. package/src/meta.ts +1 -0
  154. package/src/model/index.ts +1 -1
  155. package/src/model/sheet-model.test.ts +6 -4
  156. package/src/model/sheet-model.ts +103 -26
  157. package/src/{hooks → model}/useSheetModel.ts +1 -1
  158. package/src/serializer.ts +27 -0
  159. package/src/testing/testing.tsx +1 -1
  160. package/src/translations.ts +18 -3
  161. package/src/types.ts +24 -2
  162. package/dist/lib/browser/SheetContainer-AKWROARP.mjs.map +0 -7
  163. package/dist/lib/browser/chunk-BWN5DZWZ.mjs.map +0 -7
  164. package/dist/lib/browser/chunk-FGMFOW6U.mjs.map +0 -7
  165. package/dist/lib/browser/chunk-GSV5QNLD.mjs.map +0 -7
  166. package/dist/lib/node/SheetContainer-N5IQGEFL.cjs.map +0 -7
  167. package/dist/lib/node/chunk-53BMSUIK.cjs.map +0 -7
  168. package/dist/lib/node/chunk-5XPK2V4A.cjs.map +0 -7
  169. package/dist/lib/node/chunk-NZARD7UP.cjs.map +0 -7
  170. package/dist/lib/node/graph-Q3N2X26H.cjs.map +0 -7
  171. package/dist/lib/node-esm/SheetContainer-46PBMF2E.mjs.map +0 -7
  172. package/dist/lib/node-esm/chunk-5WPZCXNS.mjs.map +0 -7
  173. package/dist/lib/node-esm/chunk-T3PRH7QS.mjs.map +0 -7
  174. package/dist/lib/node-esm/chunk-WFDTY3IC.mjs.map +0 -7
  175. package/dist/types/src/graph/compute-graph-registry.d.ts.map +0 -1
  176. package/dist/types/src/graph/compute-graph.d.ts.map +0 -1
  177. package/dist/types/src/graph/compute-graph.stories.d.ts.map +0 -1
  178. package/dist/types/src/graph/compute-graph.test.d.ts.map +0 -1
  179. package/dist/types/src/graph/compute-node.d.ts.map +0 -1
  180. package/dist/types/src/graph/functions/async-function.d.ts.map +0 -1
  181. package/dist/types/src/graph/functions/edge-function.d.ts.map +0 -1
  182. package/dist/types/src/graph/functions/function-defs.d.ts.map +0 -1
  183. package/dist/types/src/graph/functions/index.d.ts.map +0 -1
  184. package/dist/types/src/graph/hyperformula.test.d.ts.map +0 -1
  185. package/dist/types/src/graph/index.d.ts.map +0 -1
  186. package/dist/types/src/graph/testing/index.d.ts.map +0 -1
  187. package/dist/types/src/graph/testing/test-builder.d.ts.map +0 -1
  188. package/dist/types/src/graph/testing/test-plugin.d.ts.map +0 -1
  189. package/dist/types/src/graph/util.d.ts.map +0 -1
  190. package/dist/types/src/hooks/hooks.stories.d.ts +0 -6
  191. package/dist/types/src/hooks/hooks.stories.d.ts.map +0 -1
  192. package/dist/types/src/hooks/index.d.ts +0 -4
  193. package/dist/types/src/hooks/index.d.ts.map +0 -1
  194. package/dist/types/src/hooks/threads.d.ts +0 -8
  195. package/dist/types/src/hooks/threads.d.ts.map +0 -1
  196. package/dist/types/src/hooks/useComputeGraph.d.ts +0 -7
  197. package/dist/types/src/hooks/useComputeGraph.d.ts.map +0 -1
  198. package/dist/types/src/hooks/useSheetModel.d.ts.map +0 -1
  199. package/dist/types/src/model/decorations.d.ts +0 -26
  200. package/dist/types/src/model/decorations.d.ts.map +0 -1
  201. package/src/hooks/hooks.stories.tsx +0 -53
  202. package/src/hooks/index.ts +0 -7
  203. package/src/hooks/threads.ts +0 -147
  204. package/src/hooks/useComputeGraph.ts +0 -28
  205. package/src/model/decorations.ts +0 -66
  206. /package/dist/lib/browser/{graph-M4IQ76QX.mjs.map → compute-graph-GGWUX644.mjs.map} +0 -0
  207. /package/dist/lib/node-esm/{graph-SMPUMOV2.mjs.map → compute-graph-2SCZT7N5.mjs.map} +0 -0
  208. /package/dist/types/src/{graph → compute-graph}/compute-graph-registry.d.ts +0 -0
  209. /package/dist/types/src/{graph → compute-graph}/compute-graph.stories.d.ts +0 -0
  210. /package/dist/types/src/{graph → compute-graph}/compute-graph.test.d.ts +0 -0
  211. /package/dist/types/src/{graph → compute-graph}/compute-node.d.ts +0 -0
  212. /package/dist/types/src/{graph → compute-graph}/functions/async-function.d.ts +0 -0
  213. /package/dist/types/src/{graph → compute-graph}/functions/edge-function.d.ts +0 -0
  214. /package/dist/types/src/{graph → compute-graph}/functions/function-defs.d.ts +0 -0
  215. /package/dist/types/src/{graph → compute-graph}/functions/index.d.ts +0 -0
  216. /package/dist/types/src/{graph → compute-graph}/hyperformula.test.d.ts +0 -0
  217. /package/dist/types/src/{graph → compute-graph}/index.d.ts +0 -0
  218. /package/dist/types/src/{graph → compute-graph}/testing/index.d.ts +0 -0
  219. /package/dist/types/src/{graph → compute-graph}/testing/test-builder.d.ts +0 -0
  220. /package/dist/types/src/{graph → compute-graph}/testing/test-plugin.d.ts +0 -0
  221. /package/dist/types/src/{graph → compute-graph}/util.d.ts +0 -0
  222. /package/src/{graph → compute-graph}/compute-graph-registry.ts +0 -0
  223. /package/src/{graph → compute-graph}/compute-graph.test.ts +0 -0
  224. /package/src/{graph → compute-graph}/functions/function-defs.ts +0 -0
  225. /package/src/{graph → compute-graph}/functions/index.ts +0 -0
  226. /package/src/{graph → compute-graph}/hyperformula.test.ts +0 -0
  227. /package/src/{graph → compute-graph}/index.ts +0 -0
  228. /package/src/{graph → compute-graph}/testing/index.ts +0 -0
  229. /package/src/{graph → compute-graph}/testing/test-builder.ts +0 -0
  230. /package/src/{graph → compute-graph}/testing/test-plugin.ts +0 -0
  231. /package/src/{graph → compute-graph}/util.ts +0 -0
package/package.json CHANGED
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "name": "@dxos/plugin-sheet",
3
- "version": "0.6.14-main.7bd9c89",
3
+ "version": "0.6.14-staging.54a8bab",
4
4
  "description": "Braneframe sketch plugin",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
7
7
  "license": "MIT",
8
8
  "author": "DXOS.org",
9
+ "sideEffects": true,
9
10
  "imports": {
10
11
  "#hyperformula": {
11
12
  "types": "hyperformula",
@@ -14,28 +15,19 @@
14
15
  },
15
16
  "exports": {
16
17
  ".": {
18
+ "types": "./dist/types/src/index.d.ts",
17
19
  "browser": "./dist/lib/browser/index.mjs",
18
- "node": {
19
- "require": "./dist/lib/node/index.cjs",
20
- "default": "./dist/lib/node-esm/index.mjs"
21
- },
22
- "types": "./dist/types/src/index.d.ts"
20
+ "node": "./dist/lib/node-esm/index.mjs"
23
21
  },
24
22
  "./meta": {
23
+ "types": "./dist/types/src/meta.d.ts",
25
24
  "browser": "./dist/lib/browser/meta.mjs",
26
- "node": {
27
- "require": "./dist/lib/node/meta.cjs",
28
- "default": "./dist/lib/node-esm/meta.mjs"
29
- },
30
- "types": "./dist/types/src/meta.d.ts"
25
+ "node": "./dist/lib/node-esm/meta.mjs"
31
26
  },
32
27
  "./types": {
28
+ "types": "./dist/types/src/types.d.ts",
33
29
  "browser": "./dist/lib/browser/types.mjs",
34
- "node": {
35
- "require": "./dist/lib/node/types.cjs",
36
- "default": "./dist/lib/node-esm/types.mjs"
37
- },
38
- "types": "./dist/types/src/types.d.ts"
30
+ "node": "./dist/lib/node-esm/types.mjs"
39
31
  }
40
32
  },
41
33
  "types": "dist/types/src/index.d.ts",
@@ -77,31 +69,32 @@
77
69
  "re-resizable": "^6.9.17",
78
70
  "react-markdown": "^8.0.5",
79
71
  "react-resize-detector": "^11.0.1",
80
- "@dxos/app-framework": "0.6.14-main.7bd9c89",
81
- "@dxos/async": "0.6.14-main.7bd9c89",
82
- "@dxos/client": "0.6.14-main.7bd9c89",
83
- "@dxos/context": "0.6.14-main.7bd9c89",
84
- "@dxos/debug": "0.6.14-main.7bd9c89",
85
- "@dxos/crypto": "0.6.14-main.7bd9c89",
86
- "@dxos/echo-schema": "0.6.14-main.7bd9c89",
87
- "@dxos/invariant": "0.6.14-main.7bd9c89",
88
- "@dxos/keys": "0.6.14-main.7bd9c89",
89
- "@dxos/plugin-attention": "0.6.14-main.7bd9c89",
90
- "@dxos/log": "0.6.14-main.7bd9c89",
91
- "@dxos/plugin-client": "0.6.14-main.7bd9c89",
92
- "@dxos/plugin-graph": "0.6.14-main.7bd9c89",
93
- "@dxos/plugin-markdown": "0.6.14-main.7bd9c89",
94
- "@dxos/plugin-script": "0.6.14-main.7bd9c89",
95
- "@dxos/plugin-stack": "0.6.14-main.7bd9c89",
96
- "@dxos/react-client": "0.6.14-main.7bd9c89",
97
- "@dxos/react-hooks": "0.6.14-main.7bd9c89",
98
- "@dxos/react-ui-attention": "0.6.14-main.7bd9c89",
99
- "@dxos/plugin-space": "0.6.14-main.7bd9c89",
100
- "@dxos/react-ui-editor": "0.6.14-main.7bd9c89",
101
- "@dxos/react-ui-data": "0.6.14-main.7bd9c89",
102
- "@dxos/react-ui-grid": "0.6.14-main.7bd9c89",
103
- "@dxos/schema": "0.6.14-main.7bd9c89",
104
- "@dxos/util": "0.6.14-main.7bd9c89"
72
+ "@dxos/app-framework": "0.6.14-staging.54a8bab",
73
+ "@dxos/async": "0.6.14-staging.54a8bab",
74
+ "@dxos/client": "0.6.14-staging.54a8bab",
75
+ "@dxos/crypto": "0.6.14-staging.54a8bab",
76
+ "@dxos/debug": "0.6.14-staging.54a8bab",
77
+ "@dxos/context": "0.6.14-staging.54a8bab",
78
+ "@dxos/echo-schema": "0.6.14-staging.54a8bab",
79
+ "@dxos/invariant": "0.6.14-staging.54a8bab",
80
+ "@dxos/keys": "0.6.14-staging.54a8bab",
81
+ "@dxos/plugin-attention": "0.6.14-staging.54a8bab",
82
+ "@dxos/plugin-client": "0.6.14-staging.54a8bab",
83
+ "@dxos/log": "0.6.14-staging.54a8bab",
84
+ "@dxos/plugin-graph": "0.6.14-staging.54a8bab",
85
+ "@dxos/plugin-markdown": "0.6.14-staging.54a8bab",
86
+ "@dxos/plugin-script": "0.6.14-staging.54a8bab",
87
+ "@dxos/plugin-space": "0.6.14-staging.54a8bab",
88
+ "@dxos/plugin-stack": "0.6.14-staging.54a8bab",
89
+ "@dxos/react-client": "0.6.14-staging.54a8bab",
90
+ "@dxos/react-hooks": "0.6.14-staging.54a8bab",
91
+ "@dxos/react-ui-data": "0.6.14-staging.54a8bab",
92
+ "@dxos/react-ui-editor": "0.6.14-staging.54a8bab",
93
+ "@dxos/react-ui-attention": "0.6.14-staging.54a8bab",
94
+ "@dxos/react-ui-grid": "0.6.14-staging.54a8bab",
95
+ "@dxos/react-ui-list": "0.6.14-staging.54a8bab",
96
+ "@dxos/util": "0.6.14-staging.54a8bab",
97
+ "@dxos/schema": "0.6.14-staging.54a8bab"
105
98
  },
106
99
  "devDependencies": {
107
100
  "@lezer/generator": "^1.7.1",
@@ -113,19 +106,19 @@
113
106
  "react": "~18.2.0",
114
107
  "react-dom": "~18.2.0",
115
108
  "vite": "5.4.7",
116
- "@dxos/echo-generator": "0.6.14-main.7bd9c89",
117
- "@dxos/react-ui": "0.6.14-main.7bd9c89",
118
- "@dxos/random": "0.6.14-main.7bd9c89",
119
- "@dxos/react-ui-theme": "0.6.14-main.7bd9c89",
120
- "@dxos/react-ui-syntax-highlighter": "0.6.14-main.7bd9c89",
121
- "@dxos/react-ui-types": "0.6.14-main.7bd9c89",
122
- "@dxos/storybook-utils": "0.6.14-main.7bd9c89"
109
+ "@dxos/echo-generator": "0.6.14-staging.54a8bab",
110
+ "@dxos/react-ui": "0.6.14-staging.54a8bab",
111
+ "@dxos/random": "0.6.14-staging.54a8bab",
112
+ "@dxos/react-ui-syntax-highlighter": "0.6.14-staging.54a8bab",
113
+ "@dxos/react-ui-theme": "0.6.14-staging.54a8bab",
114
+ "@dxos/react-ui-types": "0.6.14-staging.54a8bab",
115
+ "@dxos/storybook-utils": "0.6.14-staging.54a8bab"
123
116
  },
124
117
  "peerDependencies": {
125
118
  "react": "~18.2.0",
126
119
  "react-dom": "~18.2.0",
127
- "@dxos/react-ui": "0.6.14-main.7bd9c89",
128
- "@dxos/react-ui-theme": "0.6.14-main.7bd9c89"
120
+ "@dxos/react-ui": "0.6.14-staging.54a8bab",
121
+ "@dxos/react-ui-theme": "0.6.14-staging.54a8bab"
129
122
  },
130
123
  "publishConfig": {
131
124
  "access": "public"
@@ -13,12 +13,12 @@ import { SpaceAction } from '@dxos/plugin-space';
13
13
  import { getSpace, isEchoObject } from '@dxos/react-client/echo';
14
14
  import { Icon } from '@dxos/react-ui';
15
15
 
16
- import { ComputeGraphContextProvider, SheetContainer } from './components';
16
+ import { ComputeGraphContextProvider, RangeList, SheetContainer } from './components';
17
+ import { type ComputeGraphRegistry } from './compute-graph';
17
18
  import { compareIndexPositions, createSheet } from './defs';
18
19
  import { computeGraphFacet } from './extensions';
19
- import { type ComputeGraphRegistry } from './graph';
20
- import { useComputeGraph } from './hooks';
21
20
  import meta, { SHEET_PLUGIN } from './meta';
21
+ import { serializer } from './serializer';
22
22
  import translations from './translations';
23
23
  import { SheetAction, SheetType, type SheetPluginProvides } from './types';
24
24
 
@@ -38,8 +38,8 @@ export const SheetPlugin = (): PluginDefinition<SheetPluginProvides> => {
38
38
  }
39
39
 
40
40
  // Async import removes direct dependency on hyperformula.
41
- const { ComputeGraphRegistry } = await import('./graph');
42
- computeGraphRegistry = new ComputeGraphRegistry({ remoteFunctionUrl });
41
+ const { defaultPlugins, ComputeGraphRegistry } = await import('./compute-graph');
42
+ computeGraphRegistry = new ComputeGraphRegistry({ plugins: defaultPlugins, remoteFunctionUrl });
43
43
  },
44
44
  provides: {
45
45
  context: ({ children }) => {
@@ -52,6 +52,7 @@ export const SheetPlugin = (): PluginDefinition<SheetPluginProvides> => {
52
52
  label: (object: any) => (object instanceof SheetType ? object.name : undefined),
53
53
  placeholder: ['sheet title placeholder', { ns: SHEET_PLUGIN }],
54
54
  icon: 'ph--grid-nine--regular',
55
+ serializer,
55
56
  },
56
57
  },
57
58
  },
@@ -143,14 +144,26 @@ export const SheetPlugin = (): PluginDefinition<SheetPluginProvides> => {
143
144
  surface: {
144
145
  component: ({ data, role }) => {
145
146
  const space = isEchoObject(data.object) ? getSpace(data.object) : undefined;
146
- const graph = useComputeGraph(space);
147
- if (graph && data.object instanceof SheetType) {
148
- switch (role) {
149
- case 'article':
150
- case 'section': {
151
- return <SheetContainer graph={graph} sheet={data.object} role={role} />;
147
+ if (!space) {
148
+ return null;
149
+ }
150
+
151
+ switch (role) {
152
+ case 'article':
153
+ case 'section':
154
+ if (data.object instanceof SheetType) {
155
+ return <SheetContainer space={space} sheet={data.object} role={role} />;
152
156
  }
153
- }
157
+
158
+ return null;
159
+ case 'complementary--settings':
160
+ if (data.subject instanceof SheetType) {
161
+ return {
162
+ node: <RangeList sheet={data.subject} />,
163
+ };
164
+ }
165
+
166
+ return null;
154
167
  }
155
168
 
156
169
  return null;
@@ -162,6 +175,26 @@ export const SheetPlugin = (): PluginDefinition<SheetPluginProvides> => {
162
175
  case SheetAction.CREATE: {
163
176
  return { data: createSheet() };
164
177
  }
178
+ case SheetAction.INSERT_AXIS: {
179
+ const { model, axis, index, count } = intent.data as SheetAction.InsertAxis;
180
+ const _indices = model[axis === 'col' ? 'insertColumns' : 'insertRows'](index, count);
181
+ return;
182
+ }
183
+ case SheetAction.DROP_AXIS: {
184
+ if (!intent.undo) {
185
+ const { model, axis, axisIndex } = intent.data as SheetAction.DropAxis;
186
+ const undoData = model[axis === 'col' ? 'dropColumn' : 'dropRow'](axisIndex);
187
+ return {
188
+ undoable: {
189
+ message: translations[0]['en-US'][SHEET_PLUGIN][`${axis} dropped label`],
190
+ data: { ...undoData, model },
191
+ },
192
+ };
193
+ } else {
194
+ const { model, ...undoData } = intent.data as SheetAction.DropAxisRestore;
195
+ model[undoData.axis === 'col' ? 'restoreColumn' : 'restoreRow'](undoData);
196
+ }
197
+ }
165
198
  }
166
199
  },
167
200
  },
@@ -2,9 +2,13 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import React, { createContext, type PropsWithChildren } from 'react';
5
+ import React, { createContext, type PropsWithChildren, useContext } from 'react';
6
6
 
7
- import { type ComputeGraphRegistry } from '../../graph';
7
+ import { raise } from '@dxos/debug';
8
+ import { type Space } from '@dxos/react-client/echo';
9
+ import { useAsyncState } from '@dxos/react-hooks';
10
+
11
+ import { type ComputeGraph, type ComputeGraphRegistry } from '../../compute-graph';
8
12
 
9
13
  export type ComputeGraphContextType = {
10
14
  registry: ComputeGraphRegistry;
@@ -18,3 +22,16 @@ export const ComputeGraphContext = createContext<ComputeGraphContextType | undef
18
22
  export const ComputeGraphContextProvider = ({ registry, children }: PropsWithChildren<ComputeGraphContextType>) => {
19
23
  return <ComputeGraphContext.Provider value={{ registry }}>{children}</ComputeGraphContext.Provider>;
20
24
  };
25
+
26
+ export const useComputeGraph = (space?: Space): ComputeGraph | undefined => {
27
+ const { registry } = useContext(ComputeGraphContext) ?? raise(new Error('Missing ComputeGraphContext'));
28
+ const [graph] = useAsyncState(async () => {
29
+ if (space) {
30
+ const graph = registry.getOrCreateGraph(space);
31
+ await graph.open();
32
+ return graph;
33
+ }
34
+ }, [space, registry]);
35
+
36
+ return graph;
37
+ };
@@ -7,19 +7,19 @@ import React from 'react';
7
7
  import { Icon } from '@dxos/react-ui';
8
8
  import { mx } from '@dxos/react-ui-theme';
9
9
 
10
- import { addressToA1Notation, rangeToA1Notation } from '../../defs';
10
+ import { addressToA1Notation, isFormula, rangeToA1Notation } from '../../defs';
11
11
  import { useSheetContext } from '../SheetContext';
12
12
 
13
13
  export const FunctionEditor = () => {
14
14
  const { model, cursor, range } = useSheetContext();
15
15
 
16
16
  let value;
17
- let isFormula = false;
17
+ let formula = false;
18
18
  if (cursor) {
19
19
  value = model.getCellValue(cursor);
20
- if (typeof value === 'string' && value.charAt(0) === '=') {
20
+ if (isFormula(value)) {
21
21
  value = model.graph.mapFunctionBindingFromId(model.mapFormulaIndicesToRefs(value));
22
- isFormula = true;
22
+ formula = true;
23
23
  } else if (value != null) {
24
24
  value = String(value);
25
25
  }
@@ -36,7 +36,7 @@ export const FunctionEditor = () => {
36
36
  {(range && rangeToA1Notation(range)) || (cursor && addressToA1Notation(cursor))}
37
37
  </div>
38
38
  <div className='flex gap-2 items-center'>
39
- <Icon icon='ph--function--regular' classNames={['text-greenText', isFormula ? 'visible' : 'invisible']} />
39
+ <Icon icon='ph--function--regular' classNames={['text-greenText', formula ? 'visible' : 'invisible']} />
40
40
  <span className='font-mono'>{value}</span>
41
41
  </div>
42
42
  </div>
@@ -10,9 +10,10 @@ import { withClientProvider } from '@dxos/react-client/testing';
10
10
  import { withTheme, withLayout } from '@dxos/storybook-utils';
11
11
 
12
12
  import { GridSheet } from './GridSheet';
13
- import { useComputeGraph } from '../../hooks';
14
13
  import { createTestCells, useTestSheet, withComputeGraphDecorator } from '../../testing';
14
+ import translations from '../../translations';
15
15
  import { SheetType } from '../../types';
16
+ import { useComputeGraph } from '../ComputeGraph';
16
17
  import { SheetProvider } from '../SheetContext';
17
18
 
18
19
  export const Basic = () => {
@@ -39,6 +40,7 @@ const meta: Meta = {
39
40
  withTheme,
40
41
  withLayout({ fullscreen: true, tooltips: true }),
41
42
  ],
43
+ parameters: { translations },
42
44
  };
43
45
 
44
46
  export default meta;
@@ -2,25 +2,41 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import React, { useCallback, useMemo, useRef, type FocusEvent, type WheelEvent, type KeyboardEvent } from 'react';
5
+ import React, {
6
+ useCallback,
7
+ useMemo,
8
+ useRef,
9
+ type FocusEvent,
10
+ type KeyboardEvent,
11
+ type WheelEvent,
12
+ type MouseEvent,
13
+ useState,
14
+ } from 'react';
6
15
 
16
+ import { useIntentDispatcher } from '@dxos/app-framework';
17
+ import { DropdownMenu, Icon, useTranslation } from '@dxos/react-ui';
7
18
  import { useAttention } from '@dxos/react-ui-attention';
8
19
  import {
9
- type DxGridElement,
10
- Grid,
11
- type GridContentProps,
20
+ closestCell,
12
21
  editorKeys,
13
- type EditorKeysProps,
22
+ Grid,
14
23
  GridCellEditor,
15
- closestCell,
24
+ type DxGridElement,
25
+ type EditorKeysProps,
26
+ type GridContentProps,
27
+ type DxGridPosition,
16
28
  } from '@dxos/react-ui-grid';
17
29
 
18
30
  import { colLabelCell, dxGridCellIndexToSheetCellAddress, rowLabelCell, useSheetModelDxGridProps } from './util';
19
- import { rangeToA1Notation, type CellRange, DEFAULT_COLUMNS, DEFAULT_ROWS } from '../../defs';
20
- import { rangeExtension, sheetExtension, type CellRangeNotifier } from '../../extensions';
21
- import { useUpdateFocusedCellOnThreadSelection } from '../../hooks';
31
+ import { DEFAULT_COLUMNS, DEFAULT_ROWS, rangeToA1Notation, type CellRange } from '../../defs';
32
+ import { rangeExtension, sheetExtension, type RangeController } from '../../extensions';
33
+ import { useSelectThreadOnCellFocus, useUpdateFocusedCellOnThreadSelection } from '../../integrations';
34
+ import { SHEET_PLUGIN } from '../../meta';
35
+ import { SheetAction } from '../../types';
22
36
  import { useSheetContext } from '../SheetContext';
23
37
 
38
+ const inertPosition: DxGridPosition = { plane: 'grid', col: 0, row: 0 };
39
+
24
40
  const initialCells = {
25
41
  grid: {},
26
42
  frozenColsStart: [...Array(64)].reduce((acc, _, i) => {
@@ -42,17 +58,29 @@ const sheetRowDefault = { frozenRowsStart: { size: 32, readonly: true }, grid: {
42
58
  const sheetColDefault = { frozenColsStart: { size: 48, readonly: true }, grid: { size: 180, resizeable: true } };
43
59
 
44
60
  export const GridSheet = () => {
45
- const { id, model, editing, setEditing, setCursor, setRange, range, cursor } = useSheetContext();
46
- const dxGrid = useRef<DxGridElement | null>(null);
47
- const rangeNotifier = useRef<CellRangeNotifier>();
61
+ const { t } = useTranslation(SHEET_PLUGIN);
62
+ const { id, model, editing, setEditing, setCursor, setRange, cursor, cursorFallbackRange, activeRefs } =
63
+ useSheetContext();
64
+ // NOTE(thure): using `useState` instead of `useRef` works with refs provided by `@lit/react` and gives us a reliable dependency for `useEffect` whereas `useLayoutEffect` does not guarantee the element will be defined.
65
+ const [dxGrid, setDxGrid] = useState<DxGridElement | null>(null);
66
+ const [extraplanarFocus, setExtraplanarFocus] = useState<DxGridPosition | null>(null);
67
+ const dispatch = useIntentDispatcher();
68
+ const rangeController = useRef<RangeController>();
48
69
  const { hasAttention } = useAttention(id);
49
70
 
50
71
  const handleFocus = useCallback(
51
72
  (event: FocusEvent) => {
52
73
  if (!editing) {
53
74
  const cell = closestCell(event.target);
54
- if (cell && cell.plane === 'grid') {
55
- setCursor({ col: cell.col, row: cell.row });
75
+ if (cell) {
76
+ if (cell.plane === 'grid') {
77
+ setCursor({ col: cell.col, row: cell.row });
78
+ setExtraplanarFocus(null);
79
+ } else {
80
+ setExtraplanarFocus(cell);
81
+ }
82
+ } else {
83
+ setExtraplanarFocus(null);
56
84
  }
57
85
  }
58
86
  },
@@ -72,9 +100,19 @@ export const GridSheet = () => {
72
100
  ? 'col'
73
101
  : undefined;
74
102
  const delta = key.startsWith('Arrow') ? (['ArrowUp', 'ArrowLeft'].includes(key) ? -1 : 1) : shift ? -1 : 1;
75
- dxGrid.current?.refocus(axis, delta);
103
+ dxGrid?.refocus(axis, delta);
76
104
  },
77
- [model, editing, setEditing],
105
+ [model, editing, dxGrid],
106
+ );
107
+
108
+ const handleBlur = useCallback(
109
+ (value?: string) => {
110
+ if (value !== undefined) {
111
+ model.setValue(dxGridCellIndexToSheetCellAddress(editing!.index), value);
112
+ }
113
+ setEditing(null);
114
+ },
115
+ [model, editing],
78
116
  );
79
117
 
80
118
  const handleAxisResize = useCallback<NonNullable<GridContentProps['onAxisResize']>>(
@@ -100,7 +138,7 @@ export const GridSheet = () => {
100
138
  }
101
139
  if (editing) {
102
140
  // Update range selection in formula.
103
- rangeNotifier.current?.(rangeToA1Notation(range));
141
+ rangeController.current?.setRange(rangeToA1Notation(range));
104
142
  } else {
105
143
  // Setting range while editing causes focus to move to null, avoid doing so.
106
144
  setRange(range.to ? range : undefined);
@@ -108,7 +146,6 @@ export const GridSheet = () => {
108
146
  },
109
147
  [editing],
110
148
  );
111
-
112
149
  const handleWheel = useCallback(
113
150
  (event: WheelEvent) => {
114
151
  if (!hasAttention) {
@@ -118,14 +155,51 @@ export const GridSheet = () => {
118
155
  [hasAttention],
119
156
  );
120
157
 
158
+ const selectEntireAxis = useCallback(
159
+ (pos: DxGridPosition) => {
160
+ switch (pos.plane) {
161
+ case 'frozenRowsStart':
162
+ return dxGrid?.setSelection({
163
+ start: { col: pos.col, row: 0, plane: 'grid' },
164
+ end: { col: pos.col, row: model.sheet.rows.length - 1, plane: 'grid' },
165
+ });
166
+ case 'frozenColsStart':
167
+ return dxGrid?.setSelection({
168
+ start: { row: pos.row, col: 0, plane: 'grid' },
169
+ end: { row: pos.row, col: model.sheet.columns.length - 1, plane: 'grid' },
170
+ });
171
+ }
172
+ },
173
+ [dxGrid, model.sheet],
174
+ );
175
+
176
+ const handleClick = useCallback(
177
+ (event: MouseEvent) => {
178
+ const cell = closestCell(event.target);
179
+ if (cell) {
180
+ selectEntireAxis(cell);
181
+ }
182
+ },
183
+ [selectEntireAxis],
184
+ );
185
+
121
186
  const handleKeyDown = useCallback(
122
187
  (event: KeyboardEvent) => {
123
- const cursorFallbackRange: CellRange | null = range ?? cursor ? { from: cursor!, to: cursor! } : null;
124
188
  switch (event.key) {
125
189
  case 'Backspace':
126
190
  case 'Delete':
127
191
  event.preventDefault();
128
192
  return cursorFallbackRange && model.clear(cursorFallbackRange);
193
+ case 'Enter':
194
+ case 'Space':
195
+ if (dxGrid && extraplanarFocus) {
196
+ switch (extraplanarFocus.plane) {
197
+ case 'frozenRowsStart':
198
+ case 'frozenColsStart':
199
+ event.preventDefault();
200
+ return selectEntireAxis(extraplanarFocus);
201
+ }
202
+ }
129
203
  }
130
204
  if (event.metaKey || event.ctrlKey) {
131
205
  switch (event.key) {
@@ -151,7 +225,48 @@ export const GridSheet = () => {
151
225
  }
152
226
  }
153
227
  },
154
- [range, model, cursor],
228
+ [cursorFallbackRange, model, cursor, extraplanarFocus, selectEntireAxis],
229
+ );
230
+
231
+ const contextMenuAnchorRef = useRef<HTMLButtonElement | null>(null);
232
+ const [contextMenuOpen, setContextMenuOpen] = useState<DxGridPosition | null>(null);
233
+ const contextMenuAxis = contextMenuOpen?.plane.startsWith('frozenRows') ? 'col' : 'row';
234
+
235
+ const handleContextMenu = useCallback((event: MouseEvent) => {
236
+ const cell = closestCell(event.target);
237
+ if (cell && cell.plane.startsWith('frozen')) {
238
+ event.preventDefault();
239
+ contextMenuAnchorRef.current = event.target as HTMLButtonElement;
240
+ setContextMenuOpen(cell);
241
+ }
242
+ }, []);
243
+
244
+ const handleAxisMenuAction = useCallback(
245
+ (operation: 'insert-before' | 'insert-after' | 'drop') => {
246
+ switch (operation) {
247
+ case 'insert-before':
248
+ case 'insert-after':
249
+ return dispatch({
250
+ action: SheetAction.INSERT_AXIS,
251
+ data: {
252
+ model,
253
+ axis: contextMenuAxis,
254
+ index: contextMenuOpen![contextMenuAxis] + (operation === 'insert-before' ? 0 : 1),
255
+ } satisfies SheetAction.InsertAxis,
256
+ });
257
+ break;
258
+ case 'drop':
259
+ return dispatch({
260
+ action: SheetAction.DROP_AXIS,
261
+ data: {
262
+ model,
263
+ axis: contextMenuAxis,
264
+ axisIndex: model.sheet[contextMenuAxis === 'row' ? 'rows' : 'columns'][contextMenuOpen![contextMenuAxis]],
265
+ } satisfies SheetAction.DropAxis,
266
+ });
267
+ }
268
+ },
269
+ [contextMenuAxis, contextMenuOpen, model, dispatch],
155
270
  );
156
271
 
157
272
  const { columns, rows } = useSheetModelDxGridProps(dxGrid, model);
@@ -160,7 +275,15 @@ export const GridSheet = () => {
160
275
  () => [
161
276
  editorKeys({ onClose: handleClose, ...(editing?.initialContent && { onNav: handleClose }) }),
162
277
  sheetExtension({ functions: model.graph.getFunctions() }),
163
- rangeExtension((fn) => (rangeNotifier.current = fn)),
278
+ rangeExtension({
279
+ onInit: (fn) => (rangeController.current = fn),
280
+ onStateChange: (state) => {
281
+ if (dxGrid) {
282
+ // This can’t dispatch a setState in this component, otherwise the cell editor remounts and loses focus.
283
+ dxGrid.mode = typeof state.activeRange === 'undefined' ? 'edit' : 'edit-select';
284
+ }
285
+ },
286
+ }),
164
287
  ],
165
288
  [model, handleClose, editing],
166
289
  );
@@ -173,11 +296,12 @@ export const GridSheet = () => {
173
296
  [model],
174
297
  );
175
298
 
176
- useUpdateFocusedCellOnThreadSelection(model, dxGrid);
299
+ useUpdateFocusedCellOnThreadSelection(dxGrid);
300
+ useSelectThreadOnCellFocus();
177
301
 
178
302
  return (
179
303
  <>
180
- <GridCellEditor getCellContent={getCellContent} extension={extension} />
304
+ <GridCellEditor getCellContent={getCellContent} extension={extension} onBlur={handleBlur} />
181
305
  <Grid.Content
182
306
  initialCells={initialCells}
183
307
  limitColumns={DEFAULT_COLUMNS}
@@ -192,10 +316,43 @@ export const GridSheet = () => {
192
316
  onFocus={handleFocus}
193
317
  onWheelCapture={handleWheel}
194
318
  onKeyDown={handleKeyDown}
319
+ onContextMenu={handleContextMenu}
320
+ onClick={handleClick}
195
321
  overscroll='inline'
196
322
  className='[--dx-grid-base:var(--surface-bg)]'
197
- ref={dxGrid}
323
+ activeRefs={activeRefs}
324
+ ref={setDxGrid}
198
325
  />
326
+ <DropdownMenu.Root
327
+ modal={false}
328
+ open={!!contextMenuOpen}
329
+ onOpenChange={(nextOpen) => setContextMenuOpen(nextOpen ? inertPosition : null)}
330
+ >
331
+ <DropdownMenu.VirtualTrigger virtualRef={contextMenuAnchorRef} />
332
+ <DropdownMenu.Content side={contextMenuAxis === 'col' ? 'bottom' : 'right'} sideOffset={4} collisionPadding={8}>
333
+ <DropdownMenu.Viewport>
334
+ <DropdownMenu.Item onClick={() => handleAxisMenuAction('insert-before')}>
335
+ <Icon
336
+ size={5}
337
+ icon={contextMenuAxis === 'col' ? 'ph--columns-plus-left--regular' : 'ph--rows-plus-top--regular'}
338
+ />
339
+ <span>{t(`add ${contextMenuAxis} before label`)}</span>
340
+ </DropdownMenu.Item>
341
+ <DropdownMenu.Item onClick={() => handleAxisMenuAction('insert-after')}>
342
+ <Icon
343
+ size={5}
344
+ icon={contextMenuAxis === 'col' ? 'ph--columns-plus-right--regular' : 'ph--rows-plus-bottom--regular'}
345
+ />
346
+ <span>{t(`add ${contextMenuAxis} after label`)}</span>
347
+ </DropdownMenu.Item>
348
+ <DropdownMenu.Item onClick={() => handleAxisMenuAction('drop')}>
349
+ <Icon size={5} icon='ph--backspace--regular' />
350
+ <span>{t(`delete ${contextMenuAxis} label`)}</span>
351
+ </DropdownMenu.Item>
352
+ </DropdownMenu.Viewport>
353
+ <DropdownMenu.Arrow />
354
+ </DropdownMenu.Content>
355
+ </DropdownMenu.Root>
199
356
  </>
200
357
  );
201
358
  };
@@ -14,9 +14,9 @@ import { CellEditor, type CellEditorProps } from '@dxos/react-ui-grid';
14
14
  import { withTheme } from '@dxos/storybook-utils';
15
15
 
16
16
  import { HyperFormula } from '#hyperformula';
17
+ import { defaultFunctions } from '../../compute-graph';
17
18
  import { createSheet } from '../../defs';
18
19
  import { sheetExtension } from '../../extensions';
19
- import { defaultFunctions } from '../../graph';
20
20
  import { SheetType } from '../../types';
21
21
 
22
22
  type StoryProps = CellEditorProps;