@dxos/plugin-sheet 0.8.4-main.72ec0f3 → 0.8.4-main.7996785055

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 (348) hide show
  1. package/dist/lib/browser/RangeList-RRNK4LL5.mjs +50 -0
  2. package/dist/lib/browser/RangeList-RRNK4LL5.mjs.map +7 -0
  3. package/dist/lib/browser/SheetContainer-N7GPNSOM.mjs +44 -0
  4. package/dist/lib/browser/SheetContainer-N7GPNSOM.mjs.map +7 -0
  5. package/dist/lib/browser/{anchor-sort-FCQ5OZZK.mjs → anchor-sort-J4Y5NKYR.mjs} +9 -7
  6. package/dist/lib/browser/anchor-sort-J4Y5NKYR.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-AIOU5OTJ.mjs +118 -0
  8. package/dist/lib/browser/chunk-AIOU5OTJ.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-BZEV7AQM.mjs +278 -0
  10. package/dist/lib/browser/chunk-BZEV7AQM.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-FWFAAGXL.mjs → chunk-MFMDZ433.mjs} +2 -2
  12. package/dist/lib/browser/chunk-MFMDZ433.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-7VEWYJJN.mjs → chunk-NNWF7EKC.mjs} +13 -13
  14. package/dist/lib/browser/chunk-NNWF7EKC.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-T5XHKC7L.mjs +1771 -0
  16. package/dist/lib/browser/chunk-T5XHKC7L.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-UZ4SHAES.mjs +8 -0
  18. package/dist/lib/browser/chunk-UZ4SHAES.mjs.map +7 -0
  19. package/dist/lib/browser/compute-graph-registry-FEG3DN5R.mjs +22 -0
  20. package/dist/lib/browser/compute-graph-registry-FEG3DN5R.mjs.map +7 -0
  21. package/dist/lib/browser/drop-axis-UTOJ5MVT.mjs +23 -0
  22. package/dist/lib/browser/drop-axis-UTOJ5MVT.mjs.map +7 -0
  23. package/dist/lib/browser/index.mjs +94 -76
  24. package/dist/lib/browser/index.mjs.map +4 -4
  25. package/dist/lib/browser/insert-axis-OS5VFQDK.mjs +16 -0
  26. package/dist/lib/browser/insert-axis-OS5VFQDK.mjs.map +7 -0
  27. package/dist/lib/browser/markdown-ZDM2HMK6.mjs +30 -0
  28. package/dist/lib/browser/markdown-ZDM2HMK6.mjs.map +7 -0
  29. package/dist/lib/browser/meta.json +1 -1
  30. package/dist/lib/browser/operation-handler-5PGGEH6O.mjs +16 -0
  31. package/dist/lib/browser/operation-handler-5PGGEH6O.mjs.map +7 -0
  32. package/dist/lib/browser/operations/index.mjs +12 -0
  33. package/dist/lib/browser/operations/index.mjs.map +7 -0
  34. package/dist/lib/browser/react-surface-7LK375A6.mjs +54 -0
  35. package/dist/lib/browser/react-surface-7LK375A6.mjs.map +7 -0
  36. package/dist/lib/browser/restore-axis-O7PHU7ON.mjs +16 -0
  37. package/dist/lib/browser/restore-axis-O7PHU7ON.mjs.map +7 -0
  38. package/dist/lib/browser/scroll-to-anchor-HNCUXJGW.mjs +37 -0
  39. package/dist/lib/browser/scroll-to-anchor-HNCUXJGW.mjs.map +7 -0
  40. package/dist/lib/browser/state-35W4C372.mjs +31 -0
  41. package/dist/lib/browser/state-35W4C372.mjs.map +7 -0
  42. package/dist/lib/browser/types/index.mjs +4 -2
  43. package/dist/lib/browser/undo-mappings-GTX6XUZK.mjs +35 -0
  44. package/dist/lib/browser/undo-mappings-GTX6XUZK.mjs.map +7 -0
  45. package/dist/lib/node-esm/RangeList-X6IU5QKI.mjs +51 -0
  46. package/dist/lib/node-esm/RangeList-X6IU5QKI.mjs.map +7 -0
  47. package/dist/lib/node-esm/SheetContainer-QFRHGZZE.mjs +45 -0
  48. package/dist/lib/node-esm/SheetContainer-QFRHGZZE.mjs.map +7 -0
  49. package/dist/lib/node-esm/{anchor-sort-ZE7IS7SH.mjs → anchor-sort-XLGKHSB4.mjs} +9 -7
  50. package/dist/lib/node-esm/anchor-sort-XLGKHSB4.mjs.map +7 -0
  51. package/dist/lib/node-esm/chunk-HI3E7P4K.mjs +10 -0
  52. package/dist/lib/node-esm/chunk-HI3E7P4K.mjs.map +7 -0
  53. package/dist/lib/node-esm/chunk-J7XCAKTA.mjs +279 -0
  54. package/dist/lib/node-esm/chunk-J7XCAKTA.mjs.map +7 -0
  55. package/dist/lib/node-esm/{chunk-4QV4AGWK.mjs → chunk-M52YLLWU.mjs} +13 -13
  56. package/dist/lib/node-esm/chunk-M52YLLWU.mjs.map +7 -0
  57. package/dist/lib/node-esm/chunk-PK76XIMN.mjs +1772 -0
  58. package/dist/lib/node-esm/chunk-PK76XIMN.mjs.map +7 -0
  59. package/dist/lib/node-esm/{chunk-HILDMVPL.mjs → chunk-UMXU7BDG.mjs} +2 -2
  60. package/dist/lib/node-esm/chunk-UMXU7BDG.mjs.map +7 -0
  61. package/dist/lib/node-esm/chunk-Z4BXHF76.mjs +119 -0
  62. package/dist/lib/node-esm/chunk-Z4BXHF76.mjs.map +7 -0
  63. package/dist/lib/node-esm/compute-graph-registry-TOMM5AGM.mjs +23 -0
  64. package/dist/lib/node-esm/compute-graph-registry-TOMM5AGM.mjs.map +7 -0
  65. package/dist/lib/node-esm/drop-axis-XFFTKE4J.mjs +24 -0
  66. package/dist/lib/node-esm/drop-axis-XFFTKE4J.mjs.map +7 -0
  67. package/dist/lib/node-esm/index.mjs +94 -76
  68. package/dist/lib/node-esm/index.mjs.map +4 -4
  69. package/dist/lib/node-esm/insert-axis-QYN6V3NH.mjs +17 -0
  70. package/dist/lib/node-esm/insert-axis-QYN6V3NH.mjs.map +7 -0
  71. package/dist/lib/node-esm/markdown-TTSQDUPW.mjs +31 -0
  72. package/dist/lib/node-esm/markdown-TTSQDUPW.mjs.map +7 -0
  73. package/dist/lib/node-esm/meta.json +1 -1
  74. package/dist/lib/node-esm/operation-handler-G6SZSFCD.mjs +17 -0
  75. package/dist/lib/node-esm/operation-handler-G6SZSFCD.mjs.map +7 -0
  76. package/dist/lib/node-esm/operations/index.mjs +13 -0
  77. package/dist/lib/node-esm/operations/index.mjs.map +7 -0
  78. package/dist/lib/node-esm/react-surface-OVBFWYD7.mjs +55 -0
  79. package/dist/lib/node-esm/react-surface-OVBFWYD7.mjs.map +7 -0
  80. package/dist/lib/node-esm/restore-axis-WUXX5KAE.mjs +17 -0
  81. package/dist/lib/node-esm/restore-axis-WUXX5KAE.mjs.map +7 -0
  82. package/dist/lib/node-esm/scroll-to-anchor-UUXINUVP.mjs +38 -0
  83. package/dist/lib/node-esm/scroll-to-anchor-UUXINUVP.mjs.map +7 -0
  84. package/dist/lib/node-esm/state-L3SAQ6V7.mjs +32 -0
  85. package/dist/lib/node-esm/state-L3SAQ6V7.mjs.map +7 -0
  86. package/dist/lib/node-esm/types/index.mjs +4 -2
  87. package/dist/lib/node-esm/undo-mappings-CQIVZKAC.mjs +36 -0
  88. package/dist/lib/node-esm/undo-mappings-CQIVZKAC.mjs.map +7 -0
  89. package/dist/types/src/SheetPlugin.d.ts +2 -1
  90. package/dist/types/src/SheetPlugin.d.ts.map +1 -1
  91. package/dist/types/src/capabilities/anchor-sort/anchor-sort.d.ts +6 -0
  92. package/dist/types/src/capabilities/anchor-sort/anchor-sort.d.ts.map +1 -0
  93. package/dist/types/src/capabilities/anchor-sort/index.d.ts +3 -0
  94. package/dist/types/src/capabilities/anchor-sort/index.d.ts.map +1 -0
  95. package/dist/types/src/capabilities/compute-graph-registry/compute-graph-registry.d.ts +5 -0
  96. package/dist/types/src/capabilities/compute-graph-registry/compute-graph-registry.d.ts.map +1 -0
  97. package/dist/types/src/capabilities/compute-graph-registry/index.d.ts +3 -0
  98. package/dist/types/src/capabilities/compute-graph-registry/index.d.ts.map +1 -0
  99. package/dist/types/src/capabilities/index.d.ts +7 -6
  100. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  101. package/dist/types/src/capabilities/markdown/index.d.ts +3 -0
  102. package/dist/types/src/capabilities/markdown/index.d.ts.map +1 -0
  103. package/dist/types/src/capabilities/markdown/markdown.d.ts +5 -0
  104. package/dist/types/src/capabilities/markdown/markdown.d.ts.map +1 -0
  105. package/dist/types/src/capabilities/operation-handler/index.d.ts +4 -0
  106. package/dist/types/src/capabilities/operation-handler/index.d.ts.map +1 -0
  107. package/dist/types/src/capabilities/operation-handler/operation-handler.d.ts +6 -0
  108. package/dist/types/src/capabilities/operation-handler/operation-handler.d.ts.map +1 -0
  109. package/dist/types/src/capabilities/react-surface/index.d.ts +3 -0
  110. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -0
  111. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +5 -0
  112. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -0
  113. package/dist/types/src/capabilities/state/index.d.ts +3 -0
  114. package/dist/types/src/capabilities/state/index.d.ts.map +1 -0
  115. package/dist/types/src/capabilities/state/state.d.ts +6 -0
  116. package/dist/types/src/capabilities/state/state.d.ts.map +1 -0
  117. package/dist/types/src/capabilities/undo-mappings/index.d.ts +3 -0
  118. package/dist/types/src/capabilities/undo-mappings/index.d.ts.map +1 -0
  119. package/dist/types/src/capabilities/undo-mappings/undo-mappings.d.ts +5 -0
  120. package/dist/types/src/capabilities/undo-mappings/undo-mappings.d.ts.map +1 -0
  121. package/dist/types/src/components/ComputeGraph/compute-graph.stories.d.ts.map +1 -1
  122. package/dist/types/src/components/Sheet/Sheet.d.ts +29 -0
  123. package/dist/types/src/components/Sheet/Sheet.d.ts.map +1 -0
  124. package/dist/types/src/components/Sheet/index.d.ts +2 -0
  125. package/dist/types/src/components/Sheet/index.d.ts.map +1 -0
  126. package/dist/types/src/components/{GridSheet → SheetContent}/SheetCellEditor.stories.d.ts +1 -1
  127. package/dist/types/src/components/SheetContent/SheetCellEditor.stories.d.ts.map +1 -0
  128. package/dist/types/src/components/SheetContent/SheetContent.d.ts +10 -0
  129. package/dist/types/src/components/SheetContent/SheetContent.d.ts.map +1 -0
  130. package/dist/types/src/components/{GridSheet/GridSheet.stories.d.ts → SheetContent/SheetContent.stories.d.ts} +10 -2
  131. package/dist/types/src/components/SheetContent/SheetContent.stories.d.ts.map +1 -0
  132. package/dist/types/src/components/SheetContent/index.d.ts +2 -0
  133. package/dist/types/src/components/SheetContent/index.d.ts.map +1 -0
  134. package/dist/types/src/components/SheetContent/util.d.ts.map +1 -0
  135. package/dist/types/src/components/{SheetContext/SheetContext.d.ts → SheetRoot/SheetRoot.d.ts} +6 -4
  136. package/dist/types/src/components/SheetRoot/SheetRoot.d.ts.map +1 -0
  137. package/dist/types/src/components/SheetRoot/index.d.ts +2 -0
  138. package/dist/types/src/components/SheetRoot/index.d.ts.map +1 -0
  139. package/dist/types/src/components/SheetStatusbar/SheetStatusbar.d.ts +10 -0
  140. package/dist/types/src/components/SheetStatusbar/SheetStatusbar.d.ts.map +1 -0
  141. package/dist/types/src/components/SheetStatusbar/index.d.ts +2 -0
  142. package/dist/types/src/components/SheetStatusbar/index.d.ts.map +1 -0
  143. package/dist/types/src/components/SheetToolbar/SheetToolbar.d.ts +9 -5
  144. package/dist/types/src/components/SheetToolbar/SheetToolbar.d.ts.map +1 -1
  145. package/dist/types/src/components/SheetToolbar/SheetToolbar.stories.d.ts +4 -0
  146. package/dist/types/src/components/SheetToolbar/SheetToolbar.stories.d.ts.map +1 -1
  147. package/dist/types/src/components/SheetToolbar/align.d.ts +12 -19
  148. package/dist/types/src/components/SheetToolbar/align.d.ts.map +1 -1
  149. package/dist/types/src/components/SheetToolbar/style.d.ts +12 -18
  150. package/dist/types/src/components/SheetToolbar/style.d.ts.map +1 -1
  151. package/dist/types/src/components/SheetToolbar/useToolbarState.d.ts +14 -1
  152. package/dist/types/src/components/SheetToolbar/useToolbarState.d.ts.map +1 -1
  153. package/dist/types/src/components/index.d.ts +1 -4
  154. package/dist/types/src/components/index.d.ts.map +1 -1
  155. package/dist/types/src/{components → containers}/RangeList/RangeList.d.ts.map +1 -1
  156. package/dist/types/src/containers/RangeList/index.d.ts +3 -0
  157. package/dist/types/src/containers/RangeList/index.d.ts.map +1 -0
  158. package/dist/types/src/containers/SheetContainer/SheetContainer.d.ts +12 -0
  159. package/dist/types/src/containers/SheetContainer/SheetContainer.d.ts.map +1 -0
  160. package/dist/types/src/{components → containers}/SheetContainer/SheetContainer.stories.d.ts +3 -1
  161. package/dist/types/src/containers/SheetContainer/SheetContainer.stories.d.ts.map +1 -0
  162. package/dist/types/src/{components → containers}/SheetContainer/index.d.ts.map +1 -1
  163. package/dist/types/src/containers/index.d.ts +4 -0
  164. package/dist/types/src/containers/index.d.ts.map +1 -0
  165. package/dist/types/src/extensions/compute.stories.d.ts.map +1 -1
  166. package/dist/types/src/extensions/editor/sheet-extension.d.ts.map +1 -1
  167. package/dist/types/src/index.d.ts +1 -1
  168. package/dist/types/src/index.d.ts.map +1 -1
  169. package/dist/types/src/integrations/thread-ranges.d.ts +0 -2
  170. package/dist/types/src/integrations/thread-ranges.d.ts.map +1 -1
  171. package/dist/types/src/meta.d.ts +2 -2
  172. package/dist/types/src/meta.d.ts.map +1 -1
  173. package/dist/types/src/model/sheet-model.d.ts +2 -2
  174. package/dist/types/src/model/sheet-model.d.ts.map +1 -1
  175. package/dist/types/src/operations/definitions.d.ts +45 -0
  176. package/dist/types/src/operations/definitions.d.ts.map +1 -0
  177. package/dist/types/src/operations/drop-axis.d.ts +5 -0
  178. package/dist/types/src/operations/drop-axis.d.ts.map +1 -0
  179. package/dist/types/src/operations/index.d.ts +4 -0
  180. package/dist/types/src/operations/index.d.ts.map +1 -0
  181. package/dist/types/src/operations/insert-axis.d.ts +5 -0
  182. package/dist/types/src/operations/insert-axis.d.ts.map +1 -0
  183. package/dist/types/src/operations/restore-axis.d.ts +5 -0
  184. package/dist/types/src/operations/restore-axis.d.ts.map +1 -0
  185. package/dist/types/src/operations/scroll-to-anchor.d.ts +5 -0
  186. package/dist/types/src/operations/scroll-to-anchor.d.ts.map +1 -0
  187. package/dist/types/src/serializer.d.ts.map +1 -1
  188. package/dist/types/src/testing/testing.d.ts +15 -15
  189. package/dist/types/src/translations.d.ts +2 -0
  190. package/dist/types/src/translations.d.ts.map +1 -1
  191. package/dist/types/src/types/Sheet.d.ts +41 -35
  192. package/dist/types/src/types/Sheet.d.ts.map +1 -1
  193. package/dist/types/src/types/capabilities.d.ts +18 -0
  194. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  195. package/dist/types/src/types/index.d.ts +1 -0
  196. package/dist/types/src/types/index.d.ts.map +1 -1
  197. package/dist/types/src/types/types.d.ts +2 -68
  198. package/dist/types/src/types/types.d.ts.map +1 -1
  199. package/dist/types/src/types/util.d.ts +2 -1
  200. package/dist/types/src/types/util.d.ts.map +1 -1
  201. package/dist/types/tsconfig.tsbuildinfo +1 -1
  202. package/package.json +83 -68
  203. package/src/SheetPlugin.tsx +59 -64
  204. package/src/capabilities/anchor-sort/anchor-sort.ts +27 -0
  205. package/src/capabilities/anchor-sort/index.ts +7 -0
  206. package/src/capabilities/compute-graph-registry/compute-graph-registry.ts +27 -0
  207. package/src/capabilities/compute-graph-registry/index.ts +7 -0
  208. package/src/capabilities/index.ts +7 -9
  209. package/src/capabilities/markdown/index.ts +7 -0
  210. package/src/capabilities/markdown/markdown.ts +30 -0
  211. package/src/capabilities/operation-handler/index.ts +11 -0
  212. package/src/capabilities/operation-handler/operation-handler.ts +16 -0
  213. package/src/capabilities/react-surface/index.ts +7 -0
  214. package/src/capabilities/react-surface/react-surface.tsx +49 -0
  215. package/src/capabilities/state/index.ts +7 -0
  216. package/src/capabilities/state/state.ts +29 -0
  217. package/src/capabilities/undo-mappings/index.ts +7 -0
  218. package/src/capabilities/undo-mappings/undo-mappings.ts +30 -0
  219. package/src/components/ComputeGraph/compute-graph.stories.tsx +11 -6
  220. package/src/components/Sheet/Sheet.tsx +20 -0
  221. package/src/components/Sheet/index.ts +5 -0
  222. package/src/components/{GridSheet → SheetContent}/SheetCellEditor.stories.tsx +9 -6
  223. package/src/components/{GridSheet/GridSheet.stories.tsx → SheetContent/SheetContent.stories.tsx} +14 -13
  224. package/src/components/{GridSheet/GridSheet.tsx → SheetContent/SheetContent.tsx} +62 -44
  225. package/src/components/{RangeList → SheetContent}/index.ts +1 -1
  226. package/src/components/{GridSheet → SheetContent}/util.ts +5 -5
  227. package/src/components/{SheetContext/SheetContext.tsx → SheetRoot/SheetRoot.tsx} +47 -40
  228. package/src/components/{GridSheet → SheetRoot}/index.ts +1 -1
  229. package/src/components/{FunctionEditor/FunctionEditor.tsx → SheetStatusbar/SheetStatusbar.tsx} +18 -6
  230. package/src/components/{FunctionEditor → SheetStatusbar}/index.ts +1 -1
  231. package/src/components/SheetToolbar/SheetToolbar.stories.tsx +4 -4
  232. package/src/components/SheetToolbar/SheetToolbar.tsx +45 -37
  233. package/src/components/SheetToolbar/align.ts +44 -19
  234. package/src/components/SheetToolbar/style.ts +48 -18
  235. package/src/components/SheetToolbar/useToolbarState.ts +22 -5
  236. package/src/components/index.ts +1 -7
  237. package/src/{components → containers}/RangeList/RangeList.tsx +12 -8
  238. package/src/containers/RangeList/index.ts +7 -0
  239. package/src/containers/SheetContainer/SheetContainer.stories.tsx +109 -0
  240. package/src/containers/SheetContainer/SheetContainer.tsx +57 -0
  241. package/src/{components → containers}/SheetContainer/index.ts +1 -1
  242. package/src/containers/index.ts +8 -0
  243. package/src/extensions/compute.stories.tsx +26 -16
  244. package/src/extensions/compute.ts +1 -1
  245. package/src/extensions/editor/sheet-extension.ts +16 -13
  246. package/src/index.ts +1 -1
  247. package/src/integrations/thread-ranges.ts +16 -53
  248. package/src/meta.ts +3 -3
  249. package/src/model/sheet-model.test.ts +2 -2
  250. package/src/model/sheet-model.ts +77 -45
  251. package/src/operations/definitions.ts +73 -0
  252. package/src/operations/drop-axis.ts +26 -0
  253. package/src/operations/index.ts +14 -0
  254. package/src/operations/insert-axis.ts +19 -0
  255. package/src/operations/restore-axis.ts +19 -0
  256. package/src/operations/scroll-to-anchor.ts +31 -0
  257. package/src/playwright/playwright.config.ts +1 -1
  258. package/src/playwright/sheet.spec.ts +2 -1
  259. package/src/sanity.test.ts +6 -3
  260. package/src/serializer.ts +1 -1
  261. package/src/translations.ts +2 -0
  262. package/src/types/Sheet.ts +31 -31
  263. package/src/types/capabilities.ts +26 -0
  264. package/src/types/index.ts +1 -0
  265. package/src/types/sheet-range-types.ts +3 -3
  266. package/src/types/types.ts +4 -40
  267. package/src/types/util.ts +2 -1
  268. package/dist/lib/browser/SheetContainer-66BNB3XG.mjs +0 -349
  269. package/dist/lib/browser/SheetContainer-66BNB3XG.mjs.map +0 -7
  270. package/dist/lib/browser/anchor-sort-FCQ5OZZK.mjs.map +0 -7
  271. package/dist/lib/browser/chunk-73AV3NH6.mjs +0 -15
  272. package/dist/lib/browser/chunk-73AV3NH6.mjs.map +0 -7
  273. package/dist/lib/browser/chunk-7VEWYJJN.mjs.map +0 -7
  274. package/dist/lib/browser/chunk-DVJ3QW3F.mjs +0 -907
  275. package/dist/lib/browser/chunk-DVJ3QW3F.mjs.map +0 -7
  276. package/dist/lib/browser/chunk-FWFAAGXL.mjs.map +0 -7
  277. package/dist/lib/browser/chunk-OU5KTWY3.mjs +0 -852
  278. package/dist/lib/browser/chunk-OU5KTWY3.mjs.map +0 -7
  279. package/dist/lib/browser/compute-graph-registry-AP5RA7W3.mjs +0 -21
  280. package/dist/lib/browser/compute-graph-registry-AP5RA7W3.mjs.map +0 -7
  281. package/dist/lib/browser/intent-resolver-66OAYVQF.mjs +0 -56
  282. package/dist/lib/browser/intent-resolver-66OAYVQF.mjs.map +0 -7
  283. package/dist/lib/browser/markdown-B6VKYY2S.mjs +0 -26
  284. package/dist/lib/browser/markdown-B6VKYY2S.mjs.map +0 -7
  285. package/dist/lib/browser/react-surface-5GYLVSMR.mjs +0 -54
  286. package/dist/lib/browser/react-surface-5GYLVSMR.mjs.map +0 -7
  287. package/dist/lib/node-esm/SheetContainer-NWEQETAY.mjs +0 -350
  288. package/dist/lib/node-esm/SheetContainer-NWEQETAY.mjs.map +0 -7
  289. package/dist/lib/node-esm/anchor-sort-ZE7IS7SH.mjs.map +0 -7
  290. package/dist/lib/node-esm/chunk-44YTKTMP.mjs +0 -16
  291. package/dist/lib/node-esm/chunk-44YTKTMP.mjs.map +0 -7
  292. package/dist/lib/node-esm/chunk-4H2EHVWE.mjs +0 -908
  293. package/dist/lib/node-esm/chunk-4H2EHVWE.mjs.map +0 -7
  294. package/dist/lib/node-esm/chunk-4MT3JJU2.mjs +0 -853
  295. package/dist/lib/node-esm/chunk-4MT3JJU2.mjs.map +0 -7
  296. package/dist/lib/node-esm/chunk-4QV4AGWK.mjs.map +0 -7
  297. package/dist/lib/node-esm/chunk-HILDMVPL.mjs.map +0 -7
  298. package/dist/lib/node-esm/compute-graph-registry-UMQ5UYCL.mjs +0 -22
  299. package/dist/lib/node-esm/compute-graph-registry-UMQ5UYCL.mjs.map +0 -7
  300. package/dist/lib/node-esm/intent-resolver-VNKIMQQT.mjs +0 -57
  301. package/dist/lib/node-esm/intent-resolver-VNKIMQQT.mjs.map +0 -7
  302. package/dist/lib/node-esm/markdown-VKY7HXU2.mjs +0 -27
  303. package/dist/lib/node-esm/markdown-VKY7HXU2.mjs.map +0 -7
  304. package/dist/lib/node-esm/react-surface-RK32YZWR.mjs +0 -55
  305. package/dist/lib/node-esm/react-surface-RK32YZWR.mjs.map +0 -7
  306. package/dist/types/src/capabilities/anchor-sort.d.ts +0 -4
  307. package/dist/types/src/capabilities/anchor-sort.d.ts.map +0 -1
  308. package/dist/types/src/capabilities/capabilities.d.ts +0 -5
  309. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  310. package/dist/types/src/capabilities/compute-graph-registry.d.ts +0 -4
  311. package/dist/types/src/capabilities/compute-graph-registry.d.ts.map +0 -1
  312. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  313. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  314. package/dist/types/src/capabilities/markdown.d.ts +0 -4
  315. package/dist/types/src/capabilities/markdown.d.ts.map +0 -1
  316. package/dist/types/src/capabilities/react-surface.d.ts +0 -4
  317. package/dist/types/src/capabilities/react-surface.d.ts.map +0 -1
  318. package/dist/types/src/components/FunctionEditor/FunctionEditor.d.ts +0 -3
  319. package/dist/types/src/components/FunctionEditor/FunctionEditor.d.ts.map +0 -1
  320. package/dist/types/src/components/FunctionEditor/index.d.ts +0 -2
  321. package/dist/types/src/components/FunctionEditor/index.d.ts.map +0 -1
  322. package/dist/types/src/components/GridSheet/GridSheet.d.ts +0 -3
  323. package/dist/types/src/components/GridSheet/GridSheet.d.ts.map +0 -1
  324. package/dist/types/src/components/GridSheet/GridSheet.stories.d.ts.map +0 -1
  325. package/dist/types/src/components/GridSheet/SheetCellEditor.stories.d.ts.map +0 -1
  326. package/dist/types/src/components/GridSheet/index.d.ts +0 -2
  327. package/dist/types/src/components/GridSheet/index.d.ts.map +0 -1
  328. package/dist/types/src/components/GridSheet/util.d.ts.map +0 -1
  329. package/dist/types/src/components/RangeList/index.d.ts +0 -2
  330. package/dist/types/src/components/RangeList/index.d.ts.map +0 -1
  331. package/dist/types/src/components/SheetContainer/SheetContainer.d.ts +0 -11
  332. package/dist/types/src/components/SheetContainer/SheetContainer.d.ts.map +0 -1
  333. package/dist/types/src/components/SheetContainer/SheetContainer.stories.d.ts.map +0 -1
  334. package/dist/types/src/components/SheetContext/SheetContext.d.ts.map +0 -1
  335. package/dist/types/src/components/SheetContext/index.d.ts +0 -2
  336. package/dist/types/src/components/SheetContext/index.d.ts.map +0 -1
  337. package/src/capabilities/anchor-sort.ts +0 -21
  338. package/src/capabilities/capabilities.ts +0 -14
  339. package/src/capabilities/compute-graph-registry.ts +0 -23
  340. package/src/capabilities/intent-resolver.ts +0 -38
  341. package/src/capabilities/markdown.ts +0 -23
  342. package/src/capabilities/react-surface.tsx +0 -41
  343. package/src/components/SheetContainer/SheetContainer.stories.tsx +0 -93
  344. package/src/components/SheetContainer/SheetContainer.tsx +0 -41
  345. package/src/components/SheetContext/index.ts +0 -5
  346. /package/dist/types/src/components/{GridSheet → SheetContent}/util.d.ts +0 -0
  347. /package/dist/types/src/{components → containers}/RangeList/RangeList.d.ts +0 -0
  348. /package/dist/types/src/{components → containers}/SheetContainer/index.d.ts +0 -0
@@ -0,0 +1,1772 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+ import {
3
+ rangeExtension,
4
+ sheetExtension
5
+ } from "./chunk-M52YLLWU.mjs";
6
+ import {
7
+ DEFAULT_COLS,
8
+ DEFAULT_ROWS,
9
+ MAX_COLS,
10
+ MAX_ROWS,
11
+ ReadonlyException,
12
+ SheetCapabilities,
13
+ addressFromIndex,
14
+ addressToIndex,
15
+ alignKey,
16
+ cellClassNameForRange,
17
+ initialize,
18
+ insertIndices,
19
+ mapFormulaIndicesToRefs,
20
+ mapFormulaRefsToIndices,
21
+ rangeFromIndex,
22
+ rangeToIndex
23
+ } from "./chunk-J7XCAKTA.mjs";
24
+ import {
25
+ definitions_exports
26
+ } from "./chunk-Z4BXHF76.mjs";
27
+ import {
28
+ meta
29
+ } from "./chunk-UMXU7BDG.mjs";
30
+
31
+ // src/integrations/thread-ranges.ts
32
+ import { useCallback as useCallback3, useEffect as useEffect6, useMemo as useMemo4 } from "react";
33
+ import { useOperationInvoker as useOperationInvoker2 } from "@dxos/app-framework/ui";
34
+ import { companionSegment } from "@dxos/app-toolkit";
35
+ import { debounce } from "@dxos/async";
36
+ import { inRange as inRange4 } from "@dxos/compute";
37
+ import { Obj as Obj5, Relation } from "@dxos/echo";
38
+ import { DeckOperation } from "@dxos/plugin-deck/operations";
39
+ import { ThreadOperation } from "@dxos/plugin-thread/operations";
40
+ import { Filter, Query, useQuery } from "@dxos/react-client/echo";
41
+ import { AnchoredTo, Thread } from "@dxos/types";
42
+
43
+ // src/components/ComputeGraph/ComputeGraphContextProvider.tsx
44
+ import React, { createContext, useContext } from "react";
45
+ import { raise } from "@dxos/debug";
46
+ import { useAsyncState } from "@dxos/react-hooks";
47
+ var ComputeGraphContext = /* @__PURE__ */ createContext(void 0);
48
+ var ComputeGraphContextProvider = ({ registry, children }) => {
49
+ return /* @__PURE__ */ React.createElement(ComputeGraphContext.Provider, {
50
+ value: {
51
+ registry
52
+ }
53
+ }, children);
54
+ };
55
+ var useComputeGraph = (space) => {
56
+ const { registry } = useContext(ComputeGraphContext) ?? raise(new Error("Missing ComputeGraphContext"));
57
+ const [graph] = useAsyncState(async () => {
58
+ if (space) {
59
+ const graph2 = registry.getOrCreateGraph(space);
60
+ await graph2.open();
61
+ return graph2;
62
+ }
63
+ }, [
64
+ space,
65
+ registry
66
+ ]);
67
+ return graph;
68
+ };
69
+
70
+ // src/components/SheetContent/SheetContent.tsx
71
+ import React3, { useCallback as useCallback2, useEffect as useEffect3, useMemo, useRef, useState as useState4 } from "react";
72
+ import { useCapabilities, useOperationInvoker } from "@dxos/app-framework/ui";
73
+ import { rangeToA1Notation } from "@dxos/compute";
74
+ import { Obj as Obj2 } from "@dxos/echo";
75
+ import { defaultColSize, defaultRowSize } from "@dxos/lit-grid";
76
+ import { DropdownMenu, Icon, useTranslation } from "@dxos/react-ui";
77
+ import { useAttention } from "@dxos/react-ui-attention";
78
+ import { Grid as Grid2, GridCellEditor, closestCell, editorKeys, parseCellIndex } from "@dxos/react-ui-grid";
79
+ import { composable, composableProps } from "@dxos/ui-theme";
80
+
81
+ // src/components/SheetRoot/SheetRoot.tsx
82
+ import React2, { createContext as createContext2, useCallback, useContext as useContext2, useState as useState2 } from "react";
83
+ import { raise as raise2 } from "@dxos/debug";
84
+ import { Grid, useGridContext } from "@dxos/react-ui-grid";
85
+
86
+ // src/model/sheet-model.ts
87
+ import { Event } from "@dxos/async";
88
+ import { DetailedCellError, ExportedCellChange, addressFromA1Notation, addressToA1Notation, createSheetName, isFormula } from "@dxos/compute";
89
+ import { Resource } from "@dxos/context";
90
+ import { Obj } from "@dxos/echo";
91
+ import { Format, TypeEnum } from "@dxos/echo/internal";
92
+ import { invariant } from "@dxos/invariant";
93
+ import { PublicKey } from "@dxos/keys";
94
+ import { log } from "@dxos/log";
95
+ var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-sheet/src/model/sheet-model.ts";
96
+ var typeMap = {
97
+ BOOLEAN: {
98
+ type: TypeEnum.Boolean
99
+ },
100
+ NUMBER_RAW: {
101
+ type: TypeEnum.Number
102
+ },
103
+ NUMBER_PERCENT: {
104
+ type: TypeEnum.Number,
105
+ format: Format.TypeFormat.Percent
106
+ },
107
+ NUMBER_CURRENCY: {
108
+ type: TypeEnum.Number,
109
+ format: Format.TypeFormat.Currency
110
+ },
111
+ NUMBER_DATETIME: {
112
+ type: TypeEnum.String,
113
+ format: Format.TypeFormat.DateTime
114
+ },
115
+ NUMBER_DATE: {
116
+ type: TypeEnum.String,
117
+ format: Format.TypeFormat.Date
118
+ },
119
+ NUMBER_TIME: {
120
+ type: TypeEnum.String,
121
+ format: Format.TypeFormat.Time
122
+ }
123
+ };
124
+ var getTopLeft = (range) => {
125
+ const to = range.to ?? range.from;
126
+ return {
127
+ row: Math.min(range.from.row, to.row),
128
+ col: Math.min(range.from.col, to.col)
129
+ };
130
+ };
131
+ var toSimpleCellAddress = (sheet, cell) => ({
132
+ sheet,
133
+ row: cell.row,
134
+ col: cell.col
135
+ });
136
+ var toModelRange = (sheet, range) => ({
137
+ start: toSimpleCellAddress(sheet, range.from),
138
+ end: toSimpleCellAddress(sheet, range.to ?? range.from)
139
+ });
140
+ var SheetModel = class extends Resource {
141
+ _graph;
142
+ _sheet;
143
+ _options;
144
+ id = `model-${PublicKey.random().truncate()}`;
145
+ // Wraps compute node.
146
+ update = new Event();
147
+ _node;
148
+ constructor(_graph, _sheet, _options = {}) {
149
+ super(), this._graph = _graph, this._sheet = _sheet, this._options = _options;
150
+ }
151
+ get graph() {
152
+ return this._graph;
153
+ }
154
+ get sheet() {
155
+ return this._sheet;
156
+ }
157
+ get readonly() {
158
+ return this._options.readonly;
159
+ }
160
+ get bounds() {
161
+ return {
162
+ rows: this._sheet.rows.length,
163
+ columns: this._sheet.columns.length
164
+ };
165
+ }
166
+ /**
167
+ * Initialize sheet and engine.
168
+ */
169
+ async _open() {
170
+ log("initialize", {
171
+ id: this.id
172
+ }, {
173
+ F: __dxlog_file,
174
+ L: 124,
175
+ S: this,
176
+ C: (f, a) => f(...a)
177
+ });
178
+ Obj.change(this._sheet, (obj) => {
179
+ initialize(obj);
180
+ });
181
+ this._graph.update.on((event) => {
182
+ if (event.type === "functionsUpdated") {
183
+ this.reset();
184
+ }
185
+ });
186
+ this._node = this._graph.getOrCreateNode(createSheetName({
187
+ type: Obj.getTypename(this._sheet),
188
+ id: this._sheet.id
189
+ }));
190
+ await this._node.open();
191
+ const unsubscribe = this._node.update.on((event) => this.update.emit(event));
192
+ this._ctx.onDispose(unsubscribe);
193
+ this.reset();
194
+ }
195
+ /**
196
+ * Update engine.
197
+ * NOTE: This resets the undo history.
198
+ * @deprecated
199
+ */
200
+ reset() {
201
+ invariant(this._node, void 0, {
202
+ F: __dxlog_file,
203
+ L: 154,
204
+ S: this,
205
+ A: [
206
+ "this._node",
207
+ ""
208
+ ]
209
+ });
210
+ this._node.graph.hf.clearSheet(this._node.sheetId);
211
+ Object.entries(this._sheet.cells).forEach(([key, { value }]) => {
212
+ invariant(this._node, void 0, {
213
+ F: __dxlog_file,
214
+ L: 157,
215
+ S: this,
216
+ A: [
217
+ "this._node",
218
+ ""
219
+ ]
220
+ });
221
+ const { col, row } = addressFromIndex(this._sheet, key);
222
+ if (isFormula(value)) {
223
+ const binding = this._graph.mapFunctionBindingFromId(mapFormulaIndicesToRefs(this._sheet, value));
224
+ if (binding) {
225
+ value = this._graph.mapFormulaToNative(binding);
226
+ } else {
227
+ value = "";
228
+ }
229
+ }
230
+ this._node.graph.hf.setCellContents({
231
+ sheet: this._node.sheetId,
232
+ row,
233
+ col
234
+ }, value);
235
+ });
236
+ }
237
+ /**
238
+ * Recalculate formulas.
239
+ * NOTE: This resets the undo history.
240
+ * https://hyperformula.handsontable.com/guide/volatile-functions.html#volatile-actions
241
+ * @deprecated
242
+ */
243
+ // TODO(burdon): Remove.
244
+ recalculate() {
245
+ this._node?.graph.hf.rebuildAndRecalculate();
246
+ }
247
+ insertRows(i, n = 1) {
248
+ let idx = [];
249
+ Obj.change(this._sheet, (obj) => {
250
+ idx = insertIndices(obj.rows, i, n, MAX_ROWS);
251
+ });
252
+ this.reset();
253
+ return idx;
254
+ }
255
+ insertColumns(i, n = 1) {
256
+ let idx = [];
257
+ Obj.change(this._sheet, (obj) => {
258
+ idx = insertIndices(obj.columns, i, n, MAX_COLS);
259
+ });
260
+ this.reset();
261
+ return idx;
262
+ }
263
+ dropRow(rowIndex) {
264
+ const range = {
265
+ from: addressFromIndex(this._sheet, `${this._sheet.columns[0]}@${rowIndex}`),
266
+ to: addressFromIndex(this._sheet, `${this._sheet.columns[this._sheet.columns.length - 1]}@${rowIndex}`)
267
+ };
268
+ const values = this.getCellValues(range).flat();
269
+ const index = this._sheet.rows.indexOf(rowIndex);
270
+ this.clear(range);
271
+ Obj.change(this._sheet, (obj) => {
272
+ obj.rows.splice(index, 1);
273
+ delete obj.rowMeta[rowIndex];
274
+ });
275
+ this.reset();
276
+ return {
277
+ axis: "row",
278
+ index,
279
+ axisIndex: rowIndex,
280
+ axisMeta: this._sheet.rowMeta[rowIndex],
281
+ values
282
+ };
283
+ }
284
+ dropColumn(colIndex) {
285
+ const range = {
286
+ from: addressFromIndex(this._sheet, `${colIndex}@${this._sheet.rows[0]}`),
287
+ to: addressFromIndex(this._sheet, `${colIndex}@${this._sheet.rows[this._sheet.rows.length - 1]}`)
288
+ };
289
+ const values = this.getCellValues(range).flat();
290
+ const index = this._sheet.columns.indexOf(colIndex);
291
+ this.clear(range);
292
+ Obj.change(this._sheet, (obj) => {
293
+ obj.columns.splice(index, 1);
294
+ delete obj.columnMeta[colIndex];
295
+ });
296
+ this.reset();
297
+ return {
298
+ axis: "col",
299
+ index,
300
+ axisIndex: colIndex,
301
+ axisMeta: this._sheet.rowMeta[colIndex],
302
+ values
303
+ };
304
+ }
305
+ restoreRow({ index, axisIndex, axisMeta, values }) {
306
+ Obj.change(this._sheet, (obj) => {
307
+ obj.rows.splice(index, 0, axisIndex);
308
+ values.forEach((value, col) => {
309
+ if (value) {
310
+ obj.cells[`${obj.columns[col]}@${axisIndex}`] = {
311
+ value
312
+ };
313
+ }
314
+ });
315
+ if (axisMeta) {
316
+ obj.rowMeta[axisIndex] = axisMeta;
317
+ }
318
+ });
319
+ this.reset();
320
+ }
321
+ restoreColumn({ index, axisIndex, axisMeta, values }) {
322
+ Obj.change(this._sheet, (obj) => {
323
+ obj.columns.splice(index, 0, axisIndex);
324
+ values.forEach((value, row) => {
325
+ if (value) {
326
+ obj.cells[`${axisIndex}@${obj.rows[row]}`] = {
327
+ value
328
+ };
329
+ }
330
+ });
331
+ if (axisMeta) {
332
+ obj.columnMeta[axisIndex] = axisMeta;
333
+ }
334
+ });
335
+ this.reset();
336
+ }
337
+ //
338
+ // Undoable actions.
339
+ // TODO(burdon): Group undoable methods; consistently update hf/sheet.
340
+ //
341
+ /**
342
+ * Clear range of values.
343
+ */
344
+ clear(range) {
345
+ invariant(this._node, void 0, {
346
+ F: __dxlog_file,
347
+ L: 276,
348
+ S: this,
349
+ A: [
350
+ "this._node",
351
+ ""
352
+ ]
353
+ });
354
+ const topLeft = getTopLeft(range);
355
+ const values = this._iterRange(range, () => null);
356
+ this._node.graph.hf.setCellContents(toSimpleCellAddress(this._node.sheetId, topLeft), values);
357
+ Obj.change(this._sheet, (obj) => {
358
+ this._iterRange(range, (cell) => {
359
+ const idx = addressToIndex(this._sheet, cell);
360
+ delete obj.cells[idx];
361
+ });
362
+ });
363
+ }
364
+ cut(range) {
365
+ invariant(this._node, void 0, {
366
+ F: __dxlog_file,
367
+ L: 289,
368
+ S: this,
369
+ A: [
370
+ "this._node",
371
+ ""
372
+ ]
373
+ });
374
+ this._node.graph.hf.cut(toModelRange(this._node.sheetId, range));
375
+ Obj.change(this._sheet, (obj) => {
376
+ this._iterRange(range, (cell) => {
377
+ const idx = addressToIndex(this._sheet, cell);
378
+ delete obj.cells[idx];
379
+ });
380
+ });
381
+ }
382
+ copy(range) {
383
+ invariant(this._node, void 0, {
384
+ F: __dxlog_file,
385
+ L: 300,
386
+ S: this,
387
+ A: [
388
+ "this._node",
389
+ ""
390
+ ]
391
+ });
392
+ this._node.graph.hf.copy(toModelRange(this._node.sheetId, range));
393
+ }
394
+ paste(cell) {
395
+ invariant(this._node, void 0, {
396
+ F: __dxlog_file,
397
+ L: 305,
398
+ S: this,
399
+ A: [
400
+ "this._node",
401
+ ""
402
+ ]
403
+ });
404
+ if (!this._node.graph.hf.isClipboardEmpty()) {
405
+ const changes = this._node.graph.hf.paste(toSimpleCellAddress(this._node.sheetId, cell));
406
+ Obj.change(this._sheet, (obj) => {
407
+ for (const change of changes) {
408
+ if (change instanceof ExportedCellChange) {
409
+ const { address, newValue } = change;
410
+ const idx = addressToIndex(this._sheet, {
411
+ row: address.row,
412
+ col: address.col
413
+ });
414
+ obj.cells[idx] = {
415
+ value: newValue
416
+ };
417
+ }
418
+ }
419
+ });
420
+ }
421
+ }
422
+ // TODO(burdon): Display undo/redo state.
423
+ undo() {
424
+ invariant(this._node, void 0, {
425
+ F: __dxlog_file,
426
+ L: 322,
427
+ S: this,
428
+ A: [
429
+ "this._node",
430
+ ""
431
+ ]
432
+ });
433
+ if (this._node.graph.hf.isThereSomethingToUndo()) {
434
+ this._node.graph.hf.undo();
435
+ }
436
+ }
437
+ redo() {
438
+ invariant(this._node, void 0, {
439
+ F: __dxlog_file,
440
+ L: 330,
441
+ S: this,
442
+ A: [
443
+ "this._node",
444
+ ""
445
+ ]
446
+ });
447
+ if (this._node.graph.hf.isThereSomethingToRedo()) {
448
+ this._node.graph.hf.redo();
449
+ }
450
+ }
451
+ /**
452
+ * Get value from sheet.
453
+ */
454
+ getCellValue(cell) {
455
+ const idx = addressToIndex(this._sheet, cell);
456
+ return this._sheet.cells[idx]?.value ?? null;
457
+ }
458
+ /**
459
+ * Get value as a string for editing.
460
+ */
461
+ getCellText(cell) {
462
+ const value = this.getCellValue(cell);
463
+ if (value == null) {
464
+ return void 0;
465
+ }
466
+ if (isFormula(value)) {
467
+ return this._graph.mapFunctionBindingFromId(mapFormulaIndicesToRefs(this._sheet, value));
468
+ } else {
469
+ return String(value);
470
+ }
471
+ }
472
+ /**
473
+ * Get array of raw values from sheet.
474
+ */
475
+ getCellValues(range) {
476
+ return this._iterRange(range, (cell) => this.getCellValue(cell));
477
+ }
478
+ /**
479
+ * Gets the regular or computed value from the engine.
480
+ */
481
+ getValue(cell) {
482
+ invariant(this._node, void 0, {
483
+ F: __dxlog_file,
484
+ L: 373,
485
+ S: this,
486
+ A: [
487
+ "this._node",
488
+ ""
489
+ ]
490
+ });
491
+ const address = toSimpleCellAddress(this._node.sheetId, cell);
492
+ const value = this._node.graph.hf.getCellValue(address);
493
+ if (value instanceof DetailedCellError) {
494
+ log.warn("cell error", {
495
+ cell,
496
+ error: value
497
+ }, {
498
+ F: __dxlog_file,
499
+ L: 378,
500
+ S: this,
501
+ C: (f, a) => f(...a)
502
+ });
503
+ return value.toString();
504
+ }
505
+ return value;
506
+ }
507
+ /**
508
+ * Get value type.
509
+ */
510
+ getValueDescription(cell) {
511
+ invariant(this._node, void 0, {
512
+ F: __dxlog_file,
513
+ L: 389,
514
+ S: this,
515
+ A: [
516
+ "this._node",
517
+ ""
518
+ ]
519
+ });
520
+ const addr = toSimpleCellAddress(this._node.sheetId, cell);
521
+ const type = this._node.graph.hf.getCellValueDetailedType(addr);
522
+ return typeMap[type];
523
+ }
524
+ /**
525
+ * Sets the value, updating the sheet and engine.
526
+ */
527
+ setValue(cell, value) {
528
+ invariant(this._node, void 0, {
529
+ F: __dxlog_file,
530
+ L: 399,
531
+ S: this,
532
+ A: [
533
+ "this._node",
534
+ ""
535
+ ]
536
+ });
537
+ if (this._options.readonly) {
538
+ throw new ReadonlyException();
539
+ }
540
+ let refresh = false;
541
+ if (cell.row >= this._sheet.rows.length) {
542
+ Obj.change(this._sheet, (obj) => {
543
+ insertIndices(obj.rows, cell.row, 1, MAX_ROWS);
544
+ });
545
+ refresh = true;
546
+ }
547
+ if (cell.col >= this._sheet.columns.length) {
548
+ Obj.change(this._sheet, (obj) => {
549
+ insertIndices(obj.columns, cell.col, 1, MAX_COLS);
550
+ });
551
+ refresh = true;
552
+ }
553
+ if (refresh) {
554
+ this.reset();
555
+ }
556
+ this._node.graph.hf.setCellContents({
557
+ sheet: this._node.sheetId,
558
+ row: cell.row,
559
+ col: cell.col
560
+ }, [
561
+ [
562
+ isFormula(value) ? this._graph.mapFormulaToNative(value) : value
563
+ ]
564
+ ]);
565
+ const idx = addressToIndex(this._sheet, cell);
566
+ if (value === void 0 || value === null) {
567
+ Obj.change(this._sheet, (obj) => {
568
+ delete obj.cells[idx];
569
+ });
570
+ } else {
571
+ if (isFormula(value)) {
572
+ value = this._graph.mapFunctionBindingToId(mapFormulaRefsToIndices(this._sheet, value));
573
+ }
574
+ Obj.change(this._sheet, (obj) => {
575
+ obj.cells[idx] = {
576
+ value
577
+ };
578
+ });
579
+ }
580
+ }
581
+ /**
582
+ * Sets values from a simple map.
583
+ */
584
+ setValues(values) {
585
+ Object.entries(values).forEach(([key, { value }]) => {
586
+ this.setValue(addressFromA1Notation(key), value);
587
+ });
588
+ }
589
+ /**
590
+ * Iterate range.
591
+ */
592
+ _iterRange(range, cb) {
593
+ const to = range.to ?? range.from;
594
+ const rowRange = [
595
+ Math.min(range.from.row, to.row),
596
+ Math.max(range.from.row, to.row)
597
+ ];
598
+ const columnRange = [
599
+ Math.min(range.from.col, to.col),
600
+ Math.max(range.from.col, to.col)
601
+ ];
602
+ const rows = [];
603
+ for (let row = rowRange[0]; row <= rowRange[1]; row++) {
604
+ const rowCells = [];
605
+ for (let column = columnRange[0]; column <= columnRange[1]; column++) {
606
+ const value = cb({
607
+ row,
608
+ col: column
609
+ });
610
+ if (value !== void 0) {
611
+ rowCells.push(value);
612
+ }
613
+ }
614
+ rows.push(rowCells);
615
+ }
616
+ return rows;
617
+ }
618
+ // TODO(burdon): Delete index.
619
+ _deleteIndices(indices, i, n) {
620
+ throw new Error("Not implemented");
621
+ }
622
+ // TODO(burdon): Move. Cannot use fractional without changing. Switch back to using unique IDs?
623
+ _moveIndices(indices, i, j, n) {
624
+ throw new Error("Not implemented");
625
+ }
626
+ /**
627
+ * Map from indices to A1 notation.
628
+ */
629
+ mapFormulaIndicesToRefs(formula) {
630
+ invariant(isFormula(formula), void 0, {
631
+ F: __dxlog_file,
632
+ L: 492,
633
+ S: this,
634
+ A: [
635
+ "isFormula(formula)",
636
+ ""
637
+ ]
638
+ });
639
+ return formula.replace(/([a-zA-Z0-9]+)@([a-zA-Z0-9]+)/g, (idx) => {
640
+ return addressToA1Notation(addressFromIndex(this._sheet, idx));
641
+ });
642
+ }
643
+ //
644
+ // Values
645
+ //
646
+ /**
647
+ * https://hyperformula.handsontable.com/guide/date-and-time-handling.html#example
648
+ * https://hyperformula.handsontable.com/api/interfaces/configparams.html#nulldate
649
+ * NOTE: TODAY() is number of FULL days since nullDate. It will typically be -1 days from NOW().
650
+ */
651
+ toLocalDate(num) {
652
+ const { year, month, day, hours, minutes, seconds } = this.toDateTime(num);
653
+ return new Date(year, month - 1, day, hours, minutes, seconds);
654
+ }
655
+ toDateTime(num) {
656
+ invariant(this._node, void 0, {
657
+ F: __dxlog_file,
658
+ L: 513,
659
+ S: this,
660
+ A: [
661
+ "this._node",
662
+ ""
663
+ ]
664
+ });
665
+ return this._node.graph.hf.numberToDateTime(num);
666
+ }
667
+ toDate(num) {
668
+ invariant(this._node, void 0, {
669
+ F: __dxlog_file,
670
+ L: 518,
671
+ S: this,
672
+ A: [
673
+ "this._node",
674
+ ""
675
+ ]
676
+ });
677
+ return this._node.graph.hf.numberToDate(num);
678
+ }
679
+ toTime(num) {
680
+ invariant(this._node, void 0, {
681
+ F: __dxlog_file,
682
+ L: 523,
683
+ S: this,
684
+ A: [
685
+ "this._node",
686
+ ""
687
+ ]
688
+ });
689
+ return this._node.graph.hf.numberToTime(num);
690
+ }
691
+ };
692
+
693
+ // src/model/useSheetModel.ts
694
+ import { useEffect, useState } from "react";
695
+ var useSheetModel = (graph, sheet, { readonly } = {}) => {
696
+ const [model, setModel] = useState();
697
+ useEffect(() => {
698
+ if (!graph || !sheet) {
699
+ return;
700
+ }
701
+ let model2;
702
+ const t = setTimeout(async () => {
703
+ model2 = new SheetModel(graph, sheet, {
704
+ readonly
705
+ });
706
+ await model2.open();
707
+ setModel(model2);
708
+ });
709
+ return () => {
710
+ clearTimeout(t);
711
+ void model2?.close();
712
+ };
713
+ }, [
714
+ graph,
715
+ sheet,
716
+ readonly
717
+ ]);
718
+ return model;
719
+ };
720
+
721
+ // src/components/SheetRoot/SheetRoot.tsx
722
+ var SheetContext = /* @__PURE__ */ createContext2(void 0);
723
+ var useSheetContext = () => {
724
+ return useContext2(SheetContext) ?? raise2(new Error("Missing SheetContext"));
725
+ };
726
+ var SheetRoot = ({ children, graph, sheet, attendableId, readonly, ignoreAttention, onInfo }) => {
727
+ const model = useSheetModel(graph, sheet, {
728
+ readonly
729
+ });
730
+ if (!model) {
731
+ return null;
732
+ }
733
+ return /* @__PURE__ */ React2.createElement(Grid.Root, {
734
+ id: attendableId
735
+ }, /* @__PURE__ */ React2.createElement(SheetProviderImpl, {
736
+ model,
737
+ attendableId,
738
+ onInfo,
739
+ ignoreAttention
740
+ }, children));
741
+ };
742
+ var SheetProviderImpl = ({ __gridScope, children, attendableId, ignoreAttention, model, onInfo }) => {
743
+ const { id, editing, setEditing } = useGridContext("SheetProvider", __gridScope);
744
+ const [cursor, setCursorInternal] = useState2();
745
+ const [range, setRangeInternal] = useState2();
746
+ const [cursorFallbackRange, setCursorFallbackRange] = useState2();
747
+ const [activeRefs, setActiveRefs] = useState2("");
748
+ const setCursor = useCallback((nextCursor) => {
749
+ setCursorInternal(nextCursor);
750
+ setCursorFallbackRange(range?.to ? range : nextCursor ? {
751
+ from: nextCursor,
752
+ to: nextCursor
753
+ } : void 0);
754
+ }, [
755
+ range
756
+ ]);
757
+ const setRange = useCallback((nextRange) => {
758
+ setRangeInternal(nextRange);
759
+ setCursorFallbackRange(nextRange?.to ? nextRange : cursor ? {
760
+ from: cursor,
761
+ to: cursor
762
+ } : void 0);
763
+ }, [
764
+ cursor
765
+ ]);
766
+ return /* @__PURE__ */ React2.createElement(SheetContext.Provider, {
767
+ value: {
768
+ id,
769
+ attendableId,
770
+ model,
771
+ editing,
772
+ setEditing,
773
+ cursor,
774
+ setCursor,
775
+ range,
776
+ setRange,
777
+ cursorFallbackRange,
778
+ activeRefs,
779
+ setActiveRefs,
780
+ ignoreAttention,
781
+ // TODO(burdon): Change to event.
782
+ onInfo
783
+ }
784
+ }, children);
785
+ };
786
+
787
+ // src/components/SheetContent/util.ts
788
+ import { useEffect as useEffect2, useState as useState3 } from "react";
789
+ import { inRange } from "@dxos/compute";
790
+ import { createDocAccessor } from "@dxos/echo-db";
791
+ import { cellClassesForFieldType, parseValue } from "@dxos/react-ui-form";
792
+ import { colToA1Notation, commentedClassName, rowToA1Notation } from "@dxos/react-ui-grid";
793
+ import { mx } from "@dxos/ui-theme";
794
+ var createDxGridColumns = (model) => {
795
+ return model.sheet.columns.reduce((acc, columnId, numericIndex) => {
796
+ if (model.sheet.columnMeta[columnId] && model.sheet.columnMeta[columnId].size) {
797
+ acc.grid[numericIndex] = {
798
+ size: model.sheet.columnMeta[columnId].size,
799
+ resizeable: true
800
+ };
801
+ }
802
+ return acc;
803
+ }, {
804
+ grid: {}
805
+ });
806
+ };
807
+ var createDxGridRows = (model) => {
808
+ return model.sheet.rows.reduce((acc, rowId, numericIndex) => {
809
+ if (model.sheet.rowMeta[rowId] && model.sheet.rowMeta[rowId].size) {
810
+ acc.grid[numericIndex] = {
811
+ size: model.sheet.rowMeta[rowId].size,
812
+ resizeable: true
813
+ };
814
+ }
815
+ return acc;
816
+ }, {
817
+ grid: {}
818
+ });
819
+ };
820
+ var projectCellProps = (model, col, row) => {
821
+ const address = {
822
+ col,
823
+ row
824
+ };
825
+ const rawValue = model.getValue(address);
826
+ const ranges = model.sheet.ranges?.filter(({ range }) => inRange(rangeFromIndex(model.sheet, range), address));
827
+ const threadRefs = void 0;
828
+ const description = model.getValueDescription(address);
829
+ const type = description?.type;
830
+ const format = description?.format;
831
+ const classNames = ranges?.map(cellClassNameForRange).reverse();
832
+ return {
833
+ value: parseValue({
834
+ type,
835
+ format,
836
+ value: rawValue
837
+ }),
838
+ className: mx(cellClassesForFieldType({
839
+ type,
840
+ format
841
+ }), threadRefs && commentedClassName, classNames),
842
+ dataRefs: threadRefs
843
+ };
844
+ };
845
+ var gridCellGetter = (model) => {
846
+ const cachedGridCells = {};
847
+ return (nextBounds) => {
848
+ [
849
+ ...Array(nextBounds.end.col - nextBounds.start.col)
850
+ ].forEach((_, c0) => {
851
+ return [
852
+ ...Array(nextBounds.end.row - nextBounds.start.row)
853
+ ].forEach((_2, r0) => {
854
+ const col = nextBounds.start.col + c0;
855
+ const row = nextBounds.start.row + r0;
856
+ cachedGridCells[`${col},${row}`] = projectCellProps(model, col, row);
857
+ });
858
+ });
859
+ return cachedGridCells;
860
+ };
861
+ };
862
+ var rowLabelCell = (row) => ({
863
+ value: rowToA1Notation(row),
864
+ className: "!bg-toolbar-surface text-subdued text-end pe-1",
865
+ resizeHandle: "row"
866
+ });
867
+ var colLabelCell = (col) => ({
868
+ value: colToA1Notation(col),
869
+ className: "!bg-toolbar-surface text-subdued",
870
+ resizeHandle: "col"
871
+ });
872
+ var cellGetter = (model) => {
873
+ const getGridCells = gridCellGetter(model);
874
+ return (nextBounds, plane) => {
875
+ switch (plane) {
876
+ case "grid":
877
+ return getGridCells(nextBounds);
878
+ case "fixedStartStart": {
879
+ return {
880
+ "0,0": {
881
+ className: "!bg-toolbar-surface"
882
+ }
883
+ };
884
+ }
885
+ case "frozenColsStart":
886
+ return [
887
+ ...Array(nextBounds.end.row - nextBounds.start.row)
888
+ ].reduce((acc, _, r0) => {
889
+ const r = nextBounds.start.row + r0;
890
+ acc[`0,${r}`] = rowLabelCell(r);
891
+ return acc;
892
+ }, {});
893
+ case "frozenRowsStart":
894
+ return [
895
+ ...Array(nextBounds.end.col - nextBounds.start.col)
896
+ ].reduce((acc, _, c0) => {
897
+ const c = nextBounds.start.col + c0;
898
+ acc[`${c},0`] = colLabelCell(c);
899
+ return acc;
900
+ }, {});
901
+ default:
902
+ return {};
903
+ }
904
+ };
905
+ };
906
+ var useSheetModelDxGridProps = (dxGrid, model) => {
907
+ const [columns, setColumns] = useState3(createDxGridColumns(model));
908
+ const [rows, setRows] = useState3(createDxGridRows(model));
909
+ useEffect2(() => {
910
+ const cellsAccessor = createDocAccessor(model.sheet, [
911
+ "cells"
912
+ ]);
913
+ if (dxGrid) {
914
+ dxGrid.getCells = cellGetter(model);
915
+ }
916
+ const handleCellsUpdate = () => {
917
+ dxGrid?.requestUpdate("initialCells");
918
+ };
919
+ cellsAccessor.handle.addListener("change", handleCellsUpdate);
920
+ const unsubscribe = model.graph.update.on(handleCellsUpdate);
921
+ return () => {
922
+ cellsAccessor.handle.removeListener("change", handleCellsUpdate);
923
+ unsubscribe();
924
+ };
925
+ }, [
926
+ model,
927
+ dxGrid
928
+ ]);
929
+ useEffect2(() => {
930
+ const columnMetaAccessor = createDocAccessor(model.sheet, [
931
+ "columnMeta"
932
+ ]);
933
+ const rowMetaAccessor = createDocAccessor(model.sheet, [
934
+ "rowMeta"
935
+ ]);
936
+ const handleColumnMetaUpdate = () => {
937
+ setColumns(createDxGridColumns(model));
938
+ };
939
+ const handleRowMetaUpdate = () => {
940
+ setRows(createDxGridRows(model));
941
+ };
942
+ columnMetaAccessor.handle.addListener("change", handleColumnMetaUpdate);
943
+ rowMetaAccessor.handle.addListener("change", handleRowMetaUpdate);
944
+ return () => {
945
+ columnMetaAccessor.handle.removeListener("change", handleColumnMetaUpdate);
946
+ rowMetaAccessor.handle.removeListener("change", handleRowMetaUpdate);
947
+ };
948
+ }, [
949
+ model,
950
+ dxGrid
951
+ ]);
952
+ return {
953
+ columns,
954
+ rows
955
+ };
956
+ };
957
+
958
+ // src/components/SheetContent/SheetContent.tsx
959
+ var inertPosition = {
960
+ plane: "grid",
961
+ col: 0,
962
+ row: 0
963
+ };
964
+ var initialCells = {
965
+ grid: {},
966
+ frozenColsStart: [
967
+ ...Array(64)
968
+ ].reduce((acc, _, i) => {
969
+ acc[`0,${i}`] = rowLabelCell(i);
970
+ return acc;
971
+ }, {}),
972
+ frozenRowsStart: [
973
+ ...Array(12)
974
+ ].reduce((acc, _, i) => {
975
+ acc[`${i},0`] = colLabelCell(i);
976
+ return acc;
977
+ }, {})
978
+ };
979
+ var frozen = {
980
+ frozenColsStart: 1,
981
+ frozenRowsStart: 1
982
+ };
983
+ var sheetColDefault = {
984
+ frozenColsStart: {
985
+ size: 48,
986
+ readonly: true,
987
+ focusUnfurl: false
988
+ },
989
+ grid: {
990
+ size: defaultColSize,
991
+ resizeable: true
992
+ }
993
+ };
994
+ var sheetRowDefault = {
995
+ frozenRowsStart: {
996
+ size: defaultRowSize,
997
+ readonly: true,
998
+ focusUnfurl: false
999
+ },
1000
+ grid: {
1001
+ size: defaultRowSize,
1002
+ resizeable: true
1003
+ }
1004
+ };
1005
+ var SheetContent = composable((props, forwardedRef) => {
1006
+ const { t } = useTranslation(meta.id);
1007
+ const { id, attendableId, model, editing, setCursor, setRange, cursor, cursorFallbackRange, activeRefs, setActiveRefs, ignoreAttention } = useSheetContext();
1008
+ const [dxGrid, setDxGrid] = useState4(null);
1009
+ const [extraplanarFocus, setExtraplanarFocus] = useState4(null);
1010
+ const { invokePromise } = useOperationInvoker();
1011
+ const rangeController = useRef(null);
1012
+ const { hasAttention } = useAttention(id);
1013
+ const handleFocus = useCallback2((event) => {
1014
+ if (!editing) {
1015
+ const cell = closestCell(event.target);
1016
+ if (cell) {
1017
+ if (cell.plane === "grid") {
1018
+ setCursor({
1019
+ col: cell.col,
1020
+ row: cell.row
1021
+ });
1022
+ setExtraplanarFocus(null);
1023
+ } else {
1024
+ setExtraplanarFocus(cell);
1025
+ }
1026
+ } else {
1027
+ setExtraplanarFocus(null);
1028
+ }
1029
+ }
1030
+ }, [
1031
+ editing
1032
+ ]);
1033
+ const handleClose = useCallback2((_value, event) => {
1034
+ if (event) {
1035
+ const { key, shift } = event;
1036
+ const axis = [
1037
+ "Enter",
1038
+ "ArrowUp",
1039
+ "ArrowDown"
1040
+ ].includes(key) ? "row" : [
1041
+ "Tab",
1042
+ "ArrowLeft",
1043
+ "ArrowRight"
1044
+ ].includes(key) ? "col" : void 0;
1045
+ const delta = key.startsWith("Arrow") ? [
1046
+ "ArrowUp",
1047
+ "ArrowLeft"
1048
+ ].includes(key) ? -1 : 1 : shift ? -1 : 1;
1049
+ dxGrid?.refocus(axis, delta);
1050
+ }
1051
+ }, [
1052
+ model,
1053
+ editing,
1054
+ dxGrid
1055
+ ]);
1056
+ const handleBlur = useCallback2((value) => {
1057
+ if (value !== void 0) {
1058
+ model.setValue(parseCellIndex(editing.index), value);
1059
+ }
1060
+ }, [
1061
+ model,
1062
+ editing
1063
+ ]);
1064
+ const handleAxisResize = useCallback2(({ axis, size, index: numericIndex }) => {
1065
+ Obj2.change(model.sheet, (sheet) => {
1066
+ if (axis === "row") {
1067
+ const rowId = sheet.rows[parseInt(numericIndex)];
1068
+ sheet.rowMeta[rowId] ??= {};
1069
+ sheet.rowMeta[rowId].size = size;
1070
+ } else {
1071
+ const columnId = sheet.columns[parseInt(numericIndex)];
1072
+ sheet.columnMeta[columnId] ??= {};
1073
+ sheet.columnMeta[columnId].size = size;
1074
+ }
1075
+ });
1076
+ }, [
1077
+ model
1078
+ ]);
1079
+ const handleSelect = useCallback2(({ minCol, maxCol, minRow, maxRow }) => {
1080
+ const range = {
1081
+ from: {
1082
+ col: minCol,
1083
+ row: minRow
1084
+ }
1085
+ };
1086
+ if (minCol !== maxCol || minRow !== maxRow) {
1087
+ range.to = {
1088
+ col: maxCol,
1089
+ row: maxRow
1090
+ };
1091
+ }
1092
+ if (editing) {
1093
+ rangeController.current?.setRange(rangeToA1Notation(range));
1094
+ } else {
1095
+ setRange(range.to ? range : void 0);
1096
+ }
1097
+ }, [
1098
+ editing
1099
+ ]);
1100
+ const handleWheel = useCallback2((event) => {
1101
+ if (!ignoreAttention && !hasAttention) {
1102
+ event.stopPropagation();
1103
+ }
1104
+ }, [
1105
+ hasAttention,
1106
+ ignoreAttention
1107
+ ]);
1108
+ const selectEntireAxis = useCallback2((pos) => {
1109
+ switch (pos.plane) {
1110
+ case "frozenRowsStart":
1111
+ return dxGrid?.setSelection({
1112
+ start: {
1113
+ col: pos.col,
1114
+ row: 0,
1115
+ plane: "grid"
1116
+ },
1117
+ end: {
1118
+ col: pos.col,
1119
+ row: model.sheet.rows.length - 1,
1120
+ plane: "grid"
1121
+ }
1122
+ });
1123
+ case "frozenColsStart":
1124
+ return dxGrid?.setSelection({
1125
+ start: {
1126
+ row: pos.row,
1127
+ col: 0,
1128
+ plane: "grid"
1129
+ },
1130
+ end: {
1131
+ row: pos.row,
1132
+ col: model.sheet.columns.length - 1,
1133
+ plane: "grid"
1134
+ }
1135
+ });
1136
+ }
1137
+ }, [
1138
+ dxGrid,
1139
+ model.sheet
1140
+ ]);
1141
+ const handleClick = useCallback2((event) => {
1142
+ const cell = closestCell(event.target);
1143
+ if (cell) {
1144
+ selectEntireAxis(cell);
1145
+ }
1146
+ }, [
1147
+ selectEntireAxis
1148
+ ]);
1149
+ const handleKeyDown = useCallback2((event) => {
1150
+ switch (event.key) {
1151
+ case "Backspace":
1152
+ case "Delete":
1153
+ event.preventDefault();
1154
+ return cursorFallbackRange && model.clear(cursorFallbackRange);
1155
+ case "Enter":
1156
+ case "Space":
1157
+ if (dxGrid && extraplanarFocus) {
1158
+ switch (extraplanarFocus.plane) {
1159
+ case "frozenRowsStart":
1160
+ case "frozenColsStart":
1161
+ event.preventDefault();
1162
+ return selectEntireAxis(extraplanarFocus);
1163
+ }
1164
+ }
1165
+ }
1166
+ if (event.metaKey || event.ctrlKey) {
1167
+ switch (event.key) {
1168
+ case "x":
1169
+ case "X":
1170
+ event.preventDefault();
1171
+ return cursorFallbackRange && model.cut(cursorFallbackRange);
1172
+ case "c":
1173
+ case "C":
1174
+ event.preventDefault();
1175
+ return cursorFallbackRange && model.copy(cursorFallbackRange);
1176
+ case "v":
1177
+ case "V":
1178
+ event.preventDefault();
1179
+ return cursor && model.paste(cursor);
1180
+ case "z":
1181
+ event.preventDefault();
1182
+ return event.shiftKey ? model.redo() : model.undo();
1183
+ case "Z":
1184
+ case "y":
1185
+ event.preventDefault();
1186
+ return model.redo();
1187
+ }
1188
+ }
1189
+ }, [
1190
+ cursorFallbackRange,
1191
+ model,
1192
+ cursor,
1193
+ extraplanarFocus,
1194
+ selectEntireAxis
1195
+ ]);
1196
+ const contextMenuAnchorRef = useRef(null);
1197
+ const [contextMenuOpen, setContextMenuOpen] = useState4(null);
1198
+ const contextMenuAxis = contextMenuOpen?.plane.startsWith("frozenRows") ? "col" : "row";
1199
+ const handleContextMenu = useCallback2((event) => {
1200
+ const cell = closestCell(event.target);
1201
+ if (cell && cell.plane.startsWith("frozen")) {
1202
+ event.preventDefault();
1203
+ contextMenuAnchorRef.current = event.target;
1204
+ setContextMenuOpen(cell);
1205
+ }
1206
+ }, []);
1207
+ const handleAxisMenuAction = useCallback2((operation) => {
1208
+ switch (operation) {
1209
+ case "insert-before":
1210
+ case "insert-after":
1211
+ return invokePromise(definitions_exports.InsertAxis, {
1212
+ model,
1213
+ axis: contextMenuAxis,
1214
+ index: contextMenuOpen[contextMenuAxis] + (operation === "insert-before" ? 0 : 1)
1215
+ });
1216
+ case "drop":
1217
+ return invokePromise(definitions_exports.DropAxis, {
1218
+ model,
1219
+ axis: contextMenuAxis,
1220
+ axisIndex: model.sheet[contextMenuAxis === "row" ? "rows" : "columns"][contextMenuOpen[contextMenuAxis]]
1221
+ });
1222
+ }
1223
+ }, [
1224
+ contextMenuAxis,
1225
+ contextMenuOpen,
1226
+ model,
1227
+ invokePromise
1228
+ ]);
1229
+ const { columns, rows } = useSheetModelDxGridProps(dxGrid, model);
1230
+ const extensions = useMemo(() => [
1231
+ editorKeys({
1232
+ onClose: handleClose,
1233
+ ...editing?.initialContent && {
1234
+ onNav: handleClose
1235
+ }
1236
+ }),
1237
+ sheetExtension({
1238
+ functions: model.graph.getFunctions()
1239
+ }),
1240
+ rangeExtension({
1241
+ onInit: (fn) => rangeController.current = fn,
1242
+ onStateChange: (state) => {
1243
+ if (dxGrid) {
1244
+ dxGrid.mode = typeof state.activeRange === "undefined" ? "edit" : "edit-select";
1245
+ }
1246
+ }
1247
+ })
1248
+ ], [
1249
+ model,
1250
+ handleClose,
1251
+ editing
1252
+ ]);
1253
+ const getCellContent = useCallback2((index) => {
1254
+ return model.getCellText(parseCellIndex(index));
1255
+ }, [
1256
+ model
1257
+ ]);
1258
+ const [gridInstances] = useCapabilities(SheetCapabilities.GridInstances);
1259
+ useEffect3(() => {
1260
+ if (dxGrid && gridInstances) {
1261
+ gridInstances.register(attendableId, dxGrid, setActiveRefs);
1262
+ return () => gridInstances.unregister(attendableId);
1263
+ }
1264
+ }, [
1265
+ dxGrid,
1266
+ gridInstances,
1267
+ attendableId,
1268
+ setActiveRefs
1269
+ ]);
1270
+ useSelectThreadOnCellFocus();
1271
+ return /* @__PURE__ */ React3.createElement("div", {
1272
+ ref: forwardedRef,
1273
+ ...composableProps(props, {
1274
+ role: "none",
1275
+ classNames: "relative min-h-0"
1276
+ })
1277
+ }, /* @__PURE__ */ React3.createElement(GridCellEditor, {
1278
+ getCellContent,
1279
+ extensions,
1280
+ onBlur: handleBlur
1281
+ }), /* @__PURE__ */ React3.createElement(Grid2.Content, {
1282
+ className: "[--dx-grid-base:var(--base-surface)] [&_.dx-grid]:absolute [&_.dx-grid]:inset-0",
1283
+ initialCells,
1284
+ limitColumns: DEFAULT_COLS,
1285
+ limitRows: DEFAULT_ROWS,
1286
+ columns,
1287
+ rows,
1288
+ columnDefault: sheetColDefault,
1289
+ rowDefault: sheetRowDefault,
1290
+ activeRefs,
1291
+ frozen,
1292
+ overscroll: "trap",
1293
+ onAxisResize: handleAxisResize,
1294
+ onSelect: handleSelect,
1295
+ onFocus: handleFocus,
1296
+ onWheelCapture: handleWheel,
1297
+ onKeyDown: handleKeyDown,
1298
+ onContextMenu: handleContextMenu,
1299
+ onClick: handleClick,
1300
+ ref: setDxGrid
1301
+ }), /* @__PURE__ */ React3.createElement(DropdownMenu.Root, {
1302
+ modal: false,
1303
+ open: !!contextMenuOpen,
1304
+ onOpenChange: (nextOpen) => setContextMenuOpen(nextOpen ? inertPosition : null)
1305
+ }, /* @__PURE__ */ React3.createElement(DropdownMenu.VirtualTrigger, {
1306
+ virtualRef: contextMenuAnchorRef
1307
+ }), /* @__PURE__ */ React3.createElement(DropdownMenu.Content, {
1308
+ side: contextMenuAxis === "col" ? "bottom" : "right",
1309
+ sideOffset: 4,
1310
+ collisionPadding: 8
1311
+ }, /* @__PURE__ */ React3.createElement(DropdownMenu.Viewport, null, /* @__PURE__ */ React3.createElement(DropdownMenu.Item, {
1312
+ onClick: () => handleAxisMenuAction("insert-before"),
1313
+ "data-testid": `grid.${contextMenuAxis}.insert-before`
1314
+ }, /* @__PURE__ */ React3.createElement(Icon, {
1315
+ icon: contextMenuAxis === "col" ? "ph--columns-plus-left--regular" : "ph--rows-plus-top--regular"
1316
+ }), /* @__PURE__ */ React3.createElement("span", null, t(`add ${contextMenuAxis} before label`))), /* @__PURE__ */ React3.createElement(DropdownMenu.Item, {
1317
+ onClick: () => handleAxisMenuAction("insert-after"),
1318
+ "data-testid": `grid.${contextMenuAxis}.insert-after`
1319
+ }, /* @__PURE__ */ React3.createElement(Icon, {
1320
+ icon: contextMenuAxis === "col" ? "ph--columns-plus-right--regular" : "ph--rows-plus-bottom--regular"
1321
+ }), /* @__PURE__ */ React3.createElement("span", null, t(`add ${contextMenuAxis} after label`))), /* @__PURE__ */ React3.createElement(DropdownMenu.Item, {
1322
+ onClick: () => handleAxisMenuAction("drop"),
1323
+ "data-testid": `grid.${contextMenuAxis}.drop`
1324
+ }, /* @__PURE__ */ React3.createElement(Icon, {
1325
+ icon: "ph--backspace--regular"
1326
+ }), /* @__PURE__ */ React3.createElement("span", null, t(`delete ${contextMenuAxis} label`)))), /* @__PURE__ */ React3.createElement(DropdownMenu.Arrow, null))));
1327
+ });
1328
+
1329
+ // src/components/SheetStatusbar/SheetStatusbar.tsx
1330
+ import React4 from "react";
1331
+ import { addressToA1Notation as addressToA1Notation2, isFormula as isFormula2, rangeToA1Notation as rangeToA1Notation2 } from "@dxos/compute";
1332
+ import { Icon as Icon2 } from "@dxos/react-ui";
1333
+ import { composable as composable2, composableProps as composableProps2, mx as mx2 } from "@dxos/ui-theme";
1334
+ var SheetStatusbar = composable2((props, forwardedRef) => {
1335
+ const { className, ...rest } = composableProps2(props);
1336
+ const { model, cursor, range } = useSheetContext();
1337
+ let value;
1338
+ let formula = false;
1339
+ if (cursor) {
1340
+ value = model.getCellValue(cursor);
1341
+ if (isFormula2(value)) {
1342
+ value = model.graph.mapFunctionBindingFromId(mapFormulaIndicesToRefs(model.sheet, value));
1343
+ formula = true;
1344
+ } else if (value != null) {
1345
+ value = String(value);
1346
+ }
1347
+ }
1348
+ return /* @__PURE__ */ React4.createElement("div", {
1349
+ ref: forwardedRef,
1350
+ ...rest,
1351
+ className: mx2("flex shrink-0 justify-between items-center px-4 py-1 text-sm bg-toolbar-surface border-y !border-subdued-separator", className)
1352
+ }, /* @__PURE__ */ React4.createElement("div", {
1353
+ className: "flex gap-4 items-center"
1354
+ }, /* @__PURE__ */ React4.createElement("div", {
1355
+ className: "flex w-16 items-center font-mono"
1356
+ }, range && rangeToA1Notation2(range) || cursor && addressToA1Notation2(cursor)), /* @__PURE__ */ React4.createElement("div", {
1357
+ className: "flex gap-2 items-center"
1358
+ }, /* @__PURE__ */ React4.createElement(Icon2, {
1359
+ icon: "ph--function--regular",
1360
+ classNames: [
1361
+ "text-green-text",
1362
+ formula ? "visible" : "invisible"
1363
+ ]
1364
+ }), /* @__PURE__ */ React4.createElement("span", {
1365
+ className: "font-mono"
1366
+ }, value))));
1367
+ });
1368
+
1369
+ // src/components/SheetToolbar/SheetToolbar.tsx
1370
+ import { Atom as Atom2, RegistryContext as RegistryContext4 } from "@effect-atom/atom-react";
1371
+ import React5, { useContext as useContext6, useMemo as useMemo3 } from "react";
1372
+ import { useAppGraph } from "@dxos/app-toolkit/ui";
1373
+ import { Menu, createGapSeparator, useMenuActions } from "@dxos/react-ui-menu";
1374
+ import { composable as composable3, composableProps as composableProps3 } from "@dxos/ui-theme";
1375
+
1376
+ // src/components/SheetToolbar/align.ts
1377
+ import { RegistryContext } from "@effect-atom/atom-react";
1378
+ import { useContext as useContext3, useEffect as useEffect4 } from "react";
1379
+ import { inRange as inRange2 } from "@dxos/compute";
1380
+ import { Obj as Obj3 } from "@dxos/echo";
1381
+ import { createMenuAction, createMenuItemGroup } from "@dxos/react-ui-menu";
1382
+ var aligns = {
1383
+ start: "ph--text-align-left--regular",
1384
+ center: "ph--text-align-center--regular",
1385
+ end: "ph--text-align-right--regular"
1386
+ };
1387
+ var useAlignState = (stateAtom) => {
1388
+ const registry = useContext3(RegistryContext);
1389
+ const { cursor, model } = useSheetContext();
1390
+ useEffect4(() => {
1391
+ const alignValue = cursor ? model.sheet.ranges?.findLast(({ range, key }) => key === alignKey && inRange2(rangeFromIndex(model.sheet, range), cursor))?.value : void 0;
1392
+ const prev = registry.get(stateAtom);
1393
+ registry.set(stateAtom, {
1394
+ ...prev,
1395
+ [alignKey]: alignValue
1396
+ });
1397
+ }, [
1398
+ cursor,
1399
+ model.sheet,
1400
+ registry,
1401
+ stateAtom
1402
+ ]);
1403
+ };
1404
+ var createAlignGroupAction = (value) => createMenuItemGroup("align", {
1405
+ label: [
1406
+ "align label",
1407
+ {
1408
+ ns: meta.id
1409
+ }
1410
+ ],
1411
+ variant: "toggleGroup",
1412
+ selectCardinality: "single",
1413
+ value: `${alignKey}--${value}`
1414
+ });
1415
+ var createAlignActions = ({ model, state, stateAtom, registry, cursorFallbackRange }) => Object.entries(aligns).map(([alignValue, icon]) => {
1416
+ return createMenuAction(`${alignKey}--${alignValue}`, () => {
1417
+ if (!cursorFallbackRange) {
1418
+ return;
1419
+ }
1420
+ const index = model.sheet.ranges?.findIndex((range) => range.key === alignKey && inRange2(rangeFromIndex(model.sheet, range.range), cursorFallbackRange.from)) ?? -1;
1421
+ const nextRangeEntity = {
1422
+ range: rangeToIndex(model.sheet, cursorFallbackRange),
1423
+ key: alignKey,
1424
+ value: alignValue
1425
+ };
1426
+ const currentState = registry.get(stateAtom);
1427
+ if (index < 0) {
1428
+ Obj3.change(model.sheet, (obj) => {
1429
+ obj.ranges?.push(nextRangeEntity);
1430
+ });
1431
+ registry.set(stateAtom, {
1432
+ ...currentState,
1433
+ [alignKey]: nextRangeEntity.value
1434
+ });
1435
+ } else if (model.sheet.ranges[index].value === nextRangeEntity.value) {
1436
+ Obj3.change(model.sheet, (obj) => {
1437
+ obj.ranges?.splice(index, 1);
1438
+ });
1439
+ registry.set(stateAtom, {
1440
+ ...currentState,
1441
+ [alignKey]: void 0
1442
+ });
1443
+ } else {
1444
+ Obj3.change(model.sheet, (obj) => {
1445
+ obj.ranges?.splice(index, 1, nextRangeEntity);
1446
+ });
1447
+ registry.set(stateAtom, {
1448
+ ...currentState,
1449
+ [alignKey]: nextRangeEntity.value
1450
+ });
1451
+ }
1452
+ }, {
1453
+ key: alignKey,
1454
+ value: alignValue,
1455
+ checked: state[alignKey] === alignValue,
1456
+ label: [
1457
+ `range value ${alignValue} label`,
1458
+ {
1459
+ ns: meta.id
1460
+ }
1461
+ ],
1462
+ icon,
1463
+ testId: `grid.toolbar.${alignKey}.${alignValue}`
1464
+ });
1465
+ });
1466
+ var createAlign = (context) => {
1467
+ const alignGroup = createAlignGroupAction(context.state[alignKey]);
1468
+ const alignActions = createAlignActions(context);
1469
+ return {
1470
+ nodes: [
1471
+ alignGroup,
1472
+ ...alignActions
1473
+ ],
1474
+ edges: [
1475
+ {
1476
+ source: "root",
1477
+ target: "align",
1478
+ relation: "child"
1479
+ },
1480
+ ...alignActions.map(({ id }) => ({
1481
+ source: alignGroup.id,
1482
+ target: id,
1483
+ relation: "child"
1484
+ }))
1485
+ ]
1486
+ };
1487
+ };
1488
+
1489
+ // src/components/SheetToolbar/style.ts
1490
+ import { RegistryContext as RegistryContext2 } from "@effect-atom/atom-react";
1491
+ import { useContext as useContext4, useEffect as useEffect5 } from "react";
1492
+ import { inRange as inRange3 } from "@dxos/compute";
1493
+ import { Obj as Obj4 } from "@dxos/echo";
1494
+ import { createMenuAction as createMenuAction2, createMenuItemGroup as createMenuItemGroup2 } from "@dxos/react-ui-menu";
1495
+ var styles = {
1496
+ highlight: "ph--highlighter--regular",
1497
+ softwrap: "ph--paragraph--regular"
1498
+ };
1499
+ var useStyleState = (stateAtom) => {
1500
+ const registry = useContext4(RegistryContext2);
1501
+ const { cursorFallbackRange, model } = useSheetContext();
1502
+ useEffect5(() => {
1503
+ let highlight = false;
1504
+ let softwrap = false;
1505
+ if (cursorFallbackRange && model.sheet.ranges) {
1506
+ model.sheet.ranges.filter(({ range, key }) => key === "style" && inRange3(rangeFromIndex(model.sheet, range), cursorFallbackRange.from)).forEach(({ value }) => {
1507
+ if (value === "highlight") {
1508
+ highlight = true;
1509
+ }
1510
+ if (value === "softwrap") {
1511
+ softwrap = true;
1512
+ }
1513
+ });
1514
+ }
1515
+ const prev = registry.get(stateAtom);
1516
+ registry.set(stateAtom, {
1517
+ ...prev,
1518
+ highlight,
1519
+ softwrap
1520
+ });
1521
+ }, [
1522
+ cursorFallbackRange,
1523
+ model.sheet,
1524
+ registry,
1525
+ stateAtom
1526
+ ]);
1527
+ };
1528
+ var createStyleGroup = (state) => {
1529
+ return createMenuItemGroup2("style", {
1530
+ variant: "toggleGroup",
1531
+ selectCardinality: "multiple",
1532
+ value: Object.keys(styles).filter((key) => !!state[key]).map((styleValue) => `style--${styleValue}`)
1533
+ });
1534
+ };
1535
+ var createStyleActions = ({ model, state, stateAtom, registry, cursorFallbackRange }) => Object.entries(styles).map(([styleValue, icon]) => {
1536
+ return createMenuAction2(`style--${styleValue}`, () => {
1537
+ if (!cursorFallbackRange) {
1538
+ return;
1539
+ }
1540
+ const index = model.sheet.ranges?.findIndex((range) => range.key === "style" && inRange3(rangeFromIndex(model.sheet, range.range), cursorFallbackRange.from)) ?? -1;
1541
+ const nextRangeEntity = {
1542
+ range: rangeToIndex(model.sheet, cursorFallbackRange),
1543
+ key: "style",
1544
+ value: styleValue
1545
+ };
1546
+ const currentState = registry.get(stateAtom);
1547
+ if (model.sheet.ranges.filter(({ range, key: rangeKey }) => rangeKey === "style" && inRange3(rangeFromIndex(model.sheet, range), cursorFallbackRange.from)).some(({ value: rangeValue }) => rangeValue === styleValue)) {
1548
+ if (index >= 0) {
1549
+ Obj4.change(model.sheet, (obj) => {
1550
+ obj.ranges?.splice(index, 1);
1551
+ });
1552
+ }
1553
+ registry.set(stateAtom, {
1554
+ ...currentState,
1555
+ [nextRangeEntity.value]: false
1556
+ });
1557
+ } else {
1558
+ Obj4.change(model.sheet, (obj) => {
1559
+ obj.ranges?.push(nextRangeEntity);
1560
+ });
1561
+ registry.set(stateAtom, {
1562
+ ...currentState,
1563
+ [nextRangeEntity.value]: true
1564
+ });
1565
+ }
1566
+ }, {
1567
+ key: "style",
1568
+ value: styleValue,
1569
+ icon,
1570
+ label: [
1571
+ `range value ${styleValue} label`,
1572
+ {
1573
+ ns: meta.id
1574
+ }
1575
+ ],
1576
+ checked: !!state[styleValue]
1577
+ });
1578
+ });
1579
+ var createStyle = (context) => {
1580
+ const styleGroupAction = createStyleGroup(context.state);
1581
+ const styleActions = createStyleActions(context);
1582
+ return {
1583
+ nodes: [
1584
+ styleGroupAction,
1585
+ ...styleActions
1586
+ ],
1587
+ edges: [
1588
+ {
1589
+ source: "root",
1590
+ target: "style",
1591
+ relation: "child"
1592
+ },
1593
+ ...styleActions.map(({ id }) => ({
1594
+ source: styleGroupAction.id,
1595
+ target: id,
1596
+ relation: "child"
1597
+ }))
1598
+ ]
1599
+ };
1600
+ };
1601
+
1602
+ // src/components/SheetToolbar/useToolbarState.ts
1603
+ import { Atom, RegistryContext as RegistryContext3, useAtomValue } from "@effect-atom/atom-react";
1604
+ import { useContext as useContext5, useMemo as useMemo2 } from "react";
1605
+ var useToolbarState = (initialState = {}) => {
1606
+ return useMemo2(() => Atom.make(initialState).pipe(Atom.keepAlive), []);
1607
+ };
1608
+
1609
+ // src/components/SheetToolbar/SheetToolbar.tsx
1610
+ var createToolbarActions = ({ model, stateAtom, registry, cursorFallbackRange, customActions }) => {
1611
+ return Atom2.make((get) => {
1612
+ const state = get(stateAtom);
1613
+ const context = {
1614
+ model,
1615
+ state,
1616
+ stateAtom,
1617
+ registry,
1618
+ cursorFallbackRange
1619
+ };
1620
+ const align = createAlign(context);
1621
+ const style = createStyle(context);
1622
+ const gap = createGapSeparator();
1623
+ const graph = {
1624
+ nodes: [
1625
+ ...align.nodes,
1626
+ ...style.nodes,
1627
+ ...gap.nodes
1628
+ ],
1629
+ edges: [
1630
+ ...align.edges,
1631
+ ...style.edges,
1632
+ ...gap.edges
1633
+ ]
1634
+ };
1635
+ if (customActions) {
1636
+ const custom = get(customActions);
1637
+ graph.nodes.push(...custom.nodes);
1638
+ graph.edges.push(...custom.edges);
1639
+ }
1640
+ return graph;
1641
+ });
1642
+ };
1643
+ var SheetToolbar = composable3((props, forwardedRef) => {
1644
+ const { attendableId, model, cursorFallbackRange } = useSheetContext();
1645
+ const stateAtom = useToolbarState({});
1646
+ const registry = useContext6(RegistryContext4);
1647
+ useAlignState(stateAtom);
1648
+ useStyleState(stateAtom);
1649
+ const { graph } = useAppGraph();
1650
+ const customActions = useMemo3(() => {
1651
+ return Atom2.make((get) => {
1652
+ const actions = get(graph.actions(attendableId));
1653
+ const nodes = actions.filter((action) => action.properties.disposition === "toolbar");
1654
+ return {
1655
+ nodes,
1656
+ edges: nodes.map((node) => ({
1657
+ source: "root",
1658
+ target: node.id,
1659
+ relation: "child"
1660
+ }))
1661
+ };
1662
+ });
1663
+ }, [
1664
+ graph,
1665
+ attendableId
1666
+ ]);
1667
+ const actionsCreator = useMemo3(() => createToolbarActions({
1668
+ model,
1669
+ stateAtom,
1670
+ registry,
1671
+ cursorFallbackRange,
1672
+ customActions
1673
+ }), [
1674
+ model,
1675
+ stateAtom,
1676
+ registry,
1677
+ cursorFallbackRange,
1678
+ customActions
1679
+ ]);
1680
+ const menuActions = useMenuActions(actionsCreator);
1681
+ return /* @__PURE__ */ React5.createElement(Menu.Root, {
1682
+ ...menuActions,
1683
+ attendableId
1684
+ }, /* @__PURE__ */ React5.createElement(Menu.Toolbar, {
1685
+ ...composableProps3(props),
1686
+ ref: forwardedRef
1687
+ }));
1688
+ });
1689
+ SheetToolbar.displayName = "SheetToolbar";
1690
+
1691
+ // src/components/Sheet/Sheet.tsx
1692
+ var Sheet = {
1693
+ Root: SheetRoot,
1694
+ Toolbar: SheetToolbar,
1695
+ Content: SheetContent,
1696
+ Statusbar: SheetStatusbar
1697
+ };
1698
+
1699
+ // src/integrations/thread-ranges.ts
1700
+ var parseThreadAnchorAsCellRange = (cursor) => {
1701
+ const coords = cursor.split(",");
1702
+ if (coords.length !== 4) {
1703
+ return null;
1704
+ } else {
1705
+ const [fromCol, fromRow, toCol, toRow] = coords;
1706
+ return {
1707
+ from: {
1708
+ col: parseInt(fromCol),
1709
+ row: parseInt(fromRow)
1710
+ },
1711
+ to: {
1712
+ col: parseInt(toCol),
1713
+ row: parseInt(toRow)
1714
+ }
1715
+ };
1716
+ }
1717
+ };
1718
+ var useSelectThreadOnCellFocus = () => {
1719
+ const { model, cursor } = useSheetContext();
1720
+ const { invokePromise } = useOperationInvoker2();
1721
+ const db = Obj5.getDatabase(model.sheet);
1722
+ const anchors = useQuery(db, Query.select(Filter.id(model.sheet.id)).targetOf(AnchoredTo.AnchoredTo));
1723
+ const selectClosestThread = useCallback3((cellAddress) => {
1724
+ if (!cellAddress) {
1725
+ return;
1726
+ }
1727
+ const closestThread = anchors.find((anchor) => {
1728
+ const source = Relation.getSource(anchor);
1729
+ if (anchor.anchor && Obj5.instanceOf(Thread.Thread, source)) {
1730
+ const range = parseThreadAnchorAsCellRange(anchor.anchor);
1731
+ return range ? inRange4(range, cellAddress) : false;
1732
+ } else {
1733
+ return false;
1734
+ }
1735
+ });
1736
+ if (closestThread) {
1737
+ void (async () => {
1738
+ await invokePromise(ThreadOperation.Select, {
1739
+ current: Relation.getDXN(closestThread).toString()
1740
+ });
1741
+ await invokePromise(DeckOperation.ChangeCompanion, {
1742
+ companion: companionSegment("comments")
1743
+ });
1744
+ })();
1745
+ }
1746
+ }, [
1747
+ invokePromise,
1748
+ anchors
1749
+ ]);
1750
+ const debounced = useMemo4(() => {
1751
+ return debounce((cellCoords) => requestAnimationFrame(() => selectClosestThread(cellCoords)), 50);
1752
+ }, [
1753
+ selectClosestThread
1754
+ ]);
1755
+ useEffect6(() => {
1756
+ if (!cursor) {
1757
+ return;
1758
+ }
1759
+ debounced(cursor);
1760
+ }, [
1761
+ cursor,
1762
+ debounced
1763
+ ]);
1764
+ };
1765
+
1766
+ export {
1767
+ ComputeGraphContextProvider,
1768
+ useComputeGraph,
1769
+ Sheet,
1770
+ parseThreadAnchorAsCellRange
1771
+ };
1772
+ //# sourceMappingURL=chunk-PK76XIMN.mjs.map