import * as React from 'react'; import { Object3D, Material } from 'three'; interface ThreeGraphConfigOptions {} interface GraphData { nodes: NodeObject[]; links: LinkObject[]; } type NodeObject = NodeType & { id?: string | number; x?: number; y?: number; z?: number; vx?: number; vy?: number; vz?: number; fx?: number; fy?: number; fz?: 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 DagMode = 'td' | 'bu' | 'lr' | 'rl' | 'zout' | 'zin' | 'radialout' | 'radialin'; type ForceEngine = 'd3' | 'ngraph'; interface ForceFn { (alpha: number): void; initialize?: (nodes: NodeObject[], ...args: any[]) => void; [key: string]: any; } type Coords = { x: number; y: number; z: number; } type NodePositionUpdateFn = (obj: Object3D, coords: Coords, node: NodeObject) => void | null | boolean; type LinkPositionUpdateFn = (obj: Object3D, coords: { start: Coords, end: Coords }, link: LinkObject) => void | null | boolean; interface GraphProps< NodeType = {}, LinkType = {} > extends ThreeGraphConfigOptions { // Data input graphData?: GraphData, LinkObject>; nodeId?: string; linkSource?: string; linkTarget?: string; // Node styling nodeRelSize?: number; nodeVal?: NodeAccessor; nodeVisibility?: NodeAccessor; nodeColor?: NodeAccessor; nodeAutoColorBy?: NodeAccessor; nodeOpacity?: number; nodeResolution?: number; nodeThreeObject?: NodeAccessor; nodeThreeObjectExtend?: NodeAccessor; nodePositionUpdate?: NodePositionUpdateFn | null; // Link styling linkVisibility?: LinkAccessor; linkColor?: LinkAccessor; linkAutoColorBy?: LinkAccessor; linkWidth?: LinkAccessor; linkOpacity?: number; linkResolution?: number; linkCurvature?: LinkAccessor; linkCurveRotation?: LinkAccessor; linkMaterial?: LinkAccessor; linkThreeObject?: LinkAccessor; linkThreeObjectExtend?: LinkAccessor; linkPositionUpdate?: LinkPositionUpdateFn | null; linkDirectionalArrowLength?: LinkAccessor; linkDirectionalArrowColor?: LinkAccessor; linkDirectionalArrowRelPos?: LinkAccessor; linkDirectionalArrowResolution?: number; linkDirectionalParticles?: LinkAccessor; linkDirectionalParticleSpeed?: LinkAccessor; linkDirectionalParticleOffset?: LinkAccessor; linkDirectionalParticleWidth?: LinkAccessor; linkDirectionalParticleColor?: LinkAccessor; linkDirectionalParticleResolution?: number; linkDircetionalParticleThreeObject?: LinkAccessor; // Force engine configuration forceEngine?: ForceEngine; numDimensions?: 1 | 2 | 3; dagMode?: DagMode; dagLevelDistance?: number | null; dagNodeFilter?: (node: NodeObject) => boolean; onDagError?: ((loopNodeIds: (string | number)[]) => void) | undefined; d3AlphaMin?: number; d3AlphaDecay?: number; d3AlphaTarget?: number; d3VelocityDecay?: number; ngraphPhysics?: object; warmupTicks?: number; cooldownTicks?: number; cooldownTime?: number; onEngineTick?: () => void; onEngineStop?: () => void; // Interaction onNodeClick?: (node: NodeObject, event: React.MouseEvent) => void; onLinkClick?: (link: LinkObject, event: React.MouseEvent) => void; onNodeHover?: (node: NodeObject | null, prevNode: NodeObject | null) => void; onLinkHover?: (link: LinkObject | null, prevLink: LinkObject | null) => void; // Render control onFinishUpdate?: () => void; } interface GraphMethods< NodeType = {}, LinkType = {} > { // Link styling emitParticle(link: LinkObject): void; // Force engine configuration d3Force(forceName: 'link' | 'charge' | 'center' | string): ForceFn> | undefined; d3Force(forceName: 'link' | 'charge' | 'center' | string, forceFn: ForceFn> | null): void; d3ReheatSimulation(): void; resetCountdown(): void; // Render control tickFrame(): void; refresh(): void; // Utility getGraphBbox(nodeFilter?: (node: NodeObject) => boolean): { x: [number, number], y: [number, number], z: [number, number] }; } type FCwithRef = (props: GraphProps, LinkObject> & { ref?: React.MutableRefObject, LinkObject> | undefined>; }) => React.ReactElement; declare const R3fGraph: FCwithRef; export { R3fGraph as default }; export type { GraphData, GraphMethods, GraphProps, LinkObject, NodeObject };