@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
|
@@ -1,296 +0,0 @@
|
|
|
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_TP4GYXZB_exports = {};
|
|
30
|
-
__export(SheetContainer_TP4GYXZB_exports, {
|
|
31
|
-
default: () => SheetContainer_default
|
|
32
|
-
});
|
|
33
|
-
module.exports = __toCommonJS(SheetContainer_TP4GYXZB_exports);
|
|
34
|
-
var import_chunk_FDEQ2PGJ = require("./chunk-FDEQ2PGJ.cjs");
|
|
35
|
-
var import_chunk_TQOJ7DG2 = require("./chunk-TQOJ7DG2.cjs");
|
|
36
|
-
var import_chunk_2ZVZI2KJ = require("./chunk-2ZVZI2KJ.cjs");
|
|
37
|
-
var import_react = __toESM(require("react"));
|
|
38
|
-
var import_react_ui_stack = require("@dxos/react-ui-stack");
|
|
39
|
-
var import_react2 = __toESM(require("react"));
|
|
40
|
-
var import_compute = require("@dxos/compute");
|
|
41
|
-
var import_react_ui = require("@dxos/react-ui");
|
|
42
|
-
var import_react_context = require("@radix-ui/react-context");
|
|
43
|
-
var import_react3 = __toESM(require("react"));
|
|
44
|
-
var import_app_framework = require("@dxos/app-framework");
|
|
45
|
-
var import_compute2 = require("@dxos/compute");
|
|
46
|
-
var import_live_object = require("@dxos/live-object");
|
|
47
|
-
var import_types = require("@dxos/plugin-thread/types");
|
|
48
|
-
var import_react_ui2 = require("@dxos/react-ui");
|
|
49
|
-
var import_react_ui_attention = require("@dxos/react-ui-attention");
|
|
50
|
-
var FunctionEditor = () => {
|
|
51
|
-
const { model, cursor, range } = (0, import_chunk_FDEQ2PGJ.useSheetContext)();
|
|
52
|
-
let value;
|
|
53
|
-
let formula = false;
|
|
54
|
-
if (cursor) {
|
|
55
|
-
value = model.getCellValue(cursor);
|
|
56
|
-
if ((0, import_compute.isFormula)(value)) {
|
|
57
|
-
value = model.graph.mapFunctionBindingFromId((0, import_chunk_TQOJ7DG2.mapFormulaIndicesToRefs)(model.sheet, value));
|
|
58
|
-
formula = true;
|
|
59
|
-
} else if (value != null) {
|
|
60
|
-
value = String(value);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
return /* @__PURE__ */ import_react2.default.createElement("div", {
|
|
64
|
-
className: "flex shrink-0 justify-between items-center px-4 py-1 text-sm attention-surface border-bs !border-separator"
|
|
65
|
-
}, /* @__PURE__ */ import_react2.default.createElement("div", {
|
|
66
|
-
className: "flex gap-4 items-center"
|
|
67
|
-
}, /* @__PURE__ */ import_react2.default.createElement("div", {
|
|
68
|
-
className: "flex w-16 items-center font-mono"
|
|
69
|
-
}, range && (0, import_compute.rangeToA1Notation)(range) || cursor && (0, import_compute.addressToA1Notation)(cursor)), /* @__PURE__ */ import_react2.default.createElement("div", {
|
|
70
|
-
className: "flex gap-2 items-center"
|
|
71
|
-
}, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Icon, {
|
|
72
|
-
icon: "ph--function--regular",
|
|
73
|
-
classNames: [
|
|
74
|
-
"text-greenText",
|
|
75
|
-
formula ? "visible" : "invisible"
|
|
76
|
-
]
|
|
77
|
-
}), /* @__PURE__ */ import_react2.default.createElement("span", {
|
|
78
|
-
className: "font-mono"
|
|
79
|
-
}, value))));
|
|
80
|
-
};
|
|
81
|
-
var buttonStyles = "min-bs-0 p-2";
|
|
82
|
-
var tooltipProps = {
|
|
83
|
-
side: "bottom"
|
|
84
|
-
};
|
|
85
|
-
var ToolbarSeparator = () => /* @__PURE__ */ import_react3.default.createElement("div", {
|
|
86
|
-
role: "separator",
|
|
87
|
-
className: "grow"
|
|
88
|
-
});
|
|
89
|
-
var ToolbarItem = ({ itemType, icon, children, ...props }) => {
|
|
90
|
-
const Invoker = itemType === "toggleGroupItem" ? import_react_ui2.Toolbar.ToggleGroupItem : itemType === "toggle" ? import_react_ui2.Toolbar.Toggle : import_react_ui2.Toolbar.Button;
|
|
91
|
-
return /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.Tooltip.Root, null, /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.Tooltip.Trigger, {
|
|
92
|
-
asChild: true
|
|
93
|
-
}, /* @__PURE__ */ import_react3.default.createElement(Invoker, {
|
|
94
|
-
variant: "ghost",
|
|
95
|
-
...props,
|
|
96
|
-
classNames: buttonStyles
|
|
97
|
-
}, /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.Icon, {
|
|
98
|
-
icon,
|
|
99
|
-
size: 5
|
|
100
|
-
}), /* @__PURE__ */ import_react3.default.createElement("span", {
|
|
101
|
-
className: "sr-only"
|
|
102
|
-
}, children))), /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.Tooltip.Portal, null, /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.Tooltip.Content, tooltipProps, children, /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.Tooltip.Arrow, null))));
|
|
103
|
-
};
|
|
104
|
-
var [ToolbarContextProvider, useToolbarContext] = (0, import_react_context.createContext)("Toolbar");
|
|
105
|
-
var ToolbarRoot = ({ children, role, classNames }) => {
|
|
106
|
-
const { id, model, cursorFallbackRange, cursor } = (0, import_chunk_FDEQ2PGJ.useSheetContext)();
|
|
107
|
-
const { hasAttention } = (0, import_react_ui_attention.useAttention)(id);
|
|
108
|
-
const { dispatchPromise: dispatch } = (0, import_app_framework.useIntentDispatcher)();
|
|
109
|
-
const handleAction = (0, import_react3.useCallback)((action) => {
|
|
110
|
-
switch (action.key) {
|
|
111
|
-
case "alignment":
|
|
112
|
-
if (cursorFallbackRange) {
|
|
113
|
-
const index = model.sheet.ranges?.findIndex((range) => range.key === action.key && (0, import_compute2.inRange)((0, import_chunk_TQOJ7DG2.rangeFromIndex)(model.sheet, range.range), cursorFallbackRange.from)) ?? -1;
|
|
114
|
-
const nextRangeEntity = {
|
|
115
|
-
range: (0, import_chunk_TQOJ7DG2.rangeToIndex)(model.sheet, cursorFallbackRange),
|
|
116
|
-
key: action.key,
|
|
117
|
-
value: action.value
|
|
118
|
-
};
|
|
119
|
-
if (index < 0) {
|
|
120
|
-
model.sheet.ranges?.push(nextRangeEntity);
|
|
121
|
-
} else if (model.sheet.ranges[index].value === action.value) {
|
|
122
|
-
model.sheet.ranges?.splice(index, 1);
|
|
123
|
-
} else {
|
|
124
|
-
model.sheet.ranges?.splice(index, 1, nextRangeEntity);
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
break;
|
|
128
|
-
case "style":
|
|
129
|
-
if (action.unset) {
|
|
130
|
-
const index = model.sheet.ranges?.findIndex((range) => range.key === action.key && cursorFallbackRange && (0, import_compute2.inRange)((0, import_chunk_TQOJ7DG2.rangeFromIndex)(model.sheet, range.range), cursorFallbackRange.from));
|
|
131
|
-
if (index >= 0) {
|
|
132
|
-
model.sheet.ranges?.splice(index, 1);
|
|
133
|
-
}
|
|
134
|
-
} else if (cursorFallbackRange) {
|
|
135
|
-
model.sheet.ranges?.push({
|
|
136
|
-
range: (0, import_chunk_TQOJ7DG2.rangeToIndex)(model.sheet, cursorFallbackRange),
|
|
137
|
-
key: action.key,
|
|
138
|
-
value: action.value
|
|
139
|
-
});
|
|
140
|
-
}
|
|
141
|
-
break;
|
|
142
|
-
case "comment": {
|
|
143
|
-
if (cursorFallbackRange) {
|
|
144
|
-
void dispatch((0, import_app_framework.createIntent)(import_types.ThreadAction.Create, {
|
|
145
|
-
cursor: (0, import_chunk_FDEQ2PGJ.completeCellRangeToThreadCursor)(cursorFallbackRange),
|
|
146
|
-
name: action.cellContent,
|
|
147
|
-
subject: model.sheet
|
|
148
|
-
}));
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
}, [
|
|
153
|
-
model.sheet,
|
|
154
|
-
cursorFallbackRange,
|
|
155
|
-
cursor,
|
|
156
|
-
dispatch
|
|
157
|
-
]);
|
|
158
|
-
return /* @__PURE__ */ import_react3.default.createElement(ToolbarContextProvider, {
|
|
159
|
-
onAction: handleAction
|
|
160
|
-
}, /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.Toolbar.Root, {
|
|
161
|
-
classNames: [
|
|
162
|
-
"pli-0.5 attention-surface",
|
|
163
|
-
!hasAttention && "opacity-20",
|
|
164
|
-
classNames
|
|
165
|
-
]
|
|
166
|
-
}, children));
|
|
167
|
-
};
|
|
168
|
-
var alignmentOptions = [
|
|
169
|
-
{
|
|
170
|
-
value: "start",
|
|
171
|
-
icon: "ph--text-align-left--regular"
|
|
172
|
-
},
|
|
173
|
-
{
|
|
174
|
-
value: "center",
|
|
175
|
-
icon: "ph--text-align-center--regular"
|
|
176
|
-
},
|
|
177
|
-
{
|
|
178
|
-
value: "end",
|
|
179
|
-
icon: "ph--text-align-right--regular"
|
|
180
|
-
}
|
|
181
|
-
];
|
|
182
|
-
var Alignment = () => {
|
|
183
|
-
const { cursor, model } = (0, import_chunk_FDEQ2PGJ.useSheetContext)();
|
|
184
|
-
const { onAction } = useToolbarContext("Alignment");
|
|
185
|
-
const { t } = (0, import_react_ui2.useTranslation)(import_chunk_2ZVZI2KJ.SHEET_PLUGIN);
|
|
186
|
-
const value = cursor ? model.sheet.ranges?.findLast(({ range, key }) => key === import_chunk_TQOJ7DG2.alignKey && (0, import_compute2.inRange)((0, import_chunk_TQOJ7DG2.rangeFromIndex)(model.sheet, range), cursor))?.value : void 0;
|
|
187
|
-
return /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.Toolbar.ToggleGroup, {
|
|
188
|
-
type: "single",
|
|
189
|
-
value: (
|
|
190
|
-
// TODO(thure): providing `undefined` leaves the last item active which was active rather than showing none.
|
|
191
|
-
value ?? "never"
|
|
192
|
-
),
|
|
193
|
-
onValueChange: (value2) => onAction?.({
|
|
194
|
-
key: import_chunk_TQOJ7DG2.alignKey,
|
|
195
|
-
value: value2
|
|
196
|
-
})
|
|
197
|
-
}, alignmentOptions.map(({ value: value2, icon }) => /* @__PURE__ */ import_react3.default.createElement(ToolbarItem, {
|
|
198
|
-
itemType: "toggleGroupItem",
|
|
199
|
-
key: value2,
|
|
200
|
-
value: value2,
|
|
201
|
-
icon,
|
|
202
|
-
"data-testid": `grid.toolbar.${import_chunk_TQOJ7DG2.alignKey}.${value2}`
|
|
203
|
-
}, t("toolbar action label", {
|
|
204
|
-
key: t(`range key ${import_chunk_TQOJ7DG2.alignKey} label`),
|
|
205
|
-
value: t(`range value ${value2} label`)
|
|
206
|
-
}))));
|
|
207
|
-
};
|
|
208
|
-
var styleOptions = [
|
|
209
|
-
{
|
|
210
|
-
value: "highlight",
|
|
211
|
-
icon: "ph--highlighter--regular"
|
|
212
|
-
},
|
|
213
|
-
{
|
|
214
|
-
value: "softwrap",
|
|
215
|
-
icon: "ph--paragraph--regular"
|
|
216
|
-
}
|
|
217
|
-
];
|
|
218
|
-
var Styles = () => {
|
|
219
|
-
const { cursorFallbackRange, model } = (0, import_chunk_FDEQ2PGJ.useSheetContext)();
|
|
220
|
-
const { onAction } = useToolbarContext("Styles");
|
|
221
|
-
const { t } = (0, import_react_ui2.useTranslation)(import_chunk_2ZVZI2KJ.SHEET_PLUGIN);
|
|
222
|
-
const activeValues = cursorFallbackRange ? model.sheet.ranges?.filter(({ range, key }) => key === "style" && (0, import_compute2.inRange)((0, import_chunk_TQOJ7DG2.rangeFromIndex)(model.sheet, range), cursorFallbackRange.from)).reduce((acc, { value }) => {
|
|
223
|
-
acc.add(value);
|
|
224
|
-
return acc;
|
|
225
|
-
}, /* @__PURE__ */ new Set()) : void 0;
|
|
226
|
-
return /* @__PURE__ */ import_react3.default.createElement(import_react3.default.Fragment, null, styleOptions.map(({ value, icon }) => /* @__PURE__ */ import_react3.default.createElement(ToolbarItem, {
|
|
227
|
-
itemType: "toggle",
|
|
228
|
-
key: value,
|
|
229
|
-
pressed: activeValues?.has(value),
|
|
230
|
-
onPressedChange: (nextPressed) => {
|
|
231
|
-
onAction?.({
|
|
232
|
-
key: "style",
|
|
233
|
-
value,
|
|
234
|
-
unset: !nextPressed
|
|
235
|
-
});
|
|
236
|
-
},
|
|
237
|
-
icon
|
|
238
|
-
}, t("toolbar action label", {
|
|
239
|
-
key: t(`range key ${import_chunk_TQOJ7DG2.styleKey} label`),
|
|
240
|
-
value: t(`range value ${value} label`)
|
|
241
|
-
}))));
|
|
242
|
-
};
|
|
243
|
-
var Actions = () => {
|
|
244
|
-
const { onAction } = useToolbarContext("Actions");
|
|
245
|
-
const { cursorFallbackRange, cursor, model } = (0, import_chunk_FDEQ2PGJ.useSheetContext)();
|
|
246
|
-
const { t } = (0, import_react_ui2.useTranslation)(import_chunk_2ZVZI2KJ.SHEET_PLUGIN);
|
|
247
|
-
const overlapsCommentAnchor = import_live_object.RefArray.allResolvedTargets(model.sheet.threads ?? []).filter((thread) => thread.status !== "resolved").some((thread) => {
|
|
248
|
-
if (!cursorFallbackRange) {
|
|
249
|
-
return false;
|
|
250
|
-
}
|
|
251
|
-
return (0, import_chunk_TQOJ7DG2.rangeToIndex)(model.sheet, cursorFallbackRange) === thread.anchor;
|
|
252
|
-
});
|
|
253
|
-
const tooltipLabelKey = !cursor ? "no cursor label" : overlapsCommentAnchor ? "selection overlaps existing comment label" : "comment label";
|
|
254
|
-
return /* @__PURE__ */ import_react3.default.createElement(ToolbarItem, {
|
|
255
|
-
itemType: "button",
|
|
256
|
-
value: "comment",
|
|
257
|
-
icon: "ph--chat-text--regular",
|
|
258
|
-
"data-testid": "editor.toolbar.comment",
|
|
259
|
-
onClick: () => {
|
|
260
|
-
if (!cursorFallbackRange) {
|
|
261
|
-
return;
|
|
262
|
-
}
|
|
263
|
-
return onAction?.({
|
|
264
|
-
key: "comment",
|
|
265
|
-
value: (0, import_chunk_TQOJ7DG2.rangeToIndex)(model.sheet, cursorFallbackRange),
|
|
266
|
-
cellContent: model.getCellText(cursorFallbackRange.from)
|
|
267
|
-
});
|
|
268
|
-
},
|
|
269
|
-
disabled: !cursorFallbackRange || overlapsCommentAnchor
|
|
270
|
-
}, t(tooltipLabelKey));
|
|
271
|
-
};
|
|
272
|
-
var Toolbar = {
|
|
273
|
-
Root: ToolbarRoot,
|
|
274
|
-
Separator: ToolbarSeparator,
|
|
275
|
-
Alignment,
|
|
276
|
-
Styles,
|
|
277
|
-
Actions
|
|
278
|
-
};
|
|
279
|
-
var SheetContainer = ({ space, sheet, role, ignoreAttention }) => {
|
|
280
|
-
const graph = (0, import_chunk_FDEQ2PGJ.useComputeGraph)(space);
|
|
281
|
-
return graph ? /* @__PURE__ */ import_react.default.createElement(import_chunk_FDEQ2PGJ.SheetProvider, {
|
|
282
|
-
sheet,
|
|
283
|
-
graph,
|
|
284
|
-
ignoreAttention
|
|
285
|
-
}, /* @__PURE__ */ import_react.default.createElement(import_react_ui_stack.StackItem.Content, {
|
|
286
|
-
toolbar: true,
|
|
287
|
-
statusbar: true,
|
|
288
|
-
...role === "section" && {
|
|
289
|
-
classNames: "aspect-video"
|
|
290
|
-
}
|
|
291
|
-
}, /* @__PURE__ */ import_react.default.createElement(Toolbar.Root, {
|
|
292
|
-
role
|
|
293
|
-
}, /* @__PURE__ */ import_react.default.createElement(Toolbar.Styles, null), /* @__PURE__ */ import_react.default.createElement(Toolbar.Alignment, null), /* @__PURE__ */ import_react.default.createElement(Toolbar.Separator, null), /* @__PURE__ */ import_react.default.createElement(Toolbar.Actions, null)), /* @__PURE__ */ import_react.default.createElement(import_chunk_FDEQ2PGJ.GridSheet, null), /* @__PURE__ */ import_react.default.createElement(FunctionEditor, null))) : null;
|
|
294
|
-
};
|
|
295
|
-
var SheetContainer_default = SheetContainer;
|
|
296
|
-
//# sourceMappingURL=SheetContainer-TP4GYXZB.cjs.map
|
|
@@ -1,7 +0,0 @@
|
|
|
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';\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 { Toolbar } from '../Toolbar';\n\nexport const SheetContainer = ({\n space,\n sheet,\n role,\n ignoreAttention,\n}: {\n space: Space;\n sheet: SheetType;\n role?: string;\n ignoreAttention?: boolean;\n}) => {\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 <Toolbar.Root role={role}>\n <Toolbar.Styles />\n <Toolbar.Alignment />\n <Toolbar.Separator />\n <Toolbar.Actions />\n </Toolbar.Root>\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 attention-surface border-bs !border-separator'>\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 { createIntent, useIntentDispatcher } from '@dxos/app-framework';\nimport { inRange } from '@dxos/compute';\nimport { RefArray } from '@dxos/live-object';\nimport { ThreadAction } from '@dxos/plugin-thread/types';\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';\n\nimport { completeCellRangeToThreadCursor } from '../../integrations';\nimport { SHEET_PLUGIN } from '../../meta';\nimport {\n alignKey,\n rangeFromIndex,\n rangeToIndex,\n styleKey,\n type AlignKey,\n type AlignValue,\n type CommentKey,\n type CommentValue,\n type StyleKey,\n type StyleValue,\n type SheetType,\n} 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 };\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\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 { dispatchPromise: 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 if (cursorFallbackRange) {\n void dispatch(\n createIntent(ThreadAction.Create, {\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 classNames={['pli-0.5 attention-surface', !hasAttention && 'opacity-20', classNames]}>\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\n itemType='toggleGroupItem'\n key={value}\n value={value}\n icon={icon}\n data-testid={`grid.toolbar.${alignKey}.${value}`}\n >\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 = RefArray.allResolvedTargets(model.sheet.threads ?? [])\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": ["import_react", "import_compute", "import_react_ui", "FunctionEditor", "model", "cursor", "range", "useSheetContext", "value", "formula", "getCellValue", "isFormula", "graph", "mapFunctionBindingFromId", "mapFormulaIndicesToRefs", "sheet", "String", "React", "div", "className", "rangeToA1Notation", "addressToA1Notation", "Icon", "icon", "classNames", "span", "buttonStyles", "tooltipProps", "side", "ToolbarSeparator", "role", "ToolbarItem", "itemType", "children", "props", "Invoker", "NaturalToolbar", "ToggleGroupItem", "Toggle", "Button", "Tooltip", "Root", "Trigger", "asChild", "variant", "size", "Portal", "Content", "Arrow", "ToolbarContextProvider", "useToolbarContext", "createContext", "ToolbarRoot", "id", "cursorFallbackRange", "hasAttention", "useAttention", "dispatchPromise", "dispatch", "useIntentDispatcher", "handleAction", "useCallback", "action", "key", "index", "ranges", "findIndex", "inRange", "rangeFromIndex", "from", "nextRangeEntity", "rangeToIndex", "push", "splice", "unset", "createIntent", "ThreadAction", "Create", "completeCellRangeToThreadCursor", "name", "cellContent", "subject", "onAction", "alignmentOptions", "Alignment", "t", "useTranslation", "SHEET_PLUGIN", "findLast", "alignKey", "undefined", "ToggleGroup", "type", "onValueChange", "map", "data-testid", "styleOptions", "Styles", "activeValues", "filter", "reduce", "acc", "add", "Set", "pressed", "has", "onPressedChange", "nextPressed", "styleKey", "Actions", "overlapsCommentAnchor", "RefArray", "allResolvedTargets", "threads", "thread", "status", "some", "anchor", "tooltipLabelKey", "onClick", "getCellText", "disabled", "Toolbar", "Separator", "SheetContainer", "space", "ignoreAttention", "useComputeGraph", "SheetProvider", "StackItem", "toolbar", "statusbar", "GridSheet"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 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 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
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/components/ComputeGraph/ComputeGraphContextProvider.tsx", "../../../src/extensions/compute.ts", "../../../src/extensions/editor/extension.ts", "../../../src/components/SheetContext/SheetContext.tsx", "../../../src/components/GridSheet/GridSheet.tsx", "../../../src/components/GridSheet/util.ts", "../../../src/integrations/thread-ranges.ts", "../../../src/components/index.ts", "../../../src/components/RangeList/RangeList.tsx", "../../../src/components/SheetObjectSettings.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { createContext, type PropsWithChildren, useContext } from 'react';\n\nimport { type ComputeGraph, type ComputeGraphRegistry } from '@dxos/compute';\nimport { raise } from '@dxos/debug';\nimport { type Space } from '@dxos/react-client/echo';\nimport { useAsyncState } from '@dxos/react-hooks';\n\nexport type ComputeGraphContextType = {\n registry: ComputeGraphRegistry;\n};\n\n/**\n * The compute graph context manages a ComputeGraph for each space.\n */\nexport const ComputeGraphContext = createContext<ComputeGraphContextType | undefined>(undefined);\n\nexport const ComputeGraphContextProvider = ({ registry, children }: PropsWithChildren<ComputeGraphContextType>) => {\n return <ComputeGraphContext.Provider value={{ registry }}>{children}</ComputeGraphContext.Provider>;\n};\n\nexport const useComputeGraph = (space?: Space): ComputeGraph | undefined => {\n const { registry } = useContext(ComputeGraphContext) ?? raise(new Error('Missing ComputeGraphContext'));\n const [graph] = useAsyncState(async () => {\n if (space) {\n const graph = registry.getOrCreateGraph(space);\n await graph.open();\n return graph;\n }\n }, [space, registry]);\n\n return graph;\n};\n", "//\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", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { type PropsWithChildren, createContext, useCallback, useContext, useState } from 'react';\n\nimport { type ComputeGraph, type CellAddress, type CellRange, type CompleteCellRange } from '@dxos/compute';\nimport { invariant } from '@dxos/invariant';\nimport { fullyQualifiedId } from '@dxos/react-client/echo';\nimport {\n Grid,\n type GridContentProps,\n type GridEditing,\n type GridScopedProps,\n useGridContext,\n} from '@dxos/react-ui-grid';\n\nimport { type SheetModel, useSheetModel } from '../../model';\nimport { type SheetType } from '../../types';\n\nexport type SheetContextValue = {\n id: string;\n\n model: SheetModel;\n\n // Cursor state.\n // TODO(burdon): Cursor and range should use indices.\n cursor?: CellAddress;\n setCursor: (cell: CellAddress | undefined) => void;\n range?: CellRange;\n setRange: (range: CellRange | undefined) => void;\n cursorFallbackRange?: CompleteCellRange;\n\n // Editing state (undefined if not editing).\n editing: GridEditing;\n setEditing: (editing: GridEditing) => void;\n\n // Active refs\n activeRefs: GridContentProps['activeRefs'];\n setActiveRefs: (activeRefs: GridContentProps['activeRefs']) => void;\n\n // Events.\n // TODO(burdon): Generalize.\n onInfo?: () => void;\n\n // Flags\n ignoreAttention?: boolean;\n};\n\nconst SheetContext = createContext<SheetContextValue | undefined>(undefined);\n\nexport const useSheetContext = (): SheetContextValue => {\n const context = useContext(SheetContext);\n invariant(context);\n return context;\n};\n\nconst SheetProviderImpl = ({\n model,\n onInfo,\n ignoreAttention,\n children,\n __gridScope,\n}: GridScopedProps<PropsWithChildren<Pick<SheetContextValue, 'onInfo' | 'model' | 'ignoreAttention'>>>) => {\n const { id, editing, setEditing } = useGridContext('SheetProvider', __gridScope);\n\n const [cursor, setCursorInternal] = useState<CellAddress>();\n const [range, setRangeInternal] = useState<CellRange>();\n const [cursorFallbackRange, setCursorFallbackRange] = useState<CompleteCellRange>();\n const [activeRefs, setActiveRefs] = useState<GridContentProps['activeRefs']>('');\n\n const setCursor = useCallback(\n (nextCursor?: CellAddress) => {\n setCursorInternal(nextCursor);\n setCursorFallbackRange(\n range?.to ? (range as CompleteCellRange) : nextCursor ? { from: nextCursor!, to: nextCursor! } : undefined,\n );\n },\n [range],\n );\n const setRange = useCallback(\n (nextRange?: CellRange) => {\n setRangeInternal(nextRange);\n setCursorFallbackRange(\n nextRange?.to ? (nextRange as CompleteCellRange) : cursor ? { from: cursor!, to: cursor! } : undefined,\n );\n },\n [cursor],\n );\n\n return (\n <SheetContext.Provider\n value={{\n id,\n model,\n editing,\n setEditing,\n cursor,\n setCursor,\n range,\n setRange,\n cursorFallbackRange,\n activeRefs,\n setActiveRefs,\n // TODO(burdon): Change to event.\n onInfo,\n ignoreAttention,\n }}\n >\n {children}\n </SheetContext.Provider>\n );\n};\n\nexport type SheetProviderProps = {\n graph: ComputeGraph;\n sheet: SheetType;\n readonly?: boolean;\n ignoreAttention?: boolean;\n} & Pick<SheetContextValue, 'onInfo'>;\n\nexport const SheetProvider = ({\n children,\n graph,\n sheet,\n readonly,\n ignoreAttention,\n onInfo,\n}: PropsWithChildren<SheetProviderProps>) => {\n const model = useSheetModel(graph, sheet, { readonly });\n\n return !model ? null : (\n <Grid.Root id={fullyQualifiedId(sheet)}>\n <SheetProviderImpl model={model} onInfo={onInfo} ignoreAttention={ignoreAttention}>\n {children}\n </SheetProviderImpl>\n </Grid.Root>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, {\n useCallback,\n useMemo,\n useRef,\n type FocusEvent,\n type KeyboardEvent,\n type WheelEvent,\n type MouseEvent,\n useState,\n} from 'react';\n\nimport { createIntent, useIntentDispatcher } from '@dxos/app-framework';\nimport { rangeToA1Notation, type CellRange } from '@dxos/compute';\nimport { DropdownMenu, Icon, useTranslation } from '@dxos/react-ui';\nimport { useAttention } from '@dxos/react-ui-attention';\nimport {\n closestCell,\n defaultSizeRow,\n editorKeys,\n Grid,\n GridCellEditor,\n type DxGridElement,\n type DxGridPosition,\n type DxGridCellIndex,\n type EditorKeyHandler,\n type EditorBlurHandler,\n type GridContentProps,\n parseCellIndex,\n} from '@dxos/react-ui-grid';\n\nimport { colLabelCell, rowLabelCell, useSheetModelDxGridProps } from './util';\nimport { rangeExtension, sheetExtension, type RangeController } from '../../extensions';\nimport { useSelectThreadOnCellFocus, useUpdateFocusedCellOnThreadSelection } from '../../integrations';\nimport { SHEET_PLUGIN } from '../../meta';\nimport { DEFAULT_COLS, DEFAULT_ROWS, SheetAction } from '../../types';\nimport { useSheetContext } from '../SheetContext';\n\nconst inertPosition: DxGridPosition = { plane: 'grid', col: 0, row: 0 };\n\nconst initialCells = {\n grid: {},\n frozenColsStart: [...Array(64)].reduce((acc, _, i) => {\n acc[`0,${i}`] = rowLabelCell(i);\n return acc;\n }, {}),\n frozenRowsStart: [...Array(12)].reduce((acc, _, i) => {\n acc[`${i},0`] = colLabelCell(i);\n return acc;\n }, {}),\n};\n\nconst frozen = {\n frozenColsStart: 1,\n frozenRowsStart: 1,\n};\n\nconst sheetRowDefault = {\n frozenRowsStart: { size: defaultSizeRow, readonly: true },\n grid: { size: defaultSizeRow, resizeable: true },\n};\nconst sheetColDefault = { frozenColsStart: { size: 48, readonly: true }, grid: { size: 180, resizeable: true } };\n\nexport const GridSheet = () => {\n const { t } = useTranslation(SHEET_PLUGIN);\n const { id, model, editing, setCursor, setRange, cursor, cursorFallbackRange, activeRefs, ignoreAttention } =\n useSheetContext();\n // NOTE(thure): using `useState` instead of `useRef` works with refs provided by `@lit/react` and gives us\n // a reliable dependency for `useEffect` whereas `useLayoutEffect` does not guarantee the element will be defined.\n const [dxGrid, setDxGrid] = useState<DxGridElement | null>(null);\n const [extraplanarFocus, setExtraplanarFocus] = useState<DxGridPosition | null>(null);\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n const rangeController = useRef<RangeController>();\n const { hasAttention } = useAttention(id);\n\n const handleFocus = useCallback(\n (event: FocusEvent) => {\n if (!editing) {\n const cell = closestCell(event.target);\n if (cell) {\n if (cell.plane === 'grid') {\n setCursor({ col: cell.col, row: cell.row });\n setExtraplanarFocus(null);\n } else {\n setExtraplanarFocus(cell);\n }\n } else {\n setExtraplanarFocus(null);\n }\n }\n },\n [editing],\n );\n\n // TODO(burdon): Validate formula before closing: hf.validateFormula();\n const handleClose = useCallback<EditorKeyHandler>(\n (_value, event) => {\n if (event) {\n const { key, shift } = event;\n const axis = ['Enter', 'ArrowUp', 'ArrowDown'].includes(key)\n ? 'row'\n : ['Tab', 'ArrowLeft', 'ArrowRight'].includes(key)\n ? 'col'\n : undefined;\n const delta = key.startsWith('Arrow') ? (['ArrowUp', 'ArrowLeft'].includes(key) ? -1 : 1) : shift ? -1 : 1;\n dxGrid?.refocus(axis, delta);\n }\n },\n [model, editing, dxGrid],\n );\n\n const handleBlur = useCallback<EditorBlurHandler>(\n (value) => {\n if (value !== undefined) {\n model.setValue(parseCellIndex(editing!.index), value);\n }\n },\n [model, editing],\n );\n\n const handleAxisResize = useCallback<NonNullable<GridContentProps['onAxisResize']>>(\n ({ axis, size, index: numericIndex }) => {\n if (axis === 'row') {\n const rowId = model.sheet.rows[parseInt(numericIndex)];\n model.sheet.rowMeta[rowId] ??= {};\n model.sheet.rowMeta[rowId].size = size;\n } else {\n const columnId = model.sheet.columns[parseInt(numericIndex)];\n model.sheet.columnMeta[columnId] ??= {};\n model.sheet.columnMeta[columnId].size = size;\n }\n },\n [model],\n );\n\n const handleSelect = useCallback<NonNullable<GridContentProps['onSelect']>>(\n ({ minCol, maxCol, minRow, maxRow }) => {\n const range: CellRange = { from: { col: minCol, row: minRow } };\n if (minCol !== maxCol || minRow !== maxRow) {\n range.to = { col: maxCol, row: maxRow };\n }\n if (editing) {\n // Update range selection in formula.\n rangeController.current?.setRange(rangeToA1Notation(range));\n } else {\n // Setting range while editing causes focus to move to null, avoid doing so.\n setRange(range.to ? range : undefined);\n }\n },\n [editing],\n );\n const handleWheel = useCallback(\n (event: WheelEvent) => {\n if (!ignoreAttention && !hasAttention) {\n event.stopPropagation();\n }\n },\n [hasAttention, ignoreAttention],\n );\n\n const selectEntireAxis = useCallback(\n (pos: DxGridPosition) => {\n switch (pos.plane) {\n case 'frozenRowsStart':\n return dxGrid?.setSelection({\n start: { col: pos.col, row: 0, plane: 'grid' },\n end: { col: pos.col, row: model.sheet.rows.length - 1, plane: 'grid' },\n });\n case 'frozenColsStart':\n return dxGrid?.setSelection({\n start: { row: pos.row, col: 0, plane: 'grid' },\n end: { row: pos.row, col: model.sheet.columns.length - 1, plane: 'grid' },\n });\n }\n },\n [dxGrid, model.sheet],\n );\n\n const handleClick = useCallback(\n (event: MouseEvent) => {\n const cell = closestCell(event.target);\n if (cell) {\n selectEntireAxis(cell);\n }\n },\n [selectEntireAxis],\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n switch (event.key) {\n case 'Backspace':\n case 'Delete':\n event.preventDefault();\n return cursorFallbackRange && model.clear(cursorFallbackRange);\n case 'Enter':\n case 'Space':\n if (dxGrid && extraplanarFocus) {\n switch (extraplanarFocus.plane) {\n case 'frozenRowsStart':\n case 'frozenColsStart':\n event.preventDefault();\n return selectEntireAxis(extraplanarFocus);\n }\n }\n }\n if (event.metaKey || event.ctrlKey) {\n switch (event.key) {\n case 'x':\n case 'X':\n event.preventDefault();\n return cursorFallbackRange && model.cut(cursorFallbackRange);\n case 'c':\n case 'C':\n event.preventDefault();\n return cursorFallbackRange && model.copy(cursorFallbackRange);\n case 'v':\n case 'V':\n event.preventDefault();\n return cursor && model.paste(cursor);\n case 'z':\n event.preventDefault();\n return event.shiftKey ? model.redo() : model.undo();\n case 'Z':\n case 'y':\n event.preventDefault();\n return model.redo();\n }\n }\n },\n [cursorFallbackRange, model, cursor, extraplanarFocus, selectEntireAxis],\n );\n\n const contextMenuAnchorRef = useRef<HTMLButtonElement | null>(null);\n const [contextMenuOpen, setContextMenuOpen] = useState<DxGridPosition | null>(null);\n const contextMenuAxis = contextMenuOpen?.plane.startsWith('frozenRows') ? 'col' : 'row';\n\n const handleContextMenu = useCallback((event: MouseEvent) => {\n const cell = closestCell(event.target);\n if (cell && cell.plane.startsWith('frozen')) {\n event.preventDefault();\n contextMenuAnchorRef.current = event.target as HTMLButtonElement;\n setContextMenuOpen(cell);\n }\n }, []);\n\n const handleAxisMenuAction = useCallback(\n (operation: 'insert-before' | 'insert-after' | 'drop') => {\n switch (operation) {\n case 'insert-before':\n case 'insert-after':\n return dispatch(\n createIntent(SheetAction.InsertAxis, {\n model,\n axis: contextMenuAxis,\n index: contextMenuOpen![contextMenuAxis] + (operation === 'insert-before' ? 0 : 1),\n }),\n );\n case 'drop':\n return dispatch(\n createIntent(SheetAction.DropAxis, {\n model,\n axis: contextMenuAxis,\n axisIndex: model.sheet[contextMenuAxis === 'row' ? 'rows' : 'columns'][contextMenuOpen![contextMenuAxis]],\n }),\n );\n }\n },\n [contextMenuAxis, contextMenuOpen, model, dispatch],\n );\n\n const { columns, rows } = useSheetModelDxGridProps(dxGrid, model);\n\n const extension = useMemo(\n () => [\n editorKeys({ onClose: handleClose, ...(editing?.initialContent && { onNav: handleClose }) }),\n sheetExtension({ functions: model.graph.getFunctions() }),\n rangeExtension({\n onInit: (fn) => (rangeController.current = fn),\n onStateChange: (state) => {\n if (dxGrid) {\n // This can’t dispatch a setState in this component, otherwise the cell editor remounts and loses focus.\n dxGrid.mode = typeof state.activeRange === 'undefined' ? 'edit' : 'edit-select';\n }\n },\n }),\n ],\n [model, handleClose, editing],\n );\n\n const getCellContent = useCallback(\n (index: DxGridCellIndex) => {\n return model.getCellText(parseCellIndex(index));\n },\n [model],\n );\n\n useUpdateFocusedCellOnThreadSelection(dxGrid);\n useSelectThreadOnCellFocus();\n\n return (\n <div role='none' className='relative min-bs-0'>\n <GridCellEditor getCellContent={getCellContent} extension={extension} onBlur={handleBlur} />\n <Grid.Content\n initialCells={initialCells}\n limitColumns={DEFAULT_COLS}\n limitRows={DEFAULT_ROWS}\n columns={columns}\n rows={rows}\n onAxisResize={handleAxisResize}\n onSelect={handleSelect}\n rowDefault={sheetRowDefault}\n columnDefault={sheetColDefault}\n frozen={frozen}\n onFocus={handleFocus}\n onWheelCapture={handleWheel}\n onKeyDown={handleKeyDown}\n onContextMenu={handleContextMenu}\n onClick={handleClick}\n overscroll='trap'\n className='[--dx-grid-base:var(--surface-bg)] [&_.dx-grid]:border-bs [&_.dx-grid]:absolute [&_.dx-grid]:inset-0 [&_.dx-grid]:border-separator'\n activeRefs={activeRefs}\n ref={setDxGrid}\n />\n <DropdownMenu.Root\n modal={false}\n open={!!contextMenuOpen}\n onOpenChange={(nextOpen) => setContextMenuOpen(nextOpen ? inertPosition : null)}\n >\n <DropdownMenu.VirtualTrigger virtualRef={contextMenuAnchorRef} />\n <DropdownMenu.Content side={contextMenuAxis === 'col' ? 'bottom' : 'right'} sideOffset={4} collisionPadding={8}>\n <DropdownMenu.Viewport>\n <DropdownMenu.Item\n onClick={() => handleAxisMenuAction('insert-before')}\n data-testid={`grid.${contextMenuAxis}.insert-before`}\n >\n <Icon\n size={5}\n icon={contextMenuAxis === 'col' ? 'ph--columns-plus-left--regular' : 'ph--rows-plus-top--regular'}\n />\n <span>{t(`add ${contextMenuAxis} before label`)}</span>\n </DropdownMenu.Item>\n <DropdownMenu.Item\n onClick={() => handleAxisMenuAction('insert-after')}\n data-testid={`grid.${contextMenuAxis}.insert-after`}\n >\n <Icon\n size={5}\n icon={contextMenuAxis === 'col' ? 'ph--columns-plus-right--regular' : 'ph--rows-plus-bottom--regular'}\n />\n <span>{t(`add ${contextMenuAxis} after label`)}</span>\n </DropdownMenu.Item>\n <DropdownMenu.Item\n onClick={() => handleAxisMenuAction('drop')}\n data-testid={`grid.${contextMenuAxis}.drop`}\n >\n <Icon size={5} icon='ph--backspace--regular' />\n <span>{t(`delete ${contextMenuAxis} label`)}</span>\n </DropdownMenu.Item>\n </DropdownMenu.Viewport>\n <DropdownMenu.Arrow />\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n </div>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useEffect, useState } from 'react';\n\nimport { inRange } from '@dxos/compute';\nimport { createDocAccessor, fullyQualifiedId } from '@dxos/react-client/echo';\nimport { parseValue, cellClassesForFieldType } from '@dxos/react-ui-form';\nimport {\n type GridContentProps,\n type DxGridElement,\n type DxGridAxisMeta,\n type DxGridPlane,\n type DxGridPlaneRange,\n type DxGridPlaneCells,\n type DxGridCellValue,\n colToA1Notation,\n rowToA1Notation,\n commentedClassName,\n} from '@dxos/react-ui-grid';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { parseThreadAnchorAsCellRange } from '../../integrations';\nimport { type SheetModel } from '../../model';\nimport { cellClassNameForRange, rangeFromIndex } from '../../types';\n\nconst createDxGridColumns = (model: SheetModel): DxGridAxisMeta => {\n return model.sheet.columns.reduce(\n (acc: DxGridAxisMeta, columnId, numericIndex) => {\n if (model.sheet.columnMeta[columnId] && model.sheet.columnMeta[columnId].size) {\n acc.grid[numericIndex] = { size: model.sheet.columnMeta[columnId].size, resizeable: true };\n }\n return acc;\n },\n { grid: {} },\n );\n};\n\nconst createDxGridRows = (model: SheetModel): DxGridAxisMeta => {\n return model.sheet.rows.reduce(\n (acc: DxGridAxisMeta, rowId, numericIndex) => {\n if (model.sheet.rowMeta[rowId] && model.sheet.rowMeta[rowId].size) {\n acc.grid[numericIndex] = { size: model.sheet.rowMeta[rowId].size, resizeable: true };\n }\n return acc;\n },\n { grid: {} },\n );\n};\n\nconst projectCellProps = (model: SheetModel, col: number, row: number): DxGridCellValue => {\n const address = { col, row };\n const rawValue = model.getValue(address);\n const ranges = model.sheet.ranges?.filter(({ range }) => inRange(rangeFromIndex(model.sheet, range), address));\n const threadRefs = model.sheet.threads\n ?.filter((thread) => {\n const range = thread.target?.anchor && parseThreadAnchorAsCellRange(thread.target!.anchor);\n return thread && range ? inRange(range, address) : false;\n })\n .map((thread) => fullyQualifiedId(thread!))\n .join(' ');\n\n const description = model.getValueDescription(address);\n const type = description?.type;\n const format = description?.format;\n const classNames = ranges?.map(cellClassNameForRange).reverse();\n\n return {\n value: parseValue({ type, format, value: rawValue }),\n className: mx(cellClassesForFieldType({ type, format }), threadRefs && commentedClassName, classNames),\n dataRefs: threadRefs,\n };\n};\nconst gridCellGetter = (model: SheetModel) => {\n // TODO(thure): Actually use the cache.\n const cachedGridCells: DxGridPlaneCells = {};\n return (nextBounds: DxGridPlaneRange): DxGridPlaneCells => {\n [...Array(nextBounds.end.col - nextBounds.start.col)].forEach((_, c0) => {\n return [...Array(nextBounds.end.row - nextBounds.start.row)].forEach((_, r0) => {\n const col = nextBounds.start.col + c0;\n const row = nextBounds.start.row + r0;\n cachedGridCells[`${col},${row}`] = projectCellProps(model, col, row);\n });\n });\n return cachedGridCells;\n };\n};\n\nexport const rowLabelCell = (row: number) => ({\n value: rowToA1Notation(row),\n className: 'text-end !pie-1 text-subdued',\n resizeHandle: 'row',\n});\n\nexport const colLabelCell = (col: number) => ({\n value: colToA1Notation(col),\n className: 'text-subdued',\n resizeHandle: 'col',\n});\n\nconst cellGetter = (model: SheetModel) => {\n const getGridCells = gridCellGetter(model);\n return (nextBounds: DxGridPlaneRange, plane: DxGridPlane): DxGridPlaneCells => {\n switch (plane) {\n case 'grid':\n return getGridCells(nextBounds);\n case 'frozenColsStart':\n return [...Array(nextBounds.end.row - nextBounds.start.row)].reduce((acc, _, r0) => {\n const r = nextBounds.start.row + r0;\n acc[`0,${r}`] = rowLabelCell(r);\n return acc;\n }, {});\n case 'frozenRowsStart':\n return [...Array(nextBounds.end.col - nextBounds.start.col)].reduce((acc, _, c0) => {\n const c = nextBounds.start.col + c0;\n acc[`${c},0`] = colLabelCell(c);\n return acc;\n }, {});\n default:\n return {};\n }\n };\n};\n\nexport const useSheetModelDxGridProps = (\n dxGrid: DxGridElement | null,\n model: SheetModel,\n): Pick<GridContentProps, 'columns' | 'rows'> => {\n const [columns, setColumns] = useState<DxGridAxisMeta>(createDxGridColumns(model));\n const [rows, setRows] = useState<DxGridAxisMeta>(createDxGridRows(model));\n\n useEffect(() => {\n const cellsAccessor = createDocAccessor(model.sheet, ['cells']);\n if (dxGrid) {\n dxGrid.getCells = cellGetter(model);\n }\n const handleCellsUpdate = () => {\n dxGrid?.requestUpdate('initialCells');\n };\n cellsAccessor.handle.addListener('change', handleCellsUpdate);\n const unsubscribe = model.graph.update.on(handleCellsUpdate);\n return () => {\n cellsAccessor.handle.removeListener('change', handleCellsUpdate);\n unsubscribe();\n };\n }, [model, dxGrid]);\n\n useEffect(() => {\n const columnMetaAccessor = createDocAccessor(model.sheet, ['columnMeta']);\n const rowMetaAccessor = createDocAccessor(model.sheet, ['rowMeta']);\n const handleColumnMetaUpdate = () => {\n setColumns(createDxGridColumns(model));\n };\n const handleRowMetaUpdate = () => {\n setRows(createDxGridRows(model));\n };\n columnMetaAccessor.handle.addListener('change', handleColumnMetaUpdate);\n rowMetaAccessor.handle.addListener('change', handleRowMetaUpdate);\n return () => {\n columnMetaAccessor.handle.removeListener('change', handleColumnMetaUpdate);\n rowMetaAccessor.handle.removeListener('change', handleRowMetaUpdate);\n };\n }, [model, dxGrid]);\n\n return { columns, rows };\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useCallback, useEffect, useMemo } from 'react';\n\nimport {\n createIntent,\n createResolver,\n LayoutAction,\n useIntentDispatcher,\n useIntentResolver,\n} from '@dxos/app-framework';\nimport { debounce } from '@dxos/async';\nimport { type CellAddress, type CompleteCellRange, inRange } from '@dxos/compute';\nimport { ThreadAction } from '@dxos/plugin-thread/types';\nimport { fullyQualifiedId } from '@dxos/react-client/echo';\nimport { type DxGridElement, type DxGridPosition } from '@dxos/react-ui-grid';\n\nimport { useSheetContext } from '../components';\nimport { SHEET_PLUGIN } from '../meta';\n\nexport const completeCellRangeToThreadCursor = (range: CompleteCellRange): string => {\n return `${range.from.col},${range.from.row},${range.to.col},${range.to.row}`;\n};\n\nexport const parseThreadAnchorAsCellRange = (cursor: string): CompleteCellRange | null => {\n const coords = cursor.split(',');\n if (coords.length !== 4) {\n return null;\n } else {\n const [fromCol, fromRow, toCol, toRow] = coords;\n return {\n from: { col: parseInt(fromCol), row: parseInt(fromRow) },\n to: { col: parseInt(toCol), row: parseInt(toRow) },\n };\n }\n};\n\nexport const useUpdateFocusedCellOnThreadSelection = (grid: DxGridElement | null) => {\n const { model, setActiveRefs } = useSheetContext();\n const scrollIntoViewResolver = useMemo(\n () =>\n createResolver(\n LayoutAction.ScrollIntoView,\n ({ cursor, ref }) => {\n setActiveRefs(ref);\n // TODO(Zan): Everywhere we refer to the cursor in a thread context should change to `anchor`.\n const range = parseThreadAnchorAsCellRange(cursor!);\n range && grid?.setFocus({ ...range.to, plane: 'grid' }, true);\n },\n {\n disposition: 'hoist',\n filter: (data) => data.id === fullyQualifiedId(model.sheet) && !!data.cursor,\n },\n ),\n [model.sheet, setActiveRefs],\n );\n\n useIntentResolver(SHEET_PLUGIN, scrollIntoViewResolver);\n};\n\nexport const useSelectThreadOnCellFocus = () => {\n const { model, cursor } = useSheetContext();\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n\n const threads = useMemo(\n () => model.sheet.threads?.filter((thread): thread is NonNullable<typeof thread> => !!thread) ?? [],\n [\n // TODO(thure): Surely we can find a better dependency for this…\n JSON.stringify(model.sheet.threads),\n ],\n );\n\n const selectClosestThread = useCallback(\n (cellAddress: CellAddress) => {\n if (!cellAddress || !threads) {\n return;\n }\n\n const closestThread = threads?.find((ref) => {\n if (ref.target?.anchor) {\n const range = parseThreadAnchorAsCellRange(ref.target!.anchor);\n return range ? inRange(range, cellAddress) : false;\n } else {\n return false;\n }\n });\n\n if (closestThread) {\n void dispatch(createIntent(ThreadAction.Select, { current: fullyQualifiedId(closestThread) }));\n }\n },\n [dispatch, threads],\n );\n\n const debounced = useMemo(() => {\n return debounce((cellCoords: DxGridPosition) => requestAnimationFrame(() => selectClosestThread(cellCoords)), 50);\n }, [selectClosestThread]);\n\n useEffect(() => {\n if (!cursor) {\n return;\n }\n debounced(cursor);\n }, [cursor, debounced]);\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { lazy } from 'react';\n\nexport * from './ComputeGraph';\nexport * from './GridSheet';\nexport * from './RangeList';\nexport * from './SheetContext';\nexport * from './SheetObjectSettings';\n\nexport const SheetContainer = lazy(() => import('./SheetContainer'));\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useCallback } from 'react';\n\nimport { rangeToA1Notation } from '@dxos/compute';\nimport { S } from '@dxos/echo-schema';\nimport { useTranslation } from '@dxos/react-ui';\nimport { List } from '@dxos/react-ui-list';\nimport { ghostHover } from '@dxos/react-ui-theme';\n\nimport { SHEET_PLUGIN } from '../../meta';\nimport { rangeFromIndex } from '../../types';\nimport { Range, type SheetType } from '../../types';\n\nexport type RangeListProps = {\n sheet: SheetType;\n};\n\nexport const RangeList = ({ sheet }: RangeListProps) => {\n const { t } = useTranslation(SHEET_PLUGIN);\n // TODO(thure): Implement similar to comments, #8121\n const handleSelectRange = (range: Range) => {};\n const handleDeleteRange = useCallback(\n (range: Range) => {\n const index = sheet.ranges.findIndex((sheetRange) => sheetRange === range);\n sheet.ranges.splice(index, 1);\n },\n [sheet],\n );\n return (\n <>\n <h2 className='p-2 text-sm font-semibold'>{t('range list heading')}</h2>\n <List.Root<Range> items={sheet.ranges} isItem={S.is(Range)}>\n {({ items: ranges }) =>\n ranges.map((range, i) => (\n <List.Item key={i} item={range} classNames={['p-2', ghostHover]}>\n <List.ItemDragHandle />\n <List.ItemTitle onClick={() => handleSelectRange(range)}>\n {t('range title', {\n position: rangeToA1Notation(rangeFromIndex(sheet, range.range)),\n key: t(`range key ${range.key} label`),\n value: t(`range value ${range.value} label`),\n })}\n </List.ItemTitle>\n <List.ItemDeleteButton onClick={() => handleDeleteRange(range)} />\n </List.Item>\n ))\n }\n </List.Root>\n </>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport { SPACE_PLUGIN } from '@dxos/plugin-space/meta';\nimport { Input, useTranslation } from '@dxos/react-ui';\n\nimport { RangeList } from './RangeList';\nimport { type SheetType } from '../types';\n\nexport type SheetObjectSettingsProps = {\n sheet: SheetType;\n};\n\nexport const SheetObjectSettings = ({ sheet }: SheetObjectSettingsProps) => {\n const { t } = useTranslation(SPACE_PLUGIN);\n\n // TODO(burdon): Standardize forms.\n return (\n <>\n <div role='form' className='flex flex-col w-full p-2 gap-1'>\n <Input.Root>\n <Input.Label>{t('name label')}</Input.Label>\n <Input.TextInput\n placeholder={t('name placeholder')}\n value={sheet.name ?? ''}\n onChange={(event) => {\n sheet.name = event.target.value;\n }}\n />\n </Input.Root>\n </div>\n <RangeList sheet={sheet} />\n </>\n );\n};\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,mBAAyE;AAGzE,mBAAsB;AAEtB,yBAA8B;ACL9B,sBAA2B;AAC3B,mBAQO;AACP,kBAA+D;AAE/D,mBAAmD;AACnD,qBAMO;AACP,uBAA0B;AAC1B,6BAA6C;ACrB7C,0BAQO;AACP,IAAAA,mBAAkE;AAElE,IAAAC,eAAqE;AAErE,uBAAqB;AACrB,yCAA4B;AAG5B,IAAAC,kBAA+B;AAC/B,IAAAC,0BAAiC;AACjC,4BAAmB;ACnBnB,IAAAC,gBAAgG;AAGhG,IAAAC,oBAA0B;AAC1B,kBAAiC;AACjC,2BAMO;ACXP,IAAAD,gBASO;AAEP,2BAAkD;AAClD,IAAAF,kBAAkD;AAClD,sBAAmD;AACnD,gCAA6B;AAC7B,IAAAI,wBAaO;AC5BP,IAAAF,gBAAoC;AAEpC,IAAAF,kBAAwB;AACxB,IAAAK,eAAoD;AACpD,2BAAoD;AACpD,IAAAD,wBAWO;AACP,IAAAE,yBAAmB;ACjBnB,IAAAJ,gBAAgD;AAEhD,IAAAK,wBAMO;AACP,IAAAC,gBAAyB;AACzB,IAAAR,kBAAkE;AAClE,mBAA6B;AAC7B,IAAAK,eAAiC;ACZjC,IAAAH,gBAAqB;ACArB,IAAAA,gBAAmC;AAEnC,IAAAF,kBAAkC;AAClC,yBAAkB;AAClB,IAAAS,mBAA+B;AAC/B,2BAAqB;AACrB,IAAAH,yBAA2B;ACN3B,IAAAJ,gBAAkB;AAElB,kBAA6B;AAC7B,IAAAO,mBAAsC;ATW/B,IAAMC,sBAAsBC,gDAAmDC,MAAAA;AAE/E,IAAMC,8BAA8B,CAAC,EAAEC,UAAUC,SAAQ,MAA8C;AAC5G,SAAO,6BAAAC,QAAA,cAACN,oBAAoBO,UAAQ;IAACC,OAAO;MAAEJ;IAAS;KAAIC,QAAAA;AAC7D;AAEO,IAAMI,kBAAkB,CAACC,UAAAA;AAC9B,QAAM,EAAEN,SAAQ,QAAKO,yBAAWX,mBAAAA,SAAwBY,oBAAM,IAAIC,MAAM,6BAAA,CAAA;AACxE,QAAM,CAACC,KAAAA,QAASC,kCAAc,YAAA;AAC5B,QAAIL,OAAO;AACT,YAAMI,SAAQV,SAASY,iBAAiBN,KAAAA;AACxC,YAAMI,OAAMG,KAAI;AAChB,aAAOH;IACT;EACF,GAAG;IAACJ;IAAON;GAAS;AAEpB,SAAOU;AACT;ACLA,IAAMI,uBAAuBC,yBAAYC,OAAM;AAExC,IAAMC,wBAAoBC,yCAAAA;ACDjC,IAAMC,kBAAkBC,gCAAeJ,OAAO;;EAE5C;IACEK,KAAKC,sBAAKC;IACVC,OAAO;EACT;;EAEA;IACEH,KAAKC,sBAAKG;IACVD,OAAO;EACT;;EAEA;IACEH,KAAKC,sBAAKI;IACVF,OAAO;EACT;EACA;IACEH,KAAKC,sBAAKK;IACVH,OAAO;EACT;EACA;IACEH,KAAKC,sBAAKM;IACVJ,OAAO;EACT;;EAEA;IACEH,KAAKC,sBAAKO;IACVL,OAAO;EACT;CACD;AAED,IAAMM,oBAAgBZ,wBAAAA,kBAAAA;AAcf,IAAMa,iBAAiB,CAAC,EAAEC,OAAOC,YAAY,CAAA,EAAE,MAAyB;AAC7E,QAAM,EAAEC,WAAWC,SAAQ,QAAKC,gDAAY;IAAEC,OAAO;IAASC,kBAAkB;EAAI,CAAA;AAEpF,QAAMC,mBAAmB,CAAChB,SAAAA;AACxB,UAAM,EAAEiB,UAAU,UAAUC,aAAaC,OAAM,IAAKT,UAAUU,KAAK,CAACvC,UAAUA,MAAMmB,SAASA,IAAAA,KAAS,CAAC;AAEvG,WAAO;MACLiB;MACAI,OAAOrB;MACPsB,MAAM,MAAA;AACJ,YAAI,CAACJ,eAAe,CAACC,QAAQ;AAC3B,iBAAO;QACT;AAGA,cAAMI,OAAOC,SAASC,cAAc,KAAA;AACpCF,aAAKG,YAAY;AAEjB,cAAMC,QAAQH,SAASC,cAAc,IAAA;AACrCE,cAAMC,YAAY5B;AAClB2B,cAAMD,YAAY;AAClBH,aAAKM,YAAYF,KAAAA;AAEjB,YAAIT,aAAa;AACf,gBAAMI,OAAOE,SAASC,cAAc,GAAA;AACpCH,eAAKM,YAAYV;AACjBI,eAAKI,YAAY;AACjBH,eAAKM,YAAYP,IAAAA;QACnB;AAEA,YAAIH,QAAQ;AACV,gBAAMW,SAASN,SAASC,cAAc,KAAA;AACtCK,iBAAOF,YAAYT;AACnBW,iBAAOJ,YAAY;AACnBH,eAAKM,YAAYC,MAAAA;QACnB;AAEA,eAAOP;MACT;MACAQ,OAAO,CAACC,MAAMC,YAAYC,MAAMC,OAAAA;AAC9B,cAAMC,eAAeD,OAAOH,KAAKK,MAAMC,IAAIC,SAAQ,EAAGC;AACtDR,aAAKS,SACHT,KAAKK,MAAMK,OAAO;UAChBC,SAAS;YACPT;YACAC;YACAS,QAAQX,WAAWZ,SAASe,eAAe,OAAO;UACpD;UACAS,WAAW;YACTC,QAAQZ,OAAOD,WAAWZ,MAAMmB,SAAS;UAC3C;QACF,CAAA,CAAA;MAEJ;IACF;EACF;AAEA,SAAO;IACL7B;IACAJ,cAAcwC,GAAGnC,QAAAA;IACjBA,SAASoC,KAAKD,GAAG;MACfE,cAAc,CAACC,YAAAA;AACb,YAAIA,QAAQb,MAAMC,IAAIC,SAAQ,EAAG,CAAA,MAAO,KAAK;AAC3C,iBAAO;QACT;AACA,cAAMY,QAAQD,QAAQE,YAAY,KAAA;AAClC,YAAI,CAACD,SAASA,MAAMjB,SAASiB,MAAMhB,IAAI;AACrC,iBAAO;QACT;AAEA,cAAMkB,OAAOF,MAAME,KAAKC,YAAW;AACnC,YAAI,CAACJ,QAAQK,YAAYJ,MAAME,KAAKb,SAAS,GAAG;AAC9C,iBAAO;QACT;AAEA,eAAO;UACLN,MAAMiB,MAAMjB;UACZsB,SACE9C,WAAW+C,OAAO,CAAC,EAAEzD,KAAI,MAAOA,KAAK0D,WAAWL,IAAAA,CAAAA,EAAOM,IAAI,CAAC,EAAE3D,KAAI,MAAOgB,iBAAiBhB,IAAAA,CAAAA,KAAU,CAAA;QACxG;MACF;IACF,CAAA;QAEA4D,qCAAmBhE,eAAAA;QACnBiE,oCAAe;MACbC,aAAa;MACbC,eAAe;MACfC,kBAAkB;MAClBC,aAAa,CAACxD;MACdyD,OAAO;MACPC,cAAc,UACZC,0BACE,2EACA,8CACA,kBAAA;IAEN,CAAA;IACAC,oBAAOtB,GAAG;MACR;QACEuB,KAAK;QACLC,KAAK,CAACvC,SAAAA;AACJ,qBAAOwC,sCAAiBxC,KAAKK,KAAK,MAAM,eAAWoC,sCAAiBzC,IAAAA,QAAQ0C,qCAAgB1C,IAAAA;QAC9F;MACF;KACD;;AAeL;AAwBO,IAAM2C,iBAAiB,CAAC,EAAEC,QAAQC,cAAa,MAAyB;AAC7E,MAAI7C;AACJ,MAAI8C;AAGJ,QAAMC,WAA4B;IAChCC,UAAU,CAACC,UAAAA;AACT,UAAIH,aAAa;AACf9C,aAAKS,SACHT,KAAKK,MAAMK,OAAO;UAChBC,SAAS;YAAE,GAAGmC;YAAalC,QAAQqC,MAAM1C,SAAQ;UAAG;UACpDM,WAAW;YAAEC,QAAQgC,YAAY5C,OAAO+C,MAAMzC;UAAO;QACvD,CAAA,CAAA;MAEJ;AAEAR,WAAKkD,MAAK;IACZ;EACF;AAEA,SAAOC,aAAAA,WAAWC,UAChB,MAAA;IACEC,YAAYC,OAAmB;AAC7BtD,aAAOsD;AACPV,eAASG,QAAAA;IACX;IAEArC,OAAOV,OAAkB;AACvB,YAAM,EAAEc,OAAM,IAAKd,MAAKK,MAAMQ,UAAU0C,OAAO,CAAA;AAG/CT,oBAAcvG;AACd,YAAMqC,WAAWoB,MAAKK,MAAMmD,MAAMjF,aAAAA;AAClC,YAAM,EAAEkF,QAAO,IAAK7E,SAAS8E,OAAOC,MAAM3D,MAAKK,MAAMC,IAAIC,SAAQ,CAAA;AACjEqD,gBAAUH,SAAS,CAAC,EAAEI,MAAM3D,MAAMC,GAAE,MAAE;AACpC,YAAID,QAAQY,UAAUX,MAAMW,QAAQ;AAClC,kBAAQ+C,KAAK7F,MAAI;YACf,KAAK;AAEH8E,4BAAc;gBAAE5C,MAAMC;gBAAIA;cAAG;AAC7B;YAEF,KAAK;AAEH2C,4BAAc;gBAAE5C;gBAAMC,IAAID;cAAK;AAC/B;YAEF,KAAK;YACL,KAAK;AACH4C,4BAAc;gBAAE5C;gBAAMC;cAAG;AACzB,qBAAO;UACX;QACF;AAEA,eAAO;MACT,CAAA;AAGA,UAAI,CAAC2C,eAAe9C,MAAKK,MAAMC,IAAIC,SAAQ,EAAG,CAAA,MAAO,KAAK;AACxD,cAAMuD,MAAM9D,MAAKK,MAAMC,IAAIyD,YAAY,CAAA;AACvC,YAAIC,+BAAeC,KAAKH,GAAAA,GAAM;AAC5BhB,wBAAc;YAAE5C,MAAM;YAAGC,IAAI2D,IAAItD,SAAS;UAAE;QAC9C;MACF;AAEAqC,sBAAgB;QACdC,aAAaA,cAAc9C,MAAKK,MAAMC,IAAIyD,YAAYjB,YAAY5C,MAAM4C,YAAY3C,EAAE,IAAI5D;MAC5F,CAAA;IACF;EACF,CAAA;AAEJ;AAKA,IAAMqH,YAAY,CAACM,MAAkBC,aAAAA;AACnC,MAAIA,SAASD,IAAAA,GAAO;AAClB,WAAO;EACT;AAEA,WAASE,QAAQF,KAAKG,YAAYD,UAAU,MAAMA,QAAQA,MAAME,aAAa;AAC3E,QAAIV,UAAUQ,OAAOD,QAAAA,GAAW;AAC9B,aAAO;IACT;EACF;AAEA,SAAO;AACT;;AClQA,IAAMI,eAAejI,kCAAAA,eAA6CC,MAAAA;AAE3D,IAAMiI,kBAAkB,MAAA;AAC7B,QAAMtD,cAAUlE,cAAAA,YAAWuH,YAAAA;AAC3BE,wBAAAA,WAAUvD,SAAAA,QAAAA;;;;;;;;;AACV,SAAOA;AACT;AAEA,IAAMwD,oBAAoB,CAAC,EACzBC,OACAC,QACAC,iBACAnI,UACAoI,YAAW,MACyF;AACpG,QAAM,EAAEC,IAAIC,SAASC,WAAU,QAAKC,qCAAe,iBAAiBJ,WAAAA;AAEpE,QAAM,CAACK,QAAQC,iBAAAA,QAAqBC,wBAAAA;AACpC,QAAM,CAACpC,OAAOqC,gBAAAA,QAAoBD,wBAAAA;AAClC,QAAM,CAACE,qBAAqBC,sBAAAA,QAA0BH,wBAAAA;AACtD,QAAM,CAACI,YAAYC,aAAAA,QAAiBL,wBAAyC,EAAA;AAE7E,QAAMM,gBAAYC,2BAChB,CAACC,eAAAA;AACCT,sBAAkBS,UAAAA;AAClBL,2BACEvC,OAAO9C,KAAM8C,QAA8B4C,aAAa;MAAE3F,MAAM2F;MAAa1F,IAAI0F;IAAY,IAAItJ,MAAAA;EAErG,GACA;IAAC0G;GAAM;AAET,QAAMD,eAAW4C,2BACf,CAACE,cAAAA;AACCR,qBAAiBQ,SAAAA;AACjBN,2BACEM,WAAW3F,KAAM2F,YAAkCX,SAAS;MAAEjF,MAAMiF;MAAShF,IAAIgF;IAAQ,IAAI5I,MAAAA;EAEjG,GACA;IAAC4I;GAAO;AAGV,SACExI,8BAAAA,QAAA,cAAC4H,aAAa3H,UAAQ;IACpBC,OAAO;MACLkI;MACAJ;MACAK;MACAC;MACAE;MACAQ;MACA1C;MACAD;MACAuC;MACAE;MACAC;;MAEAd;MACAC;IACF;KAECnI,QAAAA;AAGP;AASO,IAAMqJ,gBAAgB,CAAC,EAC5BrJ,UACAS,OACA6I,OACAC,UACApB,iBACAD,OAAM,MACgC;AACtC,QAAMD,YAAQuB,qCAAc/I,OAAO6I,OAAO;IAAEC;EAAS,CAAA;AAErD,SAAO,CAACtB,QAAQ,OACdhI,8BAAAA,QAAA,cAACwJ,0BAAKC,MAAI;IAACrB,QAAIsB,8BAAiBL,KAAAA;KAC9BrJ,8BAAAA,QAAA,cAAC+H,mBAAAA;IAAkBC;IAAcC;IAAgBC;KAC9CnI,QAAAA,CAAAA;AAIT;AKtHO,IAAM4J,YAAY,CAAC,EAAEN,MAAK,MAAkB;AACjD,QAAM,EAAEO,EAAC,QAAKC,iCAAeC,kCAAAA;AAE7B,QAAMC,oBAAoB,CAACzD,UAAAA;EAAkB;AAC7C,QAAM0D,wBAAoBf,cAAAA,aACxB,CAAC3C,UAAAA;AACC,UAAM2D,QAAQZ,MAAMzC,OAAOsD,UAAU,CAACC,eAAeA,eAAe7D,KAAAA;AACpE+C,UAAMzC,OAAOwD,OAAOH,OAAO,CAAA;EAC7B,GACA;IAACZ;GAAM;AAET,SACErJ,8BAAAA,QAAA,cAAAA,cAAAA,QAAA,UAAA,MACEA,8BAAAA,QAAA,cAACqK,MAAAA;IAAGtH,WAAU;KAA6B6G,EAAE,oBAAA,CAAA,GAC7C5J,8BAAAA,QAAA,cAACsK,0BAAKb,MAAI;IAAQc,OAAOlB,MAAMzC;IAAQ4D,QAAQC,qBAAEC,GAAGC,2BAAAA;KACjD,CAAC,EAAEJ,OAAO3D,OAAM,MACfA,OAAO5B,IAAI,CAACsB,OAAOsE,MACjB5K,8BAAAA,QAAA,cAACsK,0BAAKO,MAAI;IAAClF,KAAKiF;IAAGE,MAAMxE;IAAOyE,YAAY;MAAC;MAAOC;;KAClDhL,8BAAAA,QAAA,cAACsK,0BAAKW,gBAAc,IAAA,GACpBjL,8BAAAA,QAAA,cAACsK,0BAAKY,WAAS;IAACC,SAAS,MAAMpB,kBAAkBzD,KAAAA;KAC9CsD,EAAE,eAAe;IAChBwB,cAAUC,uCAAkBC,sCAAejC,OAAO/C,MAAMA,KAAK,CAAA;IAC7DX,KAAKiE,EAAE,aAAatD,MAAMX,GAAG,QAAQ;IACrCzF,OAAO0J,EAAE,eAAetD,MAAMpG,KAAK,QAAQ;EAC7C,CAAA,CAAA,GAEFF,8BAAAA,QAAA,cAACsK,0BAAKiB,kBAAgB;IAACJ,SAAS,MAAMnB,kBAAkB1D,KAAAA;;AAOtE;ACrCO,IAAMkF,sBAAsB,CAAC,EAAEnC,MAAK,MAA4B;AACrE,QAAM,EAAEO,EAAC,QAAKC,iBAAAA,gBAAe4B,wBAAAA;AAG7B,SACEzL,8BAAAA,QAAA,cAAAA,cAAAA,QAAA,UAAA,MACEA,8BAAAA,QAAA,cAAC0L,OAAAA;IAAIC,MAAK;IAAO5I,WAAU;KACzB/C,8BAAAA,QAAA,cAAC4L,uBAAMnC,MAAI,MACTzJ,8BAAAA,QAAA,cAAC4L,uBAAMC,OAAK,MAAEjC,EAAE,YAAA,CAAA,GAChB5J,8BAAAA,QAAA,cAAC4L,uBAAME,WAAS;IACdC,aAAanC,EAAE,kBAAA;IACf1J,OAAOmJ,MAAMhI,QAAQ;IACrB2K,UAAU,CAACC,UAAAA;AACT5C,YAAMhI,OAAO4K,MAAMC,OAAOhM;IAC5B;QAINF,8BAAAA,QAAA,cAAC2J,WAAAA;IAAUN;;AAGjB;AFzBO,IAAM8C,qBAAiBC,oBAAK,MAAM,OAAO,+BAAA,CAAA;ADUzC,IAAMC,kCAAkC,CAAC/F,UAAAA;AAC9C,SAAO,GAAGA,MAAM/C,KAAK+I,GAAG,IAAIhG,MAAM/C,KAAKgJ,GAAG,IAAIjG,MAAM9C,GAAG8I,GAAG,IAAIhG,MAAM9C,GAAG+I,GAAG;AAC5E;AAEO,IAAMC,+BAA+B,CAAChE,WAAAA;AAC3C,QAAMiE,SAASjE,OAAOkE,MAAM,GAAA;AAC5B,MAAID,OAAO5I,WAAW,GAAG;AACvB,WAAO;EACT,OAAO;AACL,UAAM,CAAC8I,SAASC,SAASC,OAAOC,KAAAA,IAASL;AACzC,WAAO;MACLlJ,MAAM;QAAE+I,KAAKS,SAASJ,OAAAA;QAAUJ,KAAKQ,SAASH,OAAAA;MAAS;MACvDpJ,IAAI;QAAE8I,KAAKS,SAASF,KAAAA;QAAQN,KAAKQ,SAASD,KAAAA;MAAO;IACnD;EACF;AACF;AAEO,IAAME,wCAAwC,CAACC,SAAAA;AACpD,QAAM,EAAEjF,OAAOe,cAAa,IAAKlB,gBAAAA;AACjC,QAAMqF,6BAAyBC,uBAC7B,UACEC,sCACEC,mCAAaC,gBACb,CAAC,EAAE9E,QAAQ+E,IAAG,MAAE;AACdxE,kBAAcwE,GAAAA;AAEd,UAAMjH,QAAQkG,6BAA6BhE,MAAAA;AAC3ClC,aAAS2G,MAAMO,SAAS;MAAE,GAAGlH,MAAM9C;MAAIiK,OAAO;IAAO,GAAG,IAAA;EAC1D,GACA;IACEC,aAAa;IACb5I,QAAQ,CAACT,SAASA,KAAK+D,WAAOsB,aAAAA,kBAAiB1B,MAAMqB,KAAK,KAAK,CAAC,CAAChF,KAAKmE;EACxE,CAAA,GAEJ;IAACR,MAAMqB;IAAON;GAAc;AAG9B4E,+CAAkB7D,oCAAcoD,sBAAAA;AAClC;AAEO,IAAMU,6BAA6B,MAAA;AACxC,QAAM,EAAE5F,OAAOQ,OAAM,IAAKX,gBAAAA;AAC1B,QAAM,EAAEgG,iBAAiB/J,SAAQ,QAAKgK,2CAAAA;AAEtC,QAAMC,cAAUZ,uBACd,MAAMnF,MAAMqB,MAAM0E,SAASjJ,OAAO,CAACkJ,WAAiD,CAAC,CAACA,MAAAA,KAAW,CAAA,GACjG;;IAEEC,KAAKC,UAAUlG,MAAMqB,MAAM0E,OAAO;GACnC;AAGH,QAAMI,0BAAsBlF,cAAAA,aAC1B,CAACmF,gBAAAA;AACC,QAAI,CAACA,eAAe,CAACL,SAAS;AAC5B;IACF;AAEA,UAAMM,gBAAgBN,SAAStL,KAAK,CAAC8K,QAAAA;AACnC,UAAIA,IAAIrB,QAAQ/H,QAAQ;AACtB,cAAMmC,QAAQkG,6BAA6Be,IAAIrB,OAAQ/H,MAAM;AAC7D,eAAOmC,YAAQgI,yBAAQhI,OAAO8H,WAAAA,IAAe;MAC/C,OAAO;AACL,eAAO;MACT;IACF,CAAA;AAEA,QAAIC,eAAe;AACjB,WAAKvK,aAASyK,oCAAaC,0BAAaC,QAAQ;QAAEC,aAAShF,aAAAA,kBAAiB2E,aAAAA;MAAe,CAAA,CAAA;IAC7F;EACF,GACA;IAACvK;IAAUiK;GAAQ;AAGrB,QAAMY,gBAAYxB,uBAAQ,MAAA;AACxB,eAAOyB,cAAAA,UAAS,CAACC,eAA+BC,sBAAsB,MAAMX,oBAAoBU,UAAAA,CAAAA,GAAc,EAAA;EAChH,GAAG;IAACV;GAAoB;AAExBY,+BAAU,MAAA;AACR,QAAI,CAACvG,QAAQ;AACX;IACF;AACAmG,cAAUnG,MAAAA;EACZ,GAAG;IAACA;IAAQmG;GAAU;AACxB;AD/EA,IAAMK,sBAAsB,CAAChH,UAAAA;AAC3B,SAAOA,MAAMqB,MAAM4F,QAAQC,OACzB,CAACC,KAAqBC,UAAUC,iBAAAA;AAC9B,QAAIrH,MAAMqB,MAAMiG,WAAWF,QAAAA,KAAapH,MAAMqB,MAAMiG,WAAWF,QAAAA,EAAUG,MAAM;AAC7EJ,UAAIlC,KAAKoC,YAAAA,IAAgB;QAAEE,MAAMvH,MAAMqB,MAAMiG,WAAWF,QAAAA,EAAUG;QAAMC,YAAY;MAAK;IAC3F;AACA,WAAOL;EACT,GACA;IAAElC,MAAM,CAAC;EAAE,CAAA;AAEf;AAEA,IAAMwC,mBAAmB,CAACzH,UAAAA;AACxB,SAAOA,MAAMqB,MAAMqG,KAAKR,OACtB,CAACC,KAAqBQ,OAAON,iBAAAA;AAC3B,QAAIrH,MAAMqB,MAAMuG,QAAQD,KAAAA,KAAU3H,MAAMqB,MAAMuG,QAAQD,KAAAA,EAAOJ,MAAM;AACjEJ,UAAIlC,KAAKoC,YAAAA,IAAgB;QAAEE,MAAMvH,MAAMqB,MAAMuG,QAAQD,KAAAA,EAAOJ;QAAMC,YAAY;MAAK;IACrF;AACA,WAAOL;EACT,GACA;IAAElC,MAAM,CAAC;EAAE,CAAA;AAEf;AAEA,IAAM4C,mBAAmB,CAAC7H,OAAmBsE,KAAaC,QAAAA;AACxD,QAAMuD,UAAU;IAAExD;IAAKC;EAAI;AAC3B,QAAMwD,WAAW/H,MAAMgI,SAASF,OAAAA;AAChC,QAAMlJ,SAASoB,MAAMqB,MAAMzC,QAAQ9B,OAAO,CAAC,EAAEwB,MAAK,UAAOgI,gBAAAA,aAAQhD,sCAAetD,MAAMqB,OAAO/C,KAAAA,GAAQwJ,OAAAA,CAAAA;AACrG,QAAMG,aAAajI,MAAMqB,MAAM0E,SAC3BjJ,OAAO,CAACkJ,WAAAA;AACR,UAAM1H,QAAQ0H,OAAO9B,QAAQ/H,UAAUqI,6BAA6BwB,OAAO9B,OAAQ/H,MAAM;AACzF,WAAO6J,UAAU1H,YAAQgI,gBAAAA,SAAQhI,OAAOwJ,OAAAA,IAAW;EACrD,CAAA,EACC9K,IAAI,CAACgJ,eAAWtE,aAAAA,kBAAiBsE,MAAAA,CAAAA,EACjCkC,KAAK,GAAA;AAER,QAAM3N,cAAcyF,MAAMmI,oBAAoBL,OAAAA;AAC9C,QAAM5I,OAAO3E,aAAa2E;AAC1B,QAAMkJ,SAAS7N,aAAa6N;AAC5B,QAAMrF,aAAanE,QAAQ5B,IAAIqL,2CAAAA,EAAuBC,QAAAA;AAEtD,SAAO;IACLpQ,WAAOqQ,iCAAW;MAAErJ;MAAMkJ;MAAQlQ,OAAO6P;IAAS,CAAA;IAClDhN,eAAW0C,uBAAAA,QAAG+K,8CAAwB;MAAEtJ;MAAMkJ;IAAO,CAAA,GAAIH,cAAcQ,0CAAoB1F,UAAAA;IAC3F2F,UAAUT;EACZ;AACF;AACA,IAAMU,iBAAiB,CAAC3I,UAAAA;AAEtB,QAAM4I,kBAAoC,CAAC;AAC3C,SAAO,CAACC,eAAAA;AACN;SAAIC,MAAMD,WAAWE,IAAIzE,MAAMuE,WAAWG,MAAM1E,GAAG;MAAG2E,QAAQ,CAACC,GAAGC,OAAAA;AAChE,aAAO;WAAIL,MAAMD,WAAWE,IAAIxE,MAAMsE,WAAWG,MAAMzE,GAAG;QAAG0E,QAAQ,CAACC,IAAGE,OAAAA;AACvE,cAAM9E,MAAMuE,WAAWG,MAAM1E,MAAM6E;AACnC,cAAM5E,MAAMsE,WAAWG,MAAMzE,MAAM6E;AACnCR,wBAAgB,GAAGtE,GAAAA,IAAOC,GAAAA,EAAK,IAAIsD,iBAAiB7H,OAAOsE,KAAKC,GAAAA;MAClE,CAAA;IACF,CAAA;AACA,WAAOqE;EACT;AACF;AAEO,IAAMS,eAAe,CAAC9E,SAAiB;EAC5CrM,WAAOoR,uCAAgB/E,GAAAA;EACvBxJ,WAAW;EACXwO,cAAc;AAChB;AAEO,IAAMC,eAAe,CAAClF,SAAiB;EAC5CpM,WAAOuR,uCAAgBnF,GAAAA;EACvBvJ,WAAW;EACXwO,cAAc;AAChB;AAEA,IAAMG,aAAa,CAAC1J,UAAAA;AAClB,QAAM2J,eAAehB,eAAe3I,KAAAA;AACpC,SAAO,CAAC6I,YAA8BpD,UAAAA;AACpC,YAAQA,OAAAA;MACN,KAAK;AACH,eAAOkE,aAAad,UAAAA;MACtB,KAAK;AACH,eAAO;aAAIC,MAAMD,WAAWE,IAAIxE,MAAMsE,WAAWG,MAAMzE,GAAG;UAAG2C,OAAO,CAACC,KAAK+B,GAAGE,OAAAA;AAC3E,gBAAMQ,IAAIf,WAAWG,MAAMzE,MAAM6E;AACjCjC,cAAI,KAAKyC,CAAAA,EAAG,IAAIP,aAAaO,CAAAA;AAC7B,iBAAOzC;QACT,GAAG,CAAC,CAAA;MACN,KAAK;AACH,eAAO;aAAI2B,MAAMD,WAAWE,IAAIzE,MAAMuE,WAAWG,MAAM1E,GAAG;UAAG4C,OAAO,CAACC,KAAK+B,GAAGC,OAAAA;AAC3E,gBAAMU,IAAIhB,WAAWG,MAAM1E,MAAM6E;AACjChC,cAAI,GAAG0C,CAAAA,IAAK,IAAIL,aAAaK,CAAAA;AAC7B,iBAAO1C;QACT,GAAG,CAAC,CAAA;MACN;AACE,eAAO,CAAC;IACZ;EACF;AACF;AAEO,IAAM2C,2BAA2B,CACtCC,QACA/J,UAAAA;AAEA,QAAM,CAACiH,SAAS+C,UAAAA,QAActJ,cAAAA,UAAyBsG,oBAAoBhH,KAAAA,CAAAA;AAC3E,QAAM,CAAC0H,MAAMuC,OAAAA,QAAWvJ,cAAAA,UAAyB+G,iBAAiBzH,KAAAA,CAAAA;AAElE+G,oBAAAA,WAAU,MAAA;AACR,UAAMmD,oBAAgBC,gCAAkBnK,MAAMqB,OAAO;MAAC;KAAQ;AAC9D,QAAI0I,QAAQ;AACVA,aAAOK,WAAWV,WAAW1J,KAAAA;IAC/B;AACA,UAAMqK,oBAAoB,MAAA;AACxBN,cAAQO,cAAc,cAAA;IACxB;AACAJ,kBAAcK,OAAOC,YAAY,UAAUH,iBAAAA;AAC3C,UAAMI,cAAczK,MAAMxH,MAAMuD,OAAO2O,GAAGL,iBAAAA;AAC1C,WAAO,MAAA;AACLH,oBAAcK,OAAOI,eAAe,UAAUN,iBAAAA;AAC9CI,kBAAAA;IACF;EACF,GAAG;IAACzK;IAAO+J;GAAO;AAElBhD,oBAAAA,WAAU,MAAA;AACR,UAAM6D,yBAAqBT,gCAAkBnK,MAAMqB,OAAO;MAAC;KAAa;AACxE,UAAMwJ,sBAAkBV,gCAAkBnK,MAAMqB,OAAO;MAAC;KAAU;AAClE,UAAMyJ,yBAAyB,MAAA;AAC7Bd,iBAAWhD,oBAAoBhH,KAAAA,CAAAA;IACjC;AACA,UAAM+K,sBAAsB,MAAA;AAC1Bd,cAAQxC,iBAAiBzH,KAAAA,CAAAA;IAC3B;AACA4K,uBAAmBL,OAAOC,YAAY,UAAUM,sBAAAA;AAChDD,oBAAgBN,OAAOC,YAAY,UAAUO,mBAAAA;AAC7C,WAAO,MAAA;AACLH,yBAAmBL,OAAOI,eAAe,UAAUG,sBAAAA;AACnDD,sBAAgBN,OAAOI,eAAe,UAAUI,mBAAAA;IAClD;EACF,GAAG;IAAC/K;IAAO+J;GAAO;AAElB,SAAO;IAAE9C;IAASS;EAAK;AACzB;AD7HA,IAAMsD,gBAAgC;EAAEvF,OAAO;EAAQnB,KAAK;EAAGC,KAAK;AAAE;AAEtE,IAAM0G,eAAe;EACnBhG,MAAM,CAAC;EACPiG,iBAAiB;OAAIpC,MAAM,EAAA;IAAK5B,OAAO,CAACC,KAAK+B,GAAGtG,MAAAA;AAC9CuE,QAAI,KAAKvE,CAAAA,EAAG,IAAIyG,aAAazG,CAAAA;AAC7B,WAAOuE;EACT,GAAG,CAAC,CAAA;EACJgE,iBAAiB;OAAIrC,MAAM,EAAA;IAAK5B,OAAO,CAACC,KAAK+B,GAAGtG,MAAAA;AAC9CuE,QAAI,GAAGvE,CAAAA,IAAK,IAAI4G,aAAa5G,CAAAA;AAC7B,WAAOuE;EACT,GAAG,CAAC,CAAA;AACN;AAEA,IAAMiE,SAAS;EACbF,iBAAiB;EACjBC,iBAAiB;AACnB;AAEA,IAAME,kBAAkB;EACtBF,iBAAiB;IAAE5D,MAAM+D;IAAgBhK,UAAU;EAAK;EACxD2D,MAAM;IAAEsC,MAAM+D;IAAgB9D,YAAY;EAAK;AACjD;AACA,IAAM+D,kBAAkB;EAAEL,iBAAiB;IAAE3D,MAAM;IAAIjG,UAAU;EAAK;EAAG2D,MAAM;IAAEsC,MAAM;IAAKC,YAAY;EAAK;AAAE;AAExG,IAAMgE,YAAY,MAAA;AACvB,QAAM,EAAE5J,EAAC,QAAKC,gBAAAA,gBAAeC,kCAAAA;AAC7B,QAAM,EAAE1B,IAAIJ,OAAOK,SAASW,WAAW3C,UAAUmC,QAAQI,qBAAqBE,YAAYZ,gBAAe,IACvGL,gBAAAA;AAGF,QAAM,CAACkK,QAAQ0B,SAAAA,QAAa/K,cAAAA,UAA+B,IAAA;AAC3D,QAAM,CAACgL,kBAAkBC,mBAAAA,QAAuBjL,cAAAA,UAAgC,IAAA;AAChF,QAAM,EAAEmF,iBAAiB/J,SAAQ,QAAKgK,qBAAAA,qBAAAA;AACtC,QAAM8F,sBAAkBC,sBAAAA;AACxB,QAAM,EAAEC,aAAY,QAAKC,wCAAa3L,EAAAA;AAEtC,QAAM4L,kBAAc/K,cAAAA,aAClB,CAACgD,UAAAA;AACC,QAAI,CAAC5D,SAAS;AACZ,YAAM4L,WAAOC,mCAAYjI,MAAMC,MAAM;AACrC,UAAI+H,MAAM;AACR,YAAIA,KAAKxG,UAAU,QAAQ;AACzBzE,oBAAU;YAAEsD,KAAK2H,KAAK3H;YAAKC,KAAK0H,KAAK1H;UAAI,CAAA;AACzCoH,8BAAoB,IAAA;QACtB,OAAO;AACLA,8BAAoBM,IAAAA;QACtB;MACF,OAAO;AACLN,4BAAoB,IAAA;MACtB;IACF;EACF,GACA;IAACtL;GAAQ;AAIX,QAAM8L,kBAAclL,cAAAA,aAClB,CAACmL,QAAQnI,UAAAA;AACP,QAAIA,OAAO;AACT,YAAM,EAAEtG,KAAK0O,MAAK,IAAKpI;AACvB,YAAMqI,OAAO;QAAC;QAAS;QAAW;QAAaC,SAAS5O,GAAAA,IACpD,QACA;QAAC;QAAO;QAAa;QAAc4O,SAAS5O,GAAAA,IAC1C,QACA/F;AACN,YAAM4U,QAAQ7O,IAAIZ,WAAW,OAAA,IAAY;QAAC;QAAW;QAAawP,SAAS5O,GAAAA,IAAO,KAAK,IAAK0O,QAAQ,KAAK;AACzGtC,cAAQ0C,QAAQH,MAAME,KAAAA;IACxB;EACF,GACA;IAACxM;IAAOK;IAAS0J;GAAO;AAG1B,QAAM2C,iBAAazL,cAAAA,aACjB,CAAC/I,UAAAA;AACC,QAAIA,UAAUN,QAAW;AACvBoI,YAAM2M,aAASC,sCAAevM,QAAS4B,KAAK,GAAG/J,KAAAA;IACjD;EACF,GACA;IAAC8H;IAAOK;GAAQ;AAGlB,QAAMwM,uBAAmB5L,cAAAA,aACvB,CAAC,EAAEqL,MAAM/E,MAAMtF,OAAOoF,aAAY,MAAE;AAClC,QAAIiF,SAAS,OAAO;AAClB,YAAM3E,QAAQ3H,MAAMqB,MAAMqG,KAAK3C,SAASsC,YAAAA,CAAAA;AACxCrH,YAAMqB,MAAMuG,QAAQD,KAAAA,MAAW,CAAC;AAChC3H,YAAMqB,MAAMuG,QAAQD,KAAAA,EAAOJ,OAAOA;IACpC,OAAO;AACL,YAAMH,WAAWpH,MAAMqB,MAAM4F,QAAQlC,SAASsC,YAAAA,CAAAA;AAC9CrH,YAAMqB,MAAMiG,WAAWF,QAAAA,MAAc,CAAC;AACtCpH,YAAMqB,MAAMiG,WAAWF,QAAAA,EAAUG,OAAOA;IAC1C;EACF,GACA;IAACvH;GAAM;AAGT,QAAM8M,mBAAe7L,cAAAA,aACnB,CAAC,EAAE8L,QAAQC,QAAQC,QAAQC,OAAM,MAAE;AACjC,UAAM5O,QAAmB;MAAE/C,MAAM;QAAE+I,KAAKyI;QAAQxI,KAAK0I;MAAO;IAAE;AAC9D,QAAIF,WAAWC,UAAUC,WAAWC,QAAQ;AAC1C5O,YAAM9C,KAAK;QAAE8I,KAAK0I;QAAQzI,KAAK2I;MAAO;IACxC;AACA,QAAI7M,SAAS;AAEXuL,sBAAgBlF,SAASrI,aAASgF,gBAAAA,mBAAkB/E,KAAAA,CAAAA;IACtD,OAAO;AAELD,eAASC,MAAM9C,KAAK8C,QAAQ1G,MAAAA;IAC9B;EACF,GACA;IAACyI;GAAQ;AAEX,QAAM8M,kBAAclM,cAAAA,aAClB,CAACgD,UAAAA;AACC,QAAI,CAAC/D,mBAAmB,CAAC4L,cAAc;AACrC7H,YAAMmJ,gBAAe;IACvB;EACF,GACA;IAACtB;IAAc5L;GAAgB;AAGjC,QAAMmN,uBAAmBpM,cAAAA,aACvB,CAACqM,QAAAA;AACC,YAAQA,IAAI7H,OAAK;MACf,KAAK;AACH,eAAOsE,QAAQwD,aAAa;UAC1BvE,OAAO;YAAE1E,KAAKgJ,IAAIhJ;YAAKC,KAAK;YAAGkB,OAAO;UAAO;UAC7CsD,KAAK;YAAEzE,KAAKgJ,IAAIhJ;YAAKC,KAAKvE,MAAMqB,MAAMqG,KAAK7L,SAAS;YAAG4J,OAAO;UAAO;QACvE,CAAA;MACF,KAAK;AACH,eAAOsE,QAAQwD,aAAa;UAC1BvE,OAAO;YAAEzE,KAAK+I,IAAI/I;YAAKD,KAAK;YAAGmB,OAAO;UAAO;UAC7CsD,KAAK;YAAExE,KAAK+I,IAAI/I;YAAKD,KAAKtE,MAAMqB,MAAM4F,QAAQpL,SAAS;YAAG4J,OAAO;UAAO;QAC1E,CAAA;IACJ;EACF,GACA;IAACsE;IAAQ/J,MAAMqB;GAAM;AAGvB,QAAMmM,kBAAcvM,cAAAA,aAClB,CAACgD,UAAAA;AACC,UAAMgI,WAAOC,mCAAYjI,MAAMC,MAAM;AACrC,QAAI+H,MAAM;AACRoB,uBAAiBpB,IAAAA;IACnB;EACF,GACA;IAACoB;GAAiB;AAGpB,QAAMI,oBAAgBxM,cAAAA,aACpB,CAACgD,UAAAA;AACC,YAAQA,MAAMtG,KAAG;MACf,KAAK;MACL,KAAK;AACHsG,cAAMyJ,eAAc;AACpB,eAAO9M,uBAAuBZ,MAAM2N,MAAM/M,mBAAAA;MAC5C,KAAK;MACL,KAAK;AACH,YAAImJ,UAAU2B,kBAAkB;AAC9B,kBAAQA,iBAAiBjG,OAAK;YAC5B,KAAK;YACL,KAAK;AACHxB,oBAAMyJ,eAAc;AACpB,qBAAOL,iBAAiB3B,gBAAAA;UAC5B;QACF;IACJ;AACA,QAAIzH,MAAM2J,WAAW3J,MAAM4J,SAAS;AAClC,cAAQ5J,MAAMtG,KAAG;QACf,KAAK;QACL,KAAK;AACHsG,gBAAMyJ,eAAc;AACpB,iBAAO9M,uBAAuBZ,MAAM8N,IAAIlN,mBAAAA;QAC1C,KAAK;QACL,KAAK;AACHqD,gBAAMyJ,eAAc;AACpB,iBAAO9M,uBAAuBZ,MAAM+N,KAAKnN,mBAAAA;QAC3C,KAAK;QACL,KAAK;AACHqD,gBAAMyJ,eAAc;AACpB,iBAAOlN,UAAUR,MAAMgO,MAAMxN,MAAAA;QAC/B,KAAK;AACHyD,gBAAMyJ,eAAc;AACpB,iBAAOzJ,MAAMgK,WAAWjO,MAAMkO,KAAI,IAAKlO,MAAMmO,KAAI;QACnD,KAAK;QACL,KAAK;AACHlK,gBAAMyJ,eAAc;AACpB,iBAAO1N,MAAMkO,KAAI;MACrB;IACF;EACF,GACA;IAACtN;IAAqBZ;IAAOQ;IAAQkL;IAAkB2B;GAAiB;AAG1E,QAAMe,2BAAuBvC,sBAAiC,IAAA;AAC9D,QAAM,CAACwC,iBAAiBC,kBAAAA,QAAsB5N,cAAAA,UAAgC,IAAA;AAC9E,QAAM6N,kBAAkBF,iBAAiB5I,MAAM1I,WAAW,YAAA,IAAgB,QAAQ;AAElF,QAAMyR,wBAAoBvN,cAAAA,aAAY,CAACgD,UAAAA;AACrC,UAAMgI,WAAOC,mCAAYjI,MAAMC,MAAM;AACrC,QAAI+H,QAAQA,KAAKxG,MAAM1I,WAAW,QAAA,GAAW;AAC3CkH,YAAMyJ,eAAc;AACpBU,2BAAqB1H,UAAUzC,MAAMC;AACrCoK,yBAAmBrC,IAAAA;IACrB;EACF,GAAG,CAAA,CAAE;AAEL,QAAMwC,2BAAuBxN,cAAAA,aAC3B,CAACyN,cAAAA;AACC,YAAQA,WAAAA;MACN,KAAK;MACL,KAAK;AACH,eAAO5S,aACLyK,qBAAAA,cAAaoI,kCAAYC,YAAY;UACnC5O;UACAsM,MAAMiC;UACNtM,OAAOoM,gBAAiBE,eAAAA,KAAoBG,cAAc,kBAAkB,IAAI;QAClF,CAAA,CAAA;MAEJ,KAAK;AACH,eAAO5S,aACLyK,qBAAAA,cAAaoI,kCAAYE,UAAU;UACjC7O;UACAsM,MAAMiC;UACNO,WAAW9O,MAAMqB,MAAMkN,oBAAoB,QAAQ,SAAS,SAAA,EAAWF,gBAAiBE,eAAAA,CAAgB;QAC1G,CAAA,CAAA;IAEN;EACF,GACA;IAACA;IAAiBF;IAAiBrO;IAAOlE;GAAS;AAGrD,QAAM,EAAEmL,SAASS,KAAI,IAAKoC,yBAAyBC,QAAQ/J,KAAAA;AAE3D,QAAMhG,gBAAYmL,cAAAA,SAChB,MAAM;QACJ4J,kCAAW;MAAEC,SAAS7C;MAAa,GAAI9L,SAAS4O,kBAAkB;QAAEC,OAAO/C;MAAY;IAAG,CAAA;IAC1FtS,eAAe;MAAEE,WAAWiG,MAAMxH,MAAM2W,aAAY;IAAG,CAAA;IACvDnR,eAAe;MACbC,QAAQ,CAACmR,OAAQxD,gBAAgBlF,UAAU0I;MAC3ClR,eAAe,CAACxC,UAAAA;AACd,YAAIqO,QAAQ;AAEVA,iBAAOsF,OAAO,OAAO3T,MAAMyC,gBAAgB,cAAc,SAAS;QACpE;MACF;IACF,CAAA;KAEF;IAAC6B;IAAOmM;IAAa9L;GAAQ;AAG/B,QAAMiP,qBAAiBrO,cAAAA,aACrB,CAACgB,UAAAA;AACC,WAAOjC,MAAMuP,gBAAY3C,sCAAe3K,KAAAA,CAAAA;EAC1C,GACA;IAACjC;GAAM;AAGTgF,wCAAsC+E,MAAAA;AACtCnE,6BAAAA;AAEA,SACE5N,8BAAAA,QAAA,cAAC0L,OAAAA;IAAIC,MAAK;IAAO5I,WAAU;KACzB/C,8BAAAA,QAAA,cAACwX,sCAAAA;IAAeF;IAAgCtV;IAAsByV,QAAQ/C;MAC9E1U,8BAAAA,QAAA,cAACwJ,sBAAAA,KAAKkO,SAAO;IACXzE;IACA0E,cAAcC;IACdC,WAAWC;IACX7I;IACAS;IACAqI,cAAclD;IACdmD,UAAUlD;IACVmD,YAAY5E;IACZ6E,eAAe3E;IACfH;IACA+E,SAASnE;IACToE,gBAAgBjD;IAChBkD,WAAW5C;IACX6C,eAAe9B;IACfrL,SAASqK;IACT+C,YAAW;IACXxV,WAAU;IACV+F;IACAyE,KAAKkG;MAEPzT,8BAAAA,QAAA,cAACwY,6BAAa/O,MAAI;IAChBgP,OAAO;IACP9X,MAAM,CAAC,CAAC0V;IACRqC,cAAc,CAACC,aAAarC,mBAAmBqC,WAAW3F,gBAAgB,IAAA;KAE1EhT,8BAAAA,QAAA,cAACwY,6BAAaI,gBAAc;IAACC,YAAYzC;MACzCpW,8BAAAA,QAAA,cAACwY,6BAAad,SAAO;IAACoB,MAAMvC,oBAAoB,QAAQ,WAAW;IAASwC,YAAY;IAAGC,kBAAkB;KAC3GhZ,8BAAAA,QAAA,cAACwY,6BAAaS,UAAQ,MACpBjZ,8BAAAA,QAAA,cAACwY,6BAAa3N,MAAI;IAChBM,SAAS,MAAMsL,qBAAqB,eAAA;IACpCyC,eAAa,QAAQ3C,eAAAA;KAErBvW,8BAAAA,QAAA,cAACmZ,sBAAAA;IACC5J,MAAM;IACN6J,MAAM7C,oBAAoB,QAAQ,mCAAmC;MAEvEvW,8BAAAA,QAAA,cAACqZ,QAAAA,MAAMzP,EAAE,OAAO2M,eAAAA,eAA8B,CAAA,CAAA,GAEhDvW,8BAAAA,QAAA,cAACwY,6BAAa3N,MAAI;IAChBM,SAAS,MAAMsL,qBAAqB,cAAA;IACpCyC,eAAa,QAAQ3C,eAAAA;KAErBvW,8BAAAA,QAAA,cAACmZ,sBAAAA;IACC5J,MAAM;IACN6J,MAAM7C,oBAAoB,QAAQ,oCAAoC;MAExEvW,8BAAAA,QAAA,cAACqZ,QAAAA,MAAMzP,EAAE,OAAO2M,eAAAA,cAA6B,CAAA,CAAA,GAE/CvW,8BAAAA,QAAA,cAACwY,6BAAa3N,MAAI;IAChBM,SAAS,MAAMsL,qBAAqB,MAAA;IACpCyC,eAAa,QAAQ3C,eAAAA;KAErBvW,8BAAAA,QAAA,cAACmZ,sBAAAA;IAAK5J,MAAM;IAAG6J,MAAK;MACpBpZ,8BAAAA,QAAA,cAACqZ,QAAAA,MAAMzP,EAAE,UAAU2M,eAAAA,QAAuB,CAAA,CAAA,CAAA,GAG9CvW,8BAAAA,QAAA,cAACwY,6BAAac,OAAK,IAAA,CAAA,CAAA,CAAA;AAK7B;",
|
|
6
|
-
"names": ["import_language", "import_view", "import_compute", "import_react_ui_editor", "import_react", "import_invariant", "import_react_ui_grid", "import_echo", "import_react_ui_theme", "import_app_framework", "import_async", "import_react_ui", "ComputeGraphContext", "createContext", "undefined", "ComputeGraphContextProvider", "registry", "children", "React", "Provider", "value", "useComputeGraph", "space", "useContext", "raise", "Error", "graph", "useAsyncState", "getOrCreateGraph", "open", "updateAllDecorations", "StateEffect", "define", "computeGraphFacet", "singleValueFacet", "highlightStyles", "HighlightStyle", "tag", "tags", "name", "class", "tagName", "number", "bool", "string", "invalid", "languageFacet", "sheetExtension", "debug", "functions", "extension", "language", "spreadsheet", "idiom", "decimalSeparator", "createCompletion", "section", "description", "syntax", "find", "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", "facet", "topNode", "parser", "parse", "visitTree", "type", "str", "sliceString", "RANGE_NOTATION", "test", "node", "callback", "child", "firstChild", "nextSibling", "SheetContext", "useSheetContext", "invariant", "SheetProviderImpl", "model", "onInfo", "ignoreAttention", "__gridScope", "id", "editing", "setEditing", "useGridContext", "cursor", "setCursorInternal", "useState", "setRangeInternal", "cursorFallbackRange", "setCursorFallbackRange", "activeRefs", "setActiveRefs", "setCursor", "useCallback", "nextCursor", "nextRange", "SheetProvider", "sheet", "readonly", "useSheetModel", "Grid", "Root", "fullyQualifiedId", "RangeList", "t", "useTranslation", "SHEET_PLUGIN", "handleSelectRange", "handleDeleteRange", "index", "findIndex", "sheetRange", "splice", "h2", "List", "items", "isItem", "S", "is", "Range", "i", "Item", "item", "classNames", "ghostHover", "ItemDragHandle", "ItemTitle", "onClick", "position", "rangeToA1Notation", "rangeFromIndex", "ItemDeleteButton", "SheetObjectSettings", "SPACE_PLUGIN", "div", "role", "Input", "Label", "TextInput", "placeholder", "onChange", "event", "target", "SheetContainer", "lazy", "completeCellRangeToThreadCursor", "col", "row", "parseThreadAnchorAsCellRange", "coords", "split", "fromCol", "fromRow", "toCol", "toRow", "parseInt", "useUpdateFocusedCellOnThreadSelection", "grid", "scrollIntoViewResolver", "useMemo", "createResolver", "LayoutAction", "ScrollIntoView", "ref", "setFocus", "plane", "disposition", "useIntentResolver", "useSelectThreadOnCellFocus", "dispatchPromise", "useIntentDispatcher", "threads", "thread", "JSON", "stringify", "selectClosestThread", "cellAddress", "closestThread", "inRange", "createIntent", "ThreadAction", "Select", "current", "debounced", "debounce", "cellCoords", "requestAnimationFrame", "useEffect", "createDxGridColumns", "columns", "reduce", "acc", "columnId", "numericIndex", "columnMeta", "size", "resizeable", "createDxGridRows", "rows", "rowId", "rowMeta", "projectCellProps", "address", "rawValue", "getValue", "threadRefs", "join", "getValueDescription", "format", "cellClassNameForRange", "reverse", "parseValue", "cellClassesForFieldType", "commentedClassName", "dataRefs", "gridCellGetter", "cachedGridCells", "nextBounds", "Array", "end", "start", "forEach", "_", "c0", "r0", "rowLabelCell", "rowToA1Notation", "resizeHandle", "colLabelCell", "colToA1Notation", "cellGetter", "getGridCells", "r", "c", "useSheetModelDxGridProps", "dxGrid", "setColumns", "setRows", "cellsAccessor", "createDocAccessor", "getCells", "handleCellsUpdate", "requestUpdate", "handle", "addListener", "unsubscribe", "on", "removeListener", "columnMetaAccessor", "rowMetaAccessor", "handleColumnMetaUpdate", "handleRowMetaUpdate", "inertPosition", "initialCells", "frozenColsStart", "frozenRowsStart", "frozen", "sheetRowDefault", "defaultSizeRow", "sheetColDefault", "GridSheet", "setDxGrid", "extraplanarFocus", "setExtraplanarFocus", "rangeController", "useRef", "hasAttention", "useAttention", "handleFocus", "cell", "closestCell", "handleClose", "_value", "shift", "axis", "includes", "delta", "refocus", "handleBlur", "setValue", "parseCellIndex", "handleAxisResize", "handleSelect", "minCol", "maxCol", "minRow", "maxRow", "handleWheel", "stopPropagation", "selectEntireAxis", "pos", "setSelection", "handleClick", "handleKeyDown", "preventDefault", "clear", "metaKey", "ctrlKey", "cut", "copy", "paste", "shiftKey", "redo", "undo", "contextMenuAnchorRef", "contextMenuOpen", "setContextMenuOpen", "contextMenuAxis", "handleContextMenu", "handleAxisMenuAction", "operation", "SheetAction", "InsertAxis", "DropAxis", "axisIndex", "editorKeys", "onClose", "initialContent", "onNav", "getFunctions", "fn", "mode", "getCellContent", "getCellText", "GridCellEditor", "onBlur", "Content", "limitColumns", "DEFAULT_COLS", "limitRows", "DEFAULT_ROWS", "onAxisResize", "onSelect", "rowDefault", "columnDefault", "onFocus", "onWheelCapture", "onKeyDown", "onContextMenu", "overscroll", "DropdownMenu", "modal", "onOpenChange", "nextOpen", "VirtualTrigger", "virtualRef", "side", "sideOffset", "collisionPadding", "Viewport", "data-testid", "Icon", "icon", "span", "Arrow"]
|
|
7
|
-
}
|