import { type CSSProperties, type HTMLAttributes } from "react";
import { type FloatingActionButtonPosition } from "../button/FloatingActionButton.js";
import { type ListElement, type ListProps } from "../list/List.js";
import { type GetDefaultFocusedIndex } from "../movement/types.js";
import { type CalculateFixedPositionOptions } from "../positioning/types.js";
import { type FixedPositioningOptions } from "../positioning/useFixedPositioning.js";
import { type ScaleTransitionHookOptions } from "../transition/useScaleTransition.js";
import { type LabelRequiredForA11y, type PropsWithRef } from "../types.js";
import { type MenuConfiguration, type MenuOrientationProps } from "./MenuConfigurationProvider.js";
import { type MenuSheetConvenienceProps } from "./MenuSheet.js";
declare module "react" {
    interface CSSProperties {
        "--rmd-menu-background-color"?: string;
        "--rmd-menu-color"?: string;
        "--rmd-menu-min-width"?: string | number;
        "--rmd-menu-spacing"?: string | number;
    }
}
/** @remarks \@since 5.0.0 */
export type MenuTransitionProps = Omit<ScaleTransitionHookOptions<HTMLDivElement>, "transitionIn" | "vertical" | "nodeRef">;
/**
 * @remarks \@since 6.0.0
 */
export interface MenuConfigurationProps extends CalculateFixedPositionOptions {
    /**
     * @see {@link ScaleTransitionHookOptions.temporary}
     * @defaultValue `true`
     */
    temporary?: boolean;
    /**
     * @defaultValue `false`
     */
    disablePortal?: boolean;
    /**
     * Boolean if the menu should not gain the elevation styles and should only be
     * set to `true` when rendering within a `Sheet`.
     *
     * @defaultValue `false`
     */
    disableElevation?: boolean;
    /**
     * @defaultValue `false`
     */
    disableTransition?: boolean;
    /**
     * @see {@link FixedPositioningOptions.transformOrigin}
     * @defaultValue `true`
     */
    transformOrigin?: boolean;
    /**
     * Boolean if the menu should close if the page is scrolled. The default
     * behavior is to just update the position of the menu relative to the menu
     * button until it can no longer be visible within the viewport.
     *
     * @defaultValue `false`
     */
    closeOnScroll?: boolean;
    /**
     * Boolean if the page should no longer be scrollable while the menu is
     * visible.
     *
     * @defaultValue `false`
     */
    preventScroll?: boolean;
    /**
     * Boolean if the menu should close instead of repositioning itself if the
     * browser window is resized.
     *
     * @defaultValue `false`
     */
    closeOnResize?: boolean;
    /** @see {@link FixedPositioningOptions.getFixedPositionOptions} */
    getFixedPositionOptions?(): CalculateFixedPositionOptions;
}
/**
 * @remarks
 * \@since 5.1.0
 * \@since 6.0.0 Renamed from `MenuListProps` to `MenuListConvenienceProps`
 */
export interface MenuListConvenienceProps {
    /**
     * An optional style to provide to the `List` component that surrounds the
     * `MenuItem` within a `Menu`.
     */
    listStyle?: CSSProperties;
    /**
     * An optional className to provide to the `List` component that surrounds the
     * `MenuItem` within a `Menu`.
     */
    listClassName?: string;
    /**
     * Any additional props to pass to the `List` component that surrounds the
     * `Menu`'s `MenuItem`s.
     */
    listProps?: PropsWithRef<Omit<ListProps, "horizontal">, ListElement>;
}
/**
 * @remarks \@since 6.0.0
 */
export interface MenuConvenienceProps extends MenuConfigurationProps {
    /**
     * This can be used to apply additional props to the `Menu` component.
     *
     * Note: You can override the `style` and `className` using
     * {@link menuStyle} and {@link menuClassName} instead for convenience.
     *
     * @example
     * ```tsx
     * <DropdownMenu
     *   {...props}
     *   menuProps={{
     *     style: {
     *       // custom inline style
     *     },
     *     className: "come-class-name",
     *     getFixedPositionOptions: () => ({
     *       preventOverlap: true,
     *     }),
     *   }}
     * />
     * ```
     */
    menuProps?: PropsWithRef<Omit<MenuProps, "children" | "fixedTo" | "visible" | "onRequestClose" | "getDefaultFocusedIndex">, HTMLDivElement>;
    /**
     * Convenience prop to apply custom style to the `Menu` component.
     */
    menuStyle?: CSSProperties;
    /**
     * Convenience prop to apply custom class name to the `Menu` component.
     */
    menuClassName?: string;
}
/**
 * @remarks \@since 6.0.0
 */
export type MenuFixedPositioningOptions = Omit<FixedPositioningOptions<HTMLElement, HTMLDivElement>, "onScroll" | "onResize">;
/**
 * @remarks
 * \@since 5.0.0
 * \@since 6.0.0 Updated to use the latest Menu, Transition, and Portal API.
 */
export interface MenuProps extends HTMLAttributes<HTMLDivElement>, MenuConfiguration, MenuConfigurationProps, MenuFixedPositioningOptions, MenuOrientationProps, MenuTransitionProps, MenuListConvenienceProps, MenuSheetConvenienceProps {
    visible: boolean;
    onRequestClose(): void;
    /**
     * @defaultValue `"menu-" + useId()`
     */
    id?: string;
    /**
     * This is used to set the default focus index when the menu is visible.
     *
     * @internal
     */
    getDefaultFocusedIndex?: GetDefaultFocusedIndex;
    /**
     * Custom style that should be applied to the menu only while not rendered
     * within a sheet since the {@link style} would be applied to both versions.
     */
    menuStyle?: CSSProperties;
    /**
     * Custom class name that should be applied only while not rendered within a
     * sheet.
     */
    menuClassName?: string;
    /**
     * @internal
     *
     * This is only used to update the default anchor when the DropdownMenu's
     * toggle is a floating action button.
     */
    floating?: FloatingActionButtonPosition;
}
/**
 * **Client Component**
 *
 * This component should generally only be used to implement context menus with
 * the `useContextMenu` hook. Otherwise, the `DropdownMenu` component should be
 * used.
 *
 * @see The `useContextMenu` hook for an example.
 *
 * @remarks
 * \@since 5.0.0
 * \@since 6.0.0 Updated this component to implement all the `Menu`
 * functionality instead of requiring the `useMenu` hook and `MenuWidget`
 * component. In addition, the `renderAsSheet` behavior has been moved into this
 * implementation so that the `MenuRenderer` is no longer required and context
 * menus can appear as a `Sheet`.
 */
export declare const Menu: import("react").ForwardRefExoticComponent<LabelRequiredForA11y<MenuProps> & import("react").RefAttributes<HTMLDivElement>>;
