@dxos/plugin-sheet 0.6.14-main.8b352a0 → 0.6.14-staging.54a8bab
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/browser/{SheetContainer-R65IDJHN.mjs → SheetContainer-JZEKRM4Z.mjs} +41 -30
- package/dist/lib/browser/SheetContainer-JZEKRM4Z.mjs.map +7 -0
- package/dist/lib/browser/{chunk-5KVQ5IPW.mjs → chunk-BVUN7SHF.mjs} +4 -2
- package/dist/lib/browser/chunk-BVUN7SHF.mjs.map +7 -0
- package/dist/lib/browser/{chunk-I2DKJ72A.mjs → chunk-G2FUL6PK.mjs} +257 -57
- package/dist/lib/browser/chunk-G2FUL6PK.mjs.map +7 -0
- package/dist/lib/browser/{chunk-D3QTX46O.mjs → chunk-RABELMEQ.mjs} +3 -2
- package/dist/lib/browser/{chunk-D3QTX46O.mjs.map → chunk-RABELMEQ.mjs.map} +3 -3
- package/dist/lib/browser/{chunk-KCYJSOFB.mjs → chunk-VMSX6Z4X.mjs} +51 -17
- package/dist/lib/browser/chunk-VMSX6Z4X.mjs.map +7 -0
- package/dist/lib/browser/{compute-graph-SJT67236.mjs → compute-graph-GGWUX644.mjs} +4 -4
- package/dist/lib/browser/index.mjs +38 -10
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/meta.mjs +1 -1
- package/dist/lib/browser/types.mjs +2 -2
- package/dist/lib/node/{SheetContainer-6BO4C5X2.cjs → SheetContainer-PJE74VO4.cjs} +60 -50
- package/dist/lib/node/SheetContainer-PJE74VO4.cjs.map +7 -0
- package/dist/lib/node/{chunk-QIFIGEKV.cjs → chunk-2ZVZI2KJ.cjs} +6 -5
- package/dist/lib/node/{chunk-QIFIGEKV.cjs.map → chunk-2ZVZI2KJ.cjs.map} +3 -3
- package/dist/lib/node/{chunk-2XJ5I4UF.cjs → chunk-AWKOWDMI.cjs} +8 -6
- package/dist/lib/node/chunk-AWKOWDMI.cjs.map +7 -0
- package/dist/lib/node/{chunk-JF5XNTF3.cjs → chunk-O7XR4R7Y.cjs} +61 -26
- package/dist/lib/node/chunk-O7XR4R7Y.cjs.map +7 -0
- package/dist/lib/node/{chunk-DEPJHN47.cjs → chunk-STZ7S7RF.cjs} +293 -94
- package/dist/lib/node/chunk-STZ7S7RF.cjs.map +7 -0
- package/dist/lib/node/{compute-graph-AQBDL7HO.cjs → compute-graph-KGWA2QLE.cjs} +21 -21
- package/dist/lib/node/{compute-graph-AQBDL7HO.cjs.map → compute-graph-KGWA2QLE.cjs.map} +2 -2
- package/dist/lib/node/index.cjs +66 -38
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/meta.cjs +3 -3
- package/dist/lib/node/meta.cjs.map +1 -1
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/types.cjs +7 -7
- package/dist/lib/node/types.cjs.map +1 -1
- package/dist/lib/node-esm/{SheetContainer-MJXC5E3P.mjs → SheetContainer-R73XEXHU.mjs} +41 -30
- package/dist/lib/node-esm/SheetContainer-R73XEXHU.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-VCYJWE3O.mjs → chunk-BM2Q3FFC.mjs} +3 -2
- package/dist/lib/node-esm/{chunk-VCYJWE3O.mjs.map → chunk-BM2Q3FFC.mjs.map} +3 -3
- package/dist/lib/node-esm/{chunk-XBEHKYO7.mjs → chunk-CR4K75EL.mjs} +51 -17
- package/dist/lib/node-esm/chunk-CR4K75EL.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-5TXLF6PL.mjs → chunk-UIBWRHW7.mjs} +4 -2
- package/dist/lib/node-esm/chunk-UIBWRHW7.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-25V7WY4R.mjs → chunk-V5N3Y2O5.mjs} +257 -57
- package/dist/lib/node-esm/chunk-V5N3Y2O5.mjs.map +7 -0
- package/dist/lib/node-esm/{compute-graph-FRCKXEYK.mjs → compute-graph-2SCZT7N5.mjs} +4 -4
- package/dist/lib/node-esm/index.mjs +38 -10
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/meta.mjs +1 -1
- package/dist/lib/node-esm/types.mjs +2 -2
- package/dist/types/src/SheetPlugin.d.ts.map +1 -1
- package/dist/types/src/components/GridSheet/GridSheet.d.ts.map +1 -1
- package/dist/types/src/components/GridSheet/util.d.ts.map +1 -1
- package/dist/types/src/components/SheetContainer/SheetContainer.stories.d.ts.map +1 -1
- package/dist/types/src/components/Toolbar/Toolbar.d.ts +5 -2
- package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
- package/dist/types/src/compute-graph/compute-graph.d.ts +2 -2
- package/dist/types/src/compute-graph/compute-graph.d.ts.map +1 -1
- package/dist/types/src/compute-graph/functions/async-function.d.ts.map +1 -1
- package/dist/types/src/compute-graph/functions/edge-function.d.ts.map +1 -1
- package/dist/types/src/defs/sheet-range-types.d.ts +1 -1
- package/dist/types/src/defs/sheet-range-types.d.ts.map +1 -1
- package/dist/types/src/defs/util.d.ts +1 -1
- package/dist/types/src/defs/util.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +1 -0
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/model/sheet-model.d.ts +12 -5
- package/dist/types/src/model/sheet-model.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +10 -5
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types.d.ts +33 -3
- package/dist/types/src/types.d.ts.map +1 -1
- package/package.json +36 -36
- package/src/SheetPlugin.tsx +20 -0
- package/src/components/GridSheet/GridSheet.tsx +77 -16
- package/src/components/GridSheet/util.ts +12 -6
- package/src/components/SheetContainer/SheetContainer.stories.tsx +2 -0
- package/src/components/Toolbar/Toolbar.tsx +62 -41
- package/src/compute-graph/compute-graph.ts +22 -7
- package/src/compute-graph/functions/async-function.ts +1 -0
- package/src/compute-graph/functions/edge-function.ts +5 -3
- package/src/defs/sheet-range-types.ts +4 -2
- package/src/defs/util.ts +1 -0
- package/src/meta.ts +1 -0
- package/src/model/sheet-model.test.ts +5 -3
- package/src/model/sheet-model.ts +93 -21
- package/src/translations.ts +10 -5
- package/src/types.ts +20 -0
- package/dist/lib/browser/SheetContainer-R65IDJHN.mjs.map +0 -7
- package/dist/lib/browser/chunk-5KVQ5IPW.mjs.map +0 -7
- package/dist/lib/browser/chunk-I2DKJ72A.mjs.map +0 -7
- package/dist/lib/browser/chunk-KCYJSOFB.mjs.map +0 -7
- package/dist/lib/node/SheetContainer-6BO4C5X2.cjs.map +0 -7
- package/dist/lib/node/chunk-2XJ5I4UF.cjs.map +0 -7
- package/dist/lib/node/chunk-DEPJHN47.cjs.map +0 -7
- package/dist/lib/node/chunk-JF5XNTF3.cjs.map +0 -7
- package/dist/lib/node-esm/SheetContainer-MJXC5E3P.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-25V7WY4R.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-5TXLF6PL.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-XBEHKYO7.mjs.map +0 -7
- /package/dist/lib/browser/{compute-graph-SJT67236.mjs.map → compute-graph-GGWUX644.mjs.map} +0 -0
- /package/dist/lib/node-esm/{compute-graph-FRCKXEYK.mjs.map → compute-graph-2SCZT7N5.mjs.map} +0 -0
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
completeCellRangeToThreadCursor,
|
|
6
6
|
useComputeGraph,
|
|
7
7
|
useSheetContext
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-V5N3Y2O5.mjs";
|
|
9
9
|
import {
|
|
10
10
|
addressToA1Notation,
|
|
11
11
|
alignKey,
|
|
@@ -13,12 +13,13 @@ import {
|
|
|
13
13
|
isFormula,
|
|
14
14
|
rangeFromIndex,
|
|
15
15
|
rangeToA1Notation,
|
|
16
|
-
rangeToIndex
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
rangeToIndex,
|
|
17
|
+
styleKey
|
|
18
|
+
} from "./chunk-CR4K75EL.mjs";
|
|
19
|
+
import "./chunk-UIBWRHW7.mjs";
|
|
19
20
|
import {
|
|
20
21
|
SHEET_PLUGIN
|
|
21
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-BM2Q3FFC.mjs";
|
|
22
23
|
|
|
23
24
|
// packages/plugins/plugin-sheet/src/components/SheetContainer/SheetContainer.tsx
|
|
24
25
|
import React3 from "react";
|
|
@@ -61,7 +62,7 @@ var FunctionEditor = () => {
|
|
|
61
62
|
|
|
62
63
|
// packages/plugins/plugin-sheet/src/components/Toolbar/Toolbar.tsx
|
|
63
64
|
import { createContext } from "@radix-ui/react-context";
|
|
64
|
-
import React2, { useCallback
|
|
65
|
+
import React2, { useCallback } from "react";
|
|
65
66
|
import { useIntentDispatcher } from "@dxos/app-framework";
|
|
66
67
|
import { Icon as Icon2, Toolbar as NaturalToolbar, Tooltip, useTranslation } from "@dxos/react-ui";
|
|
67
68
|
import { useAttention } from "@dxos/react-ui-attention";
|
|
@@ -99,8 +100,8 @@ var ToolbarRoot = ({ children, role, classNames }) => {
|
|
|
99
100
|
const handleAction = useCallback((action) => {
|
|
100
101
|
switch (action.key) {
|
|
101
102
|
case "alignment":
|
|
102
|
-
if (
|
|
103
|
-
const index = model.sheet.ranges?.findIndex((range) => range.key === action.key && inRange(rangeFromIndex(model.sheet, range.range),
|
|
103
|
+
if (cursorFallbackRange) {
|
|
104
|
+
const index = model.sheet.ranges?.findIndex((range) => range.key === action.key && inRange(rangeFromIndex(model.sheet, range.range), cursorFallbackRange.from)) ?? -1;
|
|
104
105
|
const nextRangeEntity = {
|
|
105
106
|
range: rangeToIndex(model.sheet, cursorFallbackRange),
|
|
106
107
|
key: action.key,
|
|
@@ -108,14 +109,16 @@ var ToolbarRoot = ({ children, role, classNames }) => {
|
|
|
108
109
|
};
|
|
109
110
|
if (index < 0) {
|
|
110
111
|
model.sheet.ranges?.push(nextRangeEntity);
|
|
112
|
+
} else if (model.sheet.ranges[index].value === action.value) {
|
|
113
|
+
model.sheet.ranges?.splice(index, 1);
|
|
111
114
|
} else {
|
|
112
115
|
model.sheet.ranges?.splice(index, 1, nextRangeEntity);
|
|
113
116
|
}
|
|
114
117
|
}
|
|
115
118
|
break;
|
|
116
119
|
case "style":
|
|
117
|
-
if (action.
|
|
118
|
-
const index = model.sheet.ranges?.findIndex((range) => range.key === action.key);
|
|
120
|
+
if (action.unset) {
|
|
121
|
+
const index = model.sheet.ranges?.findIndex((range) => range.key === action.key && cursorFallbackRange && inRange(rangeFromIndex(model.sheet, range.range), cursorFallbackRange.from));
|
|
119
122
|
if (index >= 0) {
|
|
120
123
|
model.sheet.ranges?.splice(index, 1);
|
|
121
124
|
}
|
|
@@ -150,6 +153,7 @@ var ToolbarRoot = ({ children, role, classNames }) => {
|
|
|
150
153
|
onAction: handleAction
|
|
151
154
|
}, /* @__PURE__ */ React2.createElement(NaturalToolbar.Root, {
|
|
152
155
|
classNames: [
|
|
156
|
+
"pli-0.5",
|
|
153
157
|
...role === "section" ? [
|
|
154
158
|
"z-[2] group-focus-within/section:visible",
|
|
155
159
|
!hasAttention && "invisible",
|
|
@@ -179,13 +183,13 @@ var Alignment = () => {
|
|
|
179
183
|
const { cursor, model } = useSheetContext();
|
|
180
184
|
const { onAction } = useToolbarContext("Alignment");
|
|
181
185
|
const { t } = useTranslation(SHEET_PLUGIN);
|
|
182
|
-
const value =
|
|
183
|
-
cursor,
|
|
184
|
-
model.sheet.ranges
|
|
185
|
-
]);
|
|
186
|
+
const value = cursor ? model.sheet.ranges?.findLast(({ range, key }) => key === alignKey && inRange(rangeFromIndex(model.sheet, range), cursor))?.value : void 0;
|
|
186
187
|
return /* @__PURE__ */ React2.createElement(NaturalToolbar.ToggleGroup, {
|
|
187
188
|
type: "single",
|
|
188
|
-
value
|
|
189
|
+
value: (
|
|
190
|
+
// TODO(thure): providing `undefined` leaves the last item active which was active rather than showing none.
|
|
191
|
+
value ?? "never"
|
|
192
|
+
),
|
|
189
193
|
onValueChange: (value2) => onAction?.({
|
|
190
194
|
key: alignKey,
|
|
191
195
|
value: value2
|
|
@@ -204,29 +208,36 @@ var styleOptions = [
|
|
|
204
208
|
{
|
|
205
209
|
value: "highlight",
|
|
206
210
|
icon: "ph--highlighter--regular"
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
value: "softwrap",
|
|
214
|
+
icon: "ph--paragraph--regular"
|
|
207
215
|
}
|
|
208
216
|
];
|
|
209
217
|
var Styles = () => {
|
|
210
|
-
const {
|
|
218
|
+
const { cursorFallbackRange, model } = useSheetContext();
|
|
211
219
|
const { onAction } = useToolbarContext("Styles");
|
|
212
220
|
const { t } = useTranslation(SHEET_PLUGIN);
|
|
213
|
-
const activeValues =
|
|
221
|
+
const activeValues = cursorFallbackRange ? model.sheet.ranges?.filter(({ range, key }) => key === "style" && inRange(rangeFromIndex(model.sheet, range), cursorFallbackRange.from)).reduce((acc, { value }) => {
|
|
214
222
|
acc.add(value);
|
|
215
223
|
return acc;
|
|
216
|
-
}, /* @__PURE__ */ new Set()) : void 0
|
|
217
|
-
cursor,
|
|
218
|
-
model.sheet.ranges
|
|
219
|
-
]);
|
|
224
|
+
}, /* @__PURE__ */ new Set()) : void 0;
|
|
220
225
|
return /* @__PURE__ */ React2.createElement(React2.Fragment, null, styleOptions.map(({ value, icon }) => /* @__PURE__ */ React2.createElement(ToolbarItem, {
|
|
221
226
|
itemType: "toggle",
|
|
222
227
|
key: value,
|
|
223
228
|
pressed: activeValues?.has(value),
|
|
224
|
-
onPressedChange: (nextPressed) =>
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
229
|
+
onPressedChange: (nextPressed) => {
|
|
230
|
+
onAction?.({
|
|
231
|
+
key: "style",
|
|
232
|
+
value,
|
|
233
|
+
unset: !nextPressed
|
|
234
|
+
});
|
|
235
|
+
},
|
|
228
236
|
icon
|
|
229
|
-
}, t(
|
|
237
|
+
}, t("toolbar action label", {
|
|
238
|
+
key: t(`range key ${styleKey} label`),
|
|
239
|
+
value: t(`range value ${value} label`)
|
|
240
|
+
}))));
|
|
230
241
|
};
|
|
231
242
|
var Actions = () => {
|
|
232
243
|
const { onAction } = useToolbarContext("Actions");
|
|
@@ -245,16 +256,16 @@ var Actions = () => {
|
|
|
245
256
|
icon: "ph--chat-text--regular",
|
|
246
257
|
"data-testid": "editor.toolbar.comment",
|
|
247
258
|
onClick: () => {
|
|
248
|
-
if (!
|
|
259
|
+
if (!cursorFallbackRange) {
|
|
249
260
|
return;
|
|
250
261
|
}
|
|
251
262
|
return onAction?.({
|
|
252
263
|
key: "comment",
|
|
253
264
|
value: rangeToIndex(model.sheet, cursorFallbackRange),
|
|
254
|
-
cellContent: model.getCellText(
|
|
265
|
+
cellContent: model.getCellText(cursorFallbackRange.from)
|
|
255
266
|
});
|
|
256
267
|
},
|
|
257
|
-
disabled: !
|
|
268
|
+
disabled: !cursorFallbackRange || overlapsCommentAnchor
|
|
258
269
|
}, t(tooltipLabelKey));
|
|
259
270
|
};
|
|
260
271
|
var Toolbar = {
|
|
@@ -284,4 +295,4 @@ var SheetContainer_default = SheetContainer;
|
|
|
284
295
|
export {
|
|
285
296
|
SheetContainer_default as default
|
|
286
297
|
};
|
|
287
|
-
//# sourceMappingURL=SheetContainer-
|
|
298
|
+
//# sourceMappingURL=SheetContainer-R73XEXHU.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/components/SheetContainer/SheetContainer.tsx", "../../../src/components/FunctionEditor/FunctionEditor.tsx", "../../../src/components/Toolbar/Toolbar.tsx", "../../../src/components/SheetContainer/index.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type Space } from '@dxos/react-client/echo';\n\nimport { type SheetType } from '../../types';\nimport { useComputeGraph } from '../ComputeGraph';\nimport { FunctionEditor } from '../FunctionEditor';\nimport { GridSheet } from '../GridSheet';\nimport { SheetProvider } from '../SheetContext';\nimport { Toolbar } from '../Toolbar';\n\nexport const SheetContainer = ({ space, sheet, role }: { space: Space; sheet: SheetType; role?: string }) => {\n const graph = useComputeGraph(space);\n\n return graph ? (\n <SheetProvider sheet={sheet} graph={graph}>\n <Toolbar.Root role={role}>\n <Toolbar.Styles />\n <Toolbar.Alignment />\n <Toolbar.Separator />\n <Toolbar.Actions />\n </Toolbar.Root>\n <div role='none' className='border-bs border-separator grid cols-1 rows-[1fr_min-content] min-bs-0'>\n <GridSheet />\n <FunctionEditor />\n </div>\n </SheetProvider>\n ) : null;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Icon } from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { addressToA1Notation, isFormula, rangeToA1Notation } from '../../defs';\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(model.mapFormulaIndicesToRefs(value));\n formula = true;\n } else if (value != null) {\n value = String(value);\n }\n }\n\n return (\n <div\n className={mx(\n 'flex shrink-0 justify-between items-center px-4 py-1 text-sm border-bs !border-separator attention-surface',\n )}\n >\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 { createContext } from '@radix-ui/react-context';\nimport React, { type PropsWithChildren, useCallback } from 'react';\n\nimport { useIntentDispatcher } from '@dxos/app-framework';\nimport {\n Icon,\n type ThemedClassName,\n Toolbar as NaturalToolbar,\n type ToolbarButtonProps as NaturalToolbarButtonProps,\n type ToolbarToggleGroupItemProps as NaturalToolbarToggleGroupItemProps,\n type ToolbarToggleProps as NaturalToolbarToggleProps,\n Tooltip,\n useTranslation,\n} from '@dxos/react-ui';\nimport { useAttention } from '@dxos/react-ui-attention';\nimport { nonNullable } from '@dxos/util';\n\nimport {\n alignKey,\n type AlignKey,\n type AlignValue,\n type CommentKey,\n type CommentValue,\n inRange,\n rangeFromIndex,\n rangeToIndex,\n styleKey,\n type StyleKey,\n type StyleValue,\n} from '../../defs';\nimport { completeCellRangeToThreadCursor } from '../../integrations';\nimport { SHEET_PLUGIN } from '../../meta';\nimport { type SheetType } from '../../types';\nimport { useSheetContext } from '../SheetContext';\n\n//\n// Buttons\n//\n\nconst buttonStyles = 'min-bs-0 p-2';\nconst tooltipProps = { side: 'bottom' as const, classNames: 'z-10' };\n\nconst ToolbarSeparator = () => <div role='separator' className='grow' />;\n\n//\n// ToolbarItem\n//\n\ntype ToolbarItemProps =\n | (NaturalToolbarButtonProps & { itemType: 'button'; icon: string })\n | (NaturalToolbarToggleGroupItemProps & { itemType: 'toggleGroupItem'; icon: string })\n | (NaturalToolbarToggleProps & { itemType: 'toggle'; icon: string });\n\nexport const ToolbarItem = ({ itemType, icon, children, ...props }: ToolbarItemProps) => {\n const Invoker =\n itemType === 'toggleGroupItem'\n ? NaturalToolbar.ToggleGroupItem\n : itemType === 'toggle'\n ? NaturalToolbar.Toggle\n : NaturalToolbar.Button;\n return (\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n {/* TODO(thure): type the props spread better. */}\n <Invoker variant='ghost' {...(props as any)} classNames={buttonStyles}>\n <Icon icon={icon} size={5} />\n <span className='sr-only'>{children}</span>\n </Invoker>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content {...tooltipProps}>\n {children}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n );\n};\n\n//\n// Root\n//\n\ntype AlignAction = { key: AlignKey; value: AlignValue };\ntype CommentAction = { key: CommentKey; value: CommentValue; cellContent?: string };\ntype StyleAction = { key: StyleKey; value: StyleValue };\n\nexport type ToolbarAction = StyleAction | AlignAction | CommentAction;\nexport type ToolbarActionAnnotated = ToolbarAction & { unset?: boolean };\n\nexport type ToolbarActionType = ToolbarAction['key'];\n\nexport type ToolbarActionHandler = (action: ToolbarActionAnnotated) => void;\n\nexport type ToolbarProps = ThemedClassName<\n PropsWithChildren<{\n role?: string;\n }>\n>;\n\nconst [ToolbarContextProvider, useToolbarContext] = createContext<{\n onAction: (action: ToolbarActionAnnotated) => void;\n}>('Toolbar');\n\n// TODO(Zan): Factor out, copied this from MarkdownPlugin.\nconst sectionToolbarLayout =\n 'bs-[--rail-action] bg-[--sticky-bg] sticky block-start-0 __-block-start-px transition-opacity';\n\ntype Range = SheetType['ranges'][number];\n\nconst ToolbarRoot = ({ children, role, classNames }: ToolbarProps) => {\n const { id, model, cursorFallbackRange, cursor } = useSheetContext();\n const { hasAttention } = useAttention(id);\n const dispatch = useIntentDispatcher();\n\n // TODO(Zan): Externalize the toolbar action handler. E.g., Toolbar/keys should both fire events.\n const handleAction = useCallback(\n (action: ToolbarActionAnnotated) => {\n switch (action.key) {\n case 'alignment':\n if (cursorFallbackRange) {\n const index =\n model.sheet.ranges?.findIndex(\n (range) =>\n range.key === action.key &&\n inRange(rangeFromIndex(model.sheet, range.range), cursorFallbackRange.from),\n ) ?? -1;\n const nextRangeEntity = {\n range: rangeToIndex(model.sheet, cursorFallbackRange),\n key: action.key,\n value: action.value,\n };\n if (index < 0) {\n model.sheet.ranges?.push(nextRangeEntity);\n } else if (model.sheet.ranges![index].value === action.value) {\n model.sheet.ranges?.splice(index, 1);\n } else {\n model.sheet.ranges?.splice(index, 1, nextRangeEntity);\n }\n }\n break;\n case 'style':\n if (action.unset) {\n const index = model.sheet.ranges?.findIndex(\n (range) =>\n range.key === action.key &&\n cursorFallbackRange &&\n inRange(rangeFromIndex(model.sheet, range.range), cursorFallbackRange.from),\n );\n if (index >= 0) {\n model.sheet.ranges?.splice(index, 1);\n }\n } else if (cursorFallbackRange) {\n model.sheet.ranges?.push({\n range: rangeToIndex(model.sheet, cursorFallbackRange),\n key: action.key,\n value: action.value,\n });\n }\n break;\n case 'comment': {\n // TODO(Zan): We shouldn't hardcode the action ID.\n if (cursorFallbackRange) {\n void dispatch({\n action: 'dxos.org/plugin/thread/action/create',\n data: {\n cursor: completeCellRangeToThreadCursor(cursorFallbackRange),\n name: action.cellContent,\n subject: model.sheet,\n },\n });\n }\n }\n }\n },\n [model.sheet, cursorFallbackRange, cursor, dispatch],\n );\n\n return (\n <ToolbarContextProvider onAction={handleAction}>\n <NaturalToolbar.Root\n classNames={[\n 'pli-0.5',\n ...(role === 'section'\n ? ['z-[2] group-focus-within/section:visible', !hasAttention && 'invisible', sectionToolbarLayout]\n : ['attention-surface']),\n classNames,\n ]}\n >\n {children}\n </NaturalToolbar.Root>\n </ToolbarContextProvider>\n );\n};\n\n// TODO(burdon): Generalize.\n// TODO(burdon): Detect and display current state.\ntype ButtonProps<T> = {\n value: T;\n icon: string;\n disabled?: (state: Range) => boolean;\n};\n\n//\n// Alignment\n//\n\nconst alignmentOptions: ButtonProps<AlignValue>[] = [\n { value: 'start', icon: 'ph--text-align-left--regular' },\n { value: 'center', icon: 'ph--text-align-center--regular' },\n { value: 'end', icon: 'ph--text-align-right--regular' },\n];\n\nconst Alignment = () => {\n const { cursor, model } = useSheetContext();\n const { onAction } = useToolbarContext('Alignment');\n const { t } = useTranslation(SHEET_PLUGIN);\n\n // TODO(thure): Can this O(n) call be memoized?\n const value = cursor\n ? model.sheet.ranges?.findLast(\n ({ range, key }) => key === alignKey && inRange(rangeFromIndex(model.sheet, range), cursor),\n )?.value\n : undefined;\n\n return (\n <NaturalToolbar.ToggleGroup\n type='single'\n value={\n // TODO(thure): providing `undefined` leaves the last item active which was active rather than showing none.\n value ?? 'never'\n }\n onValueChange={(value: AlignValue) => onAction?.({ key: alignKey, value })}\n >\n {alignmentOptions.map(({ value, icon }) => (\n <ToolbarItem itemType='toggleGroupItem' key={value} value={value} icon={icon}>\n {t('toolbar action label', {\n key: t(`range key ${alignKey} label`),\n value: t(`range value ${value} label`),\n })}\n </ToolbarItem>\n ))}\n </NaturalToolbar.ToggleGroup>\n );\n};\n\nconst styleOptions: ButtonProps<StyleValue>[] = [\n { value: 'highlight', icon: 'ph--highlighter--regular' },\n { value: 'softwrap', icon: 'ph--paragraph--regular' },\n];\n\nconst Styles = () => {\n const { cursorFallbackRange, model } = useSheetContext();\n const { onAction } = useToolbarContext('Styles');\n const { t } = useTranslation(SHEET_PLUGIN);\n\n // TODO(thure): Can this O(n) call be memoized?\n const activeValues = cursorFallbackRange\n ? model.sheet.ranges\n ?.filter(\n ({ range, key }) => key === 'style' && inRange(rangeFromIndex(model.sheet, range), cursorFallbackRange.from),\n )\n .reduce((acc, { value }) => {\n acc.add(value);\n return acc;\n }, new Set())\n : undefined;\n\n return (\n <>\n {styleOptions.map(({ value, icon }) => (\n <ToolbarItem\n itemType='toggle'\n key={value}\n pressed={activeValues?.has(value)}\n onPressedChange={(nextPressed: boolean) => {\n onAction?.({ key: 'style', value, unset: !nextPressed });\n }}\n icon={icon}\n >\n {t('toolbar action label', {\n key: t(`range key ${styleKey} label`),\n value: t(`range value ${value} label`),\n })}\n </ToolbarItem>\n ))}\n </>\n );\n};\n\n//\n// Actions\n//\n\nconst Actions = () => {\n const { onAction } = useToolbarContext('Actions');\n const { cursorFallbackRange, cursor, model } = useSheetContext();\n const { t } = useTranslation(SHEET_PLUGIN);\n\n // TODO(thure): Can this O(n) call be memoized?\n const overlapsCommentAnchor = (model.sheet.threads ?? [])\n .filter(nonNullable)\n .filter((thread) => thread.status !== 'resolved')\n .some((thread) => {\n if (!cursorFallbackRange) {\n return false;\n }\n return rangeToIndex(model.sheet, cursorFallbackRange) === thread.anchor;\n });\n\n const tooltipLabelKey = !cursor\n ? 'no cursor label'\n : overlapsCommentAnchor\n ? 'selection overlaps existing comment label'\n : 'comment label';\n\n return (\n <ToolbarItem\n itemType='button'\n value='comment'\n icon='ph--chat-text--regular'\n data-testid='editor.toolbar.comment'\n onClick={() => {\n if (!cursorFallbackRange) {\n return;\n }\n return onAction?.({\n key: 'comment',\n value: rangeToIndex(model.sheet, cursorFallbackRange),\n cellContent: model.getCellText(cursorFallbackRange.from),\n });\n }}\n disabled={!cursorFallbackRange || overlapsCommentAnchor}\n >\n {t(tooltipLabelKey)}\n </ToolbarItem>\n );\n};\n\nexport const Toolbar = {\n Root: ToolbarRoot,\n Separator: ToolbarSeparator,\n Alignment,\n Styles,\n Actions,\n};\n\nexport { useToolbarContext };\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", "React", "Icon", "mx", "FunctionEditor", "model", "cursor", "range", "useSheetContext", "value", "formula", "getCellValue", "isFormula", "graph", "mapFunctionBindingFromId", "mapFormulaIndicesToRefs", "String", "div", "className", "mx", "rangeToA1Notation", "addressToA1Notation", "Icon", "icon", "classNames", "span", "createContext", "React", "useCallback", "useIntentDispatcher", "Icon", "Toolbar", "NaturalToolbar", "Tooltip", "useTranslation", "useAttention", "nonNullable", "buttonStyles", "tooltipProps", "side", "classNames", "ToolbarSeparator", "React", "div", "role", "className", "ToolbarItem", "itemType", "icon", "children", "props", "Invoker", "NaturalToolbar", "ToggleGroupItem", "Toggle", "Button", "Tooltip", "Root", "Trigger", "asChild", "variant", "Icon", "size", "span", "Portal", "Content", "Arrow", "ToolbarContextProvider", "useToolbarContext", "createContext", "sectionToolbarLayout", "ToolbarRoot", "id", "model", "cursorFallbackRange", "cursor", "useSheetContext", "hasAttention", "useAttention", "dispatch", "useIntentDispatcher", "handleAction", "useCallback", "action", "key", "index", "sheet", "ranges", "findIndex", "range", "inRange", "rangeFromIndex", "from", "nextRangeEntity", "rangeToIndex", "value", "push", "splice", "unset", "data", "completeCellRangeToThreadCursor", "name", "cellContent", "subject", "onAction", "alignmentOptions", "Alignment", "t", "useTranslation", "SHEET_PLUGIN", "findLast", "alignKey", "undefined", "ToggleGroup", "type", "onValueChange", "map", "styleOptions", "Styles", "activeValues", "filter", "reduce", "acc", "add", "Set", "pressed", "has", "onPressedChange", "nextPressed", "styleKey", "Actions", "overlapsCommentAnchor", "threads", "nonNullable", "thread", "status", "some", "anchor", "tooltipLabelKey", "data-testid", "onClick", "getCellText", "disabled", "Toolbar", "Separator", "SheetContainer", "space", "sheet", "role", "graph", "useComputeGraph", "React", "SheetProvider", "Toolbar", "Root", "Styles", "Alignment", "Separator", "Actions", "div", "className", "GridSheet", "FunctionEditor", "SheetContainer"]
|
|
7
|
+
}
|
|
@@ -6,11 +6,12 @@ var meta_default = {
|
|
|
6
6
|
id: SHEET_PLUGIN,
|
|
7
7
|
name: "Sheet",
|
|
8
8
|
description: "A simple spreadsheet plugin.",
|
|
9
|
-
icon: "ph--grid-nine--regular"
|
|
9
|
+
icon: "ph--grid-nine--regular",
|
|
10
|
+
source: "https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-sheet"
|
|
10
11
|
};
|
|
11
12
|
|
|
12
13
|
export {
|
|
13
14
|
SHEET_PLUGIN,
|
|
14
15
|
meta_default
|
|
15
16
|
};
|
|
16
|
-
//# sourceMappingURL=chunk-
|
|
17
|
+
//# sourceMappingURL=chunk-BM2Q3FFC.mjs.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/meta.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type PluginMeta } from '@dxos/app-framework';\n\nexport const SHEET_PLUGIN = 'dxos.org/plugin/sheet';\n\nexport default {\n id: SHEET_PLUGIN,\n name: 'Sheet',\n description: 'A simple spreadsheet plugin.',\n icon: 'ph--grid-nine--regular',\n} satisfies PluginMeta;\n"],
|
|
5
|
-
"mappings": ";;;AAMO,IAAMA,eAAe;AAE5B,IAAA,eAAe;EACbC,IAAID;EACJE,MAAM;EACNC,aAAa;EACbC,MAAM;
|
|
6
|
-
"names": ["SHEET_PLUGIN", "id", "name", "description", "icon"]
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type PluginMeta } from '@dxos/app-framework';\n\nexport const SHEET_PLUGIN = 'dxos.org/plugin/sheet';\n\nexport default {\n id: SHEET_PLUGIN,\n name: 'Sheet',\n description: 'A simple spreadsheet plugin.',\n icon: 'ph--grid-nine--regular',\n source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-sheet',\n} satisfies PluginMeta;\n"],
|
|
5
|
+
"mappings": ";;;AAMO,IAAMA,eAAe;AAE5B,IAAA,eAAe;EACbC,IAAID;EACJE,MAAM;EACNC,aAAa;EACbC,MAAM;EACNC,QAAQ;AACV;",
|
|
6
|
+
"names": ["SHEET_PLUGIN", "id", "name", "description", "icon", "source"]
|
|
7
7
|
}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
SheetType
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-UIBWRHW7.mjs";
|
|
5
5
|
|
|
6
6
|
// packages/plugins/plugin-sheet/src/compute-graph/compute-graph.ts
|
|
7
7
|
import { Event as Event2 } from "@dxos/async";
|
|
8
8
|
import { Filter as Filter2, fullyQualifiedId } from "@dxos/client/echo";
|
|
9
|
+
import { FQ_ID_LENGTH } from "@dxos/client/echo";
|
|
9
10
|
import { Resource as Resource2 } from "@dxos/context";
|
|
10
11
|
import { getTypename } from "@dxos/echo-schema";
|
|
11
12
|
import { invariant as invariant2 } from "@dxos/invariant";
|
|
@@ -42,7 +43,9 @@ var cellClassNameForRange = ({ key, value }) => {
|
|
|
42
43
|
case styleKey:
|
|
43
44
|
switch (value) {
|
|
44
45
|
case "highlight":
|
|
45
|
-
return "bg-gridHighlight";
|
|
46
|
+
return "!bg-gridHighlight";
|
|
47
|
+
case "softwrap":
|
|
48
|
+
return "!whitespace-normal";
|
|
46
49
|
default:
|
|
47
50
|
return void 0;
|
|
48
51
|
}
|
|
@@ -148,6 +151,7 @@ var insertIndices = (indices, i, n, max) => {
|
|
|
148
151
|
}
|
|
149
152
|
const idx = createIndices(n);
|
|
150
153
|
indices.splice(i, 0, ...idx);
|
|
154
|
+
return idx;
|
|
151
155
|
};
|
|
152
156
|
var initialize = (sheet, { rows = DEFAULT_ROWS, columns = DEFAULT_COLUMNS } = {}) => {
|
|
153
157
|
if (!sheet.rows.length) {
|
|
@@ -282,6 +286,12 @@ var FunctionContext = class _FunctionContext {
|
|
|
282
286
|
this._invocations = {};
|
|
283
287
|
this._options = defaultsDeep(_options ?? {}, defaultFunctionContextOptions);
|
|
284
288
|
this._onUpdate = debounce((update) => {
|
|
289
|
+
log("update", update, {
|
|
290
|
+
F: __dxlog_file2,
|
|
291
|
+
L: 86,
|
|
292
|
+
S: this,
|
|
293
|
+
C: (f, a) => f(...a)
|
|
294
|
+
});
|
|
285
295
|
this._hf.resumeEvaluation();
|
|
286
296
|
this._options.onUpdate?.(update);
|
|
287
297
|
}, this._options.debounceDelay);
|
|
@@ -334,7 +344,7 @@ var FunctionContext = class _FunctionContext {
|
|
|
334
344
|
value: value2
|
|
335
345
|
}, {
|
|
336
346
|
F: __dxlog_file2,
|
|
337
|
-
L:
|
|
347
|
+
L: 144,
|
|
338
348
|
S: this,
|
|
339
349
|
C: (f, a) => f(...a)
|
|
340
350
|
});
|
|
@@ -348,7 +358,7 @@ var FunctionContext = class _FunctionContext {
|
|
|
348
358
|
err
|
|
349
359
|
}, {
|
|
350
360
|
F: __dxlog_file2,
|
|
351
|
-
L:
|
|
361
|
+
L: 148,
|
|
352
362
|
S: this,
|
|
353
363
|
C: (f, a) => f(...a)
|
|
354
364
|
});
|
|
@@ -368,7 +378,7 @@ var FunctionContext = class _FunctionContext {
|
|
|
368
378
|
cache: value
|
|
369
379
|
}, {
|
|
370
380
|
F: __dxlog_file2,
|
|
371
|
-
L:
|
|
381
|
+
L: 156,
|
|
372
382
|
S: this,
|
|
373
383
|
C: (f, a) => f(...a)
|
|
374
384
|
});
|
|
@@ -425,7 +435,7 @@ var EdgeFunctionPlugin = class extends AsyncFunctionPlugin {
|
|
|
425
435
|
}
|
|
426
436
|
if (subscribe) {
|
|
427
437
|
const unsubscribe = effect(() => {
|
|
428
|
-
log2
|
|
438
|
+
log2("function changed", {
|
|
429
439
|
fn
|
|
430
440
|
}, {
|
|
431
441
|
F: __dxlog_file3,
|
|
@@ -441,7 +451,7 @@ var EdgeFunctionPlugin = class extends AsyncFunctionPlugin {
|
|
|
441
451
|
this.context.createSubscription(ast.procedureName, unsubscribe);
|
|
442
452
|
}
|
|
443
453
|
const path = getUserFunctionUrlInMetadata(getMeta(fn));
|
|
444
|
-
const
|
|
454
|
+
const response = await fetch(`${this.context.remoteFunctionUrl}${path}`, {
|
|
445
455
|
method: "POST",
|
|
446
456
|
headers: {
|
|
447
457
|
"Content-Type": "application/json"
|
|
@@ -450,7 +460,16 @@ var EdgeFunctionPlugin = class extends AsyncFunctionPlugin {
|
|
|
450
460
|
args: args.filter(nonNullable)
|
|
451
461
|
})
|
|
452
462
|
});
|
|
453
|
-
|
|
463
|
+
const result = await response.text();
|
|
464
|
+
log2("function executed", {
|
|
465
|
+
result
|
|
466
|
+
}, {
|
|
467
|
+
F: __dxlog_file3,
|
|
468
|
+
L: 65,
|
|
469
|
+
S: this,
|
|
470
|
+
C: (f, a) => f(...a)
|
|
471
|
+
});
|
|
472
|
+
return result;
|
|
454
473
|
};
|
|
455
474
|
return this.runAsyncFunction(ast, state, handler(true), {
|
|
456
475
|
ttl: FUNCTION_TTL
|
|
@@ -2887,7 +2906,7 @@ var defaultFunctions = [
|
|
|
2887
2906
|
|
|
2888
2907
|
// packages/plugins/plugin-sheet/src/compute-graph/compute-graph.ts
|
|
2889
2908
|
var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/compute-graph/compute-graph.ts";
|
|
2890
|
-
var
|
|
2909
|
+
var UNKNOWN_BINDING = "__UNKNOWN__";
|
|
2891
2910
|
var createSheetName = ({ type, id }) => `${type}@${id}`;
|
|
2892
2911
|
var parseSheetName = (name) => {
|
|
2893
2912
|
const [type, id] = name.split("@");
|
|
@@ -2908,7 +2927,16 @@ var ComputeGraph = class extends Resource2 {
|
|
|
2908
2927
|
this._nodes = /* @__PURE__ */ new Map();
|
|
2909
2928
|
this._remoteFunctions = [];
|
|
2910
2929
|
this.update = new Event2();
|
|
2911
|
-
|
|
2930
|
+
const contextOptions = {
|
|
2931
|
+
...this._options,
|
|
2932
|
+
onUpdate: (update) => {
|
|
2933
|
+
this._options?.onUpdate?.(update);
|
|
2934
|
+
this.update.emit({
|
|
2935
|
+
type: "valuesUpdated"
|
|
2936
|
+
});
|
|
2937
|
+
}
|
|
2938
|
+
};
|
|
2939
|
+
this.context = new FunctionContext(this._hf, this._space, contextOptions);
|
|
2912
2940
|
this._hf.updateConfig({
|
|
2913
2941
|
context: this.context
|
|
2914
2942
|
});
|
|
@@ -2956,7 +2984,7 @@ var ComputeGraph = class extends Resource2 {
|
|
|
2956
2984
|
getOrCreateNode(name) {
|
|
2957
2985
|
invariant2(name.length, void 0, {
|
|
2958
2986
|
F: __dxlog_file4,
|
|
2959
|
-
L:
|
|
2987
|
+
L: 129,
|
|
2960
2988
|
S: this,
|
|
2961
2989
|
A: [
|
|
2962
2990
|
"name.length",
|
|
@@ -2969,7 +2997,7 @@ var ComputeGraph = class extends Resource2 {
|
|
|
2969
2997
|
sheet: name
|
|
2970
2998
|
}, {
|
|
2971
2999
|
F: __dxlog_file4,
|
|
2972
|
-
L:
|
|
3000
|
+
L: 131,
|
|
2973
3001
|
S: this,
|
|
2974
3002
|
C: (f, a) => f(...a)
|
|
2975
3003
|
});
|
|
@@ -2978,7 +3006,7 @@ var ComputeGraph = class extends Resource2 {
|
|
|
2978
3006
|
const sheetId = this._hf.getSheetId(name);
|
|
2979
3007
|
invariant2(sheetId !== void 0, void 0, {
|
|
2980
3008
|
F: __dxlog_file4,
|
|
2981
|
-
L:
|
|
3009
|
+
L: 136,
|
|
2982
3010
|
S: this,
|
|
2983
3011
|
A: [
|
|
2984
3012
|
"sheetId !== undefined",
|
|
@@ -3046,18 +3074,23 @@ var ComputeGraph = class extends Resource2 {
|
|
|
3046
3074
|
* E.g., spaceId:objectId() => HELLO()
|
|
3047
3075
|
*/
|
|
3048
3076
|
mapFunctionBindingFromId(formula) {
|
|
3049
|
-
|
|
3077
|
+
const binding = formula.replace(/(\w+):([a-zA-Z0-9]+)\((.*)\)/g, (match, spaceId, objectId, args) => {
|
|
3050
3078
|
const id = `${spaceId}:${objectId}`;
|
|
3051
|
-
if (id.length !==
|
|
3079
|
+
if (id.length !== FQ_ID_LENGTH) {
|
|
3052
3080
|
return match;
|
|
3053
3081
|
}
|
|
3054
3082
|
const fn = this._remoteFunctions.find((fn2) => fullyQualifiedId(fn2) === id);
|
|
3055
3083
|
if (fn?.binding) {
|
|
3056
3084
|
return `${fn.binding}(${args})`;
|
|
3057
3085
|
} else {
|
|
3058
|
-
return
|
|
3086
|
+
return UNKNOWN_BINDING;
|
|
3059
3087
|
}
|
|
3060
3088
|
});
|
|
3089
|
+
if (binding.startsWith(`=${UNKNOWN_BINDING}`)) {
|
|
3090
|
+
return void 0;
|
|
3091
|
+
} else {
|
|
3092
|
+
return binding;
|
|
3093
|
+
}
|
|
3061
3094
|
}
|
|
3062
3095
|
async _open() {
|
|
3063
3096
|
if (this._space) {
|
|
@@ -3148,6 +3181,7 @@ var ComputeGraphRegistry = class extends Resource3 {
|
|
|
3148
3181
|
|
|
3149
3182
|
export {
|
|
3150
3183
|
alignKey,
|
|
3184
|
+
styleKey,
|
|
3151
3185
|
cellClassNameForRange,
|
|
3152
3186
|
DEFAULT_ROWS,
|
|
3153
3187
|
DEFAULT_COLUMNS,
|
|
@@ -3183,4 +3217,4 @@ export {
|
|
|
3183
3217
|
defaultPlugins,
|
|
3184
3218
|
ComputeGraphRegistry
|
|
3185
3219
|
};
|
|
3186
|
-
//# sourceMappingURL=chunk-
|
|
3220
|
+
//# sourceMappingURL=chunk-CR4K75EL.mjs.map
|