diff --git a/examples/svelte/src/routes/examples/customnode/CustomNode.svelte b/examples/svelte/src/routes/examples/customnode/CustomNode.svelte index 25d37d32..51ba33ea 100644 --- a/examples/svelte/src/routes/examples/customnode/CustomNode.svelte +++ b/examples/svelte/src/routes/examples/customnode/CustomNode.svelte @@ -1,6 +1,6 @@ { diff --git a/examples/svelte/src/routes/examples/edges/ButtonEdge.svelte b/examples/svelte/src/routes/examples/edges/ButtonEdge.svelte new file mode 100644 index 00000000..235aab98 --- /dev/null +++ b/examples/svelte/src/routes/examples/edges/ButtonEdge.svelte @@ -0,0 +1,92 @@ + + + + +
+ +
+
+ + diff --git a/examples/svelte/src/routes/examples/edges/CustomBezierEdge.svelte b/examples/svelte/src/routes/examples/edges/CustomBezierEdge.svelte new file mode 100644 index 00000000..48d86c3d --- /dev/null +++ b/examples/svelte/src/routes/examples/edges/CustomBezierEdge.svelte @@ -0,0 +1,55 @@ + + + diff --git a/packages/react/src/components/Edges/BezierEdge.tsx b/packages/react/src/components/Edges/BezierEdge.tsx index 8f446393..2a0b54a2 100644 --- a/packages/react/src/components/Edges/BezierEdge.tsx +++ b/packages/react/src/components/Edges/BezierEdge.tsx @@ -4,56 +4,67 @@ import { Position, getBezierPath } from '@xyflow/system'; import BaseEdge from './BaseEdge'; import type { BezierEdgeProps } from '../../types'; -const BezierEdge = memo( - ({ - sourceX, - sourceY, - targetX, - targetY, - sourcePosition = Position.Bottom, - targetPosition = Position.Top, - label, - labelStyle, - labelShowBg, - labelBgStyle, - labelBgPadding, - labelBgBorderRadius, - style, - markerEnd, - markerStart, - pathOptions, - interactionWidth, - }: BezierEdgeProps) => { - const [path, labelX, labelY] = getBezierPath({ +function createBezierEdge(params: { isInternal: boolean }) { + // eslint-disable-next-line react/display-name + return memo( + ({ + id, sourceX, sourceY, - sourcePosition, targetX, targetY, - targetPosition, - curvature: pathOptions?.curvature, - }); + sourcePosition = Position.Bottom, + targetPosition = Position.Top, + label, + labelStyle, + labelShowBg, + labelBgStyle, + labelBgPadding, + labelBgBorderRadius, + style, + markerEnd, + markerStart, + pathOptions, + interactionWidth, + }: BezierEdgeProps) => { + const [path, labelX, labelY] = getBezierPath({ + sourceX, + sourceY, + sourcePosition, + targetX, + targetY, + targetPosition, + curvature: pathOptions?.curvature, + }); - return ( - - ); - } -); + const _id = params.isInternal ? undefined : id; + + return ( + + ); + } + ); +} + +const BezierEdge = createBezierEdge({ isInternal: false }); +const BezierEdgeInternal = createBezierEdge({ isInternal: true }); BezierEdge.displayName = 'BezierEdge'; +BezierEdgeInternal.displayName = 'BezierEdgeInternal'; -export default BezierEdge; +export { BezierEdge, BezierEdgeInternal }; diff --git a/packages/react/src/components/Edges/SimpleBezierEdge.tsx b/packages/react/src/components/Edges/SimpleBezierEdge.tsx index d9fa50c4..09c7a752 100644 --- a/packages/react/src/components/Edges/SimpleBezierEdge.tsx +++ b/packages/react/src/components/Edges/SimpleBezierEdge.tsx @@ -2,7 +2,7 @@ import { memo } from 'react'; import { Position, getBezierEdgeCenter } from '@xyflow/system'; import BaseEdge from './BaseEdge'; -import type { EdgeProps } from '../../types'; +import type { SimpleBezierEdgeProps } from '../../types'; export interface GetSimpleBezierPathParams { sourceX: number; @@ -71,54 +71,65 @@ export function getSimpleBezierPath({ ]; } -const SimpleBezierEdge = memo( - ({ - sourceX, - sourceY, - targetX, - targetY, - sourcePosition = Position.Bottom, - targetPosition = Position.Top, - label, - labelStyle, - labelShowBg, - labelBgStyle, - labelBgPadding, - labelBgBorderRadius, - style, - markerEnd, - markerStart, - interactionWidth, - }: EdgeProps) => { - const [path, labelX, labelY] = getSimpleBezierPath({ +function createSimpleBezierEdge(params: { isInternal: boolean }) { + // eslint-disable-next-line react/display-name + return memo( + ({ + id, sourceX, sourceY, - sourcePosition, targetX, targetY, - targetPosition, - }); + sourcePosition = Position.Bottom, + targetPosition = Position.Top, + label, + labelStyle, + labelShowBg, + labelBgStyle, + labelBgPadding, + labelBgBorderRadius, + style, + markerEnd, + markerStart, + interactionWidth, + }: SimpleBezierEdgeProps) => { + const [path, labelX, labelY] = getSimpleBezierPath({ + sourceX, + sourceY, + sourcePosition, + targetX, + targetY, + targetPosition, + }); - return ( - - ); - } -); + const _id = params.isInternal ? undefined : id; + + return ( + + ); + } + ); +} + +const SimpleBezierEdge = createSimpleBezierEdge({ isInternal: false }); +const SimpleBezierEdgeInternal = createSimpleBezierEdge({ isInternal: true }); SimpleBezierEdge.displayName = 'SimpleBezierEdge'; +SimpleBezierEdgeInternal.displayName = 'SimpleBezierEdgeInternal'; -export default SimpleBezierEdge; +export { SimpleBezierEdge, SimpleBezierEdgeInternal }; diff --git a/packages/react/src/components/Edges/SmoothStepEdge.tsx b/packages/react/src/components/Edges/SmoothStepEdge.tsx index be635a4e..8eb10d89 100644 --- a/packages/react/src/components/Edges/SmoothStepEdge.tsx +++ b/packages/react/src/components/Edges/SmoothStepEdge.tsx @@ -4,57 +4,68 @@ import { Position, getSmoothStepPath } from '@xyflow/system'; import BaseEdge from './BaseEdge'; import type { SmoothStepEdgeProps } from '../../types'; -const SmoothStepEdge = memo( - ({ - sourceX, - sourceY, - targetX, - targetY, - label, - labelStyle, - labelShowBg, - labelBgStyle, - labelBgPadding, - labelBgBorderRadius, - style, - sourcePosition = Position.Bottom, - targetPosition = Position.Top, - markerEnd, - markerStart, - pathOptions, - interactionWidth, - }: SmoothStepEdgeProps) => { - const [path, labelX, labelY] = getSmoothStepPath({ +function createSmoothStepEdge(params: { isInternal: boolean }) { + // eslint-disable-next-line react/display-name + return memo( + ({ + id, sourceX, sourceY, - sourcePosition, targetX, targetY, - targetPosition, - borderRadius: pathOptions?.borderRadius, - offset: pathOptions?.offset, - }); + label, + labelStyle, + labelShowBg, + labelBgStyle, + labelBgPadding, + labelBgBorderRadius, + style, + sourcePosition = Position.Bottom, + targetPosition = Position.Top, + markerEnd, + markerStart, + pathOptions, + interactionWidth, + }: SmoothStepEdgeProps) => { + const [path, labelX, labelY] = getSmoothStepPath({ + sourceX, + sourceY, + sourcePosition, + targetX, + targetY, + targetPosition, + borderRadius: pathOptions?.borderRadius, + offset: pathOptions?.offset, + }); - return ( - - ); - } -); + const _id = params.isInternal ? undefined : id; + + return ( + + ); + } + ); +} + +const SmoothStepEdge = createSmoothStepEdge({ isInternal: false }); +const SmoothStepEdgeInternal = createSmoothStepEdge({ isInternal: true }); SmoothStepEdge.displayName = 'SmoothStepEdge'; +SmoothStepEdgeInternal.displayName = 'SmoothStepEdgeInternal'; -export default SmoothStepEdge; +export { SmoothStepEdge, SmoothStepEdgeInternal }; diff --git a/packages/react/src/components/Edges/StepEdge.tsx b/packages/react/src/components/Edges/StepEdge.tsx index df2646a7..6385e8f0 100644 --- a/packages/react/src/components/Edges/StepEdge.tsx +++ b/packages/react/src/components/Edges/StepEdge.tsx @@ -1,15 +1,30 @@ import { memo, useMemo } from 'react'; -import SmoothStepEdge from './SmoothStepEdge'; -import type { SmoothStepEdgeProps } from '../../types'; +import { SmoothStepEdge } from './SmoothStepEdge'; +import type { StepEdgeProps } from '../../types'; -const StepEdge = memo((props: SmoothStepEdgeProps) => ( - ({ borderRadius: 0, offset: props.pathOptions?.offset }), [props.pathOptions?.offset])} - /> -)); +function createStepEdge(params: { isInternal: boolean }) { + // eslint-disable-next-line react/display-name + return memo(({ id, ...props }: StepEdgeProps) => { + const _id = params.isInternal ? undefined : id; + + return ( + ({ borderRadius: 0, offset: props.pathOptions?.offset }), + [props.pathOptions?.offset] + )} + /> + ); + }); +} + +const StepEdge = createStepEdge({ isInternal: false }); +const StepEdgeInternal = createStepEdge({ isInternal: true }); StepEdge.displayName = 'StepEdge'; +StepEdgeInternal.displayName = 'StepEdgeInternal'; -export default StepEdge; +export { StepEdge, StepEdgeInternal }; diff --git a/packages/react/src/components/Edges/StraightEdge.tsx b/packages/react/src/components/Edges/StraightEdge.tsx index 06f4a161..5a3c824d 100644 --- a/packages/react/src/components/Edges/StraightEdge.tsx +++ b/packages/react/src/components/Edges/StraightEdge.tsx @@ -2,47 +2,58 @@ import { memo } from 'react'; import { getStraightPath } from '@xyflow/system'; import BaseEdge from './BaseEdge'; -import type { EdgeProps } from '../../types'; +import type { StraightEdgeProps } from '../../types'; -const StraightEdge = memo( - ({ - sourceX, - sourceY, - targetX, - targetY, - label, - labelStyle, - labelShowBg, - labelBgStyle, - labelBgPadding, - labelBgBorderRadius, - style, - markerEnd, - markerStart, - interactionWidth, - }: EdgeProps) => { - const [path, labelX, labelY] = getStraightPath({ sourceX, sourceY, targetX, targetY }); +function createStraightEdge(params: { isInternal: boolean }) { + // eslint-disable-next-line react/display-name + return memo( + ({ + id, + sourceX, + sourceY, + targetX, + targetY, + label, + labelStyle, + labelShowBg, + labelBgStyle, + labelBgPadding, + labelBgBorderRadius, + style, + markerEnd, + markerStart, + interactionWidth, + }: StraightEdgeProps) => { + const [path, labelX, labelY] = getStraightPath({ sourceX, sourceY, targetX, targetY }); - return ( - - ); - } -); + const _id = params.isInternal ? undefined : id; + + return ( + + ); + } + ); +} + +const StraightEdge = createStraightEdge({ isInternal: false }); +const StraightEdgeInternal = createStraightEdge({ isInternal: true }); StraightEdge.displayName = 'StraightEdge'; +StraightEdgeInternal.displayName = 'StraightEdgeInternal'; -export default StraightEdge; +export { StraightEdge, StraightEdgeInternal }; diff --git a/packages/react/src/components/Edges/index.ts b/packages/react/src/components/Edges/index.ts index e4d30109..21af9667 100644 --- a/packages/react/src/components/Edges/index.ts +++ b/packages/react/src/components/Edges/index.ts @@ -1,5 +1,9 @@ -export { default as SimpleBezierEdge } from './SimpleBezierEdge'; -export { default as SmoothStepEdge } from './SmoothStepEdge'; -export { default as StepEdge } from './StepEdge'; -export { default as StraightEdge } from './StraightEdge'; -export { default as BezierEdge } from './BezierEdge'; +// We distinguish between internal and exported edges +// The internal edges are used directly like custom edges and always get an id, source and target props +// If you import an edge from the library, the id is optional and source and target are not used at all + +export { SimpleBezierEdge, SimpleBezierEdgeInternal } from './SimpleBezierEdge'; +export { SmoothStepEdge, SmoothStepEdgeInternal } from './SmoothStepEdge'; +export { StepEdge, StepEdgeInternal } from './StepEdge'; +export { StraightEdge, StraightEdgeInternal } from './StraightEdge'; +export { BezierEdge, BezierEdgeInternal } from './BezierEdge'; diff --git a/packages/react/src/container/EdgeRenderer/utils.ts b/packages/react/src/container/EdgeRenderer/utils.ts index 0e8f39d3..433bb0f0 100644 --- a/packages/react/src/container/EdgeRenderer/utils.ts +++ b/packages/react/src/container/EdgeRenderer/utils.ts @@ -1,6 +1,12 @@ import type { ComponentType } from 'react'; -import { BezierEdge, SmoothStepEdge, StepEdge, StraightEdge, SimpleBezierEdge } from '../../components/Edges'; +import { + BezierEdgeInternal, + SmoothStepEdgeInternal, + StepEdgeInternal, + StraightEdgeInternal, + SimpleBezierEdgeInternal, +} from '../../components/Edges'; import wrapEdge from '../../components/Edges/wrapEdge'; import type { EdgeProps, EdgeTypes, EdgeTypesWrapped } from '../../types'; @@ -8,18 +14,18 @@ export type CreateEdgeTypes = (edgeTypes: EdgeTypes) => EdgeTypesWrapped; export function createEdgeTypes(edgeTypes: EdgeTypes): EdgeTypesWrapped { const standardTypes: EdgeTypesWrapped = { - default: wrapEdge((edgeTypes.default || BezierEdge) as ComponentType), - straight: wrapEdge((edgeTypes.bezier || StraightEdge) as ComponentType), - step: wrapEdge((edgeTypes.step || StepEdge) as ComponentType), - smoothstep: wrapEdge((edgeTypes.step || SmoothStepEdge) as ComponentType), - simplebezier: wrapEdge((edgeTypes.simplebezier || SimpleBezierEdge) as ComponentType), + default: wrapEdge((edgeTypes.default || BezierEdgeInternal) as ComponentType), + straight: wrapEdge((edgeTypes.bezier || StraightEdgeInternal) as ComponentType), + step: wrapEdge((edgeTypes.step || StepEdgeInternal) as ComponentType), + smoothstep: wrapEdge((edgeTypes.step || SmoothStepEdgeInternal) as ComponentType), + simplebezier: wrapEdge((edgeTypes.simplebezier || SimpleBezierEdgeInternal) as ComponentType), }; const wrappedTypes = {} as EdgeTypesWrapped; const specialTypes: EdgeTypesWrapped = Object.keys(edgeTypes) .filter((k) => !['default', 'bezier'].includes(k)) .reduce((res, key) => { - res[key] = wrapEdge((edgeTypes[key] || BezierEdge) as ComponentType); + res[key] = wrapEdge((edgeTypes[key] || BezierEdgeInternal) as ComponentType); return res; }, wrappedTypes); diff --git a/packages/react/src/container/ReactFlow/index.tsx b/packages/react/src/container/ReactFlow/index.tsx index 1b3dc796..a7360a46 100644 --- a/packages/react/src/container/ReactFlow/index.tsx +++ b/packages/react/src/container/ReactFlow/index.tsx @@ -12,7 +12,13 @@ import { } from '@xyflow/system'; import Attribution from '../../components/Attribution'; -import { BezierEdge, SmoothStepEdge, StepEdge, StraightEdge, SimpleBezierEdge } from '../../components/Edges'; +import { + BezierEdgeInternal, + SmoothStepEdgeInternal, + StepEdgeInternal, + StraightEdgeInternal, + SimpleBezierEdgeInternal, +} from '../../components/Edges'; import DefaultNode from '../../components/Nodes/DefaultNode'; import InputNode from '../../components/Nodes/InputNode'; import OutputNode from '../../components/Nodes/OutputNode'; @@ -33,11 +39,11 @@ const defaultNodeTypes: NodeTypes = { }; const defaultEdgeTypes: EdgeTypes = { - default: BezierEdge, - straight: StraightEdge, - step: StepEdge, - smoothstep: SmoothStepEdge, - simplebezier: SimpleBezierEdge, + default: BezierEdgeInternal, + straight: StraightEdgeInternal, + step: StepEdgeInternal, + smoothstep: SmoothStepEdgeInternal, + simplebezier: SimpleBezierEdgeInternal, }; const initNodeOrigin: NodeOrigin = [0, 0]; diff --git a/packages/react/src/index.ts b/packages/react/src/index.ts index 4fe922e5..2a693638 100644 --- a/packages/react/src/index.ts +++ b/packages/react/src/index.ts @@ -1,11 +1,11 @@ export { default as ReactFlow } from './container/ReactFlow'; export { default as Handle } from './components/Handle'; export { default as EdgeText } from './components/Edges/EdgeText'; -export { default as StraightEdge } from './components/Edges/StraightEdge'; -export { default as StepEdge } from './components/Edges/StepEdge'; -export { default as BezierEdge } from './components/Edges/BezierEdge'; -export { default as SimpleBezierEdge, getSimpleBezierPath } from './components/Edges/SimpleBezierEdge'; -export { default as SmoothStepEdge } from './components/Edges/SmoothStepEdge'; +export { StraightEdge } from './components/Edges/StraightEdge'; +export { StepEdge } from './components/Edges/StepEdge'; +export { BezierEdge } from './components/Edges/BezierEdge'; +export { SimpleBezierEdge, getSimpleBezierPath } from './components/Edges/SimpleBezierEdge'; +export { SmoothStepEdge } from './components/Edges/SmoothStepEdge'; export { default as BaseEdge } from './components/Edges/BaseEdge'; export { default as ReactFlowProvider } from './components/ReactFlowProvider'; export { default as Panel, type PanelProps } from './components/Panel'; diff --git a/packages/react/src/types/edges.ts b/packages/react/src/types/edges.ts index cd29a85f..287c277d 100644 --- a/packages/react/src/types/edges.ts +++ b/packages/react/src/types/edges.ts @@ -13,6 +13,8 @@ import type { HandleElement, ConnectionStatus, EdgePosition, + Optional, + StepPathOptions, } from '@xyflow/system'; import { Node } from '.'; @@ -46,7 +48,12 @@ type BezierEdgeType = DefaultEdge & { pathOptions?: BezierPathOptions; }; -export type Edge = DefaultEdge | SmoothStepEdgeType | BezierEdgeType; +type StepEdgeType = DefaultEdge & { + type: 'step'; + pathOptions?: StepPathOptions; +}; + +export type Edge = DefaultEdge | SmoothStepEdgeType | BezierEdgeType | StepEdgeType; export type EdgeMouseHandler = (event: ReactMouseEvent, edge: Edge) => void; @@ -100,14 +107,24 @@ export type BaseEdgeProps = Pick = EdgeProps & { +export type EdgeComponentProps = Optional, 'source' | 'target'>, 'id'>; + +export type StraightEdgeProps = Omit, 'sourcePosition' | 'targetPosition'>; + +export type SmoothStepEdgeProps = EdgeComponentProps & { pathOptions?: SmoothStepPathOptions; }; -export type BezierEdgeProps = EdgeProps & { +export type BezierEdgeProps = EdgeComponentProps & { pathOptions?: BezierPathOptions; }; +export type StepEdgeProps = EdgeComponentProps & { + pathOptions?: StepPathOptions; +}; + +export type SimpleBezierEdgeProps = EdgeComponentProps; + export type OnEdgeUpdateFunc = (oldEdge: Edge, newConnection: Connection) => void; export type ConnectionLineComponentProps = { diff --git a/packages/svelte/src/lib/components/EdgeWrapper/EdgeWrapper.svelte b/packages/svelte/src/lib/components/EdgeWrapper/EdgeWrapper.svelte index 7a8df68c..aad6d2b1 100644 --- a/packages/svelte/src/lib/components/EdgeWrapper/EdgeWrapper.svelte +++ b/packages/svelte/src/lib/components/EdgeWrapper/EdgeWrapper.svelte @@ -6,7 +6,7 @@ import { errorMessages, getMarkerId } from '@xyflow/system'; import { useStore } from '$lib/store'; - import BezierEdge from '$lib/components/edges/BezierEdge.svelte'; + import { BezierEdgeInternal } from '$lib/components/edges'; import type { EdgeLayouted, Edge } from '$lib/types'; import { get } from 'svelte/store'; @@ -57,7 +57,7 @@ edgecontextmenu: { edge: Edge; event: MouseEvent }; }>(); - $: edgeComponent = $edgeTypes[type!] || BezierEdge; + $: edgeComponent = $edgeTypes[type!] || BezierEdgeInternal; $: markerStartUrl = markerStart ? `url(#${getMarkerId(markerStart, $flowId)})` : undefined; $: markerEndUrl = markerEnd ? `url(#${getMarkerId(markerEnd, $flowId)})` : undefined; diff --git a/packages/svelte/src/lib/components/edges/BezierEdge.svelte b/packages/svelte/src/lib/components/edges/BezierEdge.svelte index 60921eb6..9d32f4c7 100644 --- a/packages/svelte/src/lib/components/edges/BezierEdge.svelte +++ b/packages/svelte/src/lib/components/edges/BezierEdge.svelte @@ -1,30 +1,48 @@ diff --git a/packages/svelte/src/lib/components/edges/BezierEdgeInternal.svelte b/packages/svelte/src/lib/components/edges/BezierEdgeInternal.svelte new file mode 100644 index 00000000..9431a05d --- /dev/null +++ b/packages/svelte/src/lib/components/edges/BezierEdgeInternal.svelte @@ -0,0 +1,63 @@ + + + diff --git a/packages/svelte/src/lib/components/edges/SmoothStepEdge.svelte b/packages/svelte/src/lib/components/edges/SmoothStepEdge.svelte index 30872b68..3e27368f 100644 --- a/packages/svelte/src/lib/components/edges/SmoothStepEdge.svelte +++ b/packages/svelte/src/lib/components/edges/SmoothStepEdge.svelte @@ -1,30 +1,49 @@ diff --git a/packages/svelte/src/lib/components/edges/SmoothStepEdgeInternal.svelte b/packages/svelte/src/lib/components/edges/SmoothStepEdgeInternal.svelte new file mode 100644 index 00000000..28e87269 --- /dev/null +++ b/packages/svelte/src/lib/components/edges/SmoothStepEdgeInternal.svelte @@ -0,0 +1,63 @@ + + + diff --git a/packages/svelte/src/lib/components/edges/StepEdge.svelte b/packages/svelte/src/lib/components/edges/StepEdge.svelte index 65012595..5ca6dc00 100644 --- a/packages/svelte/src/lib/components/edges/StepEdge.svelte +++ b/packages/svelte/src/lib/components/edges/StepEdge.svelte @@ -1,31 +1,49 @@ diff --git a/packages/svelte/src/lib/components/edges/StepEdgeInternal.svelte b/packages/svelte/src/lib/components/edges/StepEdgeInternal.svelte new file mode 100644 index 00000000..248e5912 --- /dev/null +++ b/packages/svelte/src/lib/components/edges/StepEdgeInternal.svelte @@ -0,0 +1,64 @@ + + + diff --git a/packages/svelte/src/lib/components/edges/StraightEdge.svelte b/packages/svelte/src/lib/components/edges/StraightEdge.svelte index 50f282ff..c868752f 100644 --- a/packages/svelte/src/lib/components/edges/StraightEdge.svelte +++ b/packages/svelte/src/lib/components/edges/StraightEdge.svelte @@ -1,28 +1,42 @@ diff --git a/packages/svelte/src/lib/components/edges/StraightEdgeInternal.svelte b/packages/svelte/src/lib/components/edges/StraightEdgeInternal.svelte new file mode 100644 index 00000000..0d436d52 --- /dev/null +++ b/packages/svelte/src/lib/components/edges/StraightEdgeInternal.svelte @@ -0,0 +1,63 @@ + + + diff --git a/packages/svelte/src/lib/components/edges/index.ts b/packages/svelte/src/lib/components/edges/index.ts index 1f1567b6..4be51363 100644 --- a/packages/svelte/src/lib/components/edges/index.ts +++ b/packages/svelte/src/lib/components/edges/index.ts @@ -1,4 +1,17 @@ +// We distinguish between internal and exported edges +// The internal edges are used directly like custom edges and always get an id, source and target props +// If you import an edge from the library, the id is optional and source and target are not used at all + +// @todo: how can we prevent this duplication in ...Edge/ ...EdgeInternal? +// both are quite similar, it's just about 1-2 props that are different export { default as BezierEdge } from './BezierEdge.svelte'; -export { default as StraightEdge } from './StraightEdge.svelte'; +export { default as BezierEdgeInternal } from './BezierEdgeInternal.svelte'; + export { default as SmoothStepEdge } from './SmoothStepEdge.svelte'; +export { default as SmoothStepEdgeInternal } from './SmoothStepEdgeInternal.svelte'; + +export { default as StraightEdge } from './StraightEdge.svelte'; +export { default as StraightEdgeInternal } from './StraightEdgeInternal.svelte'; + export { default as StepEdge } from './StepEdge.svelte'; +export { default as StepEdgeInternal } from './StepEdgeInternal.svelte'; diff --git a/packages/svelte/src/lib/index.ts b/packages/svelte/src/lib/index.ts index d9e0885f..a9107415 100644 --- a/packages/svelte/src/lib/index.ts +++ b/packages/svelte/src/lib/index.ts @@ -7,7 +7,7 @@ export * from '$lib/container/Panel'; export * from '$lib/components/SvelteFlowProvider'; export * from '$lib/components/EdgeLabelRenderer'; export * from '$lib/components/BaseEdge'; -export * from '$lib/components/edges'; +export { BezierEdge, StepEdge, SmoothStepEdge, StraightEdge } from '$lib/components/edges'; export * from '$lib/components/Handle'; // plugins @@ -29,7 +29,16 @@ export * from '$lib/hooks/useConnection'; export * from '$lib/hooks/useNodesEdges'; // types -export type { Edge, EdgeProps, EdgeTypes, DefaultEdgeOptions } from '$lib/types/edges'; +export type { + Edge, + EdgeProps, + BezierEdgeProps, + SmoothStepEdgeProps, + StepEdgeProps, + StraightEdgeProps, + EdgeTypes, + DefaultEdgeOptions +} from '$lib/types/edges'; export type { HandleComponentProps, FitViewOptions } from '$lib/types/general'; export type { Node, NodeTypes, DefaultNodeOptions } from '$lib/types/nodes'; export type { SvelteFlowStore } from '$lib/store/types'; diff --git a/packages/svelte/src/lib/store/initial-store.ts b/packages/svelte/src/lib/store/initial-store.ts index 8f358cf9..9f51abc3 100644 --- a/packages/svelte/src/lib/store/initial-store.ts +++ b/packages/svelte/src/lib/store/initial-store.ts @@ -24,10 +24,14 @@ 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 GroupNode from '$lib/components/nodes/GroupNode.svelte'; -import BezierEdge from '$lib/components/edges/BezierEdge.svelte'; -import StraightEdge from '$lib/components/edges/StraightEdge.svelte'; -import SmoothStepEdge from '$lib/components/edges/SmoothStepEdge.svelte'; -import StepEdge from '$lib/components/edges/StepEdge.svelte'; + +import { + BezierEdgeInternal, + SmoothStepEdgeInternal, + StraightEdgeInternal, + StepEdgeInternal +} from '$lib/components/edges'; + import type { NodeTypes, EdgeTypes, @@ -49,10 +53,10 @@ export const initialNodeTypes = { }; export const initialEdgeTypes = { - straight: StraightEdge, - smoothstep: SmoothStepEdge, - default: BezierEdge, - step: StepEdge + straight: StraightEdgeInternal, + smoothstep: SmoothStepEdgeInternal, + default: BezierEdgeInternal, + step: StepEdgeInternal }; export const getInitialStore = ({ diff --git a/packages/svelte/src/lib/types/edges.ts b/packages/svelte/src/lib/types/edges.ts index 33f0d908..3f1f0e8d 100644 --- a/packages/svelte/src/lib/types/edges.ts +++ b/packages/svelte/src/lib/types/edges.ts @@ -5,7 +5,9 @@ import type { BezierPathOptions, DefaultEdgeOptionsBase, EdgePosition, - SmoothStepPathOptions + SmoothStepPathOptions, + Optional, + StepPathOptions } from '@xyflow/system'; import type { Node } from '$lib/types'; @@ -29,6 +31,7 @@ type BezierEdgeType = DefaultEdge & { type StepEdgeType = DefaultEdge & { type: 'step'; + pathOptions?: StepPathOptions; }; export type Edge = @@ -37,7 +40,7 @@ export type Edge = | BezierEdgeType | StepEdgeType; -export type EdgeProps = Omit & +export type EdgeProps = Omit, 'sourceHandle' | 'targetHandle' | 'type'> & EdgePosition & { markerStart?: string; markerEnd?: string; @@ -45,6 +48,31 @@ export type EdgeProps = Omit & targetHandleId?: string | null; }; +export type EdgeComponentProps = Optional< + Omit< + EdgeProps, + 'source' | 'target' | 'sourceHandleId' | 'targetHandleId' | 'animated' | 'selected' | 'data' + >, + 'id' +>; + +export type BezierEdgeProps = EdgeComponentProps & { + pathOptions?: BezierPathOptions; +}; + +export type SmoothStepEdgeProps = EdgeComponentProps & { + pathOptions?: SmoothStepPathOptions; +}; + +export type StepEdgeProps = EdgeComponentProps & { + pathOptions?: StepPathOptions; +}; + +export type StraightEdgeProps = Omit< + EdgeComponentProps, + 'sourcePosition' | 'targetPosition' +>; + export type EdgeTypes = Record>>; export type DefaultEdgeOptions = Omit, 'focusable'>; diff --git a/packages/svelte/tsconfig.json b/packages/svelte/tsconfig.json index 8fbe9e82..d9cfe5d6 100644 --- a/packages/svelte/tsconfig.json +++ b/packages/svelte/tsconfig.json @@ -8,7 +8,8 @@ "resolveJsonModule": true, "skipLibCheck": true, "sourceMap": true, - "strict": true + "strict": true, + "noErrorTruncation": true } // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias diff --git a/packages/system/src/types/edges.ts b/packages/system/src/types/edges.ts index 855682d2..65c8e641 100644 --- a/packages/system/src/types/edges.ts +++ b/packages/system/src/types/edges.ts @@ -27,6 +27,10 @@ export type SmoothStepPathOptions = { borderRadius?: number; }; +export type StepPathOptions = { + offset?: number; +}; + export type BezierPathOptions = { curvature?: number; }; diff --git a/packages/system/src/types/utils.ts b/packages/system/src/types/utils.ts index 908e95f1..6ebb0744 100644 --- a/packages/system/src/types/utils.ts +++ b/packages/system/src/types/utils.ts @@ -1,3 +1,5 @@ +import type { Optional } from '../utils/types'; + export enum Position { Left = 'left', Top = 'top', diff --git a/packages/system/src/utils/index.ts b/packages/system/src/utils/index.ts index 380b7658..4937033c 100644 --- a/packages/system/src/utils/index.ts +++ b/packages/system/src/utils/index.ts @@ -5,3 +5,4 @@ export * from './general'; export * from './marker'; export * from './node-toolbar'; export * from './store'; +export * from './types'; diff --git a/tooling/tsconfig/react.json b/tooling/tsconfig/react.json index e3cb9853..33c4fc1f 100644 --- a/tooling/tsconfig/react.json +++ b/tooling/tsconfig/react.json @@ -6,6 +6,7 @@ "lib": ["dom", "esnext"], "module": "esnext", "target": "esnext", - "outDir": "dist" + "outDir": "dist", + "noErrorTruncation": true } }