Spaces:
Running
Running
Start adding graph viz.
Browse files- web/package-lock.json +91 -1
- web/package.json +3 -1
- web/src/LynxKiteFlow.svelte +23 -6
- web/src/LynxKiteNode.svelte +1 -21
- web/src/NodeWithGraphVisualization.svelte +25 -0
- web/src/NodeWithParams.svelte +35 -0
web/package-lock.json
CHANGED
@@ -9,7 +9,9 @@
|
|
9 |
"version": "0.0.0",
|
10 |
"dependencies": {
|
11 |
"@xyflow/svelte": "^0.0.40",
|
12 |
-
"fuse.js": "^7.0.0"
|
|
|
|
|
13 |
},
|
14 |
"devDependencies": {
|
15 |
"@sveltejs/vite-plugin-svelte": "^3.0.2",
|
@@ -1331,6 +1333,14 @@
|
|
1331 |
"@types/estree": "^1.0.0"
|
1332 |
}
|
1333 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1334 |
"node_modules/fast-glob": {
|
1335 |
"version": "3.3.2",
|
1336 |
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
|
@@ -1431,6 +1441,32 @@
|
|
1431 |
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
|
1432 |
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
|
1433 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1434 |
"node_modules/import-fresh": {
|
1435 |
"version": "3.3.0",
|
1436 |
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
|
@@ -1643,6 +1679,11 @@
|
|
1643 |
"node": ">=0.10.0"
|
1644 |
}
|
1645 |
},
|
|
|
|
|
|
|
|
|
|
|
1646 |
"node_modules/once": {
|
1647 |
"version": "1.4.0",
|
1648 |
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
|
@@ -1869,6 +1910,15 @@
|
|
1869 |
"rimraf": "^2.5.2"
|
1870 |
}
|
1871 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1872 |
"node_modules/sorcery": {
|
1873 |
"version": "0.11.0",
|
1874 |
"resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.11.0.tgz",
|
@@ -3014,6 +3064,11 @@
|
|
3014 |
"@types/estree": "^1.0.0"
|
3015 |
}
|
3016 |
},
|
|
|
|
|
|
|
|
|
|
|
3017 |
"fast-glob": {
|
3018 |
"version": "3.3.2",
|
3019 |
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
|
@@ -3089,6 +3144,27 @@
|
|
3089 |
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
|
3090 |
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
|
3091 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3092 |
"import-fresh": {
|
3093 |
"version": "3.3.0",
|
3094 |
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
|
@@ -3241,6 +3317,11 @@
|
|
3241 |
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
|
3242 |
"dev": true
|
3243 |
},
|
|
|
|
|
|
|
|
|
|
|
3244 |
"once": {
|
3245 |
"version": "1.4.0",
|
3246 |
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
|
@@ -3385,6 +3466,15 @@
|
|
3385 |
"rimraf": "^2.5.2"
|
3386 |
}
|
3387 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3388 |
"sorcery": {
|
3389 |
"version": "0.11.0",
|
3390 |
"resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.11.0.tgz",
|
|
|
9 |
"version": "0.0.0",
|
10 |
"dependencies": {
|
11 |
"@xyflow/svelte": "^0.0.40",
|
12 |
+
"fuse.js": "^7.0.0",
|
13 |
+
"graphology": "^0.25.4",
|
14 |
+
"sigma": "^3.0.0-beta.17"
|
15 |
},
|
16 |
"devDependencies": {
|
17 |
"@sveltejs/vite-plugin-svelte": "^3.0.2",
|
|
|
1333 |
"@types/estree": "^1.0.0"
|
1334 |
}
|
1335 |
},
|
1336 |
+
"node_modules/events": {
|
1337 |
+
"version": "3.3.0",
|
1338 |
+
"resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
|
1339 |
+
"integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
|
1340 |
+
"engines": {
|
1341 |
+
"node": ">=0.8.x"
|
1342 |
+
}
|
1343 |
+
},
|
1344 |
"node_modules/fast-glob": {
|
1345 |
"version": "3.3.2",
|
1346 |
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
|
|
|
1441 |
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
|
1442 |
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
|
1443 |
},
|
1444 |
+
"node_modules/graphology": {
|
1445 |
+
"version": "0.25.4",
|
1446 |
+
"resolved": "https://registry.npmjs.org/graphology/-/graphology-0.25.4.tgz",
|
1447 |
+
"integrity": "sha512-33g0Ol9nkWdD6ulw687viS8YJQBxqG5LWII6FI6nul0pq6iM2t5EKquOTFDbyTblRB3O9I+7KX4xI8u5ffekAQ==",
|
1448 |
+
"dependencies": {
|
1449 |
+
"events": "^3.3.0",
|
1450 |
+
"obliterator": "^2.0.2"
|
1451 |
+
},
|
1452 |
+
"peerDependencies": {
|
1453 |
+
"graphology-types": ">=0.24.0"
|
1454 |
+
}
|
1455 |
+
},
|
1456 |
+
"node_modules/graphology-types": {
|
1457 |
+
"version": "0.24.7",
|
1458 |
+
"resolved": "https://registry.npmjs.org/graphology-types/-/graphology-types-0.24.7.tgz",
|
1459 |
+
"integrity": "sha512-tdcqOOpwArNjEr0gNQKCXwaNCWnQJrog14nJNQPeemcLnXQUUGrsCWpWkVKt46zLjcS6/KGoayeJfHHyPDlvwA==",
|
1460 |
+
"peer": true
|
1461 |
+
},
|
1462 |
+
"node_modules/graphology-utils": {
|
1463 |
+
"version": "2.5.2",
|
1464 |
+
"resolved": "https://registry.npmjs.org/graphology-utils/-/graphology-utils-2.5.2.tgz",
|
1465 |
+
"integrity": "sha512-ckHg8MXrXJkOARk56ZaSCM1g1Wihe2d6iTmz1enGOz4W/l831MBCKSayeFQfowgF8wd+PQ4rlch/56Vs/VZLDQ==",
|
1466 |
+
"peerDependencies": {
|
1467 |
+
"graphology-types": ">=0.23.0"
|
1468 |
+
}
|
1469 |
+
},
|
1470 |
"node_modules/import-fresh": {
|
1471 |
"version": "3.3.0",
|
1472 |
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
|
|
|
1679 |
"node": ">=0.10.0"
|
1680 |
}
|
1681 |
},
|
1682 |
+
"node_modules/obliterator": {
|
1683 |
+
"version": "2.0.4",
|
1684 |
+
"resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz",
|
1685 |
+
"integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ=="
|
1686 |
+
},
|
1687 |
"node_modules/once": {
|
1688 |
"version": "1.4.0",
|
1689 |
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
|
|
|
1910 |
"rimraf": "^2.5.2"
|
1911 |
}
|
1912 |
},
|
1913 |
+
"node_modules/sigma": {
|
1914 |
+
"version": "3.0.0-beta.17",
|
1915 |
+
"resolved": "https://registry.npmjs.org/sigma/-/sigma-3.0.0-beta.17.tgz",
|
1916 |
+
"integrity": "sha512-1kwQnU+OQNc1bbgr10cpGRr8qV9qkqmHKn+ApNwdogM6uUXwPS8HSQzLEVsQzMScugC3k8aSAw1DszAsAHskaA==",
|
1917 |
+
"dependencies": {
|
1918 |
+
"events": "^3.3.0",
|
1919 |
+
"graphology-utils": "^2.5.2"
|
1920 |
+
}
|
1921 |
+
},
|
1922 |
"node_modules/sorcery": {
|
1923 |
"version": "0.11.0",
|
1924 |
"resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.11.0.tgz",
|
|
|
3064 |
"@types/estree": "^1.0.0"
|
3065 |
}
|
3066 |
},
|
3067 |
+
"events": {
|
3068 |
+
"version": "3.3.0",
|
3069 |
+
"resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
|
3070 |
+
"integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="
|
3071 |
+
},
|
3072 |
"fast-glob": {
|
3073 |
"version": "3.3.2",
|
3074 |
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
|
|
|
3144 |
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
|
3145 |
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
|
3146 |
},
|
3147 |
+
"graphology": {
|
3148 |
+
"version": "0.25.4",
|
3149 |
+
"resolved": "https://registry.npmjs.org/graphology/-/graphology-0.25.4.tgz",
|
3150 |
+
"integrity": "sha512-33g0Ol9nkWdD6ulw687viS8YJQBxqG5LWII6FI6nul0pq6iM2t5EKquOTFDbyTblRB3O9I+7KX4xI8u5ffekAQ==",
|
3151 |
+
"requires": {
|
3152 |
+
"events": "^3.3.0",
|
3153 |
+
"obliterator": "^2.0.2"
|
3154 |
+
}
|
3155 |
+
},
|
3156 |
+
"graphology-types": {
|
3157 |
+
"version": "0.24.7",
|
3158 |
+
"resolved": "https://registry.npmjs.org/graphology-types/-/graphology-types-0.24.7.tgz",
|
3159 |
+
"integrity": "sha512-tdcqOOpwArNjEr0gNQKCXwaNCWnQJrog14nJNQPeemcLnXQUUGrsCWpWkVKt46zLjcS6/KGoayeJfHHyPDlvwA==",
|
3160 |
+
"peer": true
|
3161 |
+
},
|
3162 |
+
"graphology-utils": {
|
3163 |
+
"version": "2.5.2",
|
3164 |
+
"resolved": "https://registry.npmjs.org/graphology-utils/-/graphology-utils-2.5.2.tgz",
|
3165 |
+
"integrity": "sha512-ckHg8MXrXJkOARk56ZaSCM1g1Wihe2d6iTmz1enGOz4W/l831MBCKSayeFQfowgF8wd+PQ4rlch/56Vs/VZLDQ==",
|
3166 |
+
"requires": {}
|
3167 |
+
},
|
3168 |
"import-fresh": {
|
3169 |
"version": "3.3.0",
|
3170 |
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
|
|
|
3317 |
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
|
3318 |
"dev": true
|
3319 |
},
|
3320 |
+
"obliterator": {
|
3321 |
+
"version": "2.0.4",
|
3322 |
+
"resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz",
|
3323 |
+
"integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ=="
|
3324 |
+
},
|
3325 |
"once": {
|
3326 |
"version": "1.4.0",
|
3327 |
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
|
|
|
3466 |
"rimraf": "^2.5.2"
|
3467 |
}
|
3468 |
},
|
3469 |
+
"sigma": {
|
3470 |
+
"version": "3.0.0-beta.17",
|
3471 |
+
"resolved": "https://registry.npmjs.org/sigma/-/sigma-3.0.0-beta.17.tgz",
|
3472 |
+
"integrity": "sha512-1kwQnU+OQNc1bbgr10cpGRr8qV9qkqmHKn+ApNwdogM6uUXwPS8HSQzLEVsQzMScugC3k8aSAw1DszAsAHskaA==",
|
3473 |
+
"requires": {
|
3474 |
+
"events": "^3.3.0",
|
3475 |
+
"graphology-utils": "^2.5.2"
|
3476 |
+
}
|
3477 |
+
},
|
3478 |
"sorcery": {
|
3479 |
"version": "0.11.0",
|
3480 |
"resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.11.0.tgz",
|
web/package.json
CHANGED
@@ -20,6 +20,8 @@
|
|
20 |
},
|
21 |
"dependencies": {
|
22 |
"@xyflow/svelte": "^0.0.40",
|
23 |
-
"fuse.js": "^7.0.0"
|
|
|
|
|
24 |
}
|
25 |
}
|
|
|
20 |
},
|
21 |
"dependencies": {
|
22 |
"@xyflow/svelte": "^0.0.40",
|
23 |
+
"fuse.js": "^7.0.0",
|
24 |
+
"graphology": "^0.25.4",
|
25 |
+
"sigma": "^3.0.0-beta.17"
|
26 |
}
|
27 |
}
|
web/src/LynxKiteFlow.svelte
CHANGED
@@ -12,13 +12,15 @@
|
|
12 |
type Node,
|
13 |
type Edge,
|
14 |
} from '@xyflow/svelte';
|
15 |
-
import
|
|
|
16 |
import NodeSearch from './NodeSearch.svelte';
|
17 |
import '@xyflow/svelte/dist/style.css';
|
18 |
|
19 |
const { screenToFlowPosition } = useSvelteFlow();
|
20 |
const nodeTypes: NodeTypes = {
|
21 |
-
basic:
|
|
|
22 |
};
|
23 |
|
24 |
const nodes = writable<Node[]>([
|
@@ -37,6 +39,13 @@
|
|
37 |
position: { x: -300, y: 0 },
|
38 |
sourcePosition: Position.Right,
|
39 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
40 |
]);
|
41 |
|
42 |
const edges = writable<Edge[]>([
|
@@ -48,6 +57,14 @@
|
|
48 |
type: MarkerType.ArrowClosed,
|
49 |
},
|
50 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
51 |
]);
|
52 |
|
53 |
function closeNodeSearch() {
|
@@ -97,12 +114,12 @@
|
|
97 |
{
|
98 |
type: 'basic',
|
99 |
data: { title: 'Export Parquet', params: { filename: '/tmp/x.parquet' } },
|
100 |
-
|
101 |
},
|
102 |
{
|
103 |
-
type: '
|
104 |
-
data: { title: '
|
105 |
-
|
106 |
},
|
107 |
{
|
108 |
type: 'basic',
|
|
|
12 |
type Node,
|
13 |
type Edge,
|
14 |
} from '@xyflow/svelte';
|
15 |
+
import NodeWithParams from './NodeWithParams.svelte';
|
16 |
+
import NodeWithGraphVisualization from './NodeWithGraphVisualization.svelte';
|
17 |
import NodeSearch from './NodeSearch.svelte';
|
18 |
import '@xyflow/svelte/dist/style.css';
|
19 |
|
20 |
const { screenToFlowPosition } = useSvelteFlow();
|
21 |
const nodeTypes: NodeTypes = {
|
22 |
+
basic: NodeWithParams,
|
23 |
+
graphviz: NodeWithGraphVisualization,
|
24 |
};
|
25 |
|
26 |
const nodes = writable<Node[]>([
|
|
|
39 |
position: { x: -300, y: 0 },
|
40 |
sourcePosition: Position.Right,
|
41 |
},
|
42 |
+
{
|
43 |
+
id: '4',
|
44 |
+
type: 'graphviz',
|
45 |
+
data: { title: 'Visualize graph', params: {} },
|
46 |
+
position: { x: 300, y: 0 },
|
47 |
+
targetPosition: Position.Left,
|
48 |
+
},
|
49 |
]);
|
50 |
|
51 |
const edges = writable<Edge[]>([
|
|
|
57 |
type: MarkerType.ArrowClosed,
|
58 |
},
|
59 |
},
|
60 |
+
{
|
61 |
+
id: '3-4',
|
62 |
+
source: '1',
|
63 |
+
target: '4',
|
64 |
+
markerEnd: {
|
65 |
+
type: MarkerType.ArrowClosed,
|
66 |
+
},
|
67 |
+
},
|
68 |
]);
|
69 |
|
70 |
function closeNodeSearch() {
|
|
|
114 |
{
|
115 |
type: 'basic',
|
116 |
data: { title: 'Export Parquet', params: { filename: '/tmp/x.parquet' } },
|
117 |
+
targetPosition: Position.Left,
|
118 |
},
|
119 |
{
|
120 |
+
type: 'graphviz',
|
121 |
+
data: { title: 'Visualize graph', params: {} },
|
122 |
+
targetPosition: Position.Left,
|
123 |
},
|
124 |
{
|
125 |
type: 'basic',
|
web/src/LynxKiteNode.svelte
CHANGED
@@ -32,17 +32,7 @@
|
|
32 |
{data.title}
|
33 |
</div>
|
34 |
{#if expanded}
|
35 |
-
|
36 |
-
<div class="param">
|
37 |
-
<label>
|
38 |
-
{name}<br>
|
39 |
-
<input
|
40 |
-
value={value}
|
41 |
-
on:input={(evt) => updateNodeData(id, { params: { ...data.params, [name]: evt.currentTarget.value } })}
|
42 |
-
/>
|
43 |
-
</label>
|
44 |
-
</div>
|
45 |
-
{/each}
|
46 |
{/if}
|
47 |
{#if sourcePosition}
|
48 |
<Handle type="source" position={sourcePosition} />
|
@@ -54,16 +44,6 @@
|
|
54 |
</div>
|
55 |
|
56 |
<style>
|
57 |
-
.param {
|
58 |
-
padding: 8px;
|
59 |
-
}
|
60 |
-
.param label {
|
61 |
-
font-size: 12px;
|
62 |
-
display: block;
|
63 |
-
}
|
64 |
-
.param input {
|
65 |
-
width: calc(100% - 8px);
|
66 |
-
}
|
67 |
.node-container {
|
68 |
padding: 8px;
|
69 |
}
|
|
|
32 |
{data.title}
|
33 |
</div>
|
34 |
{#if expanded}
|
35 |
+
<slot />
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
36 |
{/if}
|
37 |
{#if sourcePosition}
|
38 |
<Handle type="source" position={sourcePosition} />
|
|
|
44 |
</div>
|
45 |
|
46 |
<style>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
47 |
.node-container {
|
48 |
padding: 8px;
|
49 |
}
|
web/src/NodeWithGraphVisualization.svelte
ADDED
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<script lang="ts">
|
2 |
+
import type { ComponentProps } from 'svelte';
|
3 |
+
import { Handle, type NodeProps, useSvelteFlow } from '@xyflow/svelte';
|
4 |
+
import LynxKiteNode from './LynxKiteNode.svelte';
|
5 |
+
type $$Props = NodeProps;
|
6 |
+
export let id: $$Props['id'];
|
7 |
+
export let data: $$Props['data'];
|
8 |
+
const { updateNodeData } = useSvelteFlow();
|
9 |
+
</script>
|
10 |
+
|
11 |
+
<LynxKiteNode id={id} data={data} {...$$restProps}>
|
12 |
+
Graph here.
|
13 |
+
</LynxKiteNode>
|
14 |
+
<style>
|
15 |
+
.param {
|
16 |
+
padding: 8px;
|
17 |
+
}
|
18 |
+
.param label {
|
19 |
+
font-size: 12px;
|
20 |
+
display: block;
|
21 |
+
}
|
22 |
+
.param input {
|
23 |
+
width: calc(100% - 8px);
|
24 |
+
}
|
25 |
+
</style>
|
web/src/NodeWithParams.svelte
ADDED
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<script lang="ts">
|
2 |
+
import type { ComponentProps } from 'svelte';
|
3 |
+
import { Handle, type NodeProps, useSvelteFlow } from '@xyflow/svelte';
|
4 |
+
import LynxKiteNode from './LynxKiteNode.svelte';
|
5 |
+
type $$Props = NodeProps;
|
6 |
+
export let id: $$Props['id'];
|
7 |
+
export let data: $$Props['data'];
|
8 |
+
const { updateNodeData } = useSvelteFlow();
|
9 |
+
</script>
|
10 |
+
|
11 |
+
<LynxKiteNode id={id} data={data} {...$$restProps}>
|
12 |
+
{#each Object.entries(data.params) as [name, value]}
|
13 |
+
<div class="param">
|
14 |
+
<label>
|
15 |
+
{name}<br>
|
16 |
+
<input
|
17 |
+
value={value}
|
18 |
+
on:input={(evt) => updateNodeData(id, { params: { ...data.params, [name]: evt.currentTarget.value } })}
|
19 |
+
/>
|
20 |
+
</label>
|
21 |
+
</div>
|
22 |
+
{/each}
|
23 |
+
</LynxKiteNode>
|
24 |
+
<style>
|
25 |
+
.param {
|
26 |
+
padding: 8px;
|
27 |
+
}
|
28 |
+
.param label {
|
29 |
+
font-size: 12px;
|
30 |
+
display: block;
|
31 |
+
}
|
32 |
+
.param input {
|
33 |
+
width: calc(100% - 8px);
|
34 |
+
}
|
35 |
+
</style>
|