@dxos/plugin-sheet 0.8.2-main.fbd8ed0 → 0.8.2-staging.42af850

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 (136) hide show
  1. package/dist/lib/browser/{SheetContainer-UV7RMPXS.mjs → SheetContainer-GXPG3ZDN.mjs} +141 -162
  2. package/dist/lib/browser/SheetContainer-GXPG3ZDN.mjs.map +7 -0
  3. package/dist/lib/browser/anchor-sort-CUTFYIT4.mjs +24 -0
  4. package/dist/lib/browser/anchor-sort-CUTFYIT4.mjs.map +7 -0
  5. package/dist/lib/browser/{chunk-N2FOQHUH.mjs → chunk-5FLX3UGU.mjs} +8 -17
  6. package/dist/lib/browser/chunk-5FLX3UGU.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-AYMJXZFS.mjs +847 -0
  8. package/dist/lib/browser/chunk-AYMJXZFS.mjs.map +7 -0
  9. package/dist/lib/browser/{chunk-AT5ZK6JD.mjs → chunk-FJRLDX7Z.mjs} +1 -1
  10. package/dist/lib/browser/chunk-FJRLDX7Z.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-EMSCNWEK.mjs → chunk-IR42IS3F.mjs} +2 -2
  12. package/dist/lib/{node-esm/chunk-76T5X4VP.mjs.map → browser/chunk-IR42IS3F.mjs.map} +1 -1
  13. package/dist/lib/browser/{compute-graph-registry-MBJKPAHX.mjs → compute-graph-registry-IXGGJJBU.mjs} +2 -2
  14. package/dist/lib/browser/index.mjs +15 -14
  15. package/dist/lib/browser/index.mjs.map +3 -3
  16. package/dist/lib/browser/{intent-resolver-DN7JXDAV.mjs → intent-resolver-UI4DHURQ.mjs} +2 -2
  17. package/dist/lib/browser/{markdown-57MKY5WB.mjs → markdown-T4TUP4BF.mjs} +3 -3
  18. package/dist/lib/browser/meta.json +1 -1
  19. package/dist/lib/browser/{react-surface-NQU63B63.mjs → react-surface-KI6T5M2X.mjs} +5 -5
  20. package/dist/lib/browser/types/index.mjs +1 -1
  21. package/dist/lib/node/SheetContainer-UUDOHLZR.cjs +351 -0
  22. package/dist/lib/node/SheetContainer-UUDOHLZR.cjs.map +7 -0
  23. package/dist/lib/node/{thread-E7YPGR5T.cjs → anchor-sort-LTLYUTUP.cjs} +17 -10
  24. package/dist/lib/node/anchor-sort-LTLYUTUP.cjs.map +7 -0
  25. package/dist/lib/node/{chunk-HLSQVT3C.cjs → chunk-76NESQLB.cjs} +10 -19
  26. package/dist/lib/node/chunk-76NESQLB.cjs.map +7 -0
  27. package/dist/lib/node/chunk-BXBNSNDK.cjs +855 -0
  28. package/dist/lib/node/chunk-BXBNSNDK.cjs.map +7 -0
  29. package/dist/lib/node/{chunk-LEV7OSTK.cjs → chunk-FIM6EZ6M.cjs} +4 -4
  30. package/dist/lib/node/chunk-FIM6EZ6M.cjs.map +7 -0
  31. package/dist/lib/node/{chunk-O2FOEUYB.cjs → chunk-LJWWS53Z.cjs} +5 -5
  32. package/dist/lib/node/{chunk-O2FOEUYB.cjs.map → chunk-LJWWS53Z.cjs.map} +1 -1
  33. package/dist/lib/node/{compute-graph-registry-EBBDN6ZX.cjs → compute-graph-registry-ARLDHPFW.cjs} +6 -6
  34. package/dist/lib/node/index.cjs +21 -20
  35. package/dist/lib/node/index.cjs.map +3 -3
  36. package/dist/lib/node/{intent-resolver-OPF56TAL.cjs → intent-resolver-EVLGL7VZ.cjs} +9 -9
  37. package/dist/lib/node/{markdown-Q3RXYPHQ.cjs → markdown-DBPOAYI7.cjs} +8 -8
  38. package/dist/lib/node/meta.json +1 -1
  39. package/dist/lib/node/{react-surface-7SAA5DX3.cjs → react-surface-QHAPOAR2.cjs} +14 -14
  40. package/dist/lib/node/types/index.cjs +29 -29
  41. package/dist/lib/node/types/index.cjs.map +1 -1
  42. package/dist/lib/node-esm/{SheetContainer-XW7B2AJI.mjs → SheetContainer-44KHKMPI.mjs} +141 -162
  43. package/dist/lib/node-esm/SheetContainer-44KHKMPI.mjs.map +7 -0
  44. package/dist/lib/node-esm/anchor-sort-3E2VGLO6.mjs +25 -0
  45. package/dist/lib/node-esm/anchor-sort-3E2VGLO6.mjs.map +7 -0
  46. package/dist/lib/node-esm/{chunk-LYZV4Q4C.mjs → chunk-DIF3IOAB.mjs} +8 -17
  47. package/dist/lib/node-esm/chunk-DIF3IOAB.mjs.map +7 -0
  48. package/dist/lib/node-esm/chunk-GCCM7R45.mjs +848 -0
  49. package/dist/lib/node-esm/chunk-GCCM7R45.mjs.map +7 -0
  50. package/dist/lib/node-esm/{chunk-76T5X4VP.mjs → chunk-IQ76YE6M.mjs} +2 -2
  51. package/dist/lib/{browser/chunk-EMSCNWEK.mjs.map → node-esm/chunk-IQ76YE6M.mjs.map} +1 -1
  52. package/dist/lib/node-esm/{chunk-HXBUY5ET.mjs → chunk-NMCVJWDT.mjs} +1 -1
  53. package/dist/lib/node-esm/chunk-NMCVJWDT.mjs.map +7 -0
  54. package/dist/lib/node-esm/{compute-graph-registry-TVG6RN2J.mjs → compute-graph-registry-7PDWXMHF.mjs} +2 -2
  55. package/dist/lib/node-esm/index.mjs +15 -14
  56. package/dist/lib/node-esm/index.mjs.map +3 -3
  57. package/dist/lib/node-esm/{intent-resolver-7AN5CN4R.mjs → intent-resolver-TPOH5JM5.mjs} +2 -2
  58. package/dist/lib/node-esm/{markdown-ACHAWUOE.mjs → markdown-WWUJ3E5F.mjs} +3 -3
  59. package/dist/lib/node-esm/meta.json +1 -1
  60. package/dist/lib/node-esm/{react-surface-BPNN7RSE.mjs → react-surface-XT2J3S67.mjs} +5 -5
  61. package/dist/lib/node-esm/types/index.mjs +1 -1
  62. package/dist/types/src/SheetPlugin.d.ts.map +1 -1
  63. package/dist/types/src/capabilities/anchor-sort.d.ts +6 -0
  64. package/dist/types/src/capabilities/anchor-sort.d.ts.map +1 -0
  65. package/dist/types/src/capabilities/index.d.ts +4 -4
  66. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  67. package/dist/types/src/components/GridSheet/util.d.ts.map +1 -1
  68. package/dist/types/src/components/SheetContainer/SheetContainer.stories.d.ts.map +1 -1
  69. package/dist/types/src/components/SheetToolbar/SheetToolbar.d.ts +2 -2
  70. package/dist/types/src/components/SheetToolbar/SheetToolbar.d.ts.map +1 -1
  71. package/dist/types/src/components/SheetToolbar/useToolbarState.d.ts +2 -3
  72. package/dist/types/src/components/SheetToolbar/useToolbarState.d.ts.map +1 -1
  73. package/dist/types/src/integrations/thread-ranges.d.ts.map +1 -1
  74. package/dist/types/src/model/sheet-model.d.ts.map +1 -1
  75. package/dist/types/src/serializer.d.ts.map +1 -1
  76. package/dist/types/src/testing/playwright/sheet-manager.d.ts.map +1 -1
  77. package/dist/types/src/types/schema.d.ts +0 -207
  78. package/dist/types/src/types/schema.d.ts.map +1 -1
  79. package/dist/types/src/types/util.d.ts.map +1 -1
  80. package/package.json +49 -48
  81. package/src/SheetPlugin.tsx +7 -5
  82. package/src/capabilities/anchor-sort.ts +22 -0
  83. package/src/capabilities/index.ts +1 -1
  84. package/src/components/FunctionEditor/FunctionEditor.tsx +1 -1
  85. package/src/components/GridSheet/util.ts +10 -9
  86. package/src/components/SheetContainer/SheetContainer.stories.tsx +2 -1
  87. package/src/components/SheetContainer/SheetContainer.tsx +1 -1
  88. package/src/components/SheetToolbar/SheetToolbar.stories.tsx +1 -1
  89. package/src/components/SheetToolbar/SheetToolbar.tsx +44 -33
  90. package/src/components/SheetToolbar/useToolbarState.ts +1 -2
  91. package/src/extensions/compute.ts +1 -1
  92. package/src/integrations/thread-ranges.ts +12 -14
  93. package/src/model/sheet-model.ts +17 -17
  94. package/src/serializer.ts +1 -2
  95. package/src/testing/playwright/sheet-manager.ts +9 -9
  96. package/src/types/schema.ts +1 -5
  97. package/src/types/util.ts +0 -1
  98. package/dist/lib/browser/SheetContainer-UV7RMPXS.mjs.map +0 -7
  99. package/dist/lib/browser/chunk-AT5ZK6JD.mjs.map +0 -7
  100. package/dist/lib/browser/chunk-N2FOQHUH.mjs.map +0 -7
  101. package/dist/lib/browser/chunk-TN7LTDHU.mjs +0 -826
  102. package/dist/lib/browser/chunk-TN7LTDHU.mjs.map +0 -7
  103. package/dist/lib/browser/thread-WU64QL2A.mjs +0 -17
  104. package/dist/lib/browser/thread-WU64QL2A.mjs.map +0 -7
  105. package/dist/lib/node/SheetContainer-GR2KDOAE.cjs +0 -368
  106. package/dist/lib/node/SheetContainer-GR2KDOAE.cjs.map +0 -7
  107. package/dist/lib/node/chunk-CN7OBGYV.cjs +0 -833
  108. package/dist/lib/node/chunk-CN7OBGYV.cjs.map +0 -7
  109. package/dist/lib/node/chunk-HLSQVT3C.cjs.map +0 -7
  110. package/dist/lib/node/chunk-LEV7OSTK.cjs.map +0 -7
  111. package/dist/lib/node/thread-E7YPGR5T.cjs.map +0 -7
  112. package/dist/lib/node-esm/SheetContainer-XW7B2AJI.mjs.map +0 -7
  113. package/dist/lib/node-esm/chunk-3JJ7ETTJ.mjs +0 -827
  114. package/dist/lib/node-esm/chunk-3JJ7ETTJ.mjs.map +0 -7
  115. package/dist/lib/node-esm/chunk-HXBUY5ET.mjs.map +0 -7
  116. package/dist/lib/node-esm/chunk-LYZV4Q4C.mjs.map +0 -7
  117. package/dist/lib/node-esm/thread-ULESW6IX.mjs +0 -18
  118. package/dist/lib/node-esm/thread-ULESW6IX.mjs.map +0 -7
  119. package/dist/types/src/capabilities/thread.d.ts +0 -6
  120. package/dist/types/src/capabilities/thread.d.ts.map +0 -1
  121. package/dist/types/src/components/SheetToolbar/comment.d.ts +0 -25
  122. package/dist/types/src/components/SheetToolbar/comment.d.ts.map +0 -1
  123. package/src/capabilities/thread.ts +0 -14
  124. package/src/components/SheetToolbar/comment.ts +0 -84
  125. /package/dist/lib/browser/{compute-graph-registry-MBJKPAHX.mjs.map → compute-graph-registry-IXGGJJBU.mjs.map} +0 -0
  126. /package/dist/lib/browser/{intent-resolver-DN7JXDAV.mjs.map → intent-resolver-UI4DHURQ.mjs.map} +0 -0
  127. /package/dist/lib/browser/{markdown-57MKY5WB.mjs.map → markdown-T4TUP4BF.mjs.map} +0 -0
  128. /package/dist/lib/browser/{react-surface-NQU63B63.mjs.map → react-surface-KI6T5M2X.mjs.map} +0 -0
  129. /package/dist/lib/node/{compute-graph-registry-EBBDN6ZX.cjs.map → compute-graph-registry-ARLDHPFW.cjs.map} +0 -0
  130. /package/dist/lib/node/{intent-resolver-OPF56TAL.cjs.map → intent-resolver-EVLGL7VZ.cjs.map} +0 -0
  131. /package/dist/lib/node/{markdown-Q3RXYPHQ.cjs.map → markdown-DBPOAYI7.cjs.map} +0 -0
  132. /package/dist/lib/node/{react-surface-7SAA5DX3.cjs.map → react-surface-QHAPOAR2.cjs.map} +0 -0
  133. /package/dist/lib/node-esm/{compute-graph-registry-TVG6RN2J.mjs.map → compute-graph-registry-7PDWXMHF.mjs.map} +0 -0
  134. /package/dist/lib/node-esm/{intent-resolver-7AN5CN4R.mjs.map → intent-resolver-TPOH5JM5.mjs.map} +0 -0
  135. /package/dist/lib/node-esm/{markdown-ACHAWUOE.mjs.map → markdown-WWUJ3E5F.mjs.map} +0 -0
  136. /package/dist/lib/node-esm/{react-surface-BPNN7RSE.mjs.map → react-surface-XT2J3S67.mjs.map} +0 -0
@@ -2,70 +2,77 @@ import { createRequire } from 'node:module';const require = createRequire(import
2
2
  import {
3
3
  GridSheet,
4
4
  SheetProvider,
5
- completeCellRangeToThreadCursor,
6
5
  useComputeGraph,
7
6
  useSheetContext
8
- } from "./chunk-3JJ7ETTJ.mjs";
9
- import "./chunk-HXBUY5ET.mjs";
7
+ } from "./chunk-GCCM7R45.mjs";
10
8
  import {
11
9
  alignKey,
12
- commentKey,
13
10
  mapFormulaIndicesToRefs,
14
11
  rangeFromIndex,
15
12
  rangeToIndex
16
- } from "./chunk-LYZV4Q4C.mjs";
13
+ } from "./chunk-DIF3IOAB.mjs";
14
+ import "./chunk-NMCVJWDT.mjs";
17
15
  import {
18
16
  SHEET_PLUGIN
19
17
  } from "./chunk-Y6ND5HWX.mjs";
20
18
 
21
19
  // packages/plugins/plugin-sheet/src/components/SheetContainer/SheetContainer.tsx
20
+ import { useSignals as _useSignals4 } from "@preact-signals/safe-react/tracking";
22
21
  import React3 from "react";
23
22
  import { fullyQualifiedId } from "@dxos/react-client/echo";
24
23
  import { StackItem } from "@dxos/react-ui-stack";
25
24
 
26
25
  // packages/plugins/plugin-sheet/src/components/FunctionEditor/FunctionEditor.tsx
26
+ import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
27
27
  import React from "react";
28
28
  import { addressToA1Notation, isFormula, rangeToA1Notation } from "@dxos/compute";
29
29
  import { Icon } from "@dxos/react-ui";
30
30
  var FunctionEditor = () => {
31
- const { model, cursor, range } = useSheetContext();
32
- let value;
33
- let formula = false;
34
- if (cursor) {
35
- value = model.getCellValue(cursor);
36
- if (isFormula(value)) {
37
- value = model.graph.mapFunctionBindingFromId(mapFormulaIndicesToRefs(model.sheet, value));
38
- formula = true;
39
- } else if (value != null) {
40
- value = String(value);
31
+ var _effect = _useSignals();
32
+ try {
33
+ const { model, cursor, range } = useSheetContext();
34
+ let value;
35
+ let formula = false;
36
+ if (cursor) {
37
+ value = model.getCellValue(cursor);
38
+ if (isFormula(value)) {
39
+ value = model.graph.mapFunctionBindingFromId(mapFormulaIndicesToRefs(model.sheet, value));
40
+ formula = true;
41
+ } else if (value != null) {
42
+ value = String(value);
43
+ }
41
44
  }
45
+ return /* @__PURE__ */ React.createElement("div", {
46
+ className: "flex shrink-0 justify-between items-center px-4 py-1 text-sm bg-toolbarSurface border-bs !border-subduedSeparator"
47
+ }, /* @__PURE__ */ React.createElement("div", {
48
+ className: "flex gap-4 items-center"
49
+ }, /* @__PURE__ */ React.createElement("div", {
50
+ className: "flex w-16 items-center font-mono"
51
+ }, range && rangeToA1Notation(range) || cursor && addressToA1Notation(cursor)), /* @__PURE__ */ React.createElement("div", {
52
+ className: "flex gap-2 items-center"
53
+ }, /* @__PURE__ */ React.createElement(Icon, {
54
+ icon: "ph--function--regular",
55
+ classNames: [
56
+ "text-greenText",
57
+ formula ? "visible" : "invisible"
58
+ ]
59
+ }), /* @__PURE__ */ React.createElement("span", {
60
+ className: "font-mono"
61
+ }, value))));
62
+ } finally {
63
+ _effect.f();
42
64
  }
43
- return /* @__PURE__ */ React.createElement("div", {
44
- className: "flex shrink-0 justify-between items-center px-4 py-1 text-sm bg-toolbarSurface border-bs !border-separator"
45
- }, /* @__PURE__ */ React.createElement("div", {
46
- className: "flex gap-4 items-center"
47
- }, /* @__PURE__ */ React.createElement("div", {
48
- className: "flex w-16 items-center font-mono"
49
- }, range && rangeToA1Notation(range) || cursor && addressToA1Notation(cursor)), /* @__PURE__ */ React.createElement("div", {
50
- className: "flex gap-2 items-center"
51
- }, /* @__PURE__ */ React.createElement(Icon, {
52
- icon: "ph--function--regular",
53
- classNames: [
54
- "text-greenText",
55
- formula ? "visible" : "invisible"
56
- ]
57
- }), /* @__PURE__ */ React.createElement("span", {
58
- className: "font-mono"
59
- }, value))));
60
65
  };
61
66
 
62
67
  // packages/plugins/plugin-sheet/src/components/SheetToolbar/SheetToolbar.tsx
63
- import React2, { useCallback } from "react";
64
- import { createIntent, useIntentDispatcher } from "@dxos/app-framework";
65
- import { ThreadAction } from "@dxos/plugin-thread/types";
66
- import { createGapSeparator, MenuProvider, ToolbarMenu, useMenuActions } from "@dxos/react-ui-menu";
68
+ import { useSignals as _useSignals3 } from "@preact-signals/safe-react/tracking";
69
+ import { Rx } from "@effect-rx/rx-react";
70
+ import React2, { useMemo as useMemo2 } from "react";
71
+ import { useAppGraph } from "@dxos/app-framework";
72
+ import { createGapSeparator, MenuProvider, rxFromSignal, ToolbarMenu, useMenuActions } from "@dxos/react-ui-menu";
67
73
 
68
74
  // packages/plugins/plugin-sheet/src/components/SheetToolbar/align.ts
75
+ import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
69
76
  import { useEffect } from "react";
70
77
  import { inRange } from "@dxos/compute";
71
78
  import { createMenuAction, createMenuItemGroup } from "@dxos/react-ui-menu";
@@ -75,13 +82,18 @@ var aligns = {
75
82
  end: "ph--text-align-right--regular"
76
83
  };
77
84
  var useAlignState = (state) => {
78
- const { cursor, model } = useSheetContext();
79
- useEffect(() => {
80
- state[alignKey] = cursor ? model.sheet.ranges?.findLast(({ range, key }) => key === alignKey && inRange(rangeFromIndex(model.sheet, range), cursor))?.value : void 0;
81
- }, [
82
- cursor,
83
- model.sheet
84
- ]);
85
+ var _effect = _useSignals2();
86
+ try {
87
+ const { cursor, model } = useSheetContext();
88
+ useEffect(() => {
89
+ state[alignKey] = cursor ? model.sheet.ranges?.findLast(({ range, key }) => key === alignKey && inRange(rangeFromIndex(model.sheet, range), cursor))?.value : void 0;
90
+ }, [
91
+ cursor,
92
+ model.sheet
93
+ ]);
94
+ } finally {
95
+ _effect.f();
96
+ }
85
97
  };
86
98
  var createAlignGroupAction = (value) => createMenuItemGroup("align", {
87
99
  label: [
@@ -150,72 +162,17 @@ var createAlign = (model, state, cursorFallbackRange) => {
150
162
  };
151
163
  };
152
164
 
153
- // packages/plugins/plugin-sheet/src/components/SheetToolbar/comment.ts
154
- import { useEffect as useEffect2, useMemo } from "react";
155
- import { RefArray } from "@dxos/live-object";
156
- import { createMenuAction as createMenuAction2 } from "@dxos/react-ui-menu";
157
- var useCommentState = (state) => {
158
- const { cursorFallbackRange, model } = useSheetContext();
159
- const overlapsCommentAnchor = useMemo(() => RefArray.targets(model.sheet.threads ?? []).filter((thread) => thread.status !== "resolved").some((thread) => {
160
- if (!cursorFallbackRange) {
161
- return false;
162
- }
163
- return rangeToIndex(model.sheet, cursorFallbackRange) === thread.anchor;
164
- }), [
165
- cursorFallbackRange,
166
- model.sheet
167
- ]);
168
- useEffect2(() => {
169
- state.commentEnabled = !cursorFallbackRange ? "no cursor" : overlapsCommentAnchor ? "selection overlaps existing comment" : "comment";
170
- }, [
171
- overlapsCommentAnchor,
172
- cursorFallbackRange
173
- ]);
174
- };
175
- var createCommentAction = (model, state, onComment, cursorFallbackRange) => createMenuAction2("comment", () => {
176
- if (!cursorFallbackRange) {
177
- return;
178
- }
179
- const cellContent = model.getCellText(cursorFallbackRange.from);
180
- if (!cellContent) {
181
- return;
182
- }
183
- onComment(cellContent, completeCellRangeToThreadCursor(cursorFallbackRange));
184
- }, {
185
- key: commentKey,
186
- testId: "editor.toolbar.comment",
187
- icon: "ph--chat-text--regular",
188
- label: [
189
- `${state.commentEnabled} label`,
190
- {
191
- ns: SHEET_PLUGIN
192
- }
193
- ],
194
- disabled: state.commentEnabled !== "comment"
195
- });
196
- var createComment = (model, state, onComment, cursorFallbackRange) => ({
197
- nodes: [
198
- createCommentAction(model, state, onComment, cursorFallbackRange)
199
- ],
200
- edges: [
201
- {
202
- source: "root",
203
- target: "comment"
204
- }
205
- ]
206
- });
207
-
208
165
  // packages/plugins/plugin-sheet/src/components/SheetToolbar/style.ts
209
- import { useEffect as useEffect3 } from "react";
166
+ import { useEffect as useEffect2 } from "react";
210
167
  import { inRange as inRange2 } from "@dxos/compute";
211
- import { createMenuAction as createMenuAction3, createMenuItemGroup as createMenuItemGroup2 } from "@dxos/react-ui-menu";
168
+ import { createMenuAction as createMenuAction2, createMenuItemGroup as createMenuItemGroup2 } from "@dxos/react-ui-menu";
212
169
  var styles = {
213
170
  highlight: "ph--highlighter--regular",
214
171
  softwrap: "ph--paragraph--regular"
215
172
  };
216
173
  var useStyleState = (state) => {
217
174
  const { cursorFallbackRange, model } = useSheetContext();
218
- useEffect3(() => {
175
+ useEffect2(() => {
219
176
  state.highlight = false;
220
177
  state.softwrap = false;
221
178
  if (cursorFallbackRange && model.sheet.ranges) {
@@ -236,7 +193,7 @@ var createStyleGroup = (state) => {
236
193
  });
237
194
  };
238
195
  var createStyleActions = (model, state, cursorFallbackRange) => Object.entries(styles).map(([styleValue, icon]) => {
239
- return createMenuAction3(`style--${styleValue}`, () => {
196
+ return createMenuAction2(`style--${styleValue}`, () => {
240
197
  if (!cursorFallbackRange) {
241
198
  return;
242
199
  }
@@ -290,79 +247,101 @@ var createStyle = (model, state, cursorFallbackRange) => {
290
247
  };
291
248
 
292
249
  // packages/plugins/plugin-sheet/src/components/SheetToolbar/useToolbarState.ts
293
- import { useMemo as useMemo2 } from "react";
250
+ import { useMemo } from "react";
294
251
  import { live } from "@dxos/live-object";
295
252
  var useToolbarState = (initialState = {}) => {
296
- return useMemo2(() => live(initialState), []);
253
+ return useMemo(() => live(initialState), []);
297
254
  };
298
255
 
299
256
  // packages/plugins/plugin-sheet/src/components/SheetToolbar/SheetToolbar.tsx
300
- var createToolbarActions = (model, state, onComment, cursorFallbackRange) => {
301
- const align = createAlign(model, state, cursorFallbackRange);
302
- const style = createStyle(model, state, cursorFallbackRange);
303
- const gap = createGapSeparator();
304
- const comment = createComment(model, state, onComment, cursorFallbackRange);
305
- return {
306
- nodes: [
257
+ var createToolbarActions = (model, state, cursorFallbackRange, customActions) => {
258
+ return Rx.make((get) => {
259
+ const align = get(rxFromSignal(() => createAlign(model, state, cursorFallbackRange)));
260
+ const style = get(rxFromSignal(() => createStyle(model, state, cursorFallbackRange)));
261
+ const gap = createGapSeparator();
262
+ const nodes = [
307
263
  ...align.nodes,
308
264
  ...style.nodes,
309
- ...gap.nodes,
310
- ...comment.nodes
311
- ],
312
- edges: [
265
+ ...gap.nodes
266
+ ];
267
+ const edges = [
313
268
  ...align.edges,
314
269
  ...style.edges,
315
- ...gap.edges,
316
- ...comment.edges
317
- ]
318
- };
270
+ ...gap.edges
271
+ ];
272
+ if (customActions) {
273
+ const custom = get(customActions);
274
+ nodes.push(...custom.nodes);
275
+ edges.push(...custom.edges);
276
+ }
277
+ return {
278
+ nodes,
279
+ edges
280
+ };
281
+ });
319
282
  };
320
- var SheetToolbar = ({ attendableId, classNames }) => {
321
- const { dispatchPromise: dispatch } = useIntentDispatcher();
322
- const { model, cursorFallbackRange } = useSheetContext();
323
- const state = useToolbarState({});
324
- useAlignState(state);
325
- useStyleState(state);
326
- useCommentState(state);
327
- const handleComment = useCallback((name, cursor) => dispatch(createIntent(ThreadAction.Create, {
328
- cursor,
329
- name,
330
- subject: model.sheet
331
- })), [
332
- model.sheet,
333
- dispatch
334
- ]);
335
- const actionsCreator = useCallback(() => createToolbarActions(model, state, handleComment, cursorFallbackRange), [
336
- model,
337
- state,
338
- handleComment,
339
- cursorFallbackRange
340
- ]);
341
- const menu = useMenuActions(actionsCreator);
342
- return /* @__PURE__ */ React2.createElement(MenuProvider, {
343
- ...menu,
344
- attendableId
345
- }, /* @__PURE__ */ React2.createElement(ToolbarMenu, {
346
- classNames
347
- }));
283
+ var SheetToolbar = ({ id, classNames }) => {
284
+ var _effect = _useSignals3();
285
+ try {
286
+ const { model, cursorFallbackRange } = useSheetContext();
287
+ const state = useToolbarState({});
288
+ useAlignState(state);
289
+ useStyleState(state);
290
+ const { graph } = useAppGraph();
291
+ const customActions = useMemo2(() => {
292
+ return Rx.make((get) => {
293
+ const actions = get(graph.actions(id));
294
+ const nodes = actions.filter((action) => action.properties.disposition === "toolbar");
295
+ return {
296
+ nodes,
297
+ edges: nodes.map((node) => ({
298
+ source: "root",
299
+ target: node.id
300
+ }))
301
+ };
302
+ });
303
+ }, [
304
+ graph
305
+ ]);
306
+ const actionsCreator = useMemo2(() => createToolbarActions(model, state, cursorFallbackRange, customActions), [
307
+ model,
308
+ state,
309
+ cursorFallbackRange,
310
+ customActions
311
+ ]);
312
+ const menu = useMenuActions(actionsCreator);
313
+ return /* @__PURE__ */ React2.createElement(MenuProvider, {
314
+ ...menu,
315
+ attendableId: id
316
+ }, /* @__PURE__ */ React2.createElement(ToolbarMenu, {
317
+ classNames
318
+ }));
319
+ } finally {
320
+ _effect.f();
321
+ }
348
322
  };
349
323
 
350
324
  // packages/plugins/plugin-sheet/src/components/SheetContainer/SheetContainer.tsx
351
325
  var SheetContainer = ({ space, sheet, role, ignoreAttention }) => {
352
- const graph = useComputeGraph(space);
353
- return graph ? /* @__PURE__ */ React3.createElement(SheetProvider, {
354
- sheet,
355
- graph,
356
- ignoreAttention
357
- }, /* @__PURE__ */ React3.createElement(StackItem.Content, {
358
- toolbar: true,
359
- statusbar: true,
360
- ...role === "section" && {
361
- classNames: "aspect-video"
362
- }
363
- }, /* @__PURE__ */ React3.createElement(SheetToolbar, {
364
- attendableId: fullyQualifiedId(sheet)
365
- }), /* @__PURE__ */ React3.createElement(GridSheet, null), /* @__PURE__ */ React3.createElement(FunctionEditor, null))) : null;
326
+ var _effect = _useSignals4();
327
+ try {
328
+ const graph = useComputeGraph(space);
329
+ return graph ? /* @__PURE__ */ React3.createElement(SheetProvider, {
330
+ sheet,
331
+ graph,
332
+ ignoreAttention
333
+ }, /* @__PURE__ */ React3.createElement(StackItem.Content, {
334
+ toolbar: true,
335
+ statusbar: true,
336
+ ...role === "section" && {
337
+ classNames: "aspect-video"
338
+ }
339
+ }, /* @__PURE__ */ React3.createElement(SheetToolbar, {
340
+ id: fullyQualifiedId(sheet)
341
+ }), /* @__PURE__ */ React3.createElement(GridSheet, null), /* @__PURE__ */ React3.createElement(FunctionEditor, null))) : null;
342
+ } finally {
343
+ _effect.f();
344
+ }
366
345
  };
367
346
 
368
347
  // packages/plugins/plugin-sheet/src/components/SheetContainer/index.ts
@@ -370,4 +349,4 @@ var SheetContainer_default = SheetContainer;
370
349
  export {
371
350
  SheetContainer_default as default
372
351
  };
373
- //# sourceMappingURL=SheetContainer-XW7B2AJI.mjs.map
352
+ //# sourceMappingURL=SheetContainer-44KHKMPI.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/SheetContainer/SheetContainer.tsx", "../../../src/components/FunctionEditor/FunctionEditor.tsx", "../../../src/components/SheetToolbar/SheetToolbar.tsx", "../../../src/components/SheetToolbar/align.ts", "../../../src/components/SheetToolbar/style.ts", "../../../src/components/SheetToolbar/useToolbarState.ts", "../../../src/components/SheetContainer/index.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { fullyQualifiedId, type Space } from '@dxos/react-client/echo';\nimport { StackItem } from '@dxos/react-ui-stack';\n\nimport { type SheetType } from '../../types';\nimport { useComputeGraph } from '../ComputeGraph';\nimport { FunctionEditor } from '../FunctionEditor';\nimport { GridSheet } from '../GridSheet';\nimport { SheetProvider } from '../SheetContext';\nimport { SheetToolbar } from '../SheetToolbar';\n\nexport type SheetContainerProps = {\n space: Space;\n sheet: SheetType;\n role?: string;\n ignoreAttention?: boolean;\n};\n\nexport const SheetContainer = ({ space, sheet, role, ignoreAttention }: SheetContainerProps) => {\n const graph = useComputeGraph(space);\n\n return graph ? (\n <SheetProvider sheet={sheet} graph={graph} ignoreAttention={ignoreAttention}>\n <StackItem.Content toolbar statusbar {...(role === 'section' && { classNames: 'aspect-video' })}>\n <SheetToolbar id={fullyQualifiedId(sheet)} />\n <GridSheet />\n <FunctionEditor />\n </StackItem.Content>\n </SheetProvider>\n ) : null;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport { addressToA1Notation, isFormula, rangeToA1Notation } from '@dxos/compute';\nimport { Icon } from '@dxos/react-ui';\n\nimport { mapFormulaIndicesToRefs } from '../../types';\nimport { useSheetContext } from '../SheetContext';\n\nexport const FunctionEditor = () => {\n const { model, cursor, range } = useSheetContext();\n\n let value;\n let formula = false;\n if (cursor) {\n value = model.getCellValue(cursor);\n if (isFormula(value)) {\n value = model.graph.mapFunctionBindingFromId(mapFormulaIndicesToRefs(model.sheet, value));\n formula = true;\n } else if (value != null) {\n value = String(value);\n }\n }\n\n return (\n <div className='flex shrink-0 justify-between items-center px-4 py-1 text-sm bg-toolbarSurface border-bs !border-subduedSeparator'>\n <div className='flex gap-4 items-center'>\n <div className='flex w-16 items-center font-mono'>\n {(range && rangeToA1Notation(range)) || (cursor && addressToA1Notation(cursor))}\n </div>\n <div className='flex gap-2 items-center'>\n <Icon icon='ph--function--regular' classNames={['text-greenText', formula ? 'visible' : 'invisible']} />\n <span className='font-mono'>{value}</span>\n </div>\n </div>\n </div>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Rx } from '@effect-rx/rx-react';\nimport React, { type PropsWithChildren, useMemo } from 'react';\n\nimport { useAppGraph } from '@dxos/app-framework';\nimport { type CompleteCellRange } from '@dxos/compute';\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport {\n type ActionGraphEdges,\n type ActionGraphNodes,\n type ActionGraphProps,\n createGapSeparator,\n MenuProvider,\n rxFromSignal,\n ToolbarMenu,\n useMenuActions,\n} from '@dxos/react-ui-menu';\n\nimport { createAlign, useAlignState } from './align';\nimport { createStyle, useStyleState } from './style';\nimport { type ToolbarState, useToolbarState } from './useToolbarState';\nimport { type SheetModel } from '../../model';\nimport { useSheetContext } from '../SheetContext';\n\n//\n// Root\n//\n\nexport type SheetToolbarProps = ThemedClassName<PropsWithChildren<{ id: string }>>;\n\nconst createToolbarActions = (\n model: SheetModel,\n state: ToolbarState,\n cursorFallbackRange?: CompleteCellRange,\n customActions?: Rx.Rx<ActionGraphProps>,\n) => {\n return Rx.make((get) => {\n const align = get(rxFromSignal(() => createAlign(model, state, cursorFallbackRange)));\n const style = get(rxFromSignal(() => createStyle(model, state, cursorFallbackRange)));\n const gap = createGapSeparator();\n const nodes: ActionGraphNodes = [...align.nodes, ...style.nodes, ...gap.nodes];\n const edges: ActionGraphEdges = [...align.edges, ...style.edges, ...gap.edges];\n if (customActions) {\n const custom = get(customActions);\n nodes.push(...custom.nodes);\n edges.push(...custom.edges);\n }\n return {\n nodes,\n edges,\n };\n });\n};\n\nexport const SheetToolbar = ({ id, classNames }: SheetToolbarProps) => {\n const { model, cursorFallbackRange } = useSheetContext();\n const state = useToolbarState({});\n useAlignState(state);\n useStyleState(state);\n\n const { graph } = useAppGraph();\n const customActions = useMemo(() => {\n return Rx.make((get) => {\n const actions = get(graph.actions(id));\n const nodes = actions.filter((action) => action.properties.disposition === 'toolbar');\n return { nodes, edges: nodes.map((node) => ({ source: 'root', target: node.id })) };\n });\n }, [graph]);\n\n const actionsCreator = useMemo(\n () => createToolbarActions(model, state, cursorFallbackRange, customActions),\n [model, state, cursorFallbackRange, customActions],\n );\n const menu = useMenuActions(actionsCreator);\n\n return (\n <MenuProvider {...menu} attendableId={id}>\n <ToolbarMenu classNames={classNames} />\n </MenuProvider>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect } from 'react';\n\nimport { type CompleteCellRange, inRange } from '@dxos/compute';\nimport { createMenuAction, createMenuItemGroup, type ToolbarMenuActionGroupProperties } from '@dxos/react-ui-menu';\n\nimport { type ToolbarState } from './useToolbarState';\nimport { SHEET_PLUGIN } from '../../meta';\nimport { type SheetModel } from '../../model';\nimport { type AlignKey, alignKey, type AlignValue, rangeFromIndex, rangeToIndex } from '../../types';\nimport { useSheetContext } from '../SheetContext';\n\nexport type AlignAction = { key: AlignKey; value: AlignValue };\n\nexport type AlignState = { [alignKey]: AlignValue | undefined };\n\nconst aligns: Record<AlignValue, string> = {\n start: 'ph--text-align-left--regular',\n center: 'ph--text-align-center--regular',\n end: 'ph--text-align-right--regular',\n};\n\nexport const useAlignState = (state: Partial<AlignState>) => {\n const { cursor, model } = useSheetContext();\n useEffect(() => {\n // TODO(thure): Can this O(n) call be memoized?\n state[alignKey] = (\n cursor\n ? model.sheet.ranges?.findLast(\n ({ range, key }) => key === alignKey && inRange(rangeFromIndex(model.sheet, range), cursor),\n )?.value\n : undefined\n ) as AlignValue | undefined;\n }, [cursor, model.sheet]);\n};\n\nconst createAlignGroupAction = (value?: AlignValue) =>\n createMenuItemGroup('align', {\n label: ['align label', { ns: SHEET_PLUGIN }],\n variant: 'toggleGroup',\n selectCardinality: 'single',\n value: `${alignKey}--${value}`,\n } as ToolbarMenuActionGroupProperties);\n\nconst createAlignActions = (model: SheetModel, state: ToolbarState, cursorFallbackRange?: CompleteCellRange) =>\n Object.entries(aligns).map(([alignValue, icon]) => {\n return createMenuAction<AlignAction>(\n `${alignKey}--${alignValue}`,\n () => {\n if (!cursorFallbackRange) {\n return;\n }\n const index =\n model.sheet.ranges?.findIndex(\n (range) =>\n range.key === alignKey && inRange(rangeFromIndex(model.sheet, range.range), cursorFallbackRange.from),\n ) ?? -1;\n const nextRangeEntity = {\n range: rangeToIndex(model.sheet, cursorFallbackRange),\n key: alignKey,\n value: alignValue as AlignValue,\n };\n if (index < 0) {\n model.sheet.ranges?.push(nextRangeEntity);\n state[alignKey] = nextRangeEntity.value;\n } else if (model.sheet.ranges![index].value === nextRangeEntity.value) {\n model.sheet.ranges?.splice(index, 1);\n state[alignKey] = undefined;\n } else {\n model.sheet.ranges?.splice(index, 1, nextRangeEntity);\n state[alignKey] = nextRangeEntity.value;\n }\n },\n {\n key: alignKey,\n value: alignValue as AlignValue,\n checked: state[alignKey] === alignValue,\n label: [`range value ${alignValue} label`, { ns: SHEET_PLUGIN }],\n icon,\n testId: `grid.toolbar.${alignKey}.${alignValue}`,\n },\n );\n });\n\nexport const createAlign = (model: SheetModel, state: ToolbarState, cursorFallbackRange?: CompleteCellRange) => {\n const alignGroup = createAlignGroupAction(state[alignKey]);\n const alignActions = createAlignActions(model, state, cursorFallbackRange);\n return {\n nodes: [alignGroup, ...alignActions],\n edges: [\n { source: 'root', target: 'align' },\n ...alignActions.map(({ id }) => ({ source: alignGroup.id, target: id })),\n ],\n };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect } from 'react';\n\nimport { type CompleteCellRange, inRange } from '@dxos/compute';\nimport { createMenuAction, createMenuItemGroup, type ToolbarMenuActionGroupProperties } from '@dxos/react-ui-menu';\n\nimport { SHEET_PLUGIN } from '../../meta';\nimport { type SheetModel } from '../../model';\nimport { rangeFromIndex, rangeToIndex, type StyleKey, type StyleValue } from '../../types';\nimport { useSheetContext } from '../SheetContext';\n\nexport type StyleState = Partial<Record<StyleValue, boolean>>;\n\nexport type StyleAction = { key: StyleKey; value: StyleValue };\n\nconst styles: Record<StyleValue, string> = {\n highlight: 'ph--highlighter--regular',\n softwrap: 'ph--paragraph--regular',\n};\n\nexport const useStyleState = (state: StyleState) => {\n const { cursorFallbackRange, model } = useSheetContext();\n\n useEffect(() => {\n state.highlight = false;\n state.softwrap = false;\n if (cursorFallbackRange && model.sheet.ranges) {\n model.sheet.ranges\n .filter(\n ({ range, key }) => key === 'style' && inRange(rangeFromIndex(model.sheet, range), cursorFallbackRange.from),\n )\n .forEach(({ value }) => {\n state[value as StyleValue] = true;\n });\n }\n }, [cursorFallbackRange, model.sheet]);\n};\n\nconst createStyleGroup = (state: StyleState) => {\n return createMenuItemGroup('style', {\n variant: 'toggleGroup',\n selectCardinality: 'multiple',\n value: Object.keys(styles)\n .filter((key) => !!state[key as StyleValue])\n .map((styleValue) => `style--${styleValue}`),\n } as ToolbarMenuActionGroupProperties);\n};\n\nconst createStyleActions = (model: SheetModel, state: StyleState, cursorFallbackRange?: CompleteCellRange) =>\n Object.entries(styles).map(([styleValue, icon]) => {\n return createMenuAction<StyleAction>(\n `style--${styleValue}`,\n () => {\n if (!cursorFallbackRange) {\n return;\n }\n const index =\n model.sheet.ranges?.findIndex(\n (range) =>\n range.key === 'style' && inRange(rangeFromIndex(model.sheet, range.range), cursorFallbackRange.from),\n ) ?? -1;\n const nextRangeEntity = {\n range: rangeToIndex(model.sheet, cursorFallbackRange),\n key: 'style',\n value: styleValue as StyleValue,\n };\n if (\n model.sheet.ranges\n .filter(\n ({ range, key: rangeKey }) =>\n rangeKey === 'style' && inRange(rangeFromIndex(model.sheet, range), cursorFallbackRange.from),\n )\n .some(({ value: rangeValue }) => rangeValue === styleValue)\n ) {\n // this value should be unset\n if (index >= 0) {\n model.sheet.ranges?.splice(index, 1);\n }\n state[nextRangeEntity.value] = false;\n } else {\n model.sheet.ranges?.push(nextRangeEntity);\n state[nextRangeEntity.value] = true;\n }\n },\n {\n key: 'style',\n value: styleValue as StyleValue,\n icon,\n label: [`range value ${styleValue} label`, { ns: SHEET_PLUGIN }],\n checked: !!state[styleValue as StyleValue],\n },\n );\n });\n\nexport const createStyle = (model: SheetModel, state: StyleState, cursorFallbackRange?: CompleteCellRange) => {\n const styleGroupAction = createStyleGroup(state);\n const styleActions = createStyleActions(model, state, cursorFallbackRange);\n return {\n nodes: [styleGroupAction, ...styleActions],\n edges: [\n { source: 'root', target: 'style' },\n ...styleActions.map(({ id }) => ({ source: styleGroupAction.id, target: id })),\n ],\n };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useMemo } from 'react';\n\nimport { live } from '@dxos/live-object';\n\nimport { type AlignState } from './align';\nimport { type StyleState } from './style';\n\nexport type ToolbarState = Partial<StyleState & AlignState>;\n\nexport const useToolbarState = (initialState: ToolbarState = {}) => {\n return useMemo(() => live<ToolbarState>(initialState), []);\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { SheetContainer } from './SheetContainer';\n\nexport default SheetContainer;\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "fullyQualifiedId", "StackItem", "React", "addressToA1Notation", "isFormula", "rangeToA1Notation", "Icon", "FunctionEditor", "model", "cursor", "range", "useSheetContext", "value", "formula", "getCellValue", "isFormula", "graph", "mapFunctionBindingFromId", "mapFormulaIndicesToRefs", "sheet", "String", "div", "className", "rangeToA1Notation", "addressToA1Notation", "Icon", "icon", "classNames", "span", "Rx", "React", "useMemo", "useAppGraph", "createGapSeparator", "MenuProvider", "rxFromSignal", "ToolbarMenu", "useMenuActions", "useEffect", "inRange", "createMenuAction", "createMenuItemGroup", "aligns", "start", "center", "end", "useAlignState", "state", "cursor", "model", "useSheetContext", "useEffect", "alignKey", "sheet", "ranges", "findLast", "range", "key", "inRange", "rangeFromIndex", "value", "undefined", "createAlignGroupAction", "createMenuItemGroup", "label", "ns", "SHEET_PLUGIN", "variant", "selectCardinality", "createAlignActions", "cursorFallbackRange", "Object", "entries", "map", "alignValue", "icon", "createMenuAction", "index", "findIndex", "from", "nextRangeEntity", "rangeToIndex", "push", "splice", "checked", "testId", "createAlign", "alignGroup", "alignActions", "nodes", "edges", "source", "target", "id", "useEffect", "inRange", "createMenuAction", "createMenuItemGroup", "styles", "highlight", "softwrap", "useStyleState", "state", "cursorFallbackRange", "model", "useSheetContext", "useEffect", "sheet", "ranges", "filter", "range", "key", "inRange", "rangeFromIndex", "from", "forEach", "value", "createStyleGroup", "createMenuItemGroup", "variant", "selectCardinality", "Object", "keys", "map", "styleValue", "createStyleActions", "entries", "icon", "createMenuAction", "index", "findIndex", "nextRangeEntity", "rangeToIndex", "rangeKey", "some", "rangeValue", "splice", "push", "label", "ns", "SHEET_PLUGIN", "checked", "createStyle", "styleGroupAction", "styleActions", "nodes", "edges", "source", "target", "id", "useMemo", "live", "useToolbarState", "initialState", "useMemo", "live", "createToolbarActions", "model", "state", "cursorFallbackRange", "customActions", "Rx", "make", "get", "align", "rxFromSignal", "createAlign", "style", "createStyle", "gap", "createGapSeparator", "nodes", "edges", "custom", "push", "SheetToolbar", "id", "classNames", "useSheetContext", "useToolbarState", "useAlignState", "useStyleState", "graph", "useAppGraph", "useMemo", "actions", "filter", "action", "properties", "disposition", "map", "node", "source", "target", "actionsCreator", "menu", "useMenuActions", "React", "MenuProvider", "attendableId", "ToolbarMenu", "SheetContainer", "space", "sheet", "role", "ignoreAttention", "graph", "useComputeGraph", "React", "SheetProvider", "StackItem", "Content", "toolbar", "statusbar", "classNames", "SheetToolbar", "id", "fullyQualifiedId", "GridSheet", "FunctionEditor", "SheetContainer"]
7
+ }
@@ -0,0 +1,25 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+ import {
3
+ SheetType,
4
+ compareIndexPositions
5
+ } from "./chunk-DIF3IOAB.mjs";
6
+ import "./chunk-Y6ND5HWX.mjs";
7
+
8
+ // packages/plugins/plugin-sheet/src/capabilities/anchor-sort.ts
9
+ import { Capabilities, contributes } from "@dxos/app-framework";
10
+ import { getSchemaTypename } from "@dxos/echo-schema";
11
+ import { getTarget } from "@dxos/react-client/echo";
12
+ var anchor_sort_default = () => contributes(Capabilities.AnchorSort, {
13
+ key: getSchemaTypename(SheetType),
14
+ sort: (anchorA, anchorB) => {
15
+ const sheet = getTarget(anchorA);
16
+ if (sheet !== getTarget(anchorB)) {
17
+ return 0;
18
+ }
19
+ return !anchorA.anchor || !anchorB.anchor ? 0 : compareIndexPositions(sheet, anchorA.anchor, anchorB.anchor);
20
+ }
21
+ });
22
+ export {
23
+ anchor_sort_default as default
24
+ };
25
+ //# sourceMappingURL=anchor-sort-3E2VGLO6.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/anchor-sort.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capabilities, contributes } from '@dxos/app-framework';\nimport { getSchemaTypename } from '@dxos/echo-schema';\nimport { getTarget } from '@dxos/react-client/echo';\n\nimport { compareIndexPositions, SheetType } from '../types';\n\nexport default () =>\n contributes(Capabilities.AnchorSort, {\n key: getSchemaTypename(SheetType)!,\n sort: (anchorA, anchorB) => {\n const sheet = getTarget(anchorA) as SheetType;\n if (sheet !== getTarget(anchorB)) {\n return 0;\n }\n\n return !anchorA.anchor || !anchorB.anchor ? 0 : compareIndexPositions(sheet, anchorA.anchor, anchorB.anchor);\n },\n });\n"],
5
+ "mappings": ";;;;;;;;AAIA,SAASA,cAAcC,mBAAmB;AAC1C,SAASC,yBAAyB;AAClC,SAASC,iBAAiB;AAI1B,IAAA,sBAAe,MACbC,YAAYC,aAAaC,YAAY;EACnCC,KAAKC,kBAAkBC,SAAAA;EACvBC,MAAM,CAACC,SAASC,YAAAA;AACd,UAAMC,QAAQC,UAAUH,OAAAA;AACxB,QAAIE,UAAUC,UAAUF,OAAAA,GAAU;AAChC,aAAO;IACT;AAEA,WAAO,CAACD,QAAQI,UAAU,CAACH,QAAQG,SAAS,IAAIC,sBAAsBH,OAAOF,QAAQI,QAAQH,QAAQG,MAAM;EAC7G;AACF,CAAA;",
6
+ "names": ["Capabilities", "contributes", "getSchemaTypename", "getTarget", "contributes", "Capabilities", "AnchorSort", "key", "getSchemaTypename", "SheetType", "sort", "anchorA", "anchorB", "sheet", "getTarget", "anchor", "compareIndexPositions"]
7
+ }
@@ -5,8 +5,7 @@ import {
5
5
 
6
6
  // packages/plugins/plugin-sheet/src/types/schema.ts
7
7
  import { Schema } from "effect";
8
- import { Ref, TypedObject } from "@dxos/echo-schema";
9
- import { ThreadType } from "@dxos/plugin-space/types";
8
+ import { TypedObject } from "@dxos/echo-schema";
10
9
  var CellValue = Schema.Struct({
11
10
  // TODO(burdon): How to store dates (datetime, date, time), percentages, etc.
12
11
  // Consider import/export; natural access for other plugins. Special handling for currency (precision).
@@ -46,9 +45,7 @@ var SheetType = class extends TypedObject({
46
45
  value: Schema.mutable(RowColumnMeta)
47
46
  })),
48
47
  // Cell formatting referenced by indexed range.
49
- ranges: Schema.mutable(Schema.Array(Range)),
50
- // Threads associated with the sheet
51
- threads: Schema.optional(Schema.mutable(Schema.Array(Ref(ThreadType))))
48
+ ranges: Schema.mutable(Schema.Array(Range))
52
49
  }) {
53
50
  };
54
51
 
@@ -143,12 +140,7 @@ var toModelRange = (sheet, range) => ({
143
140
  });
144
141
  var SheetModel = class extends Resource {
145
142
  constructor(_graph, _sheet, _options = {}) {
146
- super();
147
- this._graph = _graph;
148
- this._sheet = _sheet;
149
- this._options = _options;
150
- this.id = `model-${PublicKey.random().truncate()}`;
151
- this.update = new Event();
143
+ super(), this._graph = _graph, this._sheet = _sheet, this._options = _options, this.id = `model-${PublicKey.random().truncate()}`, this.update = new Event();
152
144
  }
153
145
  get graph() {
154
146
  return this._graph;
@@ -691,7 +683,6 @@ var useSheetModel = (graph, sheet, { readonly } = {}) => {
691
683
  };
692
684
 
693
685
  // packages/plugins/plugin-sheet/src/types/types.ts
694
- var SheetAction;
695
686
  (function(SheetAction2) {
696
687
  const SHEET_ACTION = `${SHEET_PLUGIN}/action`;
697
688
  class Create extends Schema2.TaggedClass()(`${SHEET_ACTION}/create`, {
@@ -737,6 +728,7 @@ var SheetAction;
737
728
  }
738
729
  SheetAction2.DropAxis = DropAxis;
739
730
  })(SheetAction || (SheetAction = {}));
731
+ var SheetAction;
740
732
 
741
733
  // packages/plugins/plugin-sheet/src/types/util.ts
742
734
  import { addressFromA1Notation as addressFromA1Notation2, addressToA1Notation as addressToA1Notation2, isFormula as isFormula2 } from "@dxos/compute";
@@ -790,8 +782,7 @@ var createSheet = ({ name, cells, ...size } = {}) => {
790
782
  columns: [],
791
783
  rowMeta: {},
792
784
  columnMeta: {},
793
- ranges: [],
794
- threads: []
785
+ ranges: []
795
786
  });
796
787
  initialize(sheet, size);
797
788
  if (cells) {
@@ -842,7 +833,7 @@ var compareIndexPositions = (sheet, indexA, indexB) => {
842
833
  var mapFormulaRefsToIndices = (sheet, formula) => {
843
834
  invariant2(isFormula2(formula), void 0, {
844
835
  F: __dxlog_file2,
845
- L: 153,
836
+ L: 152,
846
837
  S: void 0,
847
838
  A: [
848
839
  "isFormula(formula)",
@@ -856,7 +847,7 @@ var mapFormulaRefsToIndices = (sheet, formula) => {
856
847
  var mapFormulaIndicesToRefs = (sheet, formula) => {
857
848
  invariant2(isFormula2(formula), void 0, {
858
849
  F: __dxlog_file2,
859
- L: 163,
850
+ L: 162,
860
851
  S: void 0,
861
852
  A: [
862
853
  "isFormula(formula)",
@@ -899,4 +890,4 @@ export {
899
890
  mapFormulaRefsToIndices,
900
891
  mapFormulaIndicesToRefs
901
892
  };
902
- //# sourceMappingURL=chunk-LYZV4Q4C.mjs.map
893
+ //# sourceMappingURL=chunk-DIF3IOAB.mjs.map