import type { ComponentProps, ElementType, ReactNode } from 'react';
import type { ButtonProps, ButtonSize } from '../Button';
import type { DropdownButtonProps } from '../DropdownButton';
import type { ListItemButtonProps } from '../ListItemButton';
import type { MenuItemProps } from '../MenuItem';
import type { TooltipProps } from '../Tooltip';
type NestedAction = MenuItemProps & {
    /** Название действия */
    text: string;
};
export type SingleAction<TMainActionComponent extends ElementType> = Omit<ButtonProps, 'children' | 'component'> & {
    /**
     *  Флаг показа выпадающего списка при клике
     */
    isNested?: false;
    /**
     * Название действия
     */
    text: string;
    /**
     * Текст тултипа при заблокированном состоянии кнопки
     */
    disabledReason?: string;
    /**
     * Текст тултипа при наведении на кнопку
     */
    note?: string;
    /**
     * Если true, блокирует взаимодействие с actions
     */
    isBlockingOperation?: boolean;
    /**
     * Компонент, используемый для корневого узла. Либо строка для использования элемента HTML, либо компонент
     */
    component?: TMainActionComponent;
} & Omit<ComponentProps<ElementType extends TMainActionComponent ? 'button' : TMainActionComponent>, ''>;
export type MultipleAction<TMainActionComponent extends ElementType> = Omit<DropdownButtonProps, 'children' | 'name' | 'component'> & {
    /**
     * Флаг показа выпадающего списка при клике
     */
    isNested: true;
    /**
     * Список действий для выпадающего списка
     */
    actions: NestedAction[];
    /**
     * Название действия
     */
    text: string;
    /**
     * Если true, блокирует взаимодействие с actions
     */
    isBlockingOperation?: boolean;
    /**
     * Текст тултипа при заблокированном состоянии кнопки
     */
    disabledReason?: string;
    /**
     * Текст тултипа при наведении на кнопку
     */
    note?: string;
    /**
     * Компонент, используемый для корневого узла. Либо строка для использования элемента HTML, либо компонент
     */
    component?: TMainActionComponent;
} & Omit<ComponentProps<ElementType extends TMainActionComponent ? 'button' : TMainActionComponent>, ''>;
/** Модель основного экшена */
export type MainAction<TMainActionComponent extends ElementType> = SingleAction<TMainActionComponent> | MultipleAction<TMainActionComponent>;
export type MainActionsProps<TMainActionComponent extends ElementType> = {
    actions: MainAction<TMainActionComponent>[];
    /**
     * Если true, основные действия будут заблокированы
     */
    isDisabled?: boolean;
    size?: ButtonSize;
};
/** Модель второстепенного экшена */
export type SecondaryAction<TSecondaryActionComponent extends ElementType> = Omit<ListItemButtonProps, 'children' | 'component'> & {
    /**
     * Название действия
     */
    text: string;
    tooltipPlacement?: TooltipProps['placement'];
    /**
     * Текст тултипа при наведении на элемент меню
     */
    note?: string;
    /**
     * Компонент, используемый для корневого узла. Либо строка для использования элемента HTML, либо компонент
     */
    component?: TSecondaryActionComponent;
} & Omit<ComponentProps<ElementType extends TSecondaryActionComponent ? 'button' : TSecondaryActionComponent>, ''>;
export type SecondaryActionProps<TSecondaryActionComponent extends ElementType> = {
    actions: SecondaryAction<TSecondaryActionComponent>[];
    /**
     * Если true, вторичные действия будут заблокированы
     */
    isDisabled?: boolean;
    /**
     * Класс, применяемый к кнопкам второстепенных действий
     */
    className?: string;
    size?: ButtonSize;
};
/** Модель второстепенного видимого экшена */
export type SecondaryVisibleAction = Omit<ButtonProps, 'children'> & {
    /** Название действия */
    name: string;
    /** Иконка */
    icon: ReactNode;
    /** Текст тултипа в случае дизейбла кнопки */
    disabledReason?: string;
    /**
     * Если true, блокирует взаимодействие с actions
     */
    isBlockingOperation?: boolean;
};
export type SecondaryVisibleActionProps = {
    /**
     * Видимые второстепенные действия
     */
    actions: SecondaryVisibleAction[];
    /**
     * Класс, применяемый к кнопкам второстепенных видимых действий
     */
    className?: string;
    size?: ButtonSize;
};
export type ActionGroupProps<TMainActionComponent extends ElementType = ElementType, TSecondaryActionComponent extends ElementType = ElementType> = {
    /**
     * Основные действия
     */
    main?: MainAction<TMainActionComponent>[];
    /**
     * Второстепенные действия, спрятанные за троеточием
     */
    secondary?: SecondaryAction<TSecondaryActionComponent>[];
    /**
     * Видимые второстепенные действия
     */
    secondaryVisible?: SecondaryVisibleAction[];
    /**
     * Название класса, применяется к корневому компоненту
     */
    className?: string;
    /**
     * Размер кнопок
     */
    size?: ButtonSize;
};
export {};
