import { Color, MutableObservableValue, Procedure, StringMapping, Terminable, ValueMapping } from "@opendaw/lib-std";
import { IconSymbol } from "@opendaw/studio-enums";
export type MenuItemOptions = {
    hidden?: boolean;
    selectable?: boolean;
    separatorBefore?: boolean;
};
declare const Root: {
    readonly type: "root";
};
export type HeaderMenuData = {
    type: "header";
    label: string;
    icon: IconSymbol;
    color?: Color;
};
export type DefaultMenuData = {
    type: "default";
    label: string;
    shortcut?: string | ReadonlyArray<string>;
    checked?: boolean;
    icon?: IconSymbol;
};
export type InputValueMenuData = {
    type: "input-value";
    icon: IconSymbol;
    valueMapping: ValueMapping<number>;
    stringMapping: StringMapping<number>;
    model: MutableObservableValue<number>;
    name: string;
    color?: Color;
    minValueWidth?: string;
};
export type MenuRootData = typeof Root;
export type MenuData = (DefaultMenuData & MenuItemOptions) | MenuRootData | HeaderMenuData | InputValueMenuData;
export interface MenuCollector {
    addItems(...items: MenuItem[]): void;
}
export declare class MenuItem<DATA extends MenuData = MenuData> {
    #private;
    static root(): MenuItem<MenuRootData>;
    static header(properties: Omit<HeaderMenuData, "type"> & MenuItemOptions): MenuItem<{
        icon: IconSymbol;
        label: string;
        color?: Color | undefined;
        hidden?: boolean;
        selectable?: boolean;
        separatorBefore?: boolean;
        type: "header";
    }>;
    static default(properties: Omit<DefaultMenuData, "type"> & MenuItemOptions): MenuItem<{
        icon?: IconSymbol | undefined;
        label: string;
        shortcut?: (string | ReadonlyArray<string>) | undefined;
        checked?: boolean | undefined;
        hidden?: boolean;
        selectable?: boolean;
        separatorBefore?: boolean;
        type: "default";
    }>;
    static inputValue(properties: Omit<InputValueMenuData, "type"> & MenuItemOptions): MenuItem<{
        name: string;
        icon: IconSymbol;
        model: MutableObservableValue<number>;
        color?: Color | undefined;
        valueMapping: ValueMapping<number>;
        stringMapping: StringMapping<number>;
        minValueWidth?: string | undefined;
        hidden?: boolean;
        selectable?: boolean;
        separatorBefore?: boolean;
        type: "input-value";
    }>;
    constructor(data: DATA, options?: MenuItemOptions);
    get data(): DATA;
    get hidden(): boolean;
    get selectable(): boolean;
    get separatorBefore(): boolean;
    get hasChildren(): boolean;
    addMenuItem(...items: ReadonlyArray<MenuItem>): this;
    open(): void;
    trigger(): void;
    isSelectable(value?: boolean): this;
    isHidden(value?: boolean): this;
    addSeparatorBefore(): this;
    attach(populator: (collector: MenuCollector) => void): Terminable;
    setRuntimeChildrenProcedure(procedure: Procedure<MenuItem>): this;
    setOpeningProcedure(procedure: Procedure<MenuItem>): this;
    setTriggerProcedure(procedure: Procedure<MenuItem>): this;
    collectChildren(): MenuItem[];
    clearRuntimeProcedure(): void;
    removeRuntimeChildren(): void;
}
export {};
//# sourceMappingURL=MenuItems.d.ts.map