import type { BrowserWindow, KeyboardEvent, MenuItemConstructorOptions, MenuItem as ElectronMenuItem } from "electron";
import type { SetOptional } from "type-fest";
import type { ChildOfParentComposite, ParentOfChildComposite } from "../../../../common/utils/composite/interfaces";
import type { MaybeShowable } from "../../../../common/utils/composable-responsibilities/showable/showable";
import type { Discriminable } from "../../../../common/utils/composable-responsibilities/discriminable/discriminable";
import type { Orderable } from "../../../../common/utils/composable-responsibilities/orderable/orderable";
export interface MayHaveKeyboardShortcut {
    keyboardShortcut?: string;
}
export interface ElectronClickable {
    onClick: (menuItem: ElectronMenuItem, browserWindow: (BrowserWindow) | (undefined), event: KeyboardEvent) => void;
}
export interface Labeled {
    label: string;
}
export interface MaybeLabeled extends SetOptional<Labeled, "label"> {
}
type ApplicationMenuItemType<T extends string> = Discriminable<T> & ParentOfChildComposite & ChildOfParentComposite & MaybeShowable & Orderable;
export type TopLevelMenu = ApplicationMenuItemType<"top-level-menu"> & {
    parentId: "root";
} & Labeled & MayHaveElectronRole;
interface MayHaveElectronRole {
    role?: ElectronRoles;
}
type ElectronRoles = Exclude<MenuItemConstructorOptions["role"], undefined>;
export type SubMenu = ApplicationMenuItemType<"sub-menu"> & Labeled & ChildOfParentComposite;
export type ClickableMenuItem = ApplicationMenuItemType<"clickable-menu-item"> & MenuItem & Labeled & ElectronClickable;
export type OsActionMenuItem = ApplicationMenuItemType<"os-action-menu-item"> & MenuItem & MaybeLabeled & TriggersElectronAction;
type MenuItem = ChildOfParentComposite & MayHaveKeyboardShortcut;
interface TriggersElectronAction {
    actionName: ElectronRoles;
}
export type Separator = ApplicationMenuItemType<"separator"> & ChildOfParentComposite;
export type ApplicationMenuItemTypes = TopLevelMenu | SubMenu | OsActionMenuItem | ClickableMenuItem | Separator;
declare const applicationMenuItemInjectionToken: import("@ogre-tools/injectable").InjectionToken<ApplicationMenuItemTypes, void>;
export default applicationMenuItemInjectionToken;
