import { ReactElement, ReactNode } from 'react';
import { ComponentPalletColor, Sizes } from '@m4l/styles';
import { ComponentNameToClassKey, PaperProps, SxProps } from '@mui/material';
import { Theme } from '@mui/material/styles';
import { PopoverProps } from '../extended/mui/Popover/types';
import { MenuItemProps } from '../extended/mui/MenuItem/types';
import { IconButtonProps } from '../extended/mui/IconButton/types';
import { MenuActionsSlots } from './slots';
import { MENU_ACTIONS_KEY_COMPONENT } from './constants';
import { M4LOverridesStyleRules } from '../../@types/augmentations';
/**
 * Propiedades para describir una acción de un componente.
 * [description] - Descripción opcional de la acción.
 * onClick - Función a ejecutar al hacer clic en la acción.
 */
export interface ComponentActionProps {
    description?: string;
    onClick: (props?: any) => void;
}
export type MenuTypes = 'menuItem' | 'divider' | 'loader' | 'customNode';
interface BaseMenuAction {
    type?: MenuTypes;
}
export interface MenuItemAction extends BaseMenuAction, Pick<MenuItemProps, 'startAdornment' | 'startIcon' | 'endAdornment' | 'endIcon' | 'label' | 'selected' | 'color' | 'disabled' | 'checkable' | 'checked'> {
    type?: 'menuItem';
    onClick?: (arg?: any) => void;
    customNode?: never;
    error?: boolean;
}
interface DividerAction extends BaseMenuAction {
    type: 'divider';
    label?: never;
    onClick?: never;
    customNode?: never;
    error?: never;
}
interface LoaderAction extends BaseMenuAction {
    type: 'loader';
    label?: never;
    onClick?: never;
    customNode?: never;
    error?: never;
}
interface CustomNodeAction extends BaseMenuAction {
    type: 'customNode';
    customNode: ReactNode;
    label?: never;
    onClick?: never;
    error?: never;
}
/**
 * Define una acción del menú, con propiedades heredadas de `MenuItemProps`.
 * [onClick] - Función opcional a ejecutar al hacer clic en la acción del menú.
 * [error] - Indicador de error en la acción del menú.
 */
export type MenuAction = MenuItemAction | DividerAction | LoaderAction | CustomNodeAction;
/**
 * Propiedades del componente `MenuActions`.
 */
export interface MenuActionsProps extends Omit<PopoverProps, 'open' | 'anchorEl'>, Pick<IconButtonProps, 'variant'> {
    /**
     * Tamaño opcional del menú (pequeño o mediano).
     */
    size?: Extract<Sizes, 'small' | 'medium'>;
    /**
     * Clase personalizada para el botón del ícono.
     */
    iconButtonClassName?: string;
    /**
     * Objeto personalizado a pasar al componente.
     */
    objItem?: any;
    /**
     * URL del ícono.
     * @deprecated Usa la prop `icon` en su lugar para renderizar un ReactNode o string.
     */
    urlIcon?: string;
    /**
     * Elemento que se va visualizar en el IconButton puede ser un icono por medio de un string o un ReactNode
     */
    icon?: ReactNode;
    /**
     * Acciones del menú, puede ser un array o una función que genere acciones.
     */
    menuActions: MenuAction[] | ((row: any) => MenuAction[]);
    /**
     * Texto del tooltip opcional.
     */
    toolTip?: string;
    /**
     * Margen superior del menú.
     * @deprecated Usa la prop `paperProps` para editar en su sx.
     */
    marginTop?: number | string;
    /**
     * Margen inferior del menú.
     * @deprecated Usa la prop `paperProps` para editar en su sx.
     */
    marginBottom?: number | string;
    /**
     * Margen derecho del menú.
     * @deprecated Usa la prop `paperProps` para editar en su sx.
     */
    marginRight?: number | string;
    /**
     * Margen izquierdo del menú.
     * @deprecated Usa la prop `paperProps` para editar en su sx.
     */
    marginLeft?: number | string;
    /**
     * Ancho del menú.
     * @deprecated Usa la prop `paperProps` para editar en su sx.
     */
    width?: number;
    /**
     * Elemento opcional que se renderiza al final de la lista del menú.
     */
    endListElement?: ReactElement;
    /**
     * Estilos personalizados para las acciones del menú.
     */
    menuActionSx?: SxProps<Theme> | Partial<M4LOverridesStyleRules<string, ComponentNameToClassKey, Theme>>;
    /**
     * Contenido del `Badge` si está presente.
     */
    badgeContent?: string;
    /**
     * Elemento externo para abrir el menú.
     */
    externalOpen?: HTMLDivElement | null;
    /**
     * Función externa para cerrar el menú.
     */
    externalClose?: (element: null | HTMLDivElement) => void;
    /**
     * Tipo de flecha del menú.
     */
    disabled?: boolean;
    /**
     * Propiedad objeto que se usa para poder editar las propiedades del paper o agregar estilos desde su sx
     */
    paperProps?: PaperProps;
    /**
     * Propiedad checked
     */
    checked?: boolean;
    /**
     * Propiedad checkable para el menú
     */
    checkable?: boolean;
    /**
     * Propiedad para agregar un node al menú
     */
    customNode?: ReactNode;
    /**
     * Define el color del componente.
     */
    color?: Extract<ComponentPalletColor, 'primary'>;
    /**
     * Define la clave de la acción.
     */
    actionKey?: string;
    /**
     * agrega un header al menú
     */
    header?: ReactNode;
    /**
     * agrega un footer al menú
     */
    footer?: ReactNode;
    /**
     * Define el tipo de flecha del menú.
     */
    onOpen?: (param: boolean) => void;
}
/**
 * Estado del propietario para `MenuActions`.
 * iconSize - Tamaño del ícono que se utilizará en el menú.
 */
export interface MenuActionsOwnerState {
    iconSize: Sizes;
    selected: boolean;
    paletteColor?: MenuActionsProps['color'];
}
/**
 * Tipo de slots disponibles para `MenuActions`.
 */
export type MenuActionsSlotsType = keyof typeof MenuActionsSlots;
/**
 * Estilos para `MenuActions`.
 */
export type MenuActionsStyles = M4LOverridesStyleRules<MenuActionsSlots, typeof MENU_ACTIONS_KEY_COMPONENT, Theme>;
export {};
//# sourceMappingURL=types.d.ts.map