import * as React from 'react'; import ForceGraphKapsule from 'force-graph'; interface GraphData { nodes: NodeObject[]; links: LinkObject[]; } type NodeObject = NodeType & { id?: string | number; x?: number; y?: number; vx?: number; vy?: number; fx?: number; fy?: number; [others: string]: any; }; type LinkObject = LinkType & { source?: string | number | NodeObject; target?: string | number | NodeObject; [others: string]: any; }; type Accessor = Out | string | ((obj: In) => Out); type NodeAccessor = Accessor, T>; type LinkAccessor = Accessor, T>; type TooltipContent = string | React.ReactHTMLElement; type CanvasCustomRenderMode = 'replace' | 'before' | 'after'; type CanvasCustomRenderFn = (obj: T, canvasContext: CanvasRenderingContext2D, globalScale: number) => void; type CanvasPointerAreaPaintFn = (obj: T, paintColor: string, canvasContext: CanvasRenderingContext2D, globalScale: number) => void; type DagMode = 'td' | 'bu' | 'lr' | 'rl' | 'radialout' | 'radialin'; interface ForceFn { (alpha: number): void; initialize?: (nodes: NodeObject[], ...args: any[]) => void; [key: string]: any; } interface ForceGraphProps< NodeType = {}, LinkType = {} > { // Data input graphData?: GraphData, LinkObject>; nodeId?: string; linkSource?: string; linkTarget?: string; // Container layout width?: number; height?: number; backgroundColor?: string; // Node styling nodeRelSize?: number; nodeVal?: NodeAccessor; nodeLabel?: NodeAccessor; nodeVisibility?: NodeAccessor; nodeColor?: NodeAccessor; nodeAutoColorBy?: NodeAccessor; nodeCanvasObjectMode?: string | ((obj: NodeObject) => CanvasCustomRenderMode | any); nodeCanvasObject?: CanvasCustomRenderFn>; nodePointerAreaPaint?: CanvasPointerAreaPaintFn>; // Link styling linkLabel?: LinkAccessor; linkVisibility?: LinkAccessor; linkColor?: LinkAccessor; linkAutoColorBy?: LinkAccessor; linkLineDash?: LinkAccessor; linkWidth?: LinkAccessor; linkCurvature?: LinkAccessor; linkCanvasObject?: CanvasCustomRenderFn>; linkCanvasObjectMode?: string | ((obj: LinkObject) => CanvasCustomRenderMode | any); linkDirectionalArrowLength?: LinkAccessor; linkDirectionalArrowColor?: LinkAccessor; linkDirectionalArrowRelPos?: LinkAccessor; linkDirectionalParticles?: LinkAccessor; linkDirectionalParticleSpeed?: LinkAccessor; linkDirectionalParticleOffset?: LinkAccessor; linkDirectionalParticleWidth?: LinkAccessor; linkDirectionalParticleColor?: LinkAccessor; linkDirectionalParticleCanvasObject?: (x: number, y: number, link: LinkType, canvasContext: CanvasRenderingContext2D, globalScale: number) => void; linkPointerAreaPaint?: CanvasPointerAreaPaintFn>; // Render control autoPauseRedraw?: boolean; minZoom?: number; maxZoom?: number; onRenderFramePre?: (canvasContext: CanvasRenderingContext2D, globalScale: number) => void; onRenderFramePost?: (canvasContext: CanvasRenderingContext2D, globalScale: number) => void; // Force engine (d3-force) configuration dagMode?: DagMode; dagLevelDistance?: number | null; dagNodeFilter?: (node: NodeObject) => boolean; onDagError?: ((loopNodeIds: (string | number)[]) => void) | undefined; d3AlphaMin?: number; d3AlphaDecay?: number; d3VelocityDecay?: number; ngraphPhysics?: object; 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; showPointerCursor?: boolean | ((obj: NodeObject | LinkObject | undefined) => boolean); onZoom?: (transform: {k: number, x: number, y: number}) => void; onZoomEnd?: (transform: {k: number, x: number, y: number}) => void; enableNodeDrag?: boolean; enableZoomInteraction?: boolean | ((event: MouseEvent) => boolean); enablePanInteraction?: boolean | ((event: MouseEvent) => boolean); enablePointerInteraction?: boolean; } interface ForceGraphMethods< NodeType = {}, LinkType = {} > { // Link styling emitParticle(link: LinkObject): ForceGraphKapsule; // Force engine (d3-force) configuration d3Force(forceName: 'link' | 'charge' | 'center' | string): ForceFn> | undefined; d3Force(forceName: 'link' | 'charge' | 'center' | string, forceFn: ForceFn> | null): ForceGraphKapsule; d3ReheatSimulation(): ForceGraphKapsule; // Render control pauseAnimation(): ForceGraphKapsule; resumeAnimation(): ForceGraphKapsule; centerAt(): {x: number, y: number}; centerAt(x?: number, y?: number, durationMs?: number): ForceGraphKapsule; zoom(): number; zoom(scale: number, durationMs?: number): ForceGraphKapsule; zoomToFit(durationMs?: number, padding?: number, nodeFilter?: (node: NodeObject) => boolean): ForceGraphKapsule; // Utility getGraphBbox(nodeFilter?: (node: NodeObject) => boolean): { x: [number, number], y: [number, number] }; screen2GraphCoords(x: number, y: number): { x: number, y: number }; graph2ScreenCoords(x: number, y: number): { x: number, y: number }; } type FCwithRef = (props: ForceGraphProps, LinkObject> & { ref?: React.MutableRefObject, LinkObject> | undefined>; }) => React.ReactElement; declare const ForceGraph: FCwithRef; export { ForceGraph as default }; export type { ForceGraphMethods, ForceGraphProps, GraphData, LinkObject, NodeObject };