react-force-graph-2d
Version:
React component for 2D force directed graphs
133 lines (113 loc) • 4.58 kB
TypeScript
import { ForwardRefRenderFunction } from 'react';
import { ForceGraphInstance } from 'force-graph';
interface GraphData {
nodes: NodeObject[];
links: LinkObject[];
}
type NodeObject = object & {
id?: string | number;
x?: number;
y?: number;
vx?: number;
vy?: number;
fx?: number;
fy?: number;
};
type LinkObject = object & {
source?: string | number | NodeObject;
target?: string | number | NodeObject;
};
type Accessor<In, Out> = Out | string | ((obj: In) => Out);
type NodeAccessor<T> = Accessor<NodeObject, T>;
type LinkAccessor<T> = Accessor<LinkObject, T>;
type CanvasCustomRenderFn<T> = (obj: T, canvasContext: CanvasRenderingContext2D, globalScale: number, isShadow?: boolean) => void;
type CanvasCustomRenderMode = 'replace' | 'before' | 'after';
type DagMode = 'td' | 'bu' | 'lr' | 'rl' | 'radialout' | 'radialin';
interface ForceFn {
(alpha: number): void;
initialize?: (nodes: NodeObject[]) => void;
}
interface ForceGraphProps {
// Data input
graphData?: GraphData;
nodeId?: string;
linkSource?: string;
linkTarget?: string;
// Container layout
width?: number;
height?: number;
backgroundColor?: string;
// Node styling
nodeRelSize?: number;
nodeVal?: NodeAccessor<number>;
nodeLabel?: NodeAccessor<string>;
nodeVisibility?: NodeAccessor<boolean>;
nodeColor?: NodeAccessor<string>;
nodeAutoColorBy?: NodeAccessor<string | null>;
nodeCanvasObject?: CanvasCustomRenderFn<NodeObject>;
nodeCanvasObjectMode?: string | ((obj: NodeObject) => CanvasCustomRenderMode);
// Link styling
linkLabel?: LinkAccessor<string>;
linkVisibility?: LinkAccessor<boolean>;
linkColor?: LinkAccessor<string>;
linkAutoColorBy?: LinkAccessor<string | null>;
linkWidth?: LinkAccessor<number>;
linkCurvature?: LinkAccessor<number>;
linkCanvasObject?: CanvasCustomRenderFn<LinkObject>;
linkCanvasObjectMode?: string | ((obj: LinkObject) => CanvasCustomRenderMode);
linkDirectionalArrowLength?: LinkAccessor<number>;
linkDirectionalArrowColor?: LinkAccessor<string>;
linkDirectionalArrowRelPos?: LinkAccessor<number>;
linkDirectionalParticles?: LinkAccessor<number>;
linkDirectionalParticleSpeed?: LinkAccessor<number>;
linkDirectionalParticleWidth?: LinkAccessor<number>;
linkDirectionalParticleColor?: LinkAccessor<string>;
// Force engine (d3-force) configuration
dagMode?: DagMode;
dagLevelDistance?: number | null;
d3AlphaDecay?: number;
d3VelocityDecay?: number;
warmupTicks?: number;
cooldownTicks?: number;
cooldownTime?: number;
onEngineTick?: () => void;
onEngineStop?: () => void;
// Interaction
onNodeClick?: (node: NodeObject, event: MouseEvent) => void;
onNodeRightClick?: (node: NodeObject, event: MouseEvent) => void;
onNodeHover?: (node: NodeObject | null, previousNode: NodeObject | null) => void;
onNodeDrag?: (node: NodeObject, translate: { x: number, y: number }) => void;
onNodeDragEnd?: (node: NodeObject, translate: { x: number, y: number }) => void;
onLinkClick?: (link: LinkObject, event: MouseEvent) => void;
onLinkRightClick?: (link: LinkObject, event: MouseEvent) => void;
onLinkHover?: (link: LinkObject | null, previousLink: LinkObject | null) => void;
linkHoverPrecision?: number;
onBackgroundClick?: (event: MouseEvent) => void;
onBackgroundRightClick?: (event: MouseEvent) => void;
onZoom?: (transform: {k: number, x: number, y: number}) => void;
onZoomEnd?: (transform: {k: number, x: number, y: number}) => void;
enableNodeDrag?: boolean;
enableZoomPanInteraction?: boolean;
enablePointerInteraction?: boolean;
}
interface ForceGraphMethods {
// Link styling
emitParticle(link: LinkObject): ForceGraphInstance;
// Force engine (d3-force) configuration
d3Force(forceName: 'link' | 'charge' | 'center' | string): ForceFn | undefined;
d3Force(forceName: 'link' | 'charge' | 'center' | string, forceFn: ForceFn): ForceGraphInstance;
d3ReheatSimulation(): ForceGraphInstance;
// Render control
pauseAnimation(): ForceGraphInstance;
resumeAnimation(): ForceGraphInstance;
centerAt(): {x: number, y: number};
centerAt(x?: number, y?: number, durationMs?: number): ForceGraphInstance;
zoom(): number;
zoom(scale: number, durationMs?: number): ForceGraphInstance;
// Utility
screen2GraphCoords(x: number, y: number): { x: number, y: number };
graph2ScreenCoords(x: number, y: number): { x: number, y: number };
}
declare const ForceGraph: ForwardRefRenderFunction<ForceGraphMethods, ForceGraphProps>;
export default ForceGraph;
export { GraphData, LinkObject, NodeObject };