diff --git a/packages/svelte/package.json b/packages/svelte/package.json index 09e72ce2..cd4162bd 100644 --- a/packages/svelte/package.json +++ b/packages/svelte/package.json @@ -16,6 +16,7 @@ ".": "./index.js" }, "dependencies": { + "@reactflow/edge-utils": "workspace:*", "@reactflow/system": "workspace:*", "@reactflow/utils": "workspace:*", "@svelte-put/shortcut": "^2.0.0", diff --git a/packages/svelte/src/customnodes/Custom.svelte b/packages/svelte/src/customnodes/Custom.svelte index 41057123..09b6c7f5 100644 --- a/packages/svelte/src/customnodes/Custom.svelte +++ b/packages/svelte/src/customnodes/Custom.svelte @@ -10,8 +10,8 @@
{data.label}
{~~xPos}, {~~yPos}
- - + +
\ No newline at end of file diff --git a/packages/svelte/src/lib/components/edges/BezierEdge.svelte b/packages/svelte/src/lib/components/edges/BezierEdge.svelte new file mode 100644 index 00000000..decca792 --- /dev/null +++ b/packages/svelte/src/lib/components/edges/BezierEdge.svelte @@ -0,0 +1,21 @@ + + + \ No newline at end of file diff --git a/packages/svelte/src/lib/components/edges/SmoothStepEdge.svelte b/packages/svelte/src/lib/components/edges/SmoothStepEdge.svelte new file mode 100644 index 00000000..6b0d1c42 --- /dev/null +++ b/packages/svelte/src/lib/components/edges/SmoothStepEdge.svelte @@ -0,0 +1,21 @@ + + + \ No newline at end of file diff --git a/packages/svelte/src/lib/components/edges/StraightEdge.svelte b/packages/svelte/src/lib/components/edges/StraightEdge.svelte new file mode 100644 index 00000000..285bbadc --- /dev/null +++ b/packages/svelte/src/lib/components/edges/StraightEdge.svelte @@ -0,0 +1,19 @@ + + + \ No newline at end of file diff --git a/packages/svelte/src/lib/container/Pane/index.svelte b/packages/svelte/src/lib/container/Pane/index.svelte index b4a03386..ba7580f0 100644 --- a/packages/svelte/src/lib/container/Pane/index.svelte +++ b/packages/svelte/src/lib/container/Pane/index.svelte @@ -1,14 +1,8 @@ - + + diff --git a/packages/svelte/src/lib/store/index.ts b/packages/svelte/src/lib/store/index.ts index d7daecab..85ded208 100644 --- a/packages/svelte/src/lib/store/index.ts +++ b/packages/svelte/src/lib/store/index.ts @@ -27,7 +27,10 @@ import { SelectionMode } from 'reactflow'; import DefaultNode from '$lib/components/nodes/DefaultNode.svelte'; import InputNode from '$lib/components/nodes/InputNode.svelte'; import OutputNode from '$lib/components/nodes/OutputNode.svelte'; -import type { NodeTypes } from '$lib/types'; +import type { EdgeTypes, NodeTypes } from '$lib/types'; +import BezierEdge from '$lib/components/edges/BezierEdge.svelte'; +import StraightEdge from '$lib/components/edges/StraightEdge.svelte'; +import SmoothStepEdge from '$lib/components/edges/SmoothStepEdge.svelte'; export const key = Symbol(); @@ -38,6 +41,7 @@ type CreateStoreProps = { nodeOrigin?: NodeOrigin; transform?: Transform; nodeTypes?: NodeTypes; + edgeTypes?: EdgeTypes; id?: string; }; @@ -65,6 +69,7 @@ type SvelteFlowStore = { selectionMode: Writable; selectionKeyPressedStore: Writable; nodeTypesStore: Writable; + edgeTypesStore: Writable; zoomIn: (options?: ViewportHelperFunctionOptions) => void; zoomOut: (options?: ViewportHelperFunctionOptions) => void; fitView: (options?: ViewportHelperFunctionOptions) => boolean; @@ -84,6 +89,7 @@ export function createStore({ nodeOrigin = [0, 0], fitView: fitViewOnInit = false, nodeTypes = {}, + edgeTypes = {}, id = '1' }: CreateStoreProps): SvelteFlowStore { const nodesStore = writable(nodes.map((n) => ({ ...n, positionAbsolute: n.position }))); @@ -108,6 +114,13 @@ export function createStore({ default: nodeTypes.default || DefaultNode }); + const edgeTypesStore = writable({ + ...edgeTypes, + straight: edgeTypes.straight || StraightEdge, + smoothstep: edgeTypes.smoothstep || SmoothStepEdge, + default: edgeTypes.default || BezierEdge + }); + let fitViewOnInitDone = false; const edgesWithDataStore = derived([edgesStore, nodesStore], ([$edges, $nodes]) => { @@ -293,6 +306,7 @@ export function createStore({ selectionRectModeStore, selectionMode, nodeTypesStore, + edgeTypesStore, updateNodePositions, updateNodeDimensions, zoomIn, @@ -304,5 +318,6 @@ export function createStore({ export function useStore(): SvelteFlowStore { const { getStore } = getContext<{ getStore: () => SvelteFlowStore }>(key); + return getStore(); } diff --git a/packages/svelte/src/lib/types/index.ts b/packages/svelte/src/lib/types/index.ts index d295e4ec..1bc07e7d 100644 --- a/packages/svelte/src/lib/types/index.ts +++ b/packages/svelte/src/lib/types/index.ts @@ -13,3 +13,15 @@ export type NodeProps = Record>; + +export type EdgeProps = { + id: string; + sourceX: number; + sourceY: number; + targetX: number; + targetY: number; + sourcePosition?: Position; + targetPosition?: Position; +}; + +export type EdgeTypes = Record>; diff --git a/packages/svelte/src/routes/+page.svelte b/packages/svelte/src/routes/+page.svelte index b2736b94..6a664f0a 100644 --- a/packages/svelte/src/routes/+page.svelte +++ b/packages/svelte/src/routes/+page.svelte @@ -4,64 +4,84 @@ import SvelteFlow, { Controls, Background, BackgroundVariant, Minimap } from '../lib/index'; import CustomNode from '../customnodes/Custom.svelte'; - const yNodes = 10; - const xNodes = 10; - - const nodes: Node[] = []; - const edges: Edge[] = []; - const nodeTypes = { custom: CustomNode, }; - let source = null; + // const yNodes = 10; + // const xNodes = 10; - for (let y = 0; y < yNodes; y++) { - for (let x = 0; x < xNodes; x++) { - const position = { x: x * 100, y: y * 50 }; - const id = `${x}-${y}`; - const data = { label: `Node ${id}` }; - const node = { - id, - data, - position, - type: x === 0 ? 'custom' : 'default', - }; - nodes.push(node); + // const nodes: Node[] = []; + // const edges: Edge[] = []; - if (source) { - const edge = { - id: `${source.id}-${id}`, - source: source.id, - target: id, - }; - edges.push(edge); - } - source = node; - - } - } + // let source = null; - // const nodes = [{ - // id: '1', - // type: 'input', - // data: { label: 'Input Node' }, - // position: { x: 250, y: 5 } - // }, { - // id: '2', - // type: 'input', - // data: { label: 'Input Node 2' }, - // position: { x: 150, y: 250 }, - // }] + // for (let y = 0; y < yNodes; y++) { + // for (let x = 0; x < xNodes; x++) { + // const position = { x: x * 100, y: y * 50 }; + // const id = `${x}-${y}`; + // const data = { label: `Node ${id}` }; + // const node = { + // id, + // data, + // position, + // type: x === 0 ? 'custom' : 'default', + // }; + // nodes.push(node); - // const edges = [{ - // id: '1-2', - // type: 'default', - // source: '1', - // target: '2' - // }] + // if (source) { + // const edge = { + // id: `${source.id}-${id}`, + // source: source.id, + // target: id, + // }; + // edges.push(edge); + // } + + // source = node; + // } + // } + + const nodes: Node[] = [{ + id: '1', + type: 'input', + data: { label: 'Input Node' }, + position: { x: 150, y: 5 } + }, { + id: '2', + type: 'default', + data: { label: 'Node' }, + position: { x: 0, y: 150 }, + }, { + id: '3', + type: 'output', + data: { label: 'Output Node' }, + position: { x: 300, y: 150 }, + }, { + id: '4', + type: 'custom', + data: { label: 'Custom Node' }, + position: { x: 150, y: 300 }, + }]; + + const edges: Edge[] = [{ + id: '1-2', + type: 'default', + source: '1', + target: '2' + }, { + id: '1-3', + type: 'smoothstep', + source: '1', + target: '3' + }, { + id: '2-4', + type: 'default', + source: '2', + target: '4' + }]; diff --git a/packages/system/package.json b/packages/system/package.json index 48a6575c..67654749 100644 --- a/packages/system/package.json +++ b/packages/system/package.json @@ -57,6 +57,6 @@ }, "rollup": { "globals": {}, - "name": "ReactFlowCore" + "name": "ReactFlowSystem" } } diff --git a/packages/system/src/types/general.ts b/packages/system/src/types/general.ts index 3a488d88..94a0c81c 100644 --- a/packages/system/src/types/general.ts +++ b/packages/system/src/types/general.ts @@ -77,6 +77,8 @@ export type FitViewParams = { nodeOrigin: NodeOrigin; d3Zoom: D3ZoomInstance; d3Selection: D3SelectionInstance; + minZoom: number; + maxZoom: number; }; export type FitViewOptions = { diff --git a/packages/utils/package.json b/packages/utils/package.json index 887cdd89..33b95963 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -59,6 +59,6 @@ }, "rollup": { "globals": {}, - "name": "ReactFlowCore" + "name": "ReactFlowUtils" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 74088eff..afe772eb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -143,6 +143,7 @@ importers: packages/core: specifiers: + '@reactflow/edge-utils': workspace:^11.5.5 '@reactflow/eslint-config': workspace:* '@reactflow/rollup-config': workspace:* '@reactflow/system': workspace:* @@ -163,6 +164,7 @@ importers: typescript: ^4.9.4 zustand: ^4.3.3 dependencies: + '@reactflow/edge-utils': link:../edge-utils '@reactflow/system': link:../system '@reactflow/utils': link:../utils '@types/d3': registry.npmjs.org/@types/d3/7.4.0 @@ -310,6 +312,7 @@ importers: packages/svelte: specifiers: + '@reactflow/edge-utils': workspace:^11.5.5 '@reactflow/system': workspace:* '@reactflow/utils': workspace:* '@svelte-put/shortcut': ^2.0.0 @@ -335,6 +338,7 @@ importers: typescript: ^4.9.3 vite: ^4.1.1 dependencies: + '@reactflow/edge-utils': link:../edge-utils '@reactflow/system': link:../system '@reactflow/utils': link:../utils '@svelte-put/shortcut': registry.npmjs.org/@svelte-put/shortcut/2.0.0