@dxos/plugin-sheet 0.7.5-main.9d26e3a → 0.7.5-main.e9bb01b
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-QE32GHSA.mjs +370 -0
- package/dist/lib/browser/SheetContainer-QE32GHSA.mjs.map +7 -0
- package/dist/lib/browser/chunk-5IP6N25X.mjs +18 -0
- package/dist/lib/browser/chunk-5IP6N25X.mjs.map +7 -0
- package/dist/lib/browser/{chunk-A374JPWV.mjs → chunk-EEN6LQ77.mjs} +157 -391
- package/dist/lib/browser/chunk-EEN6LQ77.mjs.map +7 -0
- package/dist/lib/browser/chunk-FOO6NGBM.mjs +229 -0
- package/dist/lib/browser/chunk-FOO6NGBM.mjs.map +7 -0
- package/dist/lib/browser/{chunk-Q4XS4YWF.mjs → chunk-MW7L2R23.mjs} +2 -2
- package/dist/lib/browser/chunk-MW7L2R23.mjs.map +7 -0
- package/dist/lib/browser/chunk-NA2WJTDQ.mjs +15 -0
- package/dist/lib/browser/chunk-NA2WJTDQ.mjs.map +7 -0
- package/dist/lib/browser/compute-graph-registry-5PSCPAJC.mjs +27 -0
- package/dist/lib/browser/compute-graph-registry-5PSCPAJC.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +80 -218
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/intent-resolver-BIOB22P2.mjs +56 -0
- package/dist/lib/browser/intent-resolver-BIOB22P2.mjs.map +7 -0
- package/dist/lib/browser/markdown-ZXHPFU4B.mjs +26 -0
- package/dist/lib/browser/markdown-ZXHPFU4B.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/react-surface-DUNHY5TJ.mjs +52 -0
- package/dist/lib/browser/react-surface-DUNHY5TJ.mjs.map +7 -0
- package/dist/lib/browser/thread-RSI66HGQ.mjs +17 -0
- package/dist/lib/browser/thread-RSI66HGQ.mjs.map +7 -0
- package/dist/lib/browser/types/index.mjs +2 -2
- package/dist/lib/node/SheetContainer-63QTAGQQ.cjs +364 -0
- package/dist/lib/node/SheetContainer-63QTAGQQ.cjs.map +7 -0
- package/dist/lib/node/{chunk-TQOJ7DG2.cjs → chunk-6BZ2TACG.cjs} +6 -6
- package/dist/lib/node/chunk-6BZ2TACG.cjs.map +7 -0
- package/dist/lib/node/{meta.cjs → chunk-6G6HHJOM.cjs} +12 -8
- package/dist/lib/node/chunk-6G6HHJOM.cjs.map +7 -0
- package/dist/lib/node/{chunk-2ZVZI2KJ.cjs → chunk-AUC5XQEN.cjs} +12 -9
- package/dist/lib/node/chunk-AUC5XQEN.cjs.map +7 -0
- package/dist/lib/node/{chunk-FDEQ2PGJ.cjs → chunk-K4VMHOR2.cjs} +198 -428
- package/dist/lib/node/chunk-K4VMHOR2.cjs.map +7 -0
- package/dist/lib/node/chunk-P4KSGZSS.cjs +251 -0
- package/dist/lib/node/chunk-P4KSGZSS.cjs.map +7 -0
- package/dist/lib/node/compute-graph-registry-IKYGA5ZC.cjs +53 -0
- package/dist/lib/node/compute-graph-registry-IKYGA5ZC.cjs.map +7 -0
- package/dist/lib/node/index.cjs +81 -215
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/intent-resolver-EN5ZMUUF.cjs +69 -0
- package/dist/lib/node/intent-resolver-EN5ZMUUF.cjs.map +7 -0
- package/dist/lib/node/markdown-7NVPUDWI.cjs +40 -0
- package/dist/lib/node/markdown-7NVPUDWI.cjs.map +7 -0
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/react-surface-YGALRCRL.cjs +70 -0
- package/dist/lib/node/react-surface-YGALRCRL.cjs.map +7 -0
- package/dist/lib/node/thread-7KJVRDUE.cjs +32 -0
- package/dist/lib/node/thread-7KJVRDUE.cjs.map +7 -0
- package/dist/lib/node/types/index.cjs +30 -30
- package/dist/lib/node/types/index.cjs.map +1 -1
- package/dist/lib/node-esm/SheetContainer-EUR47CP5.mjs +371 -0
- package/dist/lib/node-esm/SheetContainer-EUR47CP5.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-6C53G45G.mjs +16 -0
- package/dist/lib/node-esm/chunk-6C53G45G.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-JFUKD7N4.mjs +20 -0
- package/dist/lib/node-esm/chunk-JFUKD7N4.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-NYYIDVR7.mjs → chunk-LGQMXD6K.mjs} +2 -2
- package/dist/lib/node-esm/chunk-LGQMXD6K.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-PTOI45NK.mjs +231 -0
- package/dist/lib/node-esm/chunk-PTOI45NK.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-L5PQHVTX.mjs → chunk-RFGJUSHF.mjs} +157 -391
- package/dist/lib/node-esm/chunk-RFGJUSHF.mjs.map +7 -0
- package/dist/lib/node-esm/compute-graph-registry-ZSLEFSS5.mjs +28 -0
- package/dist/lib/node-esm/compute-graph-registry-ZSLEFSS5.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +80 -218
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/intent-resolver-6BCKQA5A.mjs +57 -0
- package/dist/lib/node-esm/intent-resolver-6BCKQA5A.mjs.map +7 -0
- package/dist/lib/node-esm/markdown-LRZEUBKN.mjs +27 -0
- package/dist/lib/node-esm/markdown-LRZEUBKN.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/react-surface-AAT56ZBA.mjs +53 -0
- package/dist/lib/node-esm/react-surface-AAT56ZBA.mjs.map +7 -0
- package/dist/lib/node-esm/thread-U3RIKVMB.mjs +18 -0
- package/dist/lib/node-esm/thread-U3RIKVMB.mjs.map +7 -0
- package/dist/lib/node-esm/types/index.mjs +2 -2
- package/dist/types/src/SheetPlugin.d.ts +1 -3
- package/dist/types/src/SheetPlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/capabilities.d.ts +5 -0
- package/dist/types/src/capabilities/capabilities.d.ts.map +1 -0
- package/dist/types/src/capabilities/compute-graph-registry.d.ts +4 -0
- package/dist/types/src/capabilities/compute-graph-registry.d.ts.map +1 -0
- package/dist/types/src/capabilities/index.d.ts +12 -0
- package/dist/types/src/capabilities/index.d.ts.map +1 -0
- package/dist/types/src/capabilities/intent-resolver.d.ts +4 -0
- package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -0
- package/dist/types/src/capabilities/markdown.d.ts +6 -0
- package/dist/types/src/capabilities/markdown.d.ts.map +1 -0
- package/dist/types/src/capabilities/react-surface.d.ts +4 -0
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
- package/dist/types/src/capabilities/thread.d.ts +6 -0
- package/dist/types/src/capabilities/thread.d.ts.map +1 -0
- package/dist/types/src/components/GridSheet/GridSheet.stories.d.ts.map +1 -1
- package/dist/types/src/components/SheetContainer/SheetContainer.d.ts.map +1 -1
- package/dist/types/src/components/SheetContainer/SheetContainer.stories.d.ts.map +1 -1
- package/dist/types/src/components/SheetToolbar/SheetToolbar.d.ts +7 -0
- package/dist/types/src/components/SheetToolbar/SheetToolbar.d.ts.map +1 -0
- package/dist/types/src/components/SheetToolbar/SheetToolbar.stories.d.ts +6 -0
- package/dist/types/src/components/SheetToolbar/SheetToolbar.stories.d.ts.map +1 -0
- package/dist/types/src/components/SheetToolbar/align.d.ts +28 -0
- package/dist/types/src/components/SheetToolbar/align.d.ts.map +1 -0
- package/dist/types/src/components/SheetToolbar/comment.d.ts +23 -0
- package/dist/types/src/components/SheetToolbar/comment.d.ts.map +1 -0
- package/dist/types/src/components/SheetToolbar/index.d.ts +2 -0
- package/dist/types/src/components/SheetToolbar/index.d.ts.map +1 -0
- package/dist/types/src/components/SheetToolbar/style.d.ts +26 -0
- package/dist/types/src/components/SheetToolbar/style.d.ts.map +1 -0
- package/dist/types/src/components/SheetToolbar/useToolbarAction.d.ts +8 -0
- package/dist/types/src/components/SheetToolbar/useToolbarAction.d.ts.map +1 -0
- package/dist/types/src/components/SheetToolbar/useToolbarState.d.ts +6 -0
- package/dist/types/src/components/SheetToolbar/useToolbarState.d.ts.map +1 -0
- package/dist/types/src/components/index.d.ts +1 -2
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +2 -3
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/integrations/thread-ranges.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +2 -2
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/testing/testing.d.ts +1 -1
- package/dist/types/src/testing/testing.d.ts.map +1 -1
- package/dist/types/src/types/sheet-range-types.d.ts +1 -1
- package/dist/types/src/types/sheet-range-types.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +0 -11
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +45 -52
- package/src/SheetPlugin.tsx +55 -103
- package/src/capabilities/capabilities.ts +14 -0
- package/src/capabilities/compute-graph-registry.ts +25 -0
- package/src/capabilities/index.ts +13 -0
- package/src/capabilities/intent-resolver.ts +38 -0
- package/src/capabilities/markdown.ts +22 -0
- package/src/capabilities/react-surface.tsx +37 -0
- package/src/capabilities/thread.ts +14 -0
- package/src/components/GridSheet/GridSheet.stories.tsx +2 -0
- package/src/components/GridSheet/util.ts +1 -1
- package/src/components/SheetContainer/SheetContainer.stories.tsx +28 -22
- package/src/components/SheetContainer/SheetContainer.tsx +3 -8
- package/src/components/{Toolbar/Toolbar.stories.tsx → SheetToolbar/SheetToolbar.stories.tsx} +4 -8
- package/src/components/SheetToolbar/SheetToolbar.tsx +48 -0
- package/src/components/SheetToolbar/align.ts +68 -0
- package/src/components/SheetToolbar/comment.ts +56 -0
- package/src/components/{Toolbar → SheetToolbar}/index.ts +1 -1
- package/src/components/SheetToolbar/style.ts +72 -0
- package/src/components/SheetToolbar/useToolbarAction.ts +87 -0
- package/src/components/SheetToolbar/useToolbarState.ts +17 -0
- package/src/components/index.ts +0 -1
- package/src/index.ts +2 -5
- package/src/integrations/thread-ranges.ts +21 -10
- package/src/meta.ts +3 -2
- package/src/types/sheet-range-types.ts +1 -1
- package/src/types/types.ts +0 -26
- package/dist/lib/browser/SheetContainer-S4NCLUYL.mjs +0 -290
- package/dist/lib/browser/SheetContainer-S4NCLUYL.mjs.map +0 -7
- package/dist/lib/browser/chunk-A374JPWV.mjs.map +0 -7
- package/dist/lib/browser/chunk-Q4XS4YWF.mjs.map +0 -7
- package/dist/lib/browser/chunk-RABELMEQ.mjs +0 -15
- package/dist/lib/browser/chunk-RABELMEQ.mjs.map +0 -7
- package/dist/lib/browser/meta.mjs +0 -9
- package/dist/lib/browser/meta.mjs.map +0 -7
- package/dist/lib/node/SheetContainer-TP4GYXZB.cjs +0 -296
- package/dist/lib/node/SheetContainer-TP4GYXZB.cjs.map +0 -7
- package/dist/lib/node/chunk-2ZVZI2KJ.cjs.map +0 -7
- package/dist/lib/node/chunk-FDEQ2PGJ.cjs.map +0 -7
- package/dist/lib/node/chunk-TQOJ7DG2.cjs.map +0 -7
- package/dist/lib/node/meta.cjs.map +0 -7
- package/dist/lib/node-esm/SheetContainer-YB3JBVPZ.mjs +0 -291
- package/dist/lib/node-esm/SheetContainer-YB3JBVPZ.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-BM2Q3FFC.mjs +0 -17
- package/dist/lib/node-esm/chunk-BM2Q3FFC.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-L5PQHVTX.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-NYYIDVR7.mjs.map +0 -7
- package/dist/lib/node-esm/meta.mjs +0 -10
- package/dist/lib/node-esm/meta.mjs.map +0 -7
- package/dist/types/src/components/SheetObjectSettings.d.ts +0 -7
- package/dist/types/src/components/SheetObjectSettings.d.ts.map +0 -1
- package/dist/types/src/components/Toolbar/Toolbar.d.ts +0 -48
- package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +0 -1
- package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts +0 -7
- package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +0 -1
- package/dist/types/src/components/Toolbar/index.d.ts +0 -2
- package/dist/types/src/components/Toolbar/index.d.ts.map +0 -1
- package/src/components/SheetObjectSettings.tsx +0 -38
- package/src/components/Toolbar/Toolbar.tsx +0 -344
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
|
|
2
|
+
|
|
3
|
+
// packages/plugins/plugin-sheet/src/extensions/compute.ts
|
|
4
|
+
import { syntaxTree } from "@codemirror/language";
|
|
5
|
+
import { RangeSetBuilder, StateEffect, StateField } from "@codemirror/state";
|
|
6
|
+
import { Decoration, EditorView, ViewPlugin, WidgetType } from "@codemirror/view";
|
|
7
|
+
import { debounce } from "@dxos/async";
|
|
8
|
+
import { createSheetName } from "@dxos/compute";
|
|
9
|
+
import { invariant } from "@dxos/invariant";
|
|
10
|
+
import { documentId, singleValueFacet } from "@dxos/react-ui-editor";
|
|
11
|
+
var updateAllDecorations = StateEffect.define();
|
|
12
|
+
var computeGraphFacet = singleValueFacet();
|
|
13
|
+
|
|
14
|
+
// packages/plugins/plugin-sheet/src/extensions/editor/extension.ts
|
|
15
|
+
import { acceptCompletion, autocompletion, completionStatus, startCompletion } from "@codemirror/autocomplete";
|
|
16
|
+
import { HighlightStyle, syntaxHighlighting } from "@codemirror/language";
|
|
17
|
+
import { ViewPlugin as ViewPlugin2, keymap } from "@codemirror/view";
|
|
18
|
+
import { tags } from "@lezer/highlight";
|
|
19
|
+
import { spreadsheet } from "codemirror-lang-spreadsheet";
|
|
20
|
+
import { RANGE_NOTATION } from "@dxos/compute";
|
|
21
|
+
import { singleValueFacet as singleValueFacet2 } from "@dxos/react-ui-editor";
|
|
22
|
+
import { mx } from "@dxos/react-ui-theme";
|
|
23
|
+
var highlightStyles = HighlightStyle.define([
|
|
24
|
+
// Function.
|
|
25
|
+
{
|
|
26
|
+
tag: tags.name,
|
|
27
|
+
class: "text-accentText"
|
|
28
|
+
},
|
|
29
|
+
// Range.
|
|
30
|
+
{
|
|
31
|
+
tag: tags.tagName,
|
|
32
|
+
class: "text-pinkText"
|
|
33
|
+
},
|
|
34
|
+
// Values.
|
|
35
|
+
{
|
|
36
|
+
tag: tags.number,
|
|
37
|
+
class: "text-tealText"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
tag: tags.bool,
|
|
41
|
+
class: "text-tealText"
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
tag: tags.string,
|
|
45
|
+
class: "text-tealText"
|
|
46
|
+
},
|
|
47
|
+
// Error.
|
|
48
|
+
{
|
|
49
|
+
tag: tags.invalid,
|
|
50
|
+
class: "text-unAccent"
|
|
51
|
+
}
|
|
52
|
+
]);
|
|
53
|
+
var languageFacet = singleValueFacet2();
|
|
54
|
+
var sheetExtension = ({ debug, functions = [] }) => {
|
|
55
|
+
const { extension, language } = spreadsheet({
|
|
56
|
+
idiom: "en-US",
|
|
57
|
+
decimalSeparator: "."
|
|
58
|
+
});
|
|
59
|
+
const createCompletion = (name) => {
|
|
60
|
+
const { section = "Custom", description, syntax } = functions.find((value) => value.name === name) ?? {};
|
|
61
|
+
return {
|
|
62
|
+
section,
|
|
63
|
+
label: name,
|
|
64
|
+
info: () => {
|
|
65
|
+
if (!description && !syntax) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
const root = document.createElement("div");
|
|
69
|
+
root.className = "flex flex-col gap-2 text-sm";
|
|
70
|
+
const title = document.createElement("h2");
|
|
71
|
+
title.innerText = name;
|
|
72
|
+
title.className = "text-lg font-mono text-accentText";
|
|
73
|
+
root.appendChild(title);
|
|
74
|
+
if (description) {
|
|
75
|
+
const info = document.createElement("p");
|
|
76
|
+
info.innerText = description;
|
|
77
|
+
info.className = "text-subdued";
|
|
78
|
+
root.appendChild(info);
|
|
79
|
+
}
|
|
80
|
+
if (syntax) {
|
|
81
|
+
const detail = document.createElement("pre");
|
|
82
|
+
detail.innerText = syntax;
|
|
83
|
+
detail.className = "whitespace-pre-wrap text-greenText";
|
|
84
|
+
root.appendChild(detail);
|
|
85
|
+
}
|
|
86
|
+
return root;
|
|
87
|
+
},
|
|
88
|
+
apply: (view, completion, from, to) => {
|
|
89
|
+
const insertParens = to === view.state.doc.toString().length;
|
|
90
|
+
view.dispatch(view.state.update({
|
|
91
|
+
changes: {
|
|
92
|
+
from,
|
|
93
|
+
to,
|
|
94
|
+
insert: completion.label + (insertParens ? "()" : "")
|
|
95
|
+
},
|
|
96
|
+
selection: {
|
|
97
|
+
anchor: from + completion.label.length + 1
|
|
98
|
+
}
|
|
99
|
+
}));
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
};
|
|
103
|
+
return [
|
|
104
|
+
extension,
|
|
105
|
+
languageFacet.of(language),
|
|
106
|
+
language.data.of({
|
|
107
|
+
autocomplete: (context) => {
|
|
108
|
+
if (context.state.doc.toString()[0] !== "=") {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
const match = context.matchBefore(/\w*/);
|
|
112
|
+
if (!match || match.from === match.to) {
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
const text = match.text.toUpperCase();
|
|
116
|
+
if (!context.explicit && match.text.length < 2) {
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
from: match.from,
|
|
121
|
+
options: functions?.filter(({ name }) => name.startsWith(text)).map(({ name }) => createCompletion(name)) ?? []
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
}),
|
|
125
|
+
syntaxHighlighting(highlightStyles),
|
|
126
|
+
autocompletion({
|
|
127
|
+
aboveCursor: false,
|
|
128
|
+
defaultKeymap: true,
|
|
129
|
+
activateOnTyping: true,
|
|
130
|
+
closeOnBlur: !debug,
|
|
131
|
+
icons: false,
|
|
132
|
+
tooltipClass: () => mx("!-left-[1px] !top-[33px] !-m-0 border !border-t-0 [&>ul]:!min-w-[198px]", "[&>ul>li[aria-selected]]:!bg-accentSurface", "border-separator")
|
|
133
|
+
}),
|
|
134
|
+
keymap.of([
|
|
135
|
+
{
|
|
136
|
+
key: "Tab",
|
|
137
|
+
run: (view) => {
|
|
138
|
+
return completionStatus(view.state) === "active" ? acceptCompletion(view) : startCompletion(view);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
])
|
|
142
|
+
];
|
|
143
|
+
};
|
|
144
|
+
var rangeExtension = ({ onInit, onStateChange }) => {
|
|
145
|
+
let view;
|
|
146
|
+
let activeRange;
|
|
147
|
+
const notifier = {
|
|
148
|
+
setRange: (range) => {
|
|
149
|
+
if (activeRange) {
|
|
150
|
+
view.dispatch(view.state.update({
|
|
151
|
+
changes: {
|
|
152
|
+
...activeRange,
|
|
153
|
+
insert: range.toString()
|
|
154
|
+
},
|
|
155
|
+
selection: {
|
|
156
|
+
anchor: activeRange.from + range.length
|
|
157
|
+
}
|
|
158
|
+
}));
|
|
159
|
+
}
|
|
160
|
+
view.focus();
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
return ViewPlugin2.fromClass(class {
|
|
164
|
+
constructor(_view) {
|
|
165
|
+
view = _view;
|
|
166
|
+
onInit?.(notifier);
|
|
167
|
+
}
|
|
168
|
+
update(view2) {
|
|
169
|
+
const { anchor } = view2.state.selection.ranges[0];
|
|
170
|
+
activeRange = void 0;
|
|
171
|
+
const language = view2.state.facet(languageFacet);
|
|
172
|
+
const { topNode } = language.parser.parse(view2.state.doc.toString());
|
|
173
|
+
visitTree(topNode, ({ type, from, to }) => {
|
|
174
|
+
if (from <= anchor && to >= anchor) {
|
|
175
|
+
switch (type.name) {
|
|
176
|
+
case "Function":
|
|
177
|
+
activeRange = {
|
|
178
|
+
from: to,
|
|
179
|
+
to
|
|
180
|
+
};
|
|
181
|
+
break;
|
|
182
|
+
case "CloseParen":
|
|
183
|
+
activeRange = {
|
|
184
|
+
from,
|
|
185
|
+
to: from
|
|
186
|
+
};
|
|
187
|
+
break;
|
|
188
|
+
case "RangeToken":
|
|
189
|
+
case "CellToken":
|
|
190
|
+
activeRange = {
|
|
191
|
+
from,
|
|
192
|
+
to
|
|
193
|
+
};
|
|
194
|
+
return true;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return false;
|
|
198
|
+
});
|
|
199
|
+
if (!activeRange && view2.state.doc.toString()[0] === "=") {
|
|
200
|
+
const str = view2.state.doc.sliceString(1);
|
|
201
|
+
if (RANGE_NOTATION.test(str)) {
|
|
202
|
+
activeRange = {
|
|
203
|
+
from: 1,
|
|
204
|
+
to: str.length + 1
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
onStateChange?.({
|
|
209
|
+
activeRange: activeRange ? view2.state.doc.sliceString(activeRange.from, activeRange.to) : void 0
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
};
|
|
214
|
+
var visitTree = (node, callback) => {
|
|
215
|
+
if (callback(node)) {
|
|
216
|
+
return true;
|
|
217
|
+
}
|
|
218
|
+
for (let child = node.firstChild; child !== null; child = child.nextSibling) {
|
|
219
|
+
if (visitTree(child, callback)) {
|
|
220
|
+
return true;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return false;
|
|
224
|
+
};
|
|
225
|
+
|
|
226
|
+
export {
|
|
227
|
+
computeGraphFacet,
|
|
228
|
+
sheetExtension,
|
|
229
|
+
rangeExtension
|
|
230
|
+
};
|
|
231
|
+
//# sourceMappingURL=chunk-PTOI45NK.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/extensions/compute.ts", "../../../src/extensions/editor/extension.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { syntaxTree } from '@codemirror/language';\nimport {\n type EditorState,\n type Extension,\n type RangeSet,\n RangeSetBuilder,\n StateEffect,\n StateField,\n type Transaction,\n} from '@codemirror/state';\nimport { Decoration, EditorView, ViewPlugin, WidgetType } from '@codemirror/view';\n\nimport { type UnsubscribeCallback, debounce } from '@dxos/async';\nimport {\n createSheetName,\n type CellAddress,\n type CellScalarValue,\n type ComputeGraph,\n type ComputeNode,\n} from '@dxos/compute';\nimport { invariant } from '@dxos/invariant';\nimport { documentId, singleValueFacet } from '@dxos/react-ui-editor';\n\nconst LANGUAGE_TAG = 'dx';\n\n// TODO(burdon): Create marker just for our decorator?\nconst updateAllDecorations = StateEffect.define<void>();\n\nexport const computeGraphFacet = singleValueFacet<ComputeGraph>();\n\nexport type ComputeOptions = {};\n\nexport const compute = (options: ComputeOptions = {}): Extension => {\n let computeNode: ComputeNode | undefined;\n\n const update = (state: EditorState, current?: RangeSet<Decoration>) => {\n const builder = new RangeSetBuilder<Decoration>();\n if (computeNode) {\n computeNode.clear();\n syntaxTree(state).iterate({\n enter: (node) => {\n switch (node.name) {\n case 'FencedCode': {\n const cursor = state.selection.main.head;\n if (state.readOnly || cursor < node.from || cursor > node.to) {\n const info = node.node.getChild('CodeInfo');\n if (info) {\n const type = state.sliceDoc(info.from, info.to);\n const text = node.node.getChild('CodeText');\n if (type === LANGUAGE_TAG && text) {\n const formula = state.sliceDoc(text.from, text.to);\n\n const iter = current?.iter(node.node.from);\n if (iter?.value && iter?.value.spec.formula === formula) {\n // Add existing widget.\n builder.add(node.from, node.to, iter.value);\n } else {\n // TODO(burdon): Create ordered list of cells on each decoration run.\n const cell: CellAddress = { col: node.node.from, row: 0 };\n invariant(computeNode);\n // NOTE: This triggers re-render (below).\n computeNode.setValue(cell, formula);\n const value = computeNode.getValue(cell);\n builder.add(\n node.from,\n node.to,\n Decoration.replace({\n widget: new ComputeWidget(formula, value),\n formula,\n }),\n );\n }\n }\n }\n }\n\n break;\n }\n }\n },\n });\n }\n\n return builder.finish();\n };\n\n return [\n ViewPlugin.fromClass(\n class {\n // Graph subscription.\n private _subscription?: UnsubscribeCallback;\n constructor(view: EditorView) {\n const id = view.state.facet(documentId);\n const computeGraph = view.state.facet(computeGraphFacet);\n if (id && computeGraph) {\n queueMicrotask(async () => {\n computeNode = computeGraph.getOrCreateNode(createSheetName({ type: '', id }));\n await computeNode.open();\n\n // Trigger re-render if values updated.\n // TODO(burdon): Trigger only if formula value updated (currently triggered during render).\n this._subscription = computeNode.update.on(\n debounce(({ type, ...rest }) => {\n if (type === 'valuesUpdated') {\n view.dispatch({\n effects: updateAllDecorations.of(),\n });\n }\n }, 250),\n );\n });\n }\n }\n\n destroy() {\n this._subscription?.();\n void computeNode?.close();\n computeNode = undefined;\n }\n },\n ),\n\n StateField.define<RangeSet<Decoration>>({\n create: (state) => update(state),\n update: (rangeSet: RangeSet<Decoration>, tr: Transaction) => update(tr.state, rangeSet),\n provide: (field) => EditorView.decorations.from(field),\n }),\n ];\n};\n\n// TODO(burdon): Click to edit.\nclass ComputeWidget extends WidgetType {\n constructor(\n private readonly formula: string,\n private readonly value: CellScalarValue,\n ) {\n super();\n }\n\n override toDOM(_view: EditorView) {\n const div = document.createElement('div');\n div.setAttribute('title', this.formula);\n div.innerText = String(this.value);\n return div;\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport {\n type Completion,\n type CompletionContext,\n type CompletionResult,\n acceptCompletion,\n autocompletion,\n completionStatus,\n startCompletion,\n} from '@codemirror/autocomplete';\nimport { HighlightStyle, type Language, syntaxHighlighting } from '@codemirror/language';\nimport { type Extension } from '@codemirror/state';\nimport { type EditorView, ViewPlugin, type ViewUpdate, keymap } from '@codemirror/view';\nimport { type SyntaxNode } from '@lezer/common';\nimport { tags } from '@lezer/highlight';\nimport { spreadsheet } from 'codemirror-lang-spreadsheet';\n\nimport { type FunctionDefinition } from '@dxos/compute';\nimport { RANGE_NOTATION } from '@dxos/compute';\nimport { singleValueFacet } from '@dxos/react-ui-editor';\nimport { mx } from '@dxos/react-ui-theme';\n\n/**\n * https://codemirror.net/examples/styling\n * https://lezer.codemirror.net/docs/ref/#highlight\n * https://github.com/luizzappa/codemirror-lang-spreadsheet/blob/main/src/index.ts#L28 (mapping)\n */\n// TODO(burdon): Define light/dark.\nconst highlightStyles = HighlightStyle.define([\n // Function.\n {\n tag: tags.name,\n class: 'text-accentText',\n },\n // Range.\n {\n tag: tags.tagName,\n class: 'text-pinkText',\n },\n // Values.\n {\n tag: tags.number,\n class: 'text-tealText',\n },\n {\n tag: tags.bool,\n class: 'text-tealText',\n },\n {\n tag: tags.string,\n class: 'text-tealText',\n },\n // Error.\n {\n tag: tags.invalid,\n class: 'text-unAccent',\n },\n]);\n\nconst languageFacet = singleValueFacet<Language>();\n\nexport type SheetExtensionOptions = {\n debug?: boolean;\n functions?: FunctionDefinition[];\n};\n\n/**\n * Spreadsheet formula extension and parser.\n * https://github.com/luizzappa/codemirror-lang-spreadsheet\n * https://github.com/luizzappa/codemirror-app-spreadsheet/blob/master/src/editor.ts\n * https://github.com/codemirror/lang-example\n * https://hyperformula.handsontable.com/guide/key-concepts.html#grammar\n */\nexport const sheetExtension = ({ debug, functions = [] }: SheetExtensionOptions): Extension => {\n const { extension, language } = spreadsheet({ idiom: 'en-US', decimalSeparator: '.' });\n\n const createCompletion = (name: string) => {\n const { section = 'Custom', description, syntax } = functions.find((value) => value.name === name) ?? {};\n\n return {\n section,\n label: name,\n info: () => {\n if (!description && !syntax) {\n return null;\n }\n\n // TODO(burdon): Standardize color styles.\n const root = document.createElement('div');\n root.className = 'flex flex-col gap-2 text-sm';\n\n const title = document.createElement('h2');\n title.innerText = name;\n title.className = 'text-lg font-mono text-accentText';\n root.appendChild(title);\n\n if (description) {\n const info = document.createElement('p');\n info.innerText = description;\n info.className = 'text-subdued';\n root.appendChild(info);\n }\n\n if (syntax) {\n const detail = document.createElement('pre');\n detail.innerText = syntax;\n detail.className = 'whitespace-pre-wrap text-greenText';\n root.appendChild(detail);\n }\n\n return root;\n },\n apply: (view, completion, from, to) => {\n const insertParens = to === view.state.doc.toString().length;\n view.dispatch(\n view.state.update({\n changes: {\n from,\n to,\n insert: completion.label + (insertParens ? '()' : ''),\n },\n selection: {\n anchor: from + completion.label.length + 1,\n },\n }),\n );\n },\n } satisfies Completion;\n };\n\n return [\n extension,\n languageFacet.of(language),\n language.data.of({\n autocomplete: (context: CompletionContext): CompletionResult | null => {\n if (context.state.doc.toString()[0] !== '=') {\n return null;\n }\n const match = context.matchBefore(/\\w*/);\n if (!match || match.from === match.to) {\n return null;\n }\n\n const text = match.text.toUpperCase();\n if (!context.explicit && match.text.length < 2) {\n return null;\n }\n\n return {\n from: match.from,\n options:\n functions?.filter(({ name }) => name.startsWith(text)).map(({ name }) => createCompletion(name)) ?? [],\n };\n },\n }),\n\n syntaxHighlighting(highlightStyles),\n autocompletion({\n aboveCursor: false,\n defaultKeymap: true,\n activateOnTyping: true,\n closeOnBlur: !debug,\n icons: false,\n tooltipClass: () =>\n mx(\n '!-left-[1px] !top-[33px] !-m-0 border !border-t-0 [&>ul]:!min-w-[198px]',\n '[&>ul>li[aria-selected]]:!bg-accentSurface',\n 'border-separator',\n ),\n }),\n keymap.of([\n {\n key: 'Tab',\n run: (view) => {\n return completionStatus(view.state) === 'active' ? acceptCompletion(view) : startCompletion(view);\n },\n },\n ]),\n\n // Parsing.\n // StateField.define({\n // create: (state) => {},\n // update: (value, tr) => {\n // log.info('update');\n // syntaxTree(tr.state).iterate({\n // enter: ({ type, from, to }) => {\n // log.info('node', { type: type.name, from, to });\n // },\n // });\n // },\n // }),\n ];\n};\n\nexport type SelectionRange = { from: number; to: number };\n\nexport interface RangeController {\n setRange(range: string): void;\n}\n\nexport type RangeExtensionOptions = {\n /**\n * Provides controller callback when extension is initialized.\n */\n onInit?: (controller: RangeController) => void;\n /**\n * Called when the active range changes.\n * @param state The current state.\n * @param state.activeRange undefined if no range is active, otherwise a possibly partially defined range.\n */\n onStateChange?: (state: { activeRange: string | undefined }) => void;\n};\n\n/**\n * Tracks the currently active cell within a formula and provides a callback to modify it.\n */\nexport const rangeExtension = ({ onInit, onStateChange }: RangeExtensionOptions): Extension => {\n let view: EditorView;\n let activeRange: SelectionRange | undefined;\n\n // Called externally to provide current range.\n const notifier: RangeController = {\n setRange: (range: string) => {\n if (activeRange) {\n view.dispatch(\n view.state.update({\n changes: { ...activeRange, insert: range.toString() },\n selection: { anchor: activeRange.from + range.length },\n }),\n );\n }\n\n view.focus();\n },\n };\n\n return ViewPlugin.fromClass(\n class {\n constructor(_view: EditorView) {\n view = _view;\n onInit?.(notifier);\n }\n\n update(view: ViewUpdate) {\n const { anchor } = view.state.selection.ranges[0];\n\n // Find first Range or cell at cursor.\n activeRange = undefined;\n const language = view.state.facet(languageFacet);\n const { topNode } = language.parser.parse(view.state.doc.toString());\n visitTree(topNode, ({ type, from, to }) => {\n if (from <= anchor && to >= anchor) {\n switch (type.name) {\n case 'Function':\n // Mark but keep looking.\n activeRange = { from: to, to };\n break;\n\n case 'CloseParen':\n // Mark but keep looking.\n activeRange = { from, to: from };\n break;\n\n case 'RangeToken':\n case 'CellToken':\n activeRange = { from, to };\n return true;\n }\n }\n\n return false;\n });\n\n // Allow start of formula.\n if (!activeRange && view.state.doc.toString()[0] === '=') {\n const str = view.state.doc.sliceString(1);\n if (RANGE_NOTATION.test(str)) {\n activeRange = { from: 1, to: str.length + 1 };\n }\n }\n\n onStateChange?.({\n activeRange: activeRange ? view.state.doc.sliceString(activeRange.from, activeRange.to) : undefined,\n });\n }\n },\n );\n};\n\n/**\n * Lezer parse result visitor.\n */\nconst visitTree = (node: SyntaxNode, callback: (node: SyntaxNode) => boolean): boolean => {\n if (callback(node)) {\n return true;\n }\n\n for (let child = node.firstChild; child !== null; child = child.nextSibling) {\n if (visitTree(child, callback)) {\n return true;\n }\n }\n\n return false;\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["syntaxTree", "RangeSetBuilder", "StateEffect", "StateField", "Decoration", "EditorView", "ViewPlugin", "WidgetType", "debounce", "createSheetName", "invariant", "documentId", "singleValueFacet", "updateAllDecorations", "StateEffect", "define", "computeGraphFacet", "singleValueFacet", "acceptCompletion", "autocompletion", "completionStatus", "startCompletion", "HighlightStyle", "syntaxHighlighting", "ViewPlugin", "keymap", "tags", "spreadsheet", "RANGE_NOTATION", "singleValueFacet", "mx", "highlightStyles", "HighlightStyle", "define", "tag", "tags", "name", "class", "tagName", "number", "bool", "string", "invalid", "languageFacet", "singleValueFacet", "sheetExtension", "debug", "functions", "extension", "language", "spreadsheet", "idiom", "decimalSeparator", "createCompletion", "section", "description", "syntax", "find", "value", "label", "info", "root", "document", "createElement", "className", "title", "innerText", "appendChild", "detail", "apply", "view", "completion", "from", "to", "insertParens", "state", "doc", "toString", "length", "dispatch", "update", "changes", "insert", "selection", "anchor", "of", "data", "autocomplete", "context", "match", "matchBefore", "text", "toUpperCase", "explicit", "options", "filter", "startsWith", "map", "syntaxHighlighting", "autocompletion", "aboveCursor", "defaultKeymap", "activateOnTyping", "closeOnBlur", "icons", "tooltipClass", "mx", "keymap", "key", "run", "completionStatus", "acceptCompletion", "startCompletion", "rangeExtension", "onInit", "onStateChange", "activeRange", "notifier", "setRange", "range", "focus", "ViewPlugin", "fromClass", "constructor", "_view", "ranges", "undefined", "facet", "topNode", "parser", "parse", "visitTree", "type", "str", "sliceString", "RANGE_NOTATION", "test", "node", "callback", "child", "firstChild", "nextSibling"]
|
|
7
|
+
}
|