@dxos/plugin-sheet 0.8.2-main.fbd8ed0 → 0.8.2-staging.4d6ad0f

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
@@ -0,0 +1,351 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var SheetContainer_UUDOHLZR_exports = {};
30
+ __export(SheetContainer_UUDOHLZR_exports, {
31
+ default: () => SheetContainer_default
32
+ });
33
+ module.exports = __toCommonJS(SheetContainer_UUDOHLZR_exports);
34
+ var import_chunk_BXBNSNDK = require("./chunk-BXBNSNDK.cjs");
35
+ var import_chunk_76NESQLB = require("./chunk-76NESQLB.cjs");
36
+ var import_chunk_FIM6EZ6M = require("./chunk-FIM6EZ6M.cjs");
37
+ var import_chunk_JSIDCZHB = require("./chunk-JSIDCZHB.cjs");
38
+ var import_tracking = require("@preact-signals/safe-react/tracking");
39
+ var import_react = __toESM(require("react"));
40
+ var import_echo = require("@dxos/react-client/echo");
41
+ var import_react_ui_stack = require("@dxos/react-ui-stack");
42
+ var import_tracking2 = require("@preact-signals/safe-react/tracking");
43
+ var import_react2 = __toESM(require("react"));
44
+ var import_compute = require("@dxos/compute");
45
+ var import_react_ui = require("@dxos/react-ui");
46
+ var import_tracking3 = require("@preact-signals/safe-react/tracking");
47
+ var import_rx_react = require("@effect-rx/rx-react");
48
+ var import_react3 = __toESM(require("react"));
49
+ var import_app_framework = require("@dxos/app-framework");
50
+ var import_react_ui_menu = require("@dxos/react-ui-menu");
51
+ var import_tracking4 = require("@preact-signals/safe-react/tracking");
52
+ var import_react4 = require("react");
53
+ var import_compute2 = require("@dxos/compute");
54
+ var import_react_ui_menu2 = require("@dxos/react-ui-menu");
55
+ var import_react5 = require("react");
56
+ var import_compute3 = require("@dxos/compute");
57
+ var import_react_ui_menu3 = require("@dxos/react-ui-menu");
58
+ var import_react6 = require("react");
59
+ var import_live_object = require("@dxos/live-object");
60
+ var FunctionEditor = () => {
61
+ var _effect = (0, import_tracking2.useSignals)();
62
+ try {
63
+ const { model, cursor, range } = (0, import_chunk_BXBNSNDK.useSheetContext)();
64
+ let value;
65
+ let formula = false;
66
+ if (cursor) {
67
+ value = model.getCellValue(cursor);
68
+ if ((0, import_compute.isFormula)(value)) {
69
+ value = model.graph.mapFunctionBindingFromId((0, import_chunk_76NESQLB.mapFormulaIndicesToRefs)(model.sheet, value));
70
+ formula = true;
71
+ } else if (value != null) {
72
+ value = String(value);
73
+ }
74
+ }
75
+ return /* @__PURE__ */ import_react2.default.createElement("div", {
76
+ className: "flex shrink-0 justify-between items-center px-4 py-1 text-sm bg-toolbarSurface border-bs !border-subduedSeparator"
77
+ }, /* @__PURE__ */ import_react2.default.createElement("div", {
78
+ className: "flex gap-4 items-center"
79
+ }, /* @__PURE__ */ import_react2.default.createElement("div", {
80
+ className: "flex w-16 items-center font-mono"
81
+ }, range && (0, import_compute.rangeToA1Notation)(range) || cursor && (0, import_compute.addressToA1Notation)(cursor)), /* @__PURE__ */ import_react2.default.createElement("div", {
82
+ className: "flex gap-2 items-center"
83
+ }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Icon, {
84
+ icon: "ph--function--regular",
85
+ classNames: [
86
+ "text-greenText",
87
+ formula ? "visible" : "invisible"
88
+ ]
89
+ }), /* @__PURE__ */ import_react2.default.createElement("span", {
90
+ className: "font-mono"
91
+ }, value))));
92
+ } finally {
93
+ _effect.f();
94
+ }
95
+ };
96
+ var aligns = {
97
+ start: "ph--text-align-left--regular",
98
+ center: "ph--text-align-center--regular",
99
+ end: "ph--text-align-right--regular"
100
+ };
101
+ var useAlignState = (state) => {
102
+ var _effect = (0, import_tracking4.useSignals)();
103
+ try {
104
+ const { cursor, model } = (0, import_chunk_BXBNSNDK.useSheetContext)();
105
+ (0, import_react4.useEffect)(() => {
106
+ state[import_chunk_76NESQLB.alignKey] = cursor ? model.sheet.ranges?.findLast(({ range, key }) => key === import_chunk_76NESQLB.alignKey && (0, import_compute2.inRange)((0, import_chunk_76NESQLB.rangeFromIndex)(model.sheet, range), cursor))?.value : void 0;
107
+ }, [
108
+ cursor,
109
+ model.sheet
110
+ ]);
111
+ } finally {
112
+ _effect.f();
113
+ }
114
+ };
115
+ var createAlignGroupAction = (value) => (0, import_react_ui_menu2.createMenuItemGroup)("align", {
116
+ label: [
117
+ "align label",
118
+ {
119
+ ns: import_chunk_JSIDCZHB.SHEET_PLUGIN
120
+ }
121
+ ],
122
+ variant: "toggleGroup",
123
+ selectCardinality: "single",
124
+ value: `${import_chunk_76NESQLB.alignKey}--${value}`
125
+ });
126
+ var createAlignActions = (model, state, cursorFallbackRange) => Object.entries(aligns).map(([alignValue, icon]) => {
127
+ return (0, import_react_ui_menu2.createMenuAction)(`${import_chunk_76NESQLB.alignKey}--${alignValue}`, () => {
128
+ if (!cursorFallbackRange) {
129
+ return;
130
+ }
131
+ const index = model.sheet.ranges?.findIndex((range) => range.key === import_chunk_76NESQLB.alignKey && (0, import_compute2.inRange)((0, import_chunk_76NESQLB.rangeFromIndex)(model.sheet, range.range), cursorFallbackRange.from)) ?? -1;
132
+ const nextRangeEntity = {
133
+ range: (0, import_chunk_76NESQLB.rangeToIndex)(model.sheet, cursorFallbackRange),
134
+ key: import_chunk_76NESQLB.alignKey,
135
+ value: alignValue
136
+ };
137
+ if (index < 0) {
138
+ model.sheet.ranges?.push(nextRangeEntity);
139
+ state[import_chunk_76NESQLB.alignKey] = nextRangeEntity.value;
140
+ } else if (model.sheet.ranges[index].value === nextRangeEntity.value) {
141
+ model.sheet.ranges?.splice(index, 1);
142
+ state[import_chunk_76NESQLB.alignKey] = void 0;
143
+ } else {
144
+ model.sheet.ranges?.splice(index, 1, nextRangeEntity);
145
+ state[import_chunk_76NESQLB.alignKey] = nextRangeEntity.value;
146
+ }
147
+ }, {
148
+ key: import_chunk_76NESQLB.alignKey,
149
+ value: alignValue,
150
+ checked: state[import_chunk_76NESQLB.alignKey] === alignValue,
151
+ label: [
152
+ `range value ${alignValue} label`,
153
+ {
154
+ ns: import_chunk_JSIDCZHB.SHEET_PLUGIN
155
+ }
156
+ ],
157
+ icon,
158
+ testId: `grid.toolbar.${import_chunk_76NESQLB.alignKey}.${alignValue}`
159
+ });
160
+ });
161
+ var createAlign = (model, state, cursorFallbackRange) => {
162
+ const alignGroup = createAlignGroupAction(state[import_chunk_76NESQLB.alignKey]);
163
+ const alignActions = createAlignActions(model, state, cursorFallbackRange);
164
+ return {
165
+ nodes: [
166
+ alignGroup,
167
+ ...alignActions
168
+ ],
169
+ edges: [
170
+ {
171
+ source: "root",
172
+ target: "align"
173
+ },
174
+ ...alignActions.map(({ id }) => ({
175
+ source: alignGroup.id,
176
+ target: id
177
+ }))
178
+ ]
179
+ };
180
+ };
181
+ var styles = {
182
+ highlight: "ph--highlighter--regular",
183
+ softwrap: "ph--paragraph--regular"
184
+ };
185
+ var useStyleState = (state) => {
186
+ const { cursorFallbackRange, model } = (0, import_chunk_BXBNSNDK.useSheetContext)();
187
+ (0, import_react5.useEffect)(() => {
188
+ state.highlight = false;
189
+ state.softwrap = false;
190
+ if (cursorFallbackRange && model.sheet.ranges) {
191
+ model.sheet.ranges.filter(({ range, key }) => key === "style" && (0, import_compute3.inRange)((0, import_chunk_76NESQLB.rangeFromIndex)(model.sheet, range), cursorFallbackRange.from)).forEach(({ value }) => {
192
+ state[value] = true;
193
+ });
194
+ }
195
+ }, [
196
+ cursorFallbackRange,
197
+ model.sheet
198
+ ]);
199
+ };
200
+ var createStyleGroup = (state) => {
201
+ return (0, import_react_ui_menu3.createMenuItemGroup)("style", {
202
+ variant: "toggleGroup",
203
+ selectCardinality: "multiple",
204
+ value: Object.keys(styles).filter((key) => !!state[key]).map((styleValue) => `style--${styleValue}`)
205
+ });
206
+ };
207
+ var createStyleActions = (model, state, cursorFallbackRange) => Object.entries(styles).map(([styleValue, icon]) => {
208
+ return (0, import_react_ui_menu3.createMenuAction)(`style--${styleValue}`, () => {
209
+ if (!cursorFallbackRange) {
210
+ return;
211
+ }
212
+ const index = model.sheet.ranges?.findIndex((range) => range.key === "style" && (0, import_compute3.inRange)((0, import_chunk_76NESQLB.rangeFromIndex)(model.sheet, range.range), cursorFallbackRange.from)) ?? -1;
213
+ const nextRangeEntity = {
214
+ range: (0, import_chunk_76NESQLB.rangeToIndex)(model.sheet, cursorFallbackRange),
215
+ key: "style",
216
+ value: styleValue
217
+ };
218
+ if (model.sheet.ranges.filter(({ range, key: rangeKey }) => rangeKey === "style" && (0, import_compute3.inRange)((0, import_chunk_76NESQLB.rangeFromIndex)(model.sheet, range), cursorFallbackRange.from)).some(({ value: rangeValue }) => rangeValue === styleValue)) {
219
+ if (index >= 0) {
220
+ model.sheet.ranges?.splice(index, 1);
221
+ }
222
+ state[nextRangeEntity.value] = false;
223
+ } else {
224
+ model.sheet.ranges?.push(nextRangeEntity);
225
+ state[nextRangeEntity.value] = true;
226
+ }
227
+ }, {
228
+ key: "style",
229
+ value: styleValue,
230
+ icon,
231
+ label: [
232
+ `range value ${styleValue} label`,
233
+ {
234
+ ns: import_chunk_JSIDCZHB.SHEET_PLUGIN
235
+ }
236
+ ],
237
+ checked: !!state[styleValue]
238
+ });
239
+ });
240
+ var createStyle = (model, state, cursorFallbackRange) => {
241
+ const styleGroupAction = createStyleGroup(state);
242
+ const styleActions = createStyleActions(model, state, cursorFallbackRange);
243
+ return {
244
+ nodes: [
245
+ styleGroupAction,
246
+ ...styleActions
247
+ ],
248
+ edges: [
249
+ {
250
+ source: "root",
251
+ target: "style"
252
+ },
253
+ ...styleActions.map(({ id }) => ({
254
+ source: styleGroupAction.id,
255
+ target: id
256
+ }))
257
+ ]
258
+ };
259
+ };
260
+ var useToolbarState = (initialState = {}) => {
261
+ return (0, import_react6.useMemo)(() => (0, import_live_object.live)(initialState), []);
262
+ };
263
+ var createToolbarActions = (model, state, cursorFallbackRange, customActions) => {
264
+ return import_rx_react.Rx.make((get) => {
265
+ const align = get((0, import_react_ui_menu.rxFromSignal)(() => createAlign(model, state, cursorFallbackRange)));
266
+ const style = get((0, import_react_ui_menu.rxFromSignal)(() => createStyle(model, state, cursorFallbackRange)));
267
+ const gap = (0, import_react_ui_menu.createGapSeparator)();
268
+ const nodes = [
269
+ ...align.nodes,
270
+ ...style.nodes,
271
+ ...gap.nodes
272
+ ];
273
+ const edges = [
274
+ ...align.edges,
275
+ ...style.edges,
276
+ ...gap.edges
277
+ ];
278
+ if (customActions) {
279
+ const custom = get(customActions);
280
+ nodes.push(...custom.nodes);
281
+ edges.push(...custom.edges);
282
+ }
283
+ return {
284
+ nodes,
285
+ edges
286
+ };
287
+ });
288
+ };
289
+ var SheetToolbar = ({ id, classNames }) => {
290
+ var _effect = (0, import_tracking3.useSignals)();
291
+ try {
292
+ const { model, cursorFallbackRange } = (0, import_chunk_BXBNSNDK.useSheetContext)();
293
+ const state = useToolbarState({});
294
+ useAlignState(state);
295
+ useStyleState(state);
296
+ const { graph } = (0, import_app_framework.useAppGraph)();
297
+ const customActions = (0, import_react3.useMemo)(() => {
298
+ return import_rx_react.Rx.make((get) => {
299
+ const actions = get(graph.actions(id));
300
+ const nodes = actions.filter((action) => action.properties.disposition === "toolbar");
301
+ return {
302
+ nodes,
303
+ edges: nodes.map((node) => ({
304
+ source: "root",
305
+ target: node.id
306
+ }))
307
+ };
308
+ });
309
+ }, [
310
+ graph
311
+ ]);
312
+ const actionsCreator = (0, import_react3.useMemo)(() => createToolbarActions(model, state, cursorFallbackRange, customActions), [
313
+ model,
314
+ state,
315
+ cursorFallbackRange,
316
+ customActions
317
+ ]);
318
+ const menu = (0, import_react_ui_menu.useMenuActions)(actionsCreator);
319
+ return /* @__PURE__ */ import_react3.default.createElement(import_react_ui_menu.MenuProvider, {
320
+ ...menu,
321
+ attendableId: id
322
+ }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui_menu.ToolbarMenu, {
323
+ classNames
324
+ }));
325
+ } finally {
326
+ _effect.f();
327
+ }
328
+ };
329
+ var SheetContainer = ({ space, sheet, role, ignoreAttention }) => {
330
+ var _effect = (0, import_tracking.useSignals)();
331
+ try {
332
+ const graph = (0, import_chunk_BXBNSNDK.useComputeGraph)(space);
333
+ return graph ? /* @__PURE__ */ import_react.default.createElement(import_chunk_BXBNSNDK.SheetProvider, {
334
+ sheet,
335
+ graph,
336
+ ignoreAttention
337
+ }, /* @__PURE__ */ import_react.default.createElement(import_react_ui_stack.StackItem.Content, {
338
+ toolbar: true,
339
+ statusbar: true,
340
+ ...role === "section" && {
341
+ classNames: "aspect-video"
342
+ }
343
+ }, /* @__PURE__ */ import_react.default.createElement(SheetToolbar, {
344
+ id: (0, import_echo.fullyQualifiedId)(sheet)
345
+ }), /* @__PURE__ */ import_react.default.createElement(import_chunk_BXBNSNDK.GridSheet, null), /* @__PURE__ */ import_react.default.createElement(FunctionEditor, null))) : null;
346
+ } finally {
347
+ _effect.f();
348
+ }
349
+ };
350
+ var SheetContainer_default = SheetContainer;
351
+ //# sourceMappingURL=SheetContainer-UUDOHLZR.cjs.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": ["import_react", "import_compute", "import_react_ui_menu", "FunctionEditor", "model", "cursor", "range", "useSheetContext", "value", "formula", "getCellValue", "isFormula", "graph", "mapFunctionBindingFromId", "mapFormulaIndicesToRefs", "sheet", "String", "React", "div", "className", "rangeToA1Notation", "addressToA1Notation", "Icon", "icon", "classNames", "span", "aligns", "start", "center", "end", "useAlignState", "state", "useEffect", "alignKey", "ranges", "findLast", "key", "inRange", "rangeFromIndex", "undefined", "createAlignGroupAction", "createMenuItemGroup", "label", "ns", "SHEET_PLUGIN", "variant", "selectCardinality", "createAlignActions", "cursorFallbackRange", "Object", "entries", "map", "alignValue", "createMenuAction", "index", "findIndex", "from", "nextRangeEntity", "rangeToIndex", "push", "splice", "checked", "testId", "createAlign", "alignGroup", "alignActions", "nodes", "edges", "source", "target", "id", "styles", "highlight", "softwrap", "useStyleState", "filter", "forEach", "createStyleGroup", "keys", "styleValue", "createStyleActions", "rangeKey", "some", "rangeValue", "createStyle", "styleGroupAction", "styleActions", "useToolbarState", "initialState", "useMemo", "live", "createToolbarActions", "customActions", "Rx", "make", "get", "align", "rxFromSignal", "style", "gap", "createGapSeparator", "custom", "SheetToolbar", "useAppGraph", "actions", "action", "properties", "disposition", "node", "actionsCreator", "menu", "useMenuActions", "MenuProvider", "attendableId", "ToolbarMenu", "SheetContainer", "space", "role", "ignoreAttention", "useComputeGraph", "SheetProvider", "StackItem", "Content", "toolbar", "statusbar", "fullyQualifiedId", "GridSheet"]
7
+ }
@@ -16,17 +16,24 @@ var __copyProps = (to, from, except, desc) => {
16
16
  return to;
17
17
  };
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var thread_E7YPGR5T_exports = {};
20
- __export(thread_E7YPGR5T_exports, {
21
- default: () => thread_default
19
+ var anchor_sort_LTLYUTUP_exports = {};
20
+ __export(anchor_sort_LTLYUTUP_exports, {
21
+ default: () => anchor_sort_default
22
22
  });
23
- module.exports = __toCommonJS(thread_E7YPGR5T_exports);
24
- var import_chunk_HLSQVT3C = require("./chunk-HLSQVT3C.cjs");
23
+ module.exports = __toCommonJS(anchor_sort_LTLYUTUP_exports);
24
+ var import_chunk_76NESQLB = require("./chunk-76NESQLB.cjs");
25
25
  var import_chunk_JSIDCZHB = require("./chunk-JSIDCZHB.cjs");
26
26
  var import_app_framework = require("@dxos/app-framework");
27
- var import_plugin_space = require("@dxos/plugin-space");
28
- var thread_default = () => (0, import_app_framework.contributes)(import_plugin_space.ThreadCapabilities.Thread, {
29
- predicate: (data) => data instanceof import_chunk_HLSQVT3C.SheetType,
30
- createSort: (sheet) => (indexA, indexB) => !indexA || !indexB ? 0 : (0, import_chunk_HLSQVT3C.compareIndexPositions)(sheet, indexA, indexB)
27
+ var import_echo_schema = require("@dxos/echo-schema");
28
+ var import_echo = require("@dxos/react-client/echo");
29
+ var anchor_sort_default = () => (0, import_app_framework.contributes)(import_app_framework.Capabilities.AnchorSort, {
30
+ key: (0, import_echo_schema.getSchemaTypename)(import_chunk_76NESQLB.SheetType),
31
+ sort: (anchorA, anchorB) => {
32
+ const sheet = (0, import_echo.getTarget)(anchorA);
33
+ if (sheet !== (0, import_echo.getTarget)(anchorB)) {
34
+ return 0;
35
+ }
36
+ return !anchorA.anchor || !anchorB.anchor ? 0 : (0, import_chunk_76NESQLB.compareIndexPositions)(sheet, anchorA.anchor, anchorB.anchor);
37
+ }
31
38
  });
32
- //# sourceMappingURL=thread-E7YPGR5T.cjs.map
39
+ //# sourceMappingURL=anchor-sort-LTLYUTUP.cjs.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,2BAA0C;AAC1C,yBAAkC;AAClC,kBAA0B;AAI1B,IAAA,sBAAe,UACbA,kCAAYC,kCAAaC,YAAY;EACnCC,SAAKC,sCAAkBC,+BAAAA;EACvBC,MAAM,CAACC,SAASC,YAAAA;AACd,UAAMC,YAAQC,uBAAUH,OAAAA;AACxB,QAAIE,cAAUC,uBAAUF,OAAAA,GAAU;AAChC,aAAO;IACT;AAEA,WAAO,CAACD,QAAQI,UAAU,CAACH,QAAQG,SAAS,QAAIC,6CAAsBH,OAAOF,QAAQI,QAAQH,QAAQG,MAAM;EAC7G;AACF,CAAA;",
6
+ "names": ["contributes", "Capabilities", "AnchorSort", "key", "getSchemaTypename", "SheetType", "sort", "anchorA", "anchorB", "sheet", "getTarget", "anchor", "compareIndexPositions"]
7
+ }
@@ -16,8 +16,8 @@ var __copyProps = (to, from, except, desc) => {
16
16
  return to;
17
17
  };
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var chunk_HLSQVT3C_exports = {};
20
- __export(chunk_HLSQVT3C_exports, {
19
+ var chunk_76NESQLB_exports = {};
20
+ __export(chunk_76NESQLB_exports, {
21
21
  ApiError: () => ApiError,
22
22
  CellValue: () => CellValue,
23
23
  DEFAULT_COLS: () => DEFAULT_COLS,
@@ -48,11 +48,10 @@ __export(chunk_HLSQVT3C_exports, {
48
48
  styleKey: () => styleKey,
49
49
  useSheetModel: () => useSheetModel
50
50
  });
51
- module.exports = __toCommonJS(chunk_HLSQVT3C_exports);
51
+ module.exports = __toCommonJS(chunk_76NESQLB_exports);
52
52
  var import_chunk_JSIDCZHB = require("./chunk-JSIDCZHB.cjs");
53
53
  var import_effect = require("effect");
54
54
  var import_echo_schema = require("@dxos/echo-schema");
55
- var import_types = require("@dxos/plugin-space/types");
56
55
  var import_effect2 = require("effect");
57
56
  var import_async = require("@dxos/async");
58
57
  var import_compute = require("@dxos/compute");
@@ -105,9 +104,7 @@ var SheetType = class extends (0, import_echo_schema.TypedObject)({
105
104
  value: import_effect.Schema.mutable(RowColumnMeta)
106
105
  })),
107
106
  // Cell formatting referenced by indexed range.
108
- ranges: import_effect.Schema.mutable(import_effect.Schema.Array(Range)),
109
- // Threads associated with the sheet
110
- threads: import_effect.Schema.optional(import_effect.Schema.mutable(import_effect.Schema.Array((0, import_echo_schema.Ref)(import_types.ThreadType))))
107
+ ranges: import_effect.Schema.mutable(import_effect.Schema.Array(Range))
111
108
  }) {
112
109
  };
113
110
  var alignKey = "alignment";
@@ -188,12 +185,7 @@ var toModelRange = (sheet, range) => ({
188
185
  });
189
186
  var SheetModel = class extends import_context.Resource {
190
187
  constructor(_graph, _sheet, _options = {}) {
191
- super();
192
- this._graph = _graph;
193
- this._sheet = _sheet;
194
- this._options = _options;
195
- this.id = `model-${import_keys.PublicKey.random().truncate()}`;
196
- this.update = new import_async.Event();
188
+ super(), this._graph = _graph, this._sheet = _sheet, this._options = _options, this.id = `model-${import_keys.PublicKey.random().truncate()}`, this.update = new import_async.Event();
197
189
  }
198
190
  get graph() {
199
191
  return this._graph;
@@ -731,7 +723,6 @@ var useSheetModel = (graph, sheet, { readonly } = {}) => {
731
723
  ]);
732
724
  return model;
733
725
  };
734
- var SheetAction;
735
726
  (function(SheetAction2) {
736
727
  const SHEET_ACTION = `${import_chunk_JSIDCZHB.SHEET_PLUGIN}/action`;
737
728
  class Create extends import_effect2.Schema.TaggedClass()(`${SHEET_ACTION}/create`, {
@@ -777,6 +768,7 @@ var SheetAction;
777
768
  }
778
769
  SheetAction2.DropAxis = DropAxis;
779
770
  })(SheetAction || (SheetAction = {}));
771
+ var SheetAction;
780
772
  var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/types/util.ts";
781
773
  var MAX_ROWS = 500;
782
774
  var MAX_COLS = 676;
@@ -824,8 +816,7 @@ var createSheet = ({ name, cells, ...size } = {}) => {
824
816
  columns: [],
825
817
  rowMeta: {},
826
818
  columnMeta: {},
827
- ranges: [],
828
- threads: []
819
+ ranges: []
829
820
  });
830
821
  initialize(sheet, size);
831
822
  if (cells) {
@@ -876,7 +867,7 @@ var compareIndexPositions = (sheet, indexA, indexB) => {
876
867
  var mapFormulaRefsToIndices = (sheet, formula) => {
877
868
  (0, import_invariant2.invariant)((0, import_compute2.isFormula)(formula), void 0, {
878
869
  F: __dxlog_file2,
879
- L: 153,
870
+ L: 152,
880
871
  S: void 0,
881
872
  A: [
882
873
  "isFormula(formula)",
@@ -890,7 +881,7 @@ var mapFormulaRefsToIndices = (sheet, formula) => {
890
881
  var mapFormulaIndicesToRefs = (sheet, formula) => {
891
882
  (0, import_invariant2.invariant)((0, import_compute2.isFormula)(formula), void 0, {
892
883
  F: __dxlog_file2,
893
- L: 163,
884
+ L: 162,
894
885
  S: void 0,
895
886
  A: [
896
887
  "isFormula(formula)",
@@ -933,4 +924,4 @@ var mapFormulaIndicesToRefs = (sheet, formula) => {
933
924
  styleKey,
934
925
  useSheetModel
935
926
  });
936
- //# sourceMappingURL=chunk-HLSQVT3C.cjs.map
927
+ //# sourceMappingURL=chunk-76NESQLB.cjs.map