declare module "@firefox-devtools/react-contextmenu" {
    import * as React from "react";

    export interface ContextMenuProps {
        id: string,
        data?: any,
        className?: string,
        hideOnLeave?: boolean,
        rtl?: boolean,
        onHide?: {(event: any): void},
        onMouseLeave?: {(event: React.MouseEvent<HTMLElement>, data: Object, target: HTMLElement): void} | Function,
        onShow?: {(event: any): void},
        preventHideOnContextMenu?: boolean,
        preventHideOnResize?: boolean,
        preventHideOnScroll?: boolean,
        style?: React.CSSProperties,
        children?: React.ReactNode,
    }

    export interface ContextMenuTriggerProps {
        id: string,
        attributes?: React.HTMLAttributes<any>,
        collect?: {(data: any): any},
        disable?: boolean,
        holdToDisplay?: number,
        posX?: number,
        posY?: number,
        renderTag?: React.ElementType,
        triggerOnLeftClick?: boolean,
        disableIfShiftIsPressed?: boolean,
        [key: string]: any,
        children?: React.ReactNode,
    }

    export interface MenuItemProps {
        attributes?: React.HTMLAttributes<HTMLDivElement>,
        className?: string;
        data?: Object,
        disabled?: boolean,
        divider?: boolean,
        preventClose?: boolean,
        onClick?: {(event: React.TouchEvent<HTMLDivElement> | React.MouseEvent<HTMLDivElement>, data: Object, target: HTMLElement): void} | Function,
        onMouseLeave?: {(event: React.MouseEvent<HTMLDivElement>): void} | Function,
        onMouseMove?: {(event: React.MouseEvent<HTMLDivElement>): void} | Function,
        role?: string,
        selected?: boolean,
        children?: React.ReactNode,
    }

    export interface SubMenuProps {
        title: React.ReactElement<any> | string | number,
        attributes?: React.HTMLAttributes<HTMLDivElement>,
        className?: string,
        disabled?: boolean,
        hoverDelay?: number,
        rtl?: boolean,
        selected?: boolean,
        onMouseMove?: {(event: React.MouseEvent<HTMLDivElement>): void} | Function,
        onMouseOut?: {(event: React.MouseEvent<HTMLDivElement>): void} | Function,
        forceOpen?: boolean,
        forceClose?: {(): void} | Function,
        parentKeyNavigationHandler?: {(event: React.KeyboardEvent): void} | Function,
        preventCloseOnClick?: boolean,
        onClick?: {(event: React.TouchEvent<HTMLDivElement> | React.MouseEvent<HTMLDivElement>, data: Object, target: HTMLElement): void} | Function,
        data?: Object,
        children?: React.ReactNode,
    }

    export interface ConnectMenuProps {
        id: string;
        trigger: any;
    }

    export const ContextMenu: React.ComponentClass<ContextMenuProps>;
    export const ContextMenuTrigger: React.ComponentClass<ContextMenuTriggerProps>;
    export const MenuItem: React.ComponentClass<MenuItemProps>;
    export const SubMenu: React.ComponentClass<SubMenuProps>;
    export function connectMenu<P>(
      menuId: string
    ): (
      Child: React.ComponentType<P & ConnectMenuProps>
    ) => React.ComponentType<P>;
    export function showMenu(opts?: any, target?: HTMLElement): void;
    export function hideMenu(opts?: any, target?: HTMLElement): void;
}

declare module "@firefox-devtools/react-contextmenu/modules/actions" {
    export function showMenu(opts?: any, target?: HTMLElement): void;
    export function hideMenu(opts?: any, target?: HTMLElement): void;
}
