@sqlrooms/canvas 0.28.0 → 0.29.0-rc.0
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/README.md +5 -95
- package/dist/Canvas.d.ts.map +1 -1
- package/dist/Canvas.js +72 -14
- package/dist/Canvas.js.map +1 -1
- package/dist/CanvasSlice.d.ts +42 -93
- package/dist/CanvasSlice.d.ts.map +1 -1
- package/dist/CanvasSlice.js +183 -305
- package/dist/CanvasSlice.js.map +1 -1
- package/dist/crdt.d.ts +5 -16
- package/dist/crdt.d.ts.map +1 -1
- package/dist/crdt.js +41 -28
- package/dist/crdt.js.map +1 -1
- package/dist/edgeUtils.d.ts +3 -0
- package/dist/edgeUtils.d.ts.map +1 -0
- package/dist/edgeUtils.js +7 -0
- package/dist/edgeUtils.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/nodes/AddNodePopover.d.ts.map +1 -1
- package/dist/nodes/AddNodePopover.js +16 -9
- package/dist/nodes/AddNodePopover.js.map +1 -1
- package/dist/nodes/CanvasNodeContainer.d.ts.map +1 -1
- package/dist/nodes/CanvasNodeContainer.js +5 -9
- package/dist/nodes/CanvasNodeContainer.js.map +1 -1
- package/package.json +8 -10
- package/dist/CanvasAssistantDrawer.d.ts +0 -3
- package/dist/CanvasAssistantDrawer.d.ts.map +0 -1
- package/dist/CanvasAssistantDrawer.js +0 -14
- package/dist/CanvasAssistantDrawer.js.map +0 -1
- package/dist/dag.d.ts +0 -53
- package/dist/dag.d.ts.map +0 -1
- package/dist/dag.js +0 -124
- package/dist/dag.js.map +0 -1
- package/dist/nodes/SqlNode.d.ts +0 -11
- package/dist/nodes/SqlNode.d.ts.map +0 -1
- package/dist/nodes/SqlNode.js +0 -52
- package/dist/nodes/SqlNode.js.map +0 -1
- package/dist/nodes/VegaNode.d.ts +0 -11
- package/dist/nodes/VegaNode.d.ts.map +0 -1
- package/dist/nodes/VegaNode.js +0 -12
- package/dist/nodes/VegaNode.js.map +0 -1
package/dist/crdt.d.ts
CHANGED
|
@@ -2,20 +2,15 @@ import type { CrdtMirror } from '@sqlrooms/crdt';
|
|
|
2
2
|
import { type CanvasSliceState } from './CanvasSlice';
|
|
3
3
|
/**
|
|
4
4
|
* Mirror schema for syncing the `@sqlrooms/canvas` slice via `@sqlrooms/crdt`.
|
|
5
|
-
*
|
|
6
|
-
* This is intentionally exported from a separate entrypoint (`@sqlrooms/canvas/crdt`)
|
|
7
|
-
* so consumer apps only pull `loro-mirror` when they opt into CRDT sync.
|
|
8
5
|
*/
|
|
9
6
|
export declare const canvasMirrorSchema: import("loro-mirror").LoroMapSchema<{
|
|
10
7
|
config: import("loro-mirror").LoroMapSchema<{
|
|
11
|
-
|
|
12
|
-
edges: /*elided*/ any;
|
|
8
|
+
sheets: /*elided*/ any;
|
|
13
9
|
}> & {
|
|
14
10
|
options: {};
|
|
15
11
|
} & {
|
|
16
12
|
catchall: <C extends import("loro-mirror").SchemaType>(catchallSchema: C) => import("loro-mirror").LoroMapSchemaWithCatchall<{
|
|
17
|
-
|
|
18
|
-
edges: /*elided*/ any;
|
|
13
|
+
sheets: /*elided*/ any;
|
|
19
14
|
}, C>;
|
|
20
15
|
};
|
|
21
16
|
}> & {
|
|
@@ -23,14 +18,12 @@ export declare const canvasMirrorSchema: import("loro-mirror").LoroMapSchema<{
|
|
|
23
18
|
} & {
|
|
24
19
|
catchall: <C extends import("loro-mirror").SchemaType>(catchallSchema: C) => import("loro-mirror").LoroMapSchemaWithCatchall<{
|
|
25
20
|
config: import("loro-mirror").LoroMapSchema<{
|
|
26
|
-
|
|
27
|
-
edges: /*elided*/ any;
|
|
21
|
+
sheets: /*elided*/ any;
|
|
28
22
|
}> & {
|
|
29
23
|
options: {};
|
|
30
24
|
} & {
|
|
31
25
|
catchall: <C_1 extends import("loro-mirror").SchemaType>(catchallSchema: C_1) => import("loro-mirror").LoroMapSchemaWithCatchall<{
|
|
32
|
-
|
|
33
|
-
edges: /*elided*/ any;
|
|
26
|
+
sheets: /*elided*/ any;
|
|
34
27
|
}, C_1>;
|
|
35
28
|
};
|
|
36
29
|
}, C>;
|
|
@@ -41,15 +34,11 @@ export type CanvasMirrorSchema = typeof canvasMirrorSchema;
|
|
|
41
34
|
*/
|
|
42
35
|
export declare const canvasMirrorInitialState: {
|
|
43
36
|
config: {
|
|
44
|
-
|
|
45
|
-
edges: never[];
|
|
37
|
+
sheets: never[];
|
|
46
38
|
};
|
|
47
39
|
};
|
|
48
40
|
/**
|
|
49
41
|
* Creates a CRDT mirror bundle for the canvas slice.
|
|
50
|
-
*
|
|
51
|
-
* Use this with `@sqlrooms/crdt`'s `createCrdtSlice({ mirrors: { ... } })` to
|
|
52
|
-
* compose multiple slice schemas/bindings on a single shared Loro document.
|
|
53
42
|
*/
|
|
54
43
|
export declare function createCanvasCrdtMirror<S extends CanvasSliceState = CanvasSliceState>(): CrdtMirror<S, typeof canvasMirrorSchema>;
|
|
55
44
|
/**
|
package/dist/crdt.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crdt.d.ts","sourceRoot":"","sources":["../src/crdt.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAoB,KAAK,gBAAgB,EAAC,MAAM,eAAe,CAAC;AAEvE
|
|
1
|
+
{"version":3,"file":"crdt.d.ts","sourceRoot":"","sources":["../src/crdt.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAoB,KAAK,gBAAgB,EAAC,MAAM,eAAe,CAAC;AAEvE;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;CAyB7B,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,OAAO,kBAAkB,CAAC;AAE3D;;GAEG;AACH,eAAO,MAAM,wBAAwB;;;;CAIpC,CAAC;AAEF;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,KAC1C,UAAU,CAAC,CAAC,EAAE,OAAO,kBAAkB,CAAC,CAmD5C;AAED;;GAEG;AACH,eAAO,MAAM,sBAAsB,+BAAyB,CAAC"}
|
package/dist/crdt.js
CHANGED
|
@@ -2,28 +2,25 @@ import { schema } from 'loro-mirror';
|
|
|
2
2
|
import { CanvasSliceConfig } from './CanvasSlice';
|
|
3
3
|
/**
|
|
4
4
|
* Mirror schema for syncing the `@sqlrooms/canvas` slice via `@sqlrooms/crdt`.
|
|
5
|
-
*
|
|
6
|
-
* This is intentionally exported from a separate entrypoint (`@sqlrooms/canvas/crdt`)
|
|
7
|
-
* so consumer apps only pull `loro-mirror` when they opt into CRDT sync.
|
|
8
5
|
*/
|
|
9
6
|
export const canvasMirrorSchema = schema.LoroMap({
|
|
10
7
|
config: schema.LoroMap({
|
|
11
|
-
|
|
8
|
+
sheets: schema.LoroList(schema.LoroMap({
|
|
12
9
|
id: schema.String(),
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
10
|
+
nodes: schema.LoroList(schema.LoroMap({
|
|
11
|
+
id: schema.String(),
|
|
12
|
+
position: schema.LoroMap({
|
|
13
|
+
x: schema.Number(),
|
|
14
|
+
y: schema.Number(),
|
|
15
|
+
}),
|
|
16
|
+
width: schema.Number(),
|
|
17
|
+
height: schema.Number(),
|
|
18
|
+
}), (node) => node.id),
|
|
19
|
+
meta: schema.LoroMap({
|
|
20
|
+
nodeOrder: schema.LoroList(schema.String()),
|
|
21
|
+
// viewport is kept local (unsynced)
|
|
16
22
|
}),
|
|
17
|
-
|
|
18
|
-
data: schema.Any(),
|
|
19
|
-
width: schema.Number(),
|
|
20
|
-
height: schema.Number(),
|
|
21
|
-
}), (node) => node.id),
|
|
22
|
-
edges: schema.LoroList(schema.LoroMap({
|
|
23
|
-
id: schema.String(),
|
|
24
|
-
source: schema.String(),
|
|
25
|
-
target: schema.String(),
|
|
26
|
-
}), (edge) => edge.id),
|
|
23
|
+
}), (sheet) => sheet.id),
|
|
27
24
|
}),
|
|
28
25
|
});
|
|
29
26
|
/**
|
|
@@ -31,15 +28,11 @@ export const canvasMirrorSchema = schema.LoroMap({
|
|
|
31
28
|
*/
|
|
32
29
|
export const canvasMirrorInitialState = {
|
|
33
30
|
config: {
|
|
34
|
-
|
|
35
|
-
edges: [],
|
|
31
|
+
sheets: [],
|
|
36
32
|
},
|
|
37
33
|
};
|
|
38
34
|
/**
|
|
39
35
|
* Creates a CRDT mirror bundle for the canvas slice.
|
|
40
|
-
*
|
|
41
|
-
* Use this with `@sqlrooms/crdt`'s `createCrdtSlice({ mirrors: { ... } })` to
|
|
42
|
-
* compose multiple slice schemas/bindings on a single shared Loro document.
|
|
43
36
|
*/
|
|
44
37
|
export function createCanvasCrdtMirror() {
|
|
45
38
|
return {
|
|
@@ -47,22 +40,42 @@ export function createCanvasCrdtMirror() {
|
|
|
47
40
|
initialState: canvasMirrorInitialState,
|
|
48
41
|
select: (state) => ({
|
|
49
42
|
config: {
|
|
50
|
-
|
|
51
|
-
|
|
43
|
+
sheets: Object.values(state.canvas.config.sheets).map((sheet) => ({
|
|
44
|
+
id: sheet.id,
|
|
45
|
+
nodes: Object.values(sheet.nodes),
|
|
46
|
+
meta: {
|
|
47
|
+
nodeOrder: sheet.meta.nodeOrder,
|
|
48
|
+
},
|
|
49
|
+
})),
|
|
52
50
|
},
|
|
53
51
|
}),
|
|
54
52
|
apply: (value, set, get) => {
|
|
55
53
|
if (!value?.config)
|
|
56
54
|
return;
|
|
55
|
+
const currentConfig = get().canvas.config;
|
|
56
|
+
const newSheets = {};
|
|
57
|
+
for (const sheetValue of value.config.sheets || []) {
|
|
58
|
+
const localSheet = currentConfig.sheets[sheetValue.id];
|
|
59
|
+
newSheets[sheetValue.id] = {
|
|
60
|
+
id: sheetValue.id,
|
|
61
|
+
nodes: (sheetValue.nodes || []).reduce((acc, node) => {
|
|
62
|
+
acc[node.id] = node;
|
|
63
|
+
return acc;
|
|
64
|
+
}, {}),
|
|
65
|
+
meta: {
|
|
66
|
+
...sheetValue.meta,
|
|
67
|
+
// Keep local viewport or use default
|
|
68
|
+
viewport: localSheet?.meta.viewport ?? { x: 0, y: 0, zoom: 1 },
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
}
|
|
57
72
|
set((state) => ({
|
|
58
73
|
...state,
|
|
59
74
|
canvas: {
|
|
60
75
|
...state.canvas,
|
|
61
76
|
config: CanvasSliceConfig.parse({
|
|
62
|
-
...
|
|
63
|
-
|
|
64
|
-
// Keep local viewport unsynced
|
|
65
|
-
viewport: get().canvas.config.viewport,
|
|
77
|
+
...currentConfig,
|
|
78
|
+
sheets: newSheets,
|
|
66
79
|
}),
|
|
67
80
|
},
|
|
68
81
|
}));
|
package/dist/crdt.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crdt.js","sourceRoot":"","sources":["../src/crdt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,aAAa,CAAC;AAEnC,OAAO,EAAC,iBAAiB,EAAwB,MAAM,eAAe,CAAC;AAEvE
|
|
1
|
+
{"version":3,"file":"crdt.js","sourceRoot":"","sources":["../src/crdt.ts"],"names":[],"mappings":"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","sourcesContent":["import {schema} from 'loro-mirror';\nimport type {CrdtMirror} from '@sqlrooms/crdt';\nimport {CanvasSliceConfig, type CanvasSliceState} from './CanvasSlice';\n\n/**\n * Mirror schema for syncing the `@sqlrooms/canvas` slice via `@sqlrooms/crdt`.\n */\nexport const canvasMirrorSchema = schema.LoroMap({\n config: schema.LoroMap({\n sheets: schema.LoroList(\n schema.LoroMap({\n id: schema.String(),\n nodes: schema.LoroList(\n schema.LoroMap({\n id: schema.String(),\n position: schema.LoroMap({\n x: schema.Number(),\n y: schema.Number(),\n }),\n width: schema.Number(),\n height: schema.Number(),\n }),\n (node) => node.id,\n ),\n meta: schema.LoroMap({\n nodeOrder: schema.LoroList(schema.String()),\n // viewport is kept local (unsynced)\n }),\n }),\n (sheet) => sheet.id,\n ),\n }),\n});\n\nexport type CanvasMirrorSchema = typeof canvasMirrorSchema;\n\n/**\n * Default initial mirror state for the canvas CRDT schema.\n */\nexport const canvasMirrorInitialState = {\n config: {\n sheets: [],\n },\n};\n\n/**\n * Creates a CRDT mirror bundle for the canvas slice.\n */\nexport function createCanvasCrdtMirror<\n S extends CanvasSliceState = CanvasSliceState,\n>(): CrdtMirror<S, typeof canvasMirrorSchema> {\n return {\n schema: canvasMirrorSchema,\n initialState: canvasMirrorInitialState,\n select: (state) => ({\n config: {\n sheets: Object.values(state.canvas.config.sheets).map((sheet) => ({\n id: sheet.id,\n nodes: Object.values(sheet.nodes),\n meta: {\n nodeOrder: sheet.meta.nodeOrder,\n },\n })),\n },\n }),\n apply: (value, set, get) => {\n if (!value?.config) return;\n const currentConfig = get().canvas.config;\n\n const newSheets: Record<string, any> = {};\n for (const sheetValue of value.config.sheets || []) {\n const localSheet = currentConfig.sheets[sheetValue.id];\n newSheets[sheetValue.id] = {\n id: sheetValue.id,\n nodes: (sheetValue.nodes || []).reduce(\n (acc: Record<string, any>, node: any) => {\n acc[node.id] = node;\n return acc;\n },\n {},\n ),\n meta: {\n ...sheetValue.meta,\n // Keep local viewport or use default\n viewport: localSheet?.meta.viewport ?? {x: 0, y: 0, zoom: 1},\n },\n };\n }\n\n set((state: S) => ({\n ...state,\n canvas: {\n ...state.canvas,\n config: CanvasSliceConfig.parse({\n ...currentConfig,\n sheets: newSheets,\n }),\n },\n }));\n },\n };\n}\n\n/**\n * @deprecated Use `createCanvasCrdtMirror` instead.\n */\nexport const createCanvasCrdtModule = createCanvasCrdtMirror;\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edgeUtils.d.ts","sourceRoot":"","sources":["../src/edgeUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,IAAI,EACT,KAAK,KAAK,EACX,MAAM,iBAAiB,CAAC;AAEzB,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,GAAG,IAAI,EAAE,CAGnE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edgeUtils.js","sourceRoot":"","sources":["../src/edgeUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,4BAA4B,GAG7B,MAAM,iBAAiB,CAAC;AAEzB,MAAM,UAAU,kBAAkB,CAAC,KAAwB;IACzD,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,OAAO,4BAA4B,CAAC,KAAK,CAAC,CAAC;AAC7C,CAAC","sourcesContent":["import {\n getRenderableDependencyEdges,\n type Edge,\n type Sheet,\n} from '@sqlrooms/cells';\n\nexport function getRenderableEdges(sheet: Sheet | undefined): Edge[] {\n if (!sheet) return [];\n return getRenderableDependencyEdges(sheet);\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* @packageDocumentation
|
|
4
4
|
*/
|
|
5
5
|
export { createCanvasSlice, createDefaultCanvasConfig } from './CanvasSlice';
|
|
6
|
-
export { CanvasSliceConfig } from './CanvasSlice';
|
|
7
6
|
export type { CanvasSliceState } from './CanvasSlice';
|
|
7
|
+
export { CanvasSliceConfig, CanvasNodeMeta, CanvasSheetMeta, } from './CanvasSlice';
|
|
8
8
|
export { Canvas } from './Canvas';
|
|
9
9
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,iBAAiB,EAAE,yBAAyB,EAAC,MAAM,eAAe,CAAC;AAC3E,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,iBAAiB,EAAE,yBAAyB,EAAC,MAAM,eAAe,CAAC;AAC3E,YAAY,EAAC,gBAAgB,EAAC,MAAM,eAAe,CAAC;AACpD,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,eAAe,GAChB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAC,MAAM,EAAC,MAAM,UAAU,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -3,6 +3,6 @@
|
|
|
3
3
|
* @packageDocumentation
|
|
4
4
|
*/
|
|
5
5
|
export { createCanvasSlice, createDefaultCanvasConfig } from './CanvasSlice';
|
|
6
|
-
export { CanvasSliceConfig } from './CanvasSlice';
|
|
6
|
+
export { CanvasSliceConfig, CanvasNodeMeta, CanvasSheetMeta, } from './CanvasSlice';
|
|
7
7
|
export { Canvas } from './Canvas';
|
|
8
8
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,iBAAiB,EAAE,yBAAyB,EAAC,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,iBAAiB,EAAE,yBAAyB,EAAC,MAAM,eAAe,CAAC;AAE3E,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,eAAe,GAChB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAC,MAAM,EAAC,MAAM,UAAU,CAAC","sourcesContent":["/**\n * {@include ../README.md}\n * @packageDocumentation\n */\n\nexport {createCanvasSlice, createDefaultCanvasConfig} from './CanvasSlice';\nexport type {CanvasSliceState} from './CanvasSlice';\nexport {\n CanvasSliceConfig,\n CanvasNodeMeta,\n CanvasSheetMeta,\n} from './CanvasSlice';\nexport {Canvas} from './Canvas';\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AddNodePopover.d.ts","sourceRoot":"","sources":["../../src/nodes/AddNodePopover.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AddNodePopover.d.ts","sourceRoot":"","sources":["../../src/nodes/AddNodePopover.tsx"],"names":[],"mappings":"AAQA,OAAO,EAAC,EAAE,EAAE,iBAAiB,EAAW,MAAM,OAAO,CAAC;AAGtD,eAAO,MAAM,cAAc,EAAE,EAAE,CAC7B,iBAAiB,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC,CAqCH,CAAC"}
|
|
@@ -1,18 +1,25 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Button, cn, Popover, PopoverContent, PopoverTrigger, } from '@sqlrooms/ui';
|
|
2
|
+
import { Button, cn, Popover, PopoverContent, PopoverTrigger, useToast, } from '@sqlrooms/ui';
|
|
3
3
|
import { useState } from 'react';
|
|
4
4
|
import { useStoreWithCanvas } from '../CanvasSlice';
|
|
5
5
|
export const AddNodePopover = ({ className, parentId, children }) => {
|
|
6
6
|
const [open, setOpen] = useState(false);
|
|
7
7
|
const addNode = useStoreWithCanvas((s) => s.canvas.addNode);
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
const sheetId = useStoreWithCanvas((s) => s.cells.config.currentSheetId);
|
|
9
|
+
const registry = useStoreWithCanvas((s) => s.cells.cellRegistry);
|
|
10
|
+
const { toast } = useToast();
|
|
11
|
+
const onAdd = (type) => {
|
|
12
|
+
if (sheetId) {
|
|
13
|
+
addNode({ sheetId, parentId, nodeType: type });
|
|
14
|
+
setOpen(false);
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
toast({
|
|
18
|
+
variant: 'destructive',
|
|
19
|
+
description: 'No sheet selected',
|
|
20
|
+
});
|
|
21
|
+
}
|
|
11
22
|
};
|
|
12
|
-
|
|
13
|
-
addNode({ parentId, nodeType: 'vega' });
|
|
14
|
-
setOpen(false);
|
|
15
|
-
};
|
|
16
|
-
return (_jsx("div", { className: cn(className), children: _jsxs(Popover, { open: open, onOpenChange: setOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: children }), _jsx(PopoverContent, { side: "right", align: "center", className: "max-w-[100px] border-none bg-transparent p-0 shadow-none", children: _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Button, { size: "xs", onClick: onAddSql, children: "Query" }), _jsx(Button, { size: "xs", onClick: onAddVega, children: "Visualize" })] }) })] }) }));
|
|
23
|
+
return (_jsx("div", { className: cn(className), children: _jsxs(Popover, { open: open, onOpenChange: setOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: children }), _jsx(PopoverContent, { side: "right", align: "center", className: "flex w-auto flex-col gap-2 p-2", children: Object.entries(registry).map(([type, reg]) => (_jsx(Button, { size: "xs", onClick: () => onAdd(type), children: reg.title }, type))) })] }) }));
|
|
17
24
|
};
|
|
18
25
|
//# sourceMappingURL=AddNodePopover.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AddNodePopover.js","sourceRoot":"","sources":["../../src/nodes/AddNodePopover.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,MAAM,EACN,EAAE,EACF,OAAO,EACP,cAAc,EACd,cAAc,
|
|
1
|
+
{"version":3,"file":"AddNodePopover.js","sourceRoot":"","sources":["../../src/nodes/AddNodePopover.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,MAAM,EACN,EAAE,EACF,OAAO,EACP,cAAc,EACd,cAAc,EACd,QAAQ,GACT,MAAM,cAAc,CAAC;AACtB,OAAO,EAAwB,QAAQ,EAAC,MAAM,OAAO,CAAC;AACtD,OAAO,EAAC,kBAAkB,EAAC,MAAM,gBAAgB,CAAC;AAElD,MAAM,CAAC,MAAM,cAAc,GAKvB,CAAC,EAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAC,EAAE,EAAE;IACtC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IACzE,MAAM,QAAQ,GAAG,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACjE,MAAM,EAAC,KAAK,EAAC,GAAG,QAAQ,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAE;QAC7B,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,EAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAC,CAAC,CAAC;YAC7C,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,KAAK,CAAC;gBACJ,OAAO,EAAE,aAAa;gBACtB,WAAW,EAAE,mBAAmB;aACjC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CACL,cAAK,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,YAC3B,MAAC,OAAO,IAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,aACxC,KAAC,cAAc,IAAC,OAAO,kBAAE,QAAQ,GAAkB,EACnD,KAAC,cAAc,IACb,IAAI,EAAC,OAAO,EACZ,KAAK,EAAC,QAAQ,EACd,SAAS,EAAC,gCAAgC,YAEzC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAC7C,KAAC,MAAM,IAAY,IAAI,EAAC,IAAI,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,YACpD,GAAG,CAAC,KAAK,IADC,IAAI,CAER,CACV,CAAC,GACa,IACT,GACN,CACP,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import {\n Button,\n cn,\n Popover,\n PopoverContent,\n PopoverTrigger,\n useToast,\n} from '@sqlrooms/ui';\nimport {FC, PropsWithChildren, useState} from 'react';\nimport {useStoreWithCanvas} from '../CanvasSlice';\n\nexport const AddNodePopover: FC<\n PropsWithChildren<{\n className?: string;\n parentId?: string;\n }>\n> = ({className, parentId, children}) => {\n const [open, setOpen] = useState(false);\n const addNode = useStoreWithCanvas((s) => s.canvas.addNode);\n const sheetId = useStoreWithCanvas((s) => s.cells.config.currentSheetId);\n const registry = useStoreWithCanvas((s) => s.cells.cellRegistry);\n const {toast} = useToast();\n const onAdd = (type: string) => {\n if (sheetId) {\n addNode({sheetId, parentId, nodeType: type});\n setOpen(false);\n } else {\n toast({\n variant: 'destructive',\n description: 'No sheet selected',\n });\n }\n };\n\n return (\n <div className={cn(className)}>\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>{children}</PopoverTrigger>\n <PopoverContent\n side=\"right\"\n align=\"center\"\n className=\"flex w-auto flex-col gap-2 p-2\"\n >\n {Object.entries(registry).map(([type, reg]) => (\n <Button key={type} size=\"xs\" onClick={() => onAdd(type)}>\n {reg.title}\n </Button>\n ))}\n </PopoverContent>\n </Popover>\n </div>\n );\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CanvasNodeContainer.d.ts","sourceRoot":"","sources":["../../src/nodes/CanvasNodeContainer.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CanvasNodeContainer.d.ts","sourceRoot":"","sources":["../../src/nodes/CanvasNodeContainer.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAC,EAAE,EAAE,iBAAiB,EAAE,SAAS,EAAc,MAAM,OAAO,CAAC;AAUpE;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAE,EAAE,CAClC,iBAAiB,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,WAAW,CAAC,EAAE,SAAS,CAAC;CACzB,CAAC,CAoEH,CAAC"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
3
|
-
import { Button, EditableText, Popover, PopoverContent, PopoverTrigger, cn, } from '@sqlrooms/ui';
|
|
2
|
+
import { Button, EditableText, cn } from '@sqlrooms/ui';
|
|
4
3
|
import { Handle, NodeResizer, Position } from '@xyflow/react';
|
|
5
|
-
import { PlusIcon
|
|
4
|
+
import { PlusIcon } from 'lucide-react';
|
|
6
5
|
import { useCallback } from 'react';
|
|
7
6
|
import { useStoreWithCanvas } from '../CanvasSlice';
|
|
8
7
|
import { AddNodePopover } from './AddNodePopover';
|
|
@@ -18,14 +17,11 @@ const PROMPT_PLACEHOLDER = {
|
|
|
18
17
|
*/
|
|
19
18
|
export const CanvasNodeContainer = ({ id, className, headerRight, children }) => {
|
|
20
19
|
const renameNode = useStoreWithCanvas((s) => s.canvas.renameNode);
|
|
21
|
-
const
|
|
22
|
-
const title =
|
|
20
|
+
const cell = useStoreWithCanvas((s) => s.cells.config.data[id]);
|
|
21
|
+
const title = cell?.data?.title;
|
|
23
22
|
const onTitleChange = useCallback(async (v) => {
|
|
24
23
|
await renameNode(id, v);
|
|
25
24
|
}, [id, renameNode]);
|
|
26
|
-
|
|
27
|
-
return (_jsxs("div", { className: cn(`bg-background relative flex h-full w-full rounded-md border shadow-sm`, className), children: [_jsx(NodeResizer, { minWidth: 200, minHeight: 200 }), _jsxs("div", { className: "flex h-full min-h-0 w-full flex-col items-center", children: [(title !== undefined || headerRight) && (_jsxs("div", { className: "flex w-full items-center justify-between gap-2 border-b px-3 py-2", children: [_jsx(EditableText, { className: "text-sm font-medium", value: title ?? '', onChange: (v) => onTitleChange?.(v) }), _jsx("div", { className: "flex items-center gap-2", children: headerRight })] })), _jsxs(Popover, { children: [_jsx(PopoverTrigger, { asChild: true, children: _jsx(Button, { variant: "default", className: "h-8 w-8 -translate-y-1/2 rounded-full", children: _jsx(SparklesIcon, { className: "h-4 w-4" }) }) }), _jsx(PopoverContent, { className: "max-h-[50vh] w-[400px] overflow-auto", children: _jsx(QueryControls, { placeholder: `✨ ${PROMPT_PLACEHOLDER[node?.type ?? 'default']}`, onRun: () => {
|
|
28
|
-
setAssistantOpen(true);
|
|
29
|
-
} }) })] }), _jsx("div", { className: "w-full flex-1 overflow-auto", children: children })] }), _jsx(AddNodePopover, { className: "absolute -right-10 top-1/2", parentId: id, children: _jsx(Button, { variant: "default", className: "h-8 w-8 -translate-y-1/2 rounded-full", title: "Add child node", children: _jsx(PlusIcon, { className: "h-4 w-4" }) }) }), _jsx(Handle, { type: "source", position: Position.Right }), _jsx(Handle, { type: "target", position: Position.Left })] }));
|
|
25
|
+
return (_jsxs("div", { className: cn(`bg-background relative flex h-full w-full rounded-md border shadow-sm`, className), children: [_jsx(NodeResizer, { minWidth: 200, minHeight: 200 }), _jsxs("div", { className: "flex h-full min-h-0 w-full flex-col items-center", children: [(title !== undefined || headerRight) && (_jsxs("div", { className: "flex w-full items-center justify-between gap-2 border-b px-3 py-2", children: [_jsx(EditableText, { className: "text-sm font-medium", value: title ?? '', onChange: (v) => onTitleChange?.(v) }), _jsx("div", { className: "flex items-center gap-2", children: headerRight })] })), _jsx("div", { className: "w-full flex-1 overflow-auto", children: children })] }), _jsx(AddNodePopover, { className: "absolute -right-10 top-1/2", parentId: id, children: _jsx(Button, { variant: "default", className: "h-8 w-8 -translate-y-1/2 rounded-full", title: "Add child node", children: _jsx(PlusIcon, { className: "h-4 w-4" }) }) }), _jsx(Handle, { type: "source", position: Position.Right }), _jsx(Handle, { type: "target", position: Position.Left })] }));
|
|
30
26
|
};
|
|
31
27
|
//# sourceMappingURL=CanvasNodeContainer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CanvasNodeContainer.js","sourceRoot":"","sources":["../../src/nodes/CanvasNodeContainer.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"CanvasNodeContainer.js","sourceRoot":"","sources":["../../src/nodes/CanvasNodeContainer.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,MAAM,EAAE,YAAY,EAAE,EAAE,EAAC,MAAM,cAAc,CAAC;AACtD,OAAO,EAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAC,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAC,QAAQ,EAAC,MAAM,cAAc,CAAC;AACtC,OAAO,EAAmC,WAAW,EAAC,MAAM,OAAO,CAAC;AACpE,OAAO,EAAC,kBAAkB,EAAC,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAC;AAEhD,MAAM,kBAAkB,GAAG;IACzB,GAAG,EAAE,8CAA8C;IACnD,IAAI,EAAE,2CAA2C;IACjD,OAAO,EAAE,4BAA4B;CACtC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAO5B,CAAC,EAAC,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAC,EAAE,EAAE;IAC7C,MAAM,UAAU,GAAG,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAClE,MAAM,IAAI,GAAG,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAEhE,MAAM,KAAK,GAAI,IAAI,EAAE,IAAY,EAAE,KAAK,CAAC;IACzC,MAAM,aAAa,GAAG,WAAW,CAC/B,KAAK,EAAE,CAAS,EAAE,EAAE;QAClB,MAAM,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1B,CAAC,EACD,CAAC,EAAE,EAAE,UAAU,CAAC,CACjB,CAAC;IACF,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CACX,uEAAuE,EACvE,SAAS,CACV,aAED,KAAC,WAAW,IAAC,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,GAAI,EAC9C,eAAK,SAAS,EAAC,kDAAkD,aAC9D,CAAC,KAAK,KAAK,SAAS,IAAI,WAAW,CAAC,IAAI,CACvC,eAAK,SAAS,EAAC,mEAAmE,aAChF,KAAC,YAAY,IACX,SAAS,EAAC,qBAAqB,EAC/B,KAAK,EAAE,KAAK,IAAI,EAAE,EAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,GACnC,EACF,cAAK,SAAS,EAAC,yBAAyB,YAAE,WAAW,GAAO,IACxD,CACP,EAuBD,cAAK,SAAS,EAAC,6BAA6B,YAAE,QAAQ,GAAO,IACzD,EACN,KAAC,cAAc,IAAC,SAAS,EAAC,4BAA4B,EAAC,QAAQ,EAAE,EAAE,YACjE,KAAC,MAAM,IACL,OAAO,EAAC,SAAS,EACjB,SAAS,EAAC,uCAAuC,EACjD,KAAK,EAAC,gBAAgB,YAEtB,KAAC,QAAQ,IAAC,SAAS,EAAC,SAAS,GAAG,GACzB,GACM,EACjB,KAAC,MAAM,IAAC,IAAI,EAAC,QAAQ,EAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,GAAI,EAClD,KAAC,MAAM,IAAC,IAAI,EAAC,QAAQ,EAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,GAAI,IAC7C,CACP,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import {Button, EditableText, cn} from '@sqlrooms/ui';\nimport {Handle, NodeResizer, Position} from '@xyflow/react';\nimport {PlusIcon} from 'lucide-react';\nimport {FC, PropsWithChildren, ReactNode, useCallback} from 'react';\nimport {useStoreWithCanvas} from '../CanvasSlice';\nimport {AddNodePopover} from './AddNodePopover';\n\nconst PROMPT_PLACEHOLDER = {\n sql: 'What would you like to learn about the data?',\n vega: 'How would you like to visualize the data?',\n default: 'What would you like to do?',\n};\n\n/**\n * Container applied to every canvas node. Provides resizing, connection handles,\n * and a standard \"add child\" affordance that creates downstream nodes.\n * Also renders an optional shared header with editable title and customizable right-side content.\n */\nexport const CanvasNodeContainer: FC<\n PropsWithChildren<{\n id: string;\n className?: string;\n /** Right-side header content (e.g. buttons, badges). */\n headerRight?: ReactNode;\n }>\n> = ({id, className, headerRight, children}) => {\n const renameNode = useStoreWithCanvas((s) => s.canvas.renameNode);\n const cell = useStoreWithCanvas((s) => s.cells.config.data[id]);\n\n const title = (cell?.data as any)?.title;\n const onTitleChange = useCallback(\n async (v: string) => {\n await renameNode(id, v);\n },\n [id, renameNode],\n );\n return (\n <div\n className={cn(\n `bg-background relative flex h-full w-full rounded-md border shadow-sm`,\n className,\n )}\n >\n <NodeResizer minWidth={200} minHeight={200} />\n <div className=\"flex h-full min-h-0 w-full flex-col items-center\">\n {(title !== undefined || headerRight) && (\n <div className=\"flex w-full items-center justify-between gap-2 border-b px-3 py-2\">\n <EditableText\n className=\"text-sm font-medium\"\n value={title ?? ''}\n onChange={(v) => onTitleChange?.(v)}\n />\n <div className=\"flex items-center gap-2\">{headerRight}</div>\n </div>\n )}\n {/* <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"default\"\n className=\"h-8 w-8 -translate-y-1/2 rounded-full\"\n >\n <SparklesIcon className=\"h-4 w-4\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"max-h-[50vh] w-[400px] overflow-auto\">\n <QueryControls\n placeholder={`✨ ${\n PROMPT_PLACEHOLDER[\n (cell?.type ?? 'default') as keyof typeof PROMPT_PLACEHOLDER\n ]\n }`}\n onRun={() => {\n setAssistantOpen?.(true);\n }}\n />\n </PopoverContent>\n </Popover> */}\n <div className=\"w-full flex-1 overflow-auto\">{children}</div>\n </div>\n <AddNodePopover className=\"absolute -right-10 top-1/2\" parentId={id}>\n <Button\n variant=\"default\"\n className=\"h-8 w-8 -translate-y-1/2 rounded-full\"\n title=\"Add child node\"\n >\n <PlusIcon className=\"h-4 w-4\" />\n </Button>\n </AddNodePopover>\n <Handle type=\"source\" position={Position.Right} />\n <Handle type=\"target\" position={Position.Left} />\n </div>\n );\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sqlrooms/canvas",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.29.0-rc.0",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -32,14 +32,12 @@
|
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
34
|
"@paralleldrive/cuid2": "^3.0.0",
|
|
35
|
-
"@sqlrooms/
|
|
36
|
-
"@sqlrooms/crdt": "0.
|
|
37
|
-
"@sqlrooms/
|
|
38
|
-
"@sqlrooms/
|
|
39
|
-
"@sqlrooms/
|
|
40
|
-
"@sqlrooms/
|
|
41
|
-
"@sqlrooms/ui": "0.28.0",
|
|
42
|
-
"@sqlrooms/vega": "0.28.0",
|
|
35
|
+
"@sqlrooms/cells": "0.29.0-rc.0",
|
|
36
|
+
"@sqlrooms/crdt": "0.29.0-rc.0",
|
|
37
|
+
"@sqlrooms/duckdb": "0.29.0-rc.0",
|
|
38
|
+
"@sqlrooms/room-store": "0.29.0-rc.0",
|
|
39
|
+
"@sqlrooms/ui": "0.29.0-rc.0",
|
|
40
|
+
"@sqlrooms/utils": "0.29.0-rc.0",
|
|
43
41
|
"@xyflow/react": "^12.8.5",
|
|
44
42
|
"immer": "^11.0.1",
|
|
45
43
|
"loro-mirror": "^1.1.2",
|
|
@@ -57,5 +55,5 @@
|
|
|
57
55
|
"typecheck": "tsc --noEmit",
|
|
58
56
|
"typedoc": "typedoc"
|
|
59
57
|
},
|
|
60
|
-
"gitHead": "
|
|
58
|
+
"gitHead": "afdb949c9601b4cdeaae966157a25a54aea2ae54"
|
|
61
59
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CanvasAssistantDrawer.d.ts","sourceRoot":"","sources":["../src/CanvasAssistantDrawer.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAC,EAAE,EAAC,MAAM,OAAO,CAAC;AAGzB,eAAO,MAAM,qBAAqB,EAAE,EAiDnC,CAAC"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Chat } from '@sqlrooms/ai';
|
|
3
|
-
import { Button, Drawer, DrawerClose, DrawerContent, DrawerFooter, DrawerHeader, DrawerTitle, DrawerTrigger, } from '@sqlrooms/ui';
|
|
4
|
-
import { SparklesIcon, XIcon } from 'lucide-react';
|
|
5
|
-
import { useStoreWithCanvas } from './CanvasSlice';
|
|
6
|
-
export const CanvasAssistantDrawer = () => {
|
|
7
|
-
const isAssistantOpen = useStoreWithCanvas((state) => state.canvas.isAssistantOpen);
|
|
8
|
-
const setAssistantOpen = useStoreWithCanvas((state) => state.canvas.setAssistantOpen);
|
|
9
|
-
return (_jsxs(Drawer, { direction: "right", open: isAssistantOpen, onOpenChange: setAssistantOpen, children: [_jsx(DrawerTrigger, { asChild: true, children: _jsx(Button, { variant: "default", className: "absolute top-4 right-4 z-10 h-8 w-8 rounded-full", children: _jsx(SparklesIcon, { className: "h-4 w-4" }) }) }), _jsx(DrawerContent, { className: "border-none bg-transparent p-4 outline-hidden", style: {
|
|
10
|
-
width: 500,
|
|
11
|
-
maxWidth: '50%',
|
|
12
|
-
}, "data-vaul-drawer-direction": "right", overlayClassName: "bg-transparent", children: _jsx("div", { className: "border-border bg-background relative mx-auto flex h-full w-full flex-col gap-0 overflow-hidden rounded-md border", children: _jsxs(Chat, { children: [_jsxs(DrawerHeader, { children: [_jsx(DrawerTitle, { children: "Assistant" }), _jsx(DrawerClose, { asChild: true, className: "absolute top-2 right-2", children: _jsx(Button, { variant: "ghost", size: "xs", children: _jsx(XIcon, { className: "h-4 w-4" }) }) })] }), _jsx(Chat.Messages, { className: "grow overflow-auto px-4" }), _jsx(DrawerFooter, { children: _jsx(Chat.Composer, { placeholder: "What would you like to do?" }) })] }) }) })] }));
|
|
13
|
-
};
|
|
14
|
-
//# sourceMappingURL=CanvasAssistantDrawer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CanvasAssistantDrawer.js","sourceRoot":"","sources":["../src/CanvasAssistantDrawer.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,IAAI,EAAC,MAAM,cAAc,CAAC;AAClC,OAAO,EACL,MAAM,EACN,MAAM,EACN,WAAW,EACX,aAAa,EACb,YAAY,EAEZ,YAAY,EACZ,WAAW,EACX,aAAa,GACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAC,YAAY,EAAE,KAAK,EAAC,MAAM,cAAc,CAAC;AAEjD,OAAO,EAAC,kBAAkB,EAAC,MAAM,eAAe,CAAC;AAEjD,MAAM,CAAC,MAAM,qBAAqB,GAAO,GAAG,EAAE;IAC5C,MAAM,eAAe,GAAG,kBAAkB,CACxC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CACxC,CAAC;IACF,MAAM,gBAAgB,GAAG,kBAAkB,CACzC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CACzC,CAAC;IACF,OAAO,CACL,MAAC,MAAM,IACL,SAAS,EAAC,OAAO,EACjB,IAAI,EAAE,eAAe,EACrB,YAAY,EAAE,gBAAgB,aAE9B,KAAC,aAAa,IAAC,OAAO,kBACpB,KAAC,MAAM,IACL,OAAO,EAAC,SAAS,EACjB,SAAS,EAAC,kDAAkD,YAE5D,KAAC,YAAY,IAAC,SAAS,EAAC,SAAS,GAAG,GAC7B,GACK,EAChB,KAAC,aAAa,IACZ,SAAS,EAAC,+CAA+C,EACzD,KAAK,EAAE;oBACL,KAAK,EAAE,GAAG;oBACV,QAAQ,EAAE,KAAK;iBAChB,gCAC0B,OAAO,EAClC,gBAAgB,EAAC,gBAAgB,YAEjC,cAAK,SAAS,EAAC,kHAAkH,YAC/H,MAAC,IAAI,eACH,MAAC,YAAY,eACX,KAAC,WAAW,4BAAwB,EACpC,KAAC,WAAW,IAAC,OAAO,QAAC,SAAS,EAAC,wBAAwB,YACrD,KAAC,MAAM,IAAC,OAAO,EAAC,OAAO,EAAC,IAAI,EAAC,IAAI,YAC/B,KAAC,KAAK,IAAC,SAAS,EAAC,SAAS,GAAG,GACtB,GACG,IACD,EACf,KAAC,IAAI,CAAC,QAAQ,IAAC,SAAS,EAAC,yBAAyB,GAAG,EACrD,KAAC,YAAY,cACX,KAAC,IAAI,CAAC,QAAQ,IAAC,WAAW,EAAC,4BAA4B,GAAG,GAC7C,IACV,GACH,GACQ,IACT,CACV,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import {Chat} from '@sqlrooms/ai';\nimport {\n Button,\n Drawer,\n DrawerClose,\n DrawerContent,\n DrawerFooter,\n DrawerHandle,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger,\n} from '@sqlrooms/ui';\nimport {SparklesIcon, XIcon} from 'lucide-react';\nimport {FC} from 'react';\nimport {useStoreWithCanvas} from './CanvasSlice';\n\nexport const CanvasAssistantDrawer: FC = () => {\n const isAssistantOpen = useStoreWithCanvas(\n (state) => state.canvas.isAssistantOpen,\n );\n const setAssistantOpen = useStoreWithCanvas(\n (state) => state.canvas.setAssistantOpen,\n );\n return (\n <Drawer\n direction=\"right\"\n open={isAssistantOpen}\n onOpenChange={setAssistantOpen}\n >\n <DrawerTrigger asChild>\n <Button\n variant=\"default\"\n className=\"absolute top-4 right-4 z-10 h-8 w-8 rounded-full\"\n >\n <SparklesIcon className=\"h-4 w-4\" />\n </Button>\n </DrawerTrigger>\n <DrawerContent\n className=\"border-none bg-transparent p-4 outline-hidden\"\n style={{\n width: 500,\n maxWidth: '50%',\n }}\n data-vaul-drawer-direction=\"right\"\n overlayClassName=\"bg-transparent\"\n >\n <div className=\"border-border bg-background relative mx-auto flex h-full w-full flex-col gap-0 overflow-hidden rounded-md border\">\n <Chat>\n <DrawerHeader>\n <DrawerTitle>Assistant</DrawerTitle>\n <DrawerClose asChild className=\"absolute top-2 right-2\">\n <Button variant=\"ghost\" size=\"xs\">\n <XIcon className=\"h-4 w-4\" />\n </Button>\n </DrawerClose>\n </DrawerHeader>\n <Chat.Messages className=\"grow overflow-auto px-4\" />\n <DrawerFooter>\n <Chat.Composer placeholder=\"What would you like to do?\" />\n </DrawerFooter>\n </Chat>\n </div>\n </DrawerContent>\n </Drawer>\n );\n};\n"]}
|
package/dist/dag.d.ts
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
/** A minimal graph node with an `id`. */
|
|
2
|
-
export type DagNode = {
|
|
3
|
-
id: string;
|
|
4
|
-
};
|
|
5
|
-
/** A directed edge from `source` to `target`. */
|
|
6
|
-
export type DagEdge = {
|
|
7
|
-
source: string;
|
|
8
|
-
target: string;
|
|
9
|
-
};
|
|
10
|
-
/** Forward adjacency list mapping node id to its child node ids. */
|
|
11
|
-
export type Adjacency = Record<string, string[]>;
|
|
12
|
-
/**
|
|
13
|
-
* Build a forward adjacency list for a directed graph.
|
|
14
|
-
* Ensures that every node id exists in the adjacency map, even if it has no outgoing edges.
|
|
15
|
-
*
|
|
16
|
-
* @param nodes - The set of nodes to include in the graph.
|
|
17
|
-
* @param edges - Directed edges where `source` points to `target`.
|
|
18
|
-
* @returns A mapping from node id to an array of child node ids.
|
|
19
|
-
*/
|
|
20
|
-
export declare function buildAdjacency(nodes: DagNode[], edges: DagEdge[]): Adjacency;
|
|
21
|
-
/**
|
|
22
|
-
* Find a node by id in a list of nodes.
|
|
23
|
-
*
|
|
24
|
-
* @param nodes - Array of nodes with an `id` field.
|
|
25
|
-
* @param id - The node id to find.
|
|
26
|
-
* @returns The node if found, otherwise undefined.
|
|
27
|
-
*/
|
|
28
|
-
export declare function findNodeById<T extends {
|
|
29
|
-
id: string;
|
|
30
|
-
}>(nodes: T[], id: string): T | undefined;
|
|
31
|
-
/**
|
|
32
|
-
* Topologically sort all nodes in the graph using Kahn's algorithm.
|
|
33
|
-
* If a cycle is detected, the remaining nodes are appended in arbitrary order,
|
|
34
|
-
* and a warning is logged.
|
|
35
|
-
*
|
|
36
|
-
* @param nodes - The set of nodes to sort.
|
|
37
|
-
* @param edges - Directed edges defining dependencies.
|
|
38
|
-
* @returns An array of node ids in dependency order (parents before children).
|
|
39
|
-
*/
|
|
40
|
-
export declare function topoSortAll(nodes: DagNode[], edges: DagEdge[]): string[];
|
|
41
|
-
/**
|
|
42
|
-
* Get a topological order for the downstream subgraph reachable from `startId`.
|
|
43
|
-
* Only nodes reachable from the start are included (the starting node is excluded).
|
|
44
|
-
* If a cycle exists within the reachable subgraph, the remaining nodes are appended
|
|
45
|
-
* at the end in arbitrary order and a warning is logged.
|
|
46
|
-
*
|
|
47
|
-
* @param startId - The node id to start traversal from.
|
|
48
|
-
* @param nodes - The set of nodes in the full graph.
|
|
49
|
-
* @param edges - Directed edges defining the full graph dependencies.
|
|
50
|
-
* @returns Node ids reachable from `startId`, in dependency order.
|
|
51
|
-
*/
|
|
52
|
-
export declare function topoSortDownstream(startId: string, nodes: DagNode[], edges: DagEdge[]): string[];
|
|
53
|
-
//# sourceMappingURL=dag.d.ts.map
|
package/dist/dag.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dag.d.ts","sourceRoot":"","sources":["../src/dag.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,MAAM,MAAM,OAAO,GAAG;IAAC,EAAE,EAAE,MAAM,CAAA;CAAC,CAAC;AACnC,iDAAiD;AACjD,MAAM,MAAM,OAAO,GAAG;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAC,CAAC;AACvD,oEAAoE;AACpE,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;AAEjD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,SAAS,CAQ5E;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS;IAAC,EAAE,EAAE,MAAM,CAAA;CAAC,EACjD,KAAK,EAAE,CAAC,EAAE,EACV,EAAE,EAAE,MAAM,GACT,CAAC,GAAG,SAAS,CAEf;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,CAiCxE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,OAAO,EAAE,EAChB,KAAK,EAAE,OAAO,EAAE,GACf,MAAM,EAAE,CA6CV"}
|