import React from "react";
import { OverridableComponent } from "../../util";
import { Menu, MenuPortalProps } from "../floating-menu/Menu";
type ActionMenuProps = {
    children?: React.ReactNode;
    /**
     * Whether the menu is open or not.
     * Only needed if you want manually control state.
     */
    open?: boolean;
    /**
     * Callback for when the menu is opened or closed.
     */
    onOpenChange?: (open: boolean) => void;
} & Pick<MenuPortalProps, "rootElement">;
interface ActionMenuComponent extends React.FC<ActionMenuProps> {
    /**
     * Acts as a trigger and anchor for the menu.
     * Must be wrapped around a button. If you use your own component, make sure to forward ref and props.
     * @example
     * ```jsx
     * <ActionMenu.Trigger>
     *     <button>Open Menu</button>
     * </ActionMenu.Trigger>
     * ```
     */
    Trigger: typeof ActionMenuTrigger;
    /**
     * The menu content, containing all the items.
     * @example
     * ```jsx
     * <ActionMenu.Content>
     *     <ActionMenu.Item>
     *       Item 1
     *     </ActionMenu.Item>
     *     <ActionMenu.Item>
     *       Item 2
     *     </ActionMenu.Item>
     * </ActionMenu.Content>
     * ```
     */
    Content: typeof ActionMenuContent;
    /**
     * Semantically and visually groups items together with a label.
     * This is the prefered way to group items, as it provides better accessibility
     * rather than using a standalone `ActionMenu.Label`.
     *
     * It is required to use either `label` or `aria-label` to provide an accessible name for the group.
     * @example
     * ```jsx
     * <ActionMenu.Content>
     *     <ActionMenu.Group label="Group 1">
     *         <ActionMenu.Item>
     *           Item 1
     *         </ActionMenu.Item>
     *         <ActionMenu.Item>
     *           Item 2
     *         </ActionMenu.Item>
     *     </ActionMenu.Group>
     *     <ActionMenu.Group label="Group 2">
     *         <ActionMenu.Item>
     *           Item 3
     *         </ActionMenu.Item>
     *         <ActionMenu.Item>
     *           Item 4
     *         </ActionMenu.Item>
     *     </ActionMenu.Group>
     * </ActionMenu.Content>
     * ```
     */
    Group: typeof ActionMenuGroup;
    /**
     * Separate labeling option for the menu.
     * This is not for grouping items, but rather for adding a label to the menu at the top. For grouping items, use `ActionMenu.Group`.
     * @example
     * ```jsx
     * <ActionMenu.Content>
     *     <ActionMenu.Label>
     *         Label
     *     </ActionMenu.Label>
     *     <ActionMenu.Divider />
     * </ActionMenu.Content
     * ```
     */
    Label: typeof ActionMenuLabel;
    /**
     * A single item in the menu. Can be used standalone or grouped with other items.
     * Use `onSelect` to handle the action when the item is selected, like navigating to a new page or performing an action.
     * @example
     * ```jsx
     * <ActionMenu.Content>
     *     // Grouped
     *     <ActionMenu.Group label="Group 1">
     *         <ActionMenu.Item onSelect={navigate}>
     *           Item 1
     *         </ActionMenu.Item>
     *         <ActionMenu.Item onSelect={navigate}>
     *           Item 2
     *         </ActionMenu.Item>
     *     </ActionMenu.Group>
     *     <ActionMenu.Divider />
     *     // Standalone
     *     <ActionMenu.Item onSelect={updateState}>
     *        Item 3
     *     </ActionMenu.Item>
     * </ActionMenu.Content>
     * ```
     * @example As link
     * ```jsx
     * <ActionMenu.Item as="a" href="#">
     *     Item
     * </ActionMenu.Item>
     * ```
     */
    Item: typeof ActionMenuItem;
    /**
     * A checkbox item in the menu. Can be used standalone or grouped with other items.
     * @example
     * ```jsx
     * <ActionMenu.CheckboxItem
     *   checked={isChecked}
     *   onCheckedChange={handleChange}
     * >
     *   Checkbox 1
     * </ActionMenu.CheckboxItem>
     * ```
     */
    CheckboxItem: typeof ActionMenuCheckboxItem;
    /**
     * A radio group in the menu.
     *
     * It is required to use either `label` or `aria-label` to provide an accessible name for the group.
     * @example
     * ```jsx
     * <ActionMenu.RadioGroup
     *   onValueChange={handleValueChange}
     *   value={radioValue}
     *   label="Radio group"
     * >
     *   <ActionMenu.RadioItem value="1">Radio 1</ActionMenu.RadioItem>
     *   <ActionMenu.RadioItem value="2">Radio 2</ActionMenu.RadioItem>
     * </ActionMenu.RadioGroup>
     * ```
     */
    RadioGroup: typeof ActionMenuRadioGroup;
    /**
     * A radio item in the menu. Should always be grouped with an `ActionMenu.RadioGroup`.
     * @example
     * ```jsx
     * <ActionMenu.RadioGroup
     *   onValueChange={handleValueChange}
     *   value={radioValue}
     *   label="Radio group"
     * >
     *   <ActionMenu.RadioItem value="1">Radio 1</ActionMenu.RadioItem>
     *   <ActionMenu.RadioItem value="2">Radio 2</ActionMenu.RadioItem>
     * </ActionMenu.RadioGroup>
     * ```
     */
    RadioItem: typeof ActionMenuRadioItem;
    /**
     * A simple divider to separate items in the menu.
     */
    Divider: typeof ActionMenuDivider;
    /**
     * A sub-menu that can be nested inside the menu.
     * The sub-menu can be nested inside other sub-menus allowing for multiple levels of nesting.
     * @example
     * ```jsx
     * <ActionMenu.Sub>
     *   <ActionMenu.SubTrigger>Submenu 1</ActionMenu.SubTrigger>
     *   <ActionMenu.SubContent>
     *     <ActionMenu.Item>
     *       Subitem 1
     *     </ActionMenu.Item>
     *     <ActionMenu.Item>
     *       Subitem 2
     *     </ActionMenu.Item>
     *   </ActionMenu.SubContent>
     * </ActionMenu.Sub>
     * ```
     */
    Sub: typeof ActionMenuSub;
    /**
     * Acts as a trigger for a sub-menu.
     * In contrast to `ActionMenu.Trigger`, this trigger is a standalone component and should not be wrapped around a React.ReactNode.
     * @example
     * ```jsx
     * <ActionMenu.Sub>
     *   <ActionMenu.SubTrigger>Submenu 1</ActionMenu.SubTrigger>
     * </ActionMenu.Sub>
     * ```
     */
    SubTrigger: typeof ActionMenuSubTrigger;
    /**
     * The content of a sub-menu.
     * @example
     * ```jsx
     * <ActionMenu.Sub>
     *   <ActionMenu.SubContent>
     *     <ActionMenu.Item>
     *       Subitem 1
     *     </ActionMenu.Item>
     *     <ActionMenu.Item>
     *       Subitem 2
     *     </ActionMenu.Item>
     *   </ActionMenu.SubContent>
     * </ActionMenu.Sub>
     * ```
     */
    SubContent: typeof ActionMenuSubContent;
}
export declare const ActionMenu: ActionMenuComponent;
interface ActionMenuTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
    children: React.ReactElement;
}
export declare const ActionMenuTrigger: React.ForwardRefExoticComponent<ActionMenuTriggerProps & React.RefAttributes<HTMLButtonElement>>;
interface ActionMenuContentProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "id"> {
    children?: React.ReactNode;
    align?: "start" | "end";
}
export declare const ActionMenuContent: React.ForwardRefExoticComponent<ActionMenuContentProps & React.RefAttributes<HTMLDivElement>>;
interface ActionMenuLabelProps extends React.HTMLAttributes<HTMLDivElement> {
    children: React.ReactNode;
}
export declare const ActionMenuLabel: React.ForwardRefExoticComponent<ActionMenuLabelProps & React.RefAttributes<HTMLDivElement>>;
type MenuGroupProps = React.ComponentPropsWithoutRef<typeof Menu.Group>;
type ActionMenuGroupLabelingProps = {
    /**
     * Adds a visual and accessible label to the group.
     */
    label: string;
    /**
     * Adds an aria-label to the group.
     */
    "aria-label"?: never;
} | {
    /**
     * Adds an aria-label to the group.
     */
    "aria-label": string;
    /**
     * Adds a visual and accessible label to the group.
     */
    label?: never;
};
type ActionMenuGroupProps = Omit<MenuGroupProps, "asChild"> & ActionMenuGroupLabelingProps;
export declare const ActionMenuGroup: React.ForwardRefExoticComponent<ActionMenuGroupProps & React.RefAttributes<HTMLDivElement>>;
type ActionMenuItemElement = React.ElementRef<typeof Menu.Item>;
type MenuItemProps = React.ComponentPropsWithoutRef<typeof Menu.Item>;
interface ActionMenuItemProps extends Omit<MenuItemProps, "asChild"> {
    /**
     * Shows connected shortcut-keys for the item.
     * This is only a visual representation, you will have to implement the actual shortcut yourself.
     */
    shortcut?: string;
    /**
     * Styles the item as a destructive action.
     */
    variant?: "danger";
    /**
     * Adds an icon on the left side. The icon will always have aria-hidden.
     */
    icon?: React.ReactNode;
}
export declare const ActionMenuItem: OverridableComponent<ActionMenuItemProps, ActionMenuItemElement>;
type MenuCheckboxItemProps = React.ComponentPropsWithoutRef<typeof Menu.CheckboxItem>;
interface ActionMenuCheckboxItemProps extends Omit<MenuCheckboxItemProps, "asChild"> {
    children: React.ReactNode;
    /**
     * Shows connected shortcut-keys for the item.
     * This is only a visual representation, you will have to implement the actual shortcut yourself.
     */
    shortcut?: string;
}
export declare const ActionMenuCheckboxItem: React.ForwardRefExoticComponent<ActionMenuCheckboxItemProps & React.RefAttributes<HTMLDivElement>>;
type MenuRadioGroupProps = React.ComponentPropsWithoutRef<typeof Menu.RadioGroup>;
type ActionMenuRadioGroupProps = ActionMenuGroupLabelingProps & Omit<MenuRadioGroupProps, "asChild"> & {
    children: React.ReactNode;
};
export declare const ActionMenuRadioGroup: React.ForwardRefExoticComponent<ActionMenuRadioGroupProps & React.RefAttributes<HTMLDivElement>>;
type MenuRadioItemProps = React.ComponentPropsWithoutRef<typeof Menu.RadioItem>;
interface ActionMenuRadioItemProps extends Omit<MenuRadioItemProps, "asChild"> {
    children: React.ReactNode;
}
export declare const ActionMenuRadioItem: React.ForwardRefExoticComponent<ActionMenuRadioItemProps & React.RefAttributes<HTMLDivElement>>;
type MenuDividerProps = React.ComponentPropsWithoutRef<typeof Menu.Divider>;
type ActionMenuDividerProps = Omit<MenuDividerProps, "asChild">;
export declare const ActionMenuDivider: React.ForwardRefExoticComponent<ActionMenuDividerProps & React.RefAttributes<HTMLDivElement>>;
interface ActionMenuSubProps {
    children?: React.ReactNode;
    /**
     * Whether the sub-menu is open or not. Only needed if you want to manually control state.
     */
    open?: boolean;
    /**
     * Callback for when the sub-menu is opened or closed.
     */
    onOpenChange?: (open: boolean) => void;
}
export declare const ActionMenuSub: (props: ActionMenuSubProps) => React.JSX.Element;
type MenuSubTriggerProps = React.ComponentPropsWithoutRef<typeof Menu.SubTrigger>;
interface ActionMenuSubTriggerProps extends Omit<MenuSubTriggerProps, "asChild"> {
    icon?: React.ReactNode;
}
export declare const ActionMenuSubTrigger: React.ForwardRefExoticComponent<ActionMenuSubTriggerProps & React.RefAttributes<HTMLDivElement>>;
interface ActionMenuSubContentProps extends React.HTMLAttributes<HTMLDivElement> {
    children: React.ReactNode;
}
export declare const ActionMenuSubContent: React.ForwardRefExoticComponent<ActionMenuSubContentProps & React.RefAttributes<HTMLDivElement>>;
export type { ActionMenuCheckboxItemProps, ActionMenuContentProps, ActionMenuDividerProps, ActionMenuGroupProps, ActionMenuItemProps, ActionMenuLabelProps, ActionMenuProps, ActionMenuRadioGroupProps, ActionMenuRadioItemProps, ActionMenuSubContentProps, ActionMenuSubProps, ActionMenuSubTriggerProps, ActionMenuTriggerProps, };
