import React, { FC, ReactElement, ReactNode } from 'react';
import { Port, PortProps } from '../Port';
import { Label, LabelProps } from '../Label';
import { EdgeData, NodeData, PortData } from '../../types';
import { Icon, IconProps } from '../Icon';
import { Remove, RemoveProps } from '../Remove';
import { NodeDragEvents } from '../../utils/useNodeDrag';
import { Edge, EdgeProps } from '../Edge';
export interface NodeChildProps {
    height: number;
    width: number;
    x: number;
    y: number;
    node: NodeData;
    nodes?: NodeData[];
    edges?: EdgeData[];
}
export type NodeDragType = 'node' | 'port' | 'multiportOnly' | 'all';
export type NodeChildrenAsFunction = (nodeChildProps: NodeChildProps) => ReactNode;
export interface NodeProps<T = any> extends NodeDragEvents<NodeData<T>, PortData> {
    id: string;
    height: number;
    width: number;
    x: number;
    y: number;
    rx: number;
    ry: number;
    offsetX?: number;
    offsetY?: number;
    disabled?: boolean;
    ports?: PortProps[];
    labels?: LabelProps[];
    properties: NodeData<T>;
    className?: string;
    style?: any;
    children?: ReactNode | NodeChildrenAsFunction;
    parent?: string;
    animated?: boolean;
    draggable?: boolean;
    linkable?: boolean;
    selectable?: boolean;
    removable?: boolean;
    dragType?: NodeDragType;
    dragCursor?: string;
    nodes?: NodeData[];
    edges?: EdgeData[];
    onRemove?: (event: React.MouseEvent<SVGGElement, MouseEvent>, node: NodeData) => void;
    onClick?: (event: React.MouseEvent<SVGGElement, MouseEvent>, data: NodeData) => void;
    onKeyDown?: (event: React.KeyboardEvent<SVGGElement>, data: NodeData) => void;
    onEnter?: (event: React.MouseEvent<SVGGElement, MouseEvent>, node: NodeData) => void;
    onLeave?: (event: React.MouseEvent<SVGGElement, MouseEvent>, node: NodeData) => void;
    childNode?: ReactElement<NodeProps, typeof Node> | ((node: NodeProps) => ReactElement<NodeProps, typeof Node>);
    childEdge?: ReactElement<EdgeProps, typeof Edge> | ((edge: EdgeProps) => ReactElement<NodeProps, typeof Edge>);
    remove: ReactElement<RemoveProps, typeof Remove>;
    icon: ReactElement<IconProps, typeof Icon>;
    label: ReactElement<LabelProps, typeof Label>;
    port: ReactElement<PortProps, typeof Port>;
    tooltip?: React.ElementType;
}
export declare const Node: FC<Partial<NodeProps>>;
