import type { Component } from 'react';
import React from 'react';
import type { BasicDataNode, TreeProps as RcTreeProps } from '@rc-component/tree';
import RcTree from '@rc-component/tree';
import type { DataNode, Key } from '@rc-component/tree/lib/interface';
import type { SemanticClassNamesType, SemanticStylesType } from '../_util/hooks';
export type SwitcherIcon = React.ReactNode | ((props: AntTreeNodeProps) => React.ReactNode);
export type TreeLeafIcon = React.ReactNode | ((props: AntTreeNodeProps) => React.ReactNode);
type TreeIcon = React.ReactNode | ((props: AntdTreeNodeAttribute) => React.ReactNode);
export interface AntdTreeNodeAttribute {
    eventKey: string;
    prefixCls: string;
    className: string;
    expanded: boolean;
    selected: boolean;
    checked: boolean;
    halfChecked: boolean;
    children: React.ReactNode;
    title: React.ReactNode;
    pos: string;
    dragOver: boolean;
    dragOverGapTop: boolean;
    dragOverGapBottom: boolean;
    isLeaf: boolean;
    selectable: boolean;
    disabled: boolean;
    disableCheckbox: boolean;
}
export interface AntTreeNodeProps {
    className?: string;
    checkable?: boolean;
    disabled?: boolean;
    disableCheckbox?: boolean;
    title?: React.ReactNode | ((data: DataNode) => React.ReactNode);
    key?: Key;
    eventKey?: Key;
    isLeaf?: boolean;
    checked?: boolean;
    expanded?: boolean;
    loading?: boolean;
    selected?: boolean;
    selectable?: boolean;
    icon?: TreeIcon;
    children?: React.ReactNode;
    [customProp: string]: any;
}
export interface AntTreeNode extends Component<AntTreeNodeProps> {
}
export interface AntTreeNodeBaseEvent {
    node: AntTreeNode;
    nativeEvent: MouseEvent;
}
export interface AntTreeNodeCheckedEvent extends AntTreeNodeBaseEvent {
    event: 'check';
    checked?: boolean;
    checkedNodes?: AntTreeNode[];
}
export interface AntTreeNodeSelectedEvent extends AntTreeNodeBaseEvent {
    event: 'select';
    selected?: boolean;
    selectedNodes?: DataNode[];
}
export interface AntTreeNodeExpandedEvent extends AntTreeNodeBaseEvent {
    expanded?: boolean;
}
export interface AntTreeNodeMouseEvent {
    node: AntTreeNode;
    event: React.DragEvent<HTMLElement>;
}
export interface AntTreeNodeDragEnterEvent extends AntTreeNodeMouseEvent {
    expandedKeys: Key[];
}
export interface AntTreeNodeDropEvent {
    node: AntTreeNode;
    dragNode: AntTreeNode;
    dragNodesKeys: Key[];
    dropPosition: number;
    dropToGap?: boolean;
    event: React.MouseEvent<HTMLElement>;
}
export type TreeNodeNormal = DataNode;
type DraggableFn = (node: DataNode) => boolean;
interface DraggableConfig {
    icon?: React.ReactNode;
    nodeDraggable?: DraggableFn;
}
export type TreeSemanticName = keyof TreeSemanticClassNames & keyof TreeSemanticStyles;
export type TreeSemanticClassNames = {
    root?: string;
    item?: string;
    itemIcon?: string;
    itemTitle?: string;
};
export type TreeSemanticStyles = {
    root?: React.CSSProperties;
    item?: React.CSSProperties;
    itemIcon?: React.CSSProperties;
    itemTitle?: React.CSSProperties;
};
export type TreeClassNamesType = SemanticClassNamesType<TreeProps, TreeSemanticClassNames>;
export type TreeStylesType = SemanticStylesType<TreeProps, TreeSemanticStyles>;
export interface TreeProps<T extends BasicDataNode = DataNode> extends Omit<RcTreeProps<T>, 'prefixCls' | 'showLine' | 'direction' | 'draggable' | 'icon' | 'switcherIcon' | 'classNames' | 'styles'> {
    showLine?: boolean | {
        showLeafIcon: boolean | TreeLeafIcon;
    };
    className?: string;
    classNames?: TreeClassNamesType;
    styles?: TreeStylesType;
    /** Whether to support multiple selection */
    multiple?: boolean;
    /** Whether to automatically expand the parent node */
    autoExpandParent?: boolean;
    /** Node selection in Checkable state is fully controlled (the selected state of parent and child nodes is no longer associated) */
    checkStrictly?: boolean;
    /** Whether to support selection */
    checkable?: boolean;
    /** whether to disable the tree */
    disabled?: boolean;
    /** Expand all tree nodes by default */
    defaultExpandAll?: boolean;
    /** Expand the corresponding tree node by default */
    defaultExpandParent?: boolean;
    /** Expand the specified tree node by default */
    defaultExpandedKeys?: Key[];
    /** (Controlled) Expand the specified tree node */
    expandedKeys?: Key[];
    /** (Controlled) Tree node with checked checkbox */
    checkedKeys?: Key[] | {
        checked: Key[];
        halfChecked: Key[];
    };
    /** Tree node with checkbox checked by default */
    defaultCheckedKeys?: Key[];
    /** (Controlled) Set the selected tree node */
    selectedKeys?: Key[];
    /** Tree node selected by default */
    defaultSelectedKeys?: Key[];
    selectable?: boolean;
    /** Click on the tree node to trigger */
    filterAntTreeNode?: (node: AntTreeNode) => boolean;
    loadedKeys?: Key[];
    /** Set the node to be draggable (IE>8) */
    draggable?: DraggableFn | boolean | DraggableConfig;
    style?: React.CSSProperties;
    showIcon?: boolean;
    icon?: TreeIcon;
    switcherIcon?: SwitcherIcon;
    switcherLoadingIcon?: React.ReactNode;
    prefixCls?: string;
    children?: React.ReactNode;
    blockNode?: boolean;
}
declare const Tree: React.ForwardRefExoticComponent<TreeProps<DataNode> & React.RefAttributes<RcTree<DataNode>>>;
export default Tree;
