import React, { ReactNode } from "react";
import type { IconDefinition } from "@fortawesome/fontawesome-svg-core";
import { VariantProps } from "class-variance-authority";
import { treeVariants } from "./variants";
type TreeDensity = NonNullable<VariantProps<typeof treeVariants>["density"]>;
type TreeVariant = NonNullable<VariantProps<typeof treeVariants>["variant"]>;
type IconRenderer = (params: {
    expanded: boolean;
    iconClassName: string;
}) => ReactNode;
type TreeIconProp = IconDefinition | ReactNode | ((iconClassName: string) => ReactNode);
interface TreeBranchRenderParams {
    type: "branch";
    level: number;
    label: ReactNode;
    icon?: TreeIconProp;
    collapsedIcon?: TreeIconProp;
    expandedIcon?: TreeIconProp;
    iconClassName: string;
    defaultNode: ReactNode;
    expanded: boolean;
    hasChildren: boolean;
    disabled: boolean;
    toggle: (event?: React.MouseEvent<HTMLButtonElement>) => void;
    onSelect?: (event: React.MouseEvent<HTMLButtonElement>) => void;
    density: TreeDensity;
    variant: TreeVariant;
    iconNode: ReactNode;
    collapsedIconNode: ReactNode;
    expandedIconNode: ReactNode;
    toggleIconNode: ReactNode;
    content: ReactNode;
    group: ReactNode | null;
    containerProps: React.LiHTMLAttributes<HTMLLIElement>;
}
interface TreeLeafRenderParams {
    type: "leaf";
    level: number;
    label: ReactNode;
    icon?: TreeIconProp;
    iconClassName: string;
    defaultNode: ReactNode;
    disabled: boolean;
    onSelect?: (event: React.MouseEvent<HTMLButtonElement>) => void;
    density: TreeDensity;
    variant: TreeVariant;
    iconNode: ReactNode;
    content: ReactNode;
    containerProps: React.LiHTMLAttributes<HTMLLIElement>;
}
type TreeRenderItem = (params: TreeBranchRenderParams | TreeLeafRenderParams) => ReactNode;
export interface TreeProps extends React.HTMLAttributes<HTMLUListElement>, VariantProps<typeof treeVariants> {
    iconClassName?: string;
    indent?: number;
    renderToggleIcon?: IconRenderer;
    renderItem?: TreeRenderItem;
    branchCollapsedIcon?: TreeIconProp;
    branchExpandedIcon?: TreeIconProp;
}
interface TreeBranchProps extends Omit<React.LiHTMLAttributes<HTMLLIElement>, "children" | "onSelect"> {
    label: ReactNode;
    children?: ReactNode;
    defaultExpanded?: boolean;
    expanded?: boolean;
    onExpandedChange?: (expanded: boolean) => void;
    onToggle?: (expanded: boolean) => void;
    toggleIconClassName?: string;
    icon?: TreeIconProp;
    iconCollapsed?: TreeIconProp;
    iconExpanded?: TreeIconProp;
    iconClassName?: string;
    labelClassName?: string;
    toggleIcon?: IconRenderer;
    onSelect?: (event: React.MouseEvent<HTMLButtonElement>) => void;
    disabled?: boolean;
    expandOnLabelClick?: boolean;
    renderItem?: (params: TreeBranchRenderParams) => ReactNode;
}
interface TreeLeafProps extends Omit<React.LiHTMLAttributes<HTMLLIElement>, "children" | "onSelect"> {
    label: ReactNode;
    icon?: TreeIconProp;
    iconClassName?: string;
    labelClassName?: string;
    onSelect?: (event: React.MouseEvent<HTMLButtonElement>) => void;
    disabled?: boolean;
    renderItem?: (params: TreeLeafRenderParams) => ReactNode;
}
declare const TreeNamespace: (({ density, variant, iconClassName, indent, renderToggleIcon, renderItem, branchCollapsedIcon, branchExpandedIcon, className, children, ...props }: TreeProps) => import("react/jsx-runtime").JSX.Element) & {
    Branch: {
        ({ label, children, defaultExpanded, expanded, onExpandedChange, onToggle, toggleIconClassName, icon, iconCollapsed, iconExpanded, iconClassName, labelClassName, toggleIcon, onSelect, disabled, expandOnLabelClick, renderItem, className, ...props }: TreeBranchProps): string | number | boolean | Iterable<React.ReactNode> | import("react/jsx-runtime").JSX.Element;
        displayName: string;
    };
    Leaf: {
        ({ label, icon, iconClassName, labelClassName, onSelect, disabled, renderItem, className, ...props }: TreeLeafProps): string | number | boolean | Iterable<React.ReactNode> | import("react/jsx-runtime").JSX.Element;
        displayName: string;
    };
};
export { TreeNamespace as Tree };
export type { TreeBranchProps, TreeLeafProps, TreeBranchRenderParams, TreeLeafRenderParams, TreeRenderItem, };
