@dxos/plugin-sheet 0.8.4-main.ae835ea → 0.8.4-main.bc674ce

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 (215) hide show
  1. package/dist/lib/browser/SheetContainer-J72HS2FI.mjs +397 -0
  2. package/dist/lib/browser/SheetContainer-J72HS2FI.mjs.map +7 -0
  3. package/dist/lib/browser/anchor-sort-LLO7PZKF.mjs +23 -0
  4. package/dist/lib/browser/anchor-sort-LLO7PZKF.mjs.map +7 -0
  5. package/dist/lib/browser/{chunk-7VEWYJJN.mjs → chunk-IFLWVS2V.mjs} +5 -5
  6. package/dist/lib/browser/chunk-IFLWVS2V.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-KE3AKN5W.mjs +397 -0
  8. package/dist/lib/browser/chunk-KE3AKN5W.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-S27QJYTN.mjs +1473 -0
  10. package/dist/lib/browser/chunk-S27QJYTN.mjs.map +7 -0
  11. package/dist/lib/browser/compute-graph-registry-RC5L7RE4.mjs +21 -0
  12. package/dist/lib/browser/compute-graph-registry-RC5L7RE4.mjs.map +7 -0
  13. package/dist/lib/browser/index.mjs +68 -78
  14. package/dist/lib/browser/index.mjs.map +4 -4
  15. package/dist/lib/browser/markdown-D2T2DOVX.mjs +29 -0
  16. package/dist/lib/browser/markdown-D2T2DOVX.mjs.map +7 -0
  17. package/dist/lib/browser/meta.json +1 -1
  18. package/dist/lib/browser/operation-resolver-YDOW72CN.mjs +79 -0
  19. package/dist/lib/browser/operation-resolver-YDOW72CN.mjs.map +7 -0
  20. package/dist/lib/browser/{react-surface-F3VQPGDV.mjs → react-surface-JIYVFH42.mjs} +17 -19
  21. package/dist/lib/browser/react-surface-JIYVFH42.mjs.map +7 -0
  22. package/dist/lib/browser/types/index.mjs +5 -2
  23. package/dist/lib/node-esm/SheetContainer-OGSSDOZU.mjs +398 -0
  24. package/dist/lib/node-esm/SheetContainer-OGSSDOZU.mjs.map +7 -0
  25. package/dist/lib/node-esm/anchor-sort-OX5I2YOW.mjs +24 -0
  26. package/dist/lib/node-esm/anchor-sort-OX5I2YOW.mjs.map +7 -0
  27. package/dist/lib/node-esm/chunk-6J5L47IB.mjs +398 -0
  28. package/dist/lib/node-esm/chunk-6J5L47IB.mjs.map +7 -0
  29. package/dist/lib/node-esm/{chunk-4QV4AGWK.mjs → chunk-PPOYR7DK.mjs} +5 -5
  30. package/dist/lib/node-esm/chunk-PPOYR7DK.mjs.map +7 -0
  31. package/dist/lib/node-esm/chunk-Y4V6HVHO.mjs +1474 -0
  32. package/dist/lib/node-esm/chunk-Y4V6HVHO.mjs.map +7 -0
  33. package/dist/lib/node-esm/compute-graph-registry-ZGXVLVGD.mjs +22 -0
  34. package/dist/lib/node-esm/compute-graph-registry-ZGXVLVGD.mjs.map +7 -0
  35. package/dist/lib/node-esm/index.mjs +68 -78
  36. package/dist/lib/node-esm/index.mjs.map +4 -4
  37. package/dist/lib/node-esm/markdown-PTV72DLO.mjs +30 -0
  38. package/dist/lib/node-esm/markdown-PTV72DLO.mjs.map +7 -0
  39. package/dist/lib/node-esm/meta.json +1 -1
  40. package/dist/lib/node-esm/operation-resolver-Q63VQBVA.mjs +80 -0
  41. package/dist/lib/node-esm/operation-resolver-Q63VQBVA.mjs.map +7 -0
  42. package/dist/lib/node-esm/{react-surface-GGX76V2Y.mjs → react-surface-SWRZSZVR.mjs} +17 -19
  43. package/dist/lib/node-esm/react-surface-SWRZSZVR.mjs.map +7 -0
  44. package/dist/lib/node-esm/types/index.mjs +5 -2
  45. package/dist/types/src/SheetPlugin.d.ts +2 -1
  46. package/dist/types/src/SheetPlugin.d.ts.map +1 -1
  47. package/dist/types/src/capabilities/anchor-sort/anchor-sort.d.ts +5 -0
  48. package/dist/types/src/capabilities/anchor-sort/anchor-sort.d.ts.map +1 -0
  49. package/dist/types/src/capabilities/anchor-sort/index.d.ts +3 -0
  50. package/dist/types/src/capabilities/anchor-sort/index.d.ts.map +1 -0
  51. package/dist/types/src/capabilities/compute-graph-registry/compute-graph-registry.d.ts +5 -0
  52. package/dist/types/src/capabilities/compute-graph-registry/compute-graph-registry.d.ts.map +1 -0
  53. package/dist/types/src/capabilities/compute-graph-registry/index.d.ts +3 -0
  54. package/dist/types/src/capabilities/compute-graph-registry/index.d.ts.map +1 -0
  55. package/dist/types/src/capabilities/index.d.ts +5 -9
  56. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  57. package/dist/types/src/capabilities/markdown/index.d.ts +3 -0
  58. package/dist/types/src/capabilities/markdown/index.d.ts.map +1 -0
  59. package/dist/types/src/capabilities/markdown/markdown.d.ts +5 -0
  60. package/dist/types/src/capabilities/markdown/markdown.d.ts.map +1 -0
  61. package/dist/types/src/capabilities/operation-resolver/index.d.ts +3 -0
  62. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -0
  63. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +5 -0
  64. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -0
  65. package/dist/types/src/capabilities/react-surface/index.d.ts +3 -0
  66. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -0
  67. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +5 -0
  68. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -0
  69. package/dist/types/src/components/GridSheet/GridSheet.d.ts.map +1 -1
  70. package/dist/types/src/components/GridSheet/GridSheet.stories.d.ts +1 -0
  71. package/dist/types/src/components/GridSheet/GridSheet.stories.d.ts.map +1 -1
  72. package/dist/types/src/components/GridSheet/SheetCellEditor.stories.d.ts +1 -1
  73. package/dist/types/src/components/GridSheet/SheetCellEditor.stories.d.ts.map +1 -1
  74. package/dist/types/src/components/GridSheet/util.d.ts.map +1 -1
  75. package/dist/types/src/components/RangeList/RangeList.d.ts.map +1 -1
  76. package/dist/types/src/components/SheetContainer/SheetContainer.d.ts +4 -5
  77. package/dist/types/src/components/SheetContainer/SheetContainer.d.ts.map +1 -1
  78. package/dist/types/src/components/SheetContainer/SheetContainer.stories.d.ts +3 -1
  79. package/dist/types/src/components/SheetContainer/SheetContainer.stories.d.ts.map +1 -1
  80. package/dist/types/src/components/SheetToolbar/SheetToolbar.d.ts.map +1 -1
  81. package/dist/types/src/components/SheetToolbar/SheetToolbar.stories.d.ts +2 -0
  82. package/dist/types/src/components/SheetToolbar/SheetToolbar.stories.d.ts.map +1 -1
  83. package/dist/types/src/components/SheetToolbar/align.d.ts +12 -19
  84. package/dist/types/src/components/SheetToolbar/align.d.ts.map +1 -1
  85. package/dist/types/src/components/SheetToolbar/style.d.ts +12 -18
  86. package/dist/types/src/components/SheetToolbar/style.d.ts.map +1 -1
  87. package/dist/types/src/components/SheetToolbar/useToolbarState.d.ts +14 -1
  88. package/dist/types/src/components/SheetToolbar/useToolbarState.d.ts.map +1 -1
  89. package/dist/types/src/components/index.d.ts +1 -1
  90. package/dist/types/src/components/index.d.ts.map +1 -1
  91. package/dist/types/src/extensions/compute.stories.d.ts.map +1 -1
  92. package/dist/types/src/extensions/editor/sheet-extension.d.ts.map +1 -1
  93. package/dist/types/src/index.d.ts +1 -1
  94. package/dist/types/src/index.d.ts.map +1 -1
  95. package/dist/types/src/integrations/thread-ranges.d.ts.map +1 -1
  96. package/dist/types/src/meta.d.ts +2 -2
  97. package/dist/types/src/meta.d.ts.map +1 -1
  98. package/dist/types/src/model/sheet-model.d.ts +2 -2
  99. package/dist/types/src/model/sheet-model.d.ts.map +1 -1
  100. package/dist/types/src/serializer.d.ts.map +1 -1
  101. package/dist/types/src/testing/testing.d.ts +14 -14
  102. package/dist/types/src/translations.d.ts +1 -0
  103. package/dist/types/src/translations.d.ts.map +1 -1
  104. package/dist/types/src/types/Sheet.d.ts +40 -34
  105. package/dist/types/src/types/Sheet.d.ts.map +1 -1
  106. package/dist/types/src/types/capabilities.d.ts +6 -0
  107. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  108. package/dist/types/src/types/index.d.ts +1 -0
  109. package/dist/types/src/types/index.d.ts.map +1 -1
  110. package/dist/types/src/types/types.d.ts +91 -65
  111. package/dist/types/src/types/types.d.ts.map +1 -1
  112. package/dist/types/src/types/util.d.ts +2 -1
  113. package/dist/types/src/types/util.d.ts.map +1 -1
  114. package/dist/types/tsconfig.tsbuildinfo +1 -1
  115. package/package.json +75 -68
  116. package/src/SheetPlugin.tsx +40 -62
  117. package/src/capabilities/anchor-sort/anchor-sort.ts +26 -0
  118. package/src/capabilities/anchor-sort/index.ts +7 -0
  119. package/src/capabilities/compute-graph-registry/compute-graph-registry.ts +27 -0
  120. package/src/capabilities/compute-graph-registry/index.ts +7 -0
  121. package/src/capabilities/index.ts +5 -9
  122. package/src/capabilities/markdown/index.ts +7 -0
  123. package/src/capabilities/markdown/markdown.ts +30 -0
  124. package/src/capabilities/operation-resolver/index.ts +7 -0
  125. package/src/capabilities/operation-resolver/operation-resolver.ts +77 -0
  126. package/src/capabilities/react-surface/index.ts +7 -0
  127. package/src/capabilities/react-surface/react-surface.tsx +43 -0
  128. package/src/components/ComputeGraph/compute-graph.stories.tsx +1 -1
  129. package/src/components/FunctionEditor/FunctionEditor.tsx +2 -2
  130. package/src/components/GridSheet/GridSheet.stories.tsx +2 -2
  131. package/src/components/GridSheet/GridSheet.tsx +40 -30
  132. package/src/components/GridSheet/SheetCellEditor.stories.tsx +7 -4
  133. package/src/components/GridSheet/util.ts +11 -5
  134. package/src/components/RangeList/RangeList.tsx +5 -2
  135. package/src/components/SheetContainer/SheetContainer.stories.tsx +44 -21
  136. package/src/components/SheetContainer/SheetContainer.tsx +29 -21
  137. package/src/components/SheetContext/SheetContext.tsx +6 -6
  138. package/src/components/SheetToolbar/SheetToolbar.tsx +36 -22
  139. package/src/components/SheetToolbar/align.ts +41 -16
  140. package/src/components/SheetToolbar/style.ts +45 -15
  141. package/src/components/SheetToolbar/useToolbarState.ts +22 -5
  142. package/src/extensions/compute.stories.tsx +17 -8
  143. package/src/extensions/compute.ts +1 -1
  144. package/src/extensions/editor/sheet-extension.ts +7 -4
  145. package/src/index.ts +1 -1
  146. package/src/integrations/thread-ranges.ts +38 -48
  147. package/src/meta.ts +2 -2
  148. package/src/model/sheet-model.ts +75 -45
  149. package/src/playwright/playwright.config.ts +1 -1
  150. package/src/playwright/sheet.spec.ts +1 -0
  151. package/src/sanity.test.ts +1 -1
  152. package/src/serializer.ts +1 -1
  153. package/src/translations.ts +1 -0
  154. package/src/types/Sheet.ts +23 -29
  155. package/src/{capabilities → types}/capabilities.ts +2 -2
  156. package/src/types/index.ts +1 -0
  157. package/src/types/types.ts +81 -37
  158. package/src/types/util.ts +2 -1
  159. package/dist/lib/browser/SheetContainer-GTINUSNB.mjs +0 -349
  160. package/dist/lib/browser/SheetContainer-GTINUSNB.mjs.map +0 -7
  161. package/dist/lib/browser/anchor-sort-R5CB37J7.mjs +0 -24
  162. package/dist/lib/browser/anchor-sort-R5CB37J7.mjs.map +0 -7
  163. package/dist/lib/browser/chunk-73AV3NH6.mjs +0 -15
  164. package/dist/lib/browser/chunk-73AV3NH6.mjs.map +0 -7
  165. package/dist/lib/browser/chunk-7VEWYJJN.mjs.map +0 -7
  166. package/dist/lib/browser/chunk-DVJ3QW3F.mjs +0 -907
  167. package/dist/lib/browser/chunk-DVJ3QW3F.mjs.map +0 -7
  168. package/dist/lib/browser/chunk-FWFAAGXL.mjs +0 -28
  169. package/dist/lib/browser/chunk-FWFAAGXL.mjs.map +0 -7
  170. package/dist/lib/browser/chunk-LS6D4GG7.mjs +0 -850
  171. package/dist/lib/browser/chunk-LS6D4GG7.mjs.map +0 -7
  172. package/dist/lib/browser/compute-graph-registry-AP5RA7W3.mjs +0 -21
  173. package/dist/lib/browser/compute-graph-registry-AP5RA7W3.mjs.map +0 -7
  174. package/dist/lib/browser/intent-resolver-66OAYVQF.mjs +0 -56
  175. package/dist/lib/browser/intent-resolver-66OAYVQF.mjs.map +0 -7
  176. package/dist/lib/browser/markdown-B6VKYY2S.mjs +0 -26
  177. package/dist/lib/browser/markdown-B6VKYY2S.mjs.map +0 -7
  178. package/dist/lib/browser/react-surface-F3VQPGDV.mjs.map +0 -7
  179. package/dist/lib/node-esm/SheetContainer-PW4KNZME.mjs +0 -350
  180. package/dist/lib/node-esm/SheetContainer-PW4KNZME.mjs.map +0 -7
  181. package/dist/lib/node-esm/anchor-sort-HEND452H.mjs +0 -25
  182. package/dist/lib/node-esm/anchor-sort-HEND452H.mjs.map +0 -7
  183. package/dist/lib/node-esm/chunk-44YTKTMP.mjs +0 -16
  184. package/dist/lib/node-esm/chunk-44YTKTMP.mjs.map +0 -7
  185. package/dist/lib/node-esm/chunk-4H2EHVWE.mjs +0 -908
  186. package/dist/lib/node-esm/chunk-4H2EHVWE.mjs.map +0 -7
  187. package/dist/lib/node-esm/chunk-4QV4AGWK.mjs.map +0 -7
  188. package/dist/lib/node-esm/chunk-HILDMVPL.mjs +0 -29
  189. package/dist/lib/node-esm/chunk-HILDMVPL.mjs.map +0 -7
  190. package/dist/lib/node-esm/chunk-LYUIM3QG.mjs +0 -851
  191. package/dist/lib/node-esm/chunk-LYUIM3QG.mjs.map +0 -7
  192. package/dist/lib/node-esm/compute-graph-registry-UMQ5UYCL.mjs +0 -22
  193. package/dist/lib/node-esm/compute-graph-registry-UMQ5UYCL.mjs.map +0 -7
  194. package/dist/lib/node-esm/intent-resolver-VNKIMQQT.mjs +0 -57
  195. package/dist/lib/node-esm/intent-resolver-VNKIMQQT.mjs.map +0 -7
  196. package/dist/lib/node-esm/markdown-VKY7HXU2.mjs +0 -27
  197. package/dist/lib/node-esm/markdown-VKY7HXU2.mjs.map +0 -7
  198. package/dist/lib/node-esm/react-surface-GGX76V2Y.mjs.map +0 -7
  199. package/dist/types/src/capabilities/anchor-sort.d.ts +0 -6
  200. package/dist/types/src/capabilities/anchor-sort.d.ts.map +0 -1
  201. package/dist/types/src/capabilities/capabilities.d.ts +0 -5
  202. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  203. package/dist/types/src/capabilities/compute-graph-registry.d.ts +0 -4
  204. package/dist/types/src/capabilities/compute-graph-registry.d.ts.map +0 -1
  205. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  206. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  207. package/dist/types/src/capabilities/markdown.d.ts +0 -4
  208. package/dist/types/src/capabilities/markdown.d.ts.map +0 -1
  209. package/dist/types/src/capabilities/react-surface.d.ts +0 -4
  210. package/dist/types/src/capabilities/react-surface.d.ts.map +0 -1
  211. package/src/capabilities/anchor-sort.ts +0 -22
  212. package/src/capabilities/compute-graph-registry.ts +0 -23
  213. package/src/capabilities/intent-resolver.ts +0 -38
  214. package/src/capabilities/markdown.ts +0 -23
  215. package/src/capabilities/react-surface.tsx +0 -40
@@ -13,8 +13,9 @@ import React, {
13
13
  useState,
14
14
  } from 'react';
15
15
 
16
- import { createIntent, useIntentDispatcher } from '@dxos/app-framework';
16
+ import { useOperationInvoker } from '@dxos/app-framework/react';
17
17
  import { type CellRange, rangeToA1Notation } from '@dxos/compute';
18
+ import { Obj } from '@dxos/echo';
18
19
  import { defaultColSize, defaultRowSize } from '@dxos/lit-grid';
19
20
  import { DropdownMenu, Icon, useTranslation } from '@dxos/react-ui';
20
21
  import { useAttention } from '@dxos/react-ui-attention';
@@ -35,7 +36,7 @@ import {
35
36
  import { type RangeController, rangeExtension, sheetExtension } from '../../extensions';
36
37
  import { useSelectThreadOnCellFocus, useUpdateFocusedCellOnThreadSelection } from '../../integrations';
37
38
  import { meta } from '../../meta';
38
- import { DEFAULT_COLS, DEFAULT_ROWS, SheetAction } from '../../types';
39
+ import { DEFAULT_COLS, DEFAULT_ROWS, SheetOperation } from '../../types';
39
40
  import { useSheetContext } from '../SheetContext';
40
41
 
41
42
  import { colLabelCell, rowLabelCell, useSheetModelDxGridProps } from './util';
@@ -76,7 +77,7 @@ export const GridSheet = () => {
76
77
  // a reliable dependency for `useEffect` whereas `useLayoutEffect` does not guarantee the element will be defined.
77
78
  const [dxGrid, setDxGrid] = useState<DxGridElement | null>(null);
78
79
  const [extraplanarFocus, setExtraplanarFocus] = useState<DxGridPosition | null>(null);
79
- const { dispatchPromise: dispatch } = useIntentDispatcher();
80
+ const { invokePromise } = useOperationInvoker();
80
81
  const rangeController = useRef<RangeController>(null);
81
82
  const { hasAttention } = useAttention(id);
82
83
 
@@ -127,15 +128,17 @@ export const GridSheet = () => {
127
128
 
128
129
  const handleAxisResize = useCallback<NonNullable<GridContentProps['onAxisResize']>>(
129
130
  ({ axis, size, index: numericIndex }) => {
130
- if (axis === 'row') {
131
- const rowId = model.sheet.rows[parseInt(numericIndex)];
132
- model.sheet.rowMeta[rowId] ??= {};
133
- model.sheet.rowMeta[rowId].size = size;
134
- } else {
135
- const columnId = model.sheet.columns[parseInt(numericIndex)];
136
- model.sheet.columnMeta[columnId] ??= {};
137
- model.sheet.columnMeta[columnId].size = size;
138
- }
131
+ Obj.change(model.sheet, (sheet) => {
132
+ if (axis === 'row') {
133
+ const rowId = sheet.rows[parseInt(numericIndex)];
134
+ sheet.rowMeta[rowId] ??= {};
135
+ sheet.rowMeta[rowId].size = size;
136
+ } else {
137
+ const columnId = sheet.columns[parseInt(numericIndex)];
138
+ sheet.columnMeta[columnId] ??= {};
139
+ sheet.columnMeta[columnId].size = size;
140
+ }
141
+ });
139
142
  },
140
143
  [model],
141
144
  );
@@ -172,12 +175,20 @@ export const GridSheet = () => {
172
175
  case 'frozenRowsStart':
173
176
  return dxGrid?.setSelection({
174
177
  start: { col: pos.col, row: 0, plane: 'grid' },
175
- end: { col: pos.col, row: model.sheet.rows.length - 1, plane: 'grid' },
178
+ end: {
179
+ col: pos.col,
180
+ row: model.sheet.rows.length - 1,
181
+ plane: 'grid',
182
+ },
176
183
  });
177
184
  case 'frozenColsStart':
178
185
  return dxGrid?.setSelection({
179
186
  start: { row: pos.row, col: 0, plane: 'grid' },
180
- end: { row: pos.row, col: model.sheet.columns.length - 1, plane: 'grid' },
187
+ end: {
188
+ row: pos.row,
189
+ col: model.sheet.columns.length - 1,
190
+ plane: 'grid',
191
+ },
181
192
  });
182
193
  }
183
194
  },
@@ -257,31 +268,30 @@ export const GridSheet = () => {
257
268
  switch (operation) {
258
269
  case 'insert-before':
259
270
  case 'insert-after':
260
- return dispatch(
261
- createIntent(SheetAction.InsertAxis, {
262
- model,
263
- axis: contextMenuAxis,
264
- index: contextMenuOpen![contextMenuAxis] + (operation === 'insert-before' ? 0 : 1),
265
- }),
266
- );
271
+ return invokePromise(SheetOperation.InsertAxis, {
272
+ model,
273
+ axis: contextMenuAxis,
274
+ index: contextMenuOpen![contextMenuAxis] + (operation === 'insert-before' ? 0 : 1),
275
+ });
267
276
  case 'drop':
268
- return dispatch(
269
- createIntent(SheetAction.DropAxis, {
270
- model,
271
- axis: contextMenuAxis,
272
- axisIndex: model.sheet[contextMenuAxis === 'row' ? 'rows' : 'columns'][contextMenuOpen![contextMenuAxis]],
273
- }),
274
- );
277
+ return invokePromise(SheetOperation.DropAxis, {
278
+ model,
279
+ axis: contextMenuAxis,
280
+ axisIndex: model.sheet[contextMenuAxis === 'row' ? 'rows' : 'columns'][contextMenuOpen![contextMenuAxis]],
281
+ });
275
282
  }
276
283
  },
277
- [contextMenuAxis, contextMenuOpen, model, dispatch],
284
+ [contextMenuAxis, contextMenuOpen, model, invokePromise],
278
285
  );
279
286
 
280
287
  const { columns, rows } = useSheetModelDxGridProps(dxGrid, model);
281
288
 
282
289
  const extensions = useMemo(
283
290
  () => [
284
- editorKeys({ onClose: handleClose, ...(editing?.initialContent && { onNav: handleClose }) }),
291
+ editorKeys({
292
+ onClose: handleClose,
293
+ ...(editing?.initialContent && { onNav: handleClose }),
294
+ }),
285
295
  sheetExtension({ functions: model.graph.getFunctions() }),
286
296
  rangeExtension({
287
297
  onInit: (fn) => (rangeController.current = fn),
@@ -6,13 +6,14 @@ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
  import React, { useMemo, useState } from 'react';
7
7
 
8
8
  import { Client } from '@dxos/client';
9
- import { createDocAccessor } from '@dxos/client/echo';
10
9
  import { defaultFunctions } from '@dxos/compute';
11
10
  import { getRegisteredFunctionNames } from '@dxos/compute/testing';
11
+ import { Obj } from '@dxos/echo';
12
+ import { createDocAccessor } from '@dxos/echo-db';
12
13
  import { useAsyncEffect } from '@dxos/react-hooks';
13
14
  import { withTheme } from '@dxos/react-ui/testing';
14
- import { automerge } from '@dxos/react-ui-editor';
15
15
  import { CellEditor, type CellEditorProps } from '@dxos/react-ui-grid';
16
+ import { automerge } from '@dxos/ui-editor';
16
17
 
17
18
  import { sheetExtension } from '../../extensions';
18
19
  import { Sheet } from '../../types';
@@ -37,8 +38,10 @@ const AutomergeStory = ({ value, ...props }: CellEditorProps) => {
37
38
  const space = await client.spaces.create();
38
39
 
39
40
  const sheet = Sheet.make();
40
- sheet.name = 'Test';
41
- sheet.cells[cell] = { value };
41
+ Obj.change(sheet, (s) => {
42
+ s.name = 'Test';
43
+ s.cells[cell] = { value };
44
+ });
42
45
  space.db.add(sheet);
43
46
  setObject(sheet);
44
47
  }, [value]);
@@ -5,7 +5,7 @@
5
5
  import { useEffect, useState } from 'react';
6
6
 
7
7
  import { inRange } from '@dxos/compute';
8
- import { createDocAccessor } from '@dxos/react-client/echo';
8
+ import { createDocAccessor } from '@dxos/echo-db';
9
9
  import { cellClassesForFieldType, parseValue } from '@dxos/react-ui-form';
10
10
  import {
11
11
  type DxGridAxisMeta,
@@ -19,7 +19,7 @@ import {
19
19
  commentedClassName,
20
20
  rowToA1Notation,
21
21
  } from '@dxos/react-ui-grid';
22
- import { mx } from '@dxos/react-ui-theme';
22
+ import { mx } from '@dxos/ui-theme';
23
23
 
24
24
  import { type SheetModel } from '../../model';
25
25
  import { cellClassNameForRange, rangeFromIndex } from '../../types';
@@ -28,7 +28,10 @@ const createDxGridColumns = (model: SheetModel): DxGridAxisMeta => {
28
28
  return model.sheet.columns.reduce(
29
29
  (acc: DxGridAxisMeta, columnId, numericIndex) => {
30
30
  if (model.sheet.columnMeta[columnId] && model.sheet.columnMeta[columnId].size) {
31
- acc.grid[numericIndex] = { size: model.sheet.columnMeta[columnId].size, resizeable: true };
31
+ acc.grid[numericIndex] = {
32
+ size: model.sheet.columnMeta[columnId].size,
33
+ resizeable: true,
34
+ };
32
35
  }
33
36
  return acc;
34
37
  },
@@ -40,7 +43,10 @@ const createDxGridRows = (model: SheetModel): DxGridAxisMeta => {
40
43
  return model.sheet.rows.reduce(
41
44
  (acc: DxGridAxisMeta, rowId, numericIndex) => {
42
45
  if (model.sheet.rowMeta[rowId] && model.sheet.rowMeta[rowId].size) {
43
- acc.grid[numericIndex] = { size: model.sheet.rowMeta[rowId].size, resizeable: true };
46
+ acc.grid[numericIndex] = {
47
+ size: model.sheet.rowMeta[rowId].size,
48
+ resizeable: true,
49
+ };
44
50
  }
45
51
  return acc;
46
52
  },
@@ -59,7 +65,7 @@ const projectCellProps = (model: SheetModel, col: number, row: number): DxGridCe
59
65
  // const range = thread.target?.anchor && parseThreadAnchorAsCellRange(thread.target!.anchor);
60
66
  // return thread && range ? inRange(range, address) : false;
61
67
  // })
62
- // .map((thread) => fullyQualifiedId(thread!))
68
+ // .map((thread) => Obj.getDXN(thread!).toString())
63
69
  // .join(' ');
64
70
 
65
71
  const description = model.getValueDescription(address);
@@ -6,9 +6,10 @@ import * as Schema from 'effect/Schema';
6
6
  import React, { useCallback } from 'react';
7
7
 
8
8
  import { rangeToA1Notation } from '@dxos/compute';
9
+ import { Obj } from '@dxos/echo';
9
10
  import { Callout, useTranslation } from '@dxos/react-ui';
10
11
  import { List } from '@dxos/react-ui-list';
11
- import { ghostHover } from '@dxos/react-ui-theme';
12
+ import { ghostHover } from '@dxos/ui-theme';
12
13
 
13
14
  import { meta } from '../../meta';
14
15
  import { rangeFromIndex } from '../../types';
@@ -25,7 +26,9 @@ export const RangeList = ({ sheet }: RangeListProps) => {
25
26
  const handleDeleteRange = useCallback(
26
27
  (range: Sheet.Range) => {
27
28
  const index = sheet.ranges.findIndex((sheetRange) => sheetRange === range);
28
- sheet.ranges.splice(index, 1);
29
+ Obj.change(sheet, (s) => {
30
+ s.ranges.splice(index, 1);
31
+ });
29
32
  },
30
33
  [sheet],
31
34
  );
@@ -3,20 +3,22 @@
3
3
  //
4
4
 
5
5
  import { type Meta } from '@storybook/react-vite';
6
+ import * as Effect from 'effect/Effect';
6
7
  import React from 'react';
7
8
 
8
- import { Capabilities, IntentPlugin, contributes, createResolver } from '@dxos/app-framework';
9
+ import { Capability, Common } from '@dxos/app-framework';
9
10
  import { withPluginManager } from '@dxos/app-framework/testing';
10
- import { GraphPlugin } from '@dxos/plugin-graph';
11
- import { fullyQualifiedId, useSpace } from '@dxos/react-client/echo';
11
+ import { Obj } from '@dxos/echo';
12
+ import { OperationResolver } from '@dxos/operation';
13
+ import { corePlugins } from '@dxos/plugin-testing';
14
+ import { useSpace } from '@dxos/react-client/echo';
12
15
  import { withClientProvider } from '@dxos/react-client/testing';
13
- import { withTheme } from '@dxos/react-ui/testing';
16
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
14
17
  import { AttendableContainer } from '@dxos/react-ui-attention';
15
- import { withAttention } from '@dxos/react-ui-attention/testing';
16
18
 
17
19
  import { createTestCells, useTestSheet, withComputeGraphDecorator } from '../../testing';
18
20
  import { translations } from '../../translations';
19
- import { Sheet, SheetAction } from '../../types';
21
+ import { Sheet, SheetOperation } from '../../types';
20
22
  import { useComputeGraph } from '../ComputeGraph';
21
23
  import { RangeList } from '../RangeList';
22
24
 
@@ -27,22 +29,24 @@ const meta = {
27
29
  component: SheetContainer,
28
30
  decorators: [
29
31
  withTheme,
32
+ withLayout({ layout: 'fullscreen' }),
30
33
  withClientProvider({ types: [Sheet.Sheet], createSpace: true }),
31
34
  withComputeGraphDecorator(),
32
- withAttention,
33
35
  // TODO(wittjosiah): Consider whether we should refactor component so story doesn't need to depend on intents.
34
36
  withPluginManager({
35
- plugins: [IntentPlugin(), GraphPlugin()],
37
+ plugins: [...corePlugins()],
36
38
  capabilities: [
37
- contributes(
38
- Capabilities.IntentResolver,
39
- createResolver({
40
- intent: SheetAction.DropAxis,
41
- resolve: ({ model, axis, axisIndex }) => {
42
- model[axis === 'col' ? 'dropColumn' : 'dropRow'](axisIndex);
43
- },
39
+ Capability.contributes(Common.Capability.OperationResolver, [
40
+ OperationResolver.make({
41
+ operation: SheetOperation.DropAxis,
42
+ handler: ({ model, axis, axisIndex }) =>
43
+ Effect.sync(() => {
44
+ model[axis === 'col' ? 'dropColumn' : 'dropRow'](axisIndex);
45
+ // Return stub output for story purposes.
46
+ return { axis, axisIndex, index: 0, axisMeta: null, values: [] };
47
+ }),
44
48
  }),
45
- ),
49
+ ]),
46
50
  ],
47
51
  }),
48
52
  ],
@@ -63,12 +67,31 @@ export const Default = () => {
63
67
  }
64
68
 
65
69
  return (
66
- <AttendableContainer id={fullyQualifiedId(sheet)} classNames='contents'>
67
- <SheetContainer space={space} sheet={sheet} role='story' ignoreAttention />
70
+ <AttendableContainer id={Obj.getDXN(sheet).toString()} classNames='contents'>
71
+ <SheetContainer role='article' space={space} subject={sheet} ignoreAttention />
68
72
  </AttendableContainer>
69
73
  );
70
74
  };
71
75
 
76
+ export const Section = () => {
77
+ const space = useSpace();
78
+ const graph = useComputeGraph(space);
79
+ const sheet = useTestSheet(space, graph, { cells: createTestCells() });
80
+ if (!sheet || !space) {
81
+ return null;
82
+ }
83
+
84
+ return (
85
+ <div className='is-full flex justify-center'>
86
+ <div className='is-[40rem]'>
87
+ <AttendableContainer id={Obj.getDXN(sheet).toString()} classNames='contents'>
88
+ <SheetContainer role='section' space={space} subject={sheet} ignoreAttention />
89
+ </AttendableContainer>
90
+ </div>
91
+ </div>
92
+ );
93
+ };
94
+
72
95
  export const Spec = () => {
73
96
  const space = useSpace();
74
97
  const graph = useComputeGraph(space);
@@ -78,9 +101,9 @@ export const Spec = () => {
78
101
  }
79
102
 
80
103
  return (
81
- <AttendableContainer id={fullyQualifiedId(sheet)} classNames='contents'>
82
- <div role='none' className='grid grid-rows-[66%_33%] bs-full grid-cols-1'>
83
- <SheetContainer space={space} sheet={sheet} role='story' ignoreAttention />
104
+ <AttendableContainer id={Obj.getDXN(sheet).toString()} classNames='contents'>
105
+ <div role='none' className='is-full grid grid-cols-[1fr_20rem]'>
106
+ <SheetContainer role='article' space={space} subject={sheet} ignoreAttention />
84
107
  <div role='none' data-testid='grid.range-list'>
85
108
  <RangeList sheet={sheet} />
86
109
  </div>
@@ -2,10 +2,12 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import React from 'react';
5
+ import React, { Fragment } from 'react';
6
6
 
7
- import { type Space, fullyQualifiedId } from '@dxos/react-client/echo';
8
- import { StackItem } from '@dxos/react-ui-stack';
7
+ import { type SurfaceComponentProps } from '@dxos/app-framework/react';
8
+ import { Obj } from '@dxos/echo';
9
+ import { type Space } from '@dxos/react-client/echo';
10
+ import { Layout, type LayoutFlexProps } from '@dxos/react-ui-mosaic';
9
11
 
10
12
  import { type Sheet } from '../../types';
11
13
  import { useComputeGraph } from '../ComputeGraph';
@@ -14,27 +16,33 @@ import { GridSheet } from '../GridSheet';
14
16
  import { SheetProvider } from '../SheetContext';
15
17
  import { SheetToolbar } from '../SheetToolbar';
16
18
 
17
- export type SheetContainerProps = {
18
- space: Space;
19
- sheet: Sheet.Sheet;
20
- role?: string;
21
- ignoreAttention?: boolean;
22
- };
19
+ export type SheetContainerProps = SurfaceComponentProps<
20
+ Sheet.Sheet,
21
+ {
22
+ space: Space;
23
+ ignoreAttention?: boolean;
24
+ }
25
+ >;
23
26
 
24
- export const SheetContainer = ({ space, sheet, role, ignoreAttention }: SheetContainerProps) => {
27
+ export const SheetContainer = ({ role, subject: sheet, space, ignoreAttention }: SheetContainerProps) => {
25
28
  const graph = useComputeGraph(space);
29
+ if (!graph) {
30
+ return null;
31
+ }
32
+
33
+ const Root = role === 'section' ? Container : Fragment;
26
34
 
27
- return graph ? (
35
+ return (
28
36
  <SheetProvider sheet={sheet} graph={graph} ignoreAttention={ignoreAttention}>
29
- <StackItem.Content
30
- toolbar
31
- statusbar
32
- classNames={[role === 'section' && 'aspect-video', role === 'story' && 'bs-full']}
33
- >
34
- <SheetToolbar id={fullyQualifiedId(sheet)} />
35
- <GridSheet />
36
- <FunctionEditor />
37
- </StackItem.Content>
37
+ <Root>
38
+ <Layout.Main toolbar statusbar>
39
+ <SheetToolbar id={Obj.getDXN(sheet).toString()} />
40
+ <GridSheet />
41
+ <FunctionEditor />
42
+ </Layout.Main>
43
+ </Root>
38
44
  </SheetProvider>
39
- ) : null;
45
+ );
40
46
  };
47
+
48
+ const Container = (props: LayoutFlexProps) => <Layout.Flex {...props} classNames='aspect-square' />;
@@ -5,8 +5,8 @@
5
5
  import React, { type PropsWithChildren, createContext, useCallback, useContext, useState } from 'react';
6
6
 
7
7
  import { type CellAddress, type CellRange, type CompleteCellRange, type ComputeGraph } from '@dxos/compute';
8
+ import { Obj } from '@dxos/echo';
8
9
  import { invariant } from '@dxos/invariant';
9
- import { fullyQualifiedId } from '@dxos/react-client/echo';
10
10
  import {
11
11
  Grid,
12
12
  type GridContentProps,
@@ -56,12 +56,12 @@ export const useSheetContext = (): SheetContextValue => {
56
56
  };
57
57
 
58
58
  const SheetProviderImpl = ({
59
+ __gridScope,
60
+ children,
61
+ ignoreAttention,
59
62
  model,
60
63
  onInfo,
61
- ignoreAttention,
62
- children,
63
- __gridScope,
64
- }: GridScopedProps<PropsWithChildren<Pick<SheetContextValue, 'onInfo' | 'model' | 'ignoreAttention'>>>) => {
64
+ }: GridScopedProps<PropsWithChildren<Pick<SheetContextValue, 'ignoreAttention' | 'model' | 'onInfo'>>>) => {
65
65
  const { id, editing, setEditing } = useGridContext('SheetProvider', __gridScope);
66
66
 
67
67
  const [cursor, setCursorInternal] = useState<CellAddress>();
@@ -130,7 +130,7 @@ export const SheetProvider = ({
130
130
  const model = useSheetModel(graph, sheet, { readonly });
131
131
 
132
132
  return !model ? null : (
133
- <Grid.Root id={fullyQualifiedId(sheet)}>
133
+ <Grid.Root id={Obj.getDXN(sheet).toString()}>
134
134
  <SheetProviderImpl model={model} onInfo={onInfo} ignoreAttention={ignoreAttention}>
135
135
  {children}
136
136
  </SheetProviderImpl>
@@ -2,17 +2,16 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { Rx } from '@effect-rx/rx-react';
6
- import React, { type PropsWithChildren, useMemo } from 'react';
5
+ import { Atom, type Registry, RegistryContext } from '@effect-atom/atom-react';
6
+ import React, { type PropsWithChildren, useContext, useMemo } from 'react';
7
7
 
8
- import { useAppGraph } from '@dxos/app-framework';
8
+ import { useAppGraph } from '@dxos/app-framework/react';
9
9
  import { type CompleteCellRange } from '@dxos/compute';
10
10
  import {
11
11
  type ActionGraphProps,
12
12
  MenuProvider,
13
13
  ToolbarMenu,
14
14
  createGapSeparator,
15
- rxFromSignal,
16
15
  useMenuActions,
17
16
  } from '@dxos/react-ui-menu';
18
17
 
@@ -21,17 +20,28 @@ import { useSheetContext } from '../SheetContext';
21
20
 
22
21
  import { createAlign, useAlignState } from './align';
23
22
  import { createStyle, useStyleState } from './style';
24
- import { type ToolbarState, useToolbarState } from './useToolbarState';
23
+ import { type ToolbarStateAtom, useToolbarState } from './useToolbarState';
25
24
 
26
- const createToolbarActions = (
27
- model: SheetModel,
28
- state: ToolbarState,
29
- cursorFallbackRange?: CompleteCellRange,
30
- customActions?: Rx.Rx<ActionGraphProps>,
31
- ): Rx.Rx<ActionGraphProps> => {
32
- return Rx.make((get) => {
33
- const align = get(rxFromSignal(() => createAlign(model, state, cursorFallbackRange)));
34
- const style = get(rxFromSignal(() => createStyle(model, state, cursorFallbackRange)));
25
+ type ToolbarActionsContext = {
26
+ model: SheetModel;
27
+ stateAtom: ToolbarStateAtom;
28
+ registry: Registry.Registry;
29
+ cursorFallbackRange?: CompleteCellRange;
30
+ customActions?: Atom.Atom<ActionGraphProps>;
31
+ };
32
+
33
+ const createToolbarActions = ({
34
+ model,
35
+ stateAtom,
36
+ registry,
37
+ cursorFallbackRange,
38
+ customActions,
39
+ }: ToolbarActionsContext): Atom.Atom<ActionGraphProps> => {
40
+ return Atom.make((get) => {
41
+ const state = get(stateAtom);
42
+ const context = { model, state, stateAtom, registry, cursorFallbackRange };
43
+ const align = createAlign(context);
44
+ const style = createStyle(context);
35
45
  const gap = createGapSeparator();
36
46
 
37
47
  const graph: ActionGraphProps = {
@@ -53,22 +63,26 @@ export type SheetToolbarProps = PropsWithChildren<{ id: string }>;
53
63
 
54
64
  export const SheetToolbar = ({ id }: SheetToolbarProps) => {
55
65
  const { model, cursorFallbackRange } = useSheetContext();
56
- const state = useToolbarState({});
57
- useAlignState(state);
58
- useStyleState(state);
66
+ const stateAtom = useToolbarState({});
67
+ const registry = useContext(RegistryContext);
68
+ useAlignState(stateAtom);
69
+ useStyleState(stateAtom);
59
70
 
60
71
  const { graph } = useAppGraph();
61
72
  const customActions = useMemo(() => {
62
- return Rx.make((get) => {
73
+ return Atom.make((get) => {
63
74
  const actions = get(graph.actions(id));
64
75
  const nodes = actions.filter((action) => action.properties.disposition === 'toolbar');
65
- return { nodes, edges: nodes.map((node) => ({ source: 'root', target: node.id })) };
76
+ return {
77
+ nodes,
78
+ edges: nodes.map((node) => ({ source: 'root', target: node.id })),
79
+ };
66
80
  });
67
- }, [graph]);
81
+ }, [graph, id]);
68
82
 
69
83
  const actionsCreator = useMemo(
70
- () => createToolbarActions(model, state, cursorFallbackRange, customActions),
71
- [model, state, cursorFallbackRange, customActions],
84
+ () => createToolbarActions({ model, stateAtom, registry, cursorFallbackRange, customActions }),
85
+ [model, stateAtom, registry, cursorFallbackRange, customActions],
72
86
  );
73
87
  const menu = useMenuActions(actionsCreator);
74
88
 
@@ -2,17 +2,24 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { useEffect } from 'react';
5
+ import { type Registry, RegistryContext } from '@effect-atom/atom-react';
6
+ import { useContext, useEffect } from 'react';
6
7
 
7
8
  import { type CompleteCellRange, inRange } from '@dxos/compute';
8
- import { type ToolbarMenuActionGroupProperties, createMenuAction, createMenuItemGroup } from '@dxos/react-ui-menu';
9
+ import { Obj } from '@dxos/echo';
10
+ import {
11
+ type ActionGraphProps,
12
+ type ToolbarMenuActionGroupProperties,
13
+ createMenuAction,
14
+ createMenuItemGroup,
15
+ } from '@dxos/react-ui-menu';
9
16
 
10
17
  import { meta } from '../../meta';
11
18
  import { type SheetModel } from '../../model';
12
19
  import { type AlignKey, type AlignValue, alignKey, rangeFromIndex, rangeToIndex } from '../../types';
13
20
  import { useSheetContext } from '../SheetContext';
14
21
 
15
- import { type ToolbarState } from './useToolbarState';
22
+ import { type ToolbarState, type ToolbarStateAtom } from './useToolbarState';
16
23
 
17
24
  export type AlignAction = { key: AlignKey; value: AlignValue };
18
25
 
@@ -24,18 +31,21 @@ const aligns: Record<AlignValue, string> = {
24
31
  end: 'ph--text-align-right--regular',
25
32
  };
26
33
 
27
- export const useAlignState = (state: Partial<AlignState>) => {
34
+ export const useAlignState = (stateAtom: ToolbarStateAtom) => {
35
+ const registry = useContext(RegistryContext);
28
36
  const { cursor, model } = useSheetContext();
29
37
  useEffect(() => {
30
38
  // TODO(thure): Can this O(n) call be memoized?
31
- state[alignKey] = (
39
+ const alignValue = (
32
40
  cursor
33
41
  ? model.sheet.ranges?.findLast(
34
42
  ({ range, key }) => key === alignKey && inRange(rangeFromIndex(model.sheet, range), cursor),
35
43
  )?.value
36
44
  : undefined
37
45
  ) as AlignValue | undefined;
38
- }, [cursor, model.sheet]);
46
+ const prev = registry.get(stateAtom);
47
+ registry.set(stateAtom, { ...prev, [alignKey]: alignValue });
48
+ }, [cursor, model.sheet, registry, stateAtom]);
39
49
  };
40
50
 
41
51
  const createAlignGroupAction = (value?: AlignValue) =>
@@ -46,7 +56,15 @@ const createAlignGroupAction = (value?: AlignValue) =>
46
56
  value: `${alignKey}--${value}`,
47
57
  } as ToolbarMenuActionGroupProperties);
48
58
 
49
- const createAlignActions = (model: SheetModel, state: ToolbarState, cursorFallbackRange?: CompleteCellRange) =>
59
+ type AlignActionsContext = {
60
+ model: SheetModel;
61
+ state: ToolbarState;
62
+ stateAtom: ToolbarStateAtom;
63
+ registry: Registry.Registry;
64
+ cursorFallbackRange?: CompleteCellRange;
65
+ };
66
+
67
+ const createAlignActions = ({ model, state, stateAtom, registry, cursorFallbackRange }: AlignActionsContext) =>
50
68
  Object.entries(aligns).map(([alignValue, icon]) => {
51
69
  return createMenuAction<AlignAction>(
52
70
  `${alignKey}--${alignValue}`,
@@ -64,15 +82,22 @@ const createAlignActions = (model: SheetModel, state: ToolbarState, cursorFallba
64
82
  key: alignKey,
65
83
  value: alignValue as AlignValue,
66
84
  };
85
+ const currentState = registry.get(stateAtom);
67
86
  if (index < 0) {
68
- model.sheet.ranges?.push(nextRangeEntity);
69
- state[alignKey] = nextRangeEntity.value;
87
+ Obj.change(model.sheet, (s) => {
88
+ s.ranges?.push(nextRangeEntity);
89
+ });
90
+ registry.set(stateAtom, { ...currentState, [alignKey]: nextRangeEntity.value });
70
91
  } else if (model.sheet.ranges![index].value === nextRangeEntity.value) {
71
- model.sheet.ranges?.splice(index, 1);
72
- state[alignKey] = undefined;
92
+ Obj.change(model.sheet, (s) => {
93
+ s.ranges?.splice(index, 1);
94
+ });
95
+ registry.set(stateAtom, { ...currentState, [alignKey]: undefined });
73
96
  } else {
74
- model.sheet.ranges?.splice(index, 1, nextRangeEntity);
75
- state[alignKey] = nextRangeEntity.value;
97
+ Obj.change(model.sheet, (s) => {
98
+ s.ranges?.splice(index, 1, nextRangeEntity);
99
+ });
100
+ registry.set(stateAtom, { ...currentState, [alignKey]: nextRangeEntity.value });
76
101
  }
77
102
  },
78
103
  {
@@ -86,9 +111,9 @@ const createAlignActions = (model: SheetModel, state: ToolbarState, cursorFallba
86
111
  );
87
112
  });
88
113
 
89
- export const createAlign = (model: SheetModel, state: ToolbarState, cursorFallbackRange?: CompleteCellRange) => {
90
- const alignGroup = createAlignGroupAction(state[alignKey]);
91
- const alignActions = createAlignActions(model, state, cursorFallbackRange);
114
+ export const createAlign = (context: AlignActionsContext): ActionGraphProps => {
115
+ const alignGroup = createAlignGroupAction(context.state[alignKey]);
116
+ const alignActions = createAlignActions(context);
92
117
  return {
93
118
  nodes: [alignGroup, ...alignActions],
94
119
  edges: [