import * as React from 'react';
import { StateDescriptor, StateDescriptorReturnType, StateDescriptorSerializedType, StateDescriptorValueType } from './plugin-state';
export declare type Plugin<S extends StateDescriptor = StateDescriptor, Props extends Record<string, unknown> = any> = StatelessPlugin<Props> | StatefulPlugin<S, Props>;
export interface StatelessPlugin<Props extends Record<string, unknown> = {}> {
    Component: React.ComponentType<StatelessPluginEditorProps<Props>>;
    onPaste?: (data: DataTransfer) => void | {
        state?: undefined;
    };
    title?: string;
    icon?: React.ComponentType;
    description?: string;
}
export declare type StatelessPluginEditorProps<Props extends Record<string, unknown> = {}> = {
    name: string;
    editable?: boolean;
    focused?: boolean;
} & Props;
export interface StatefulPlugin<S extends StateDescriptor, Props extends Record<string, unknown> = {}> {
    Component: React.ComponentType<StatefulPluginEditorProps<S, Props>>;
    state: S;
    onPaste?: (data: DataTransfer) => void | {
        state?: StateDescriptorSerializedType<S>;
    };
    title?: string;
    icon?: React.ComponentType;
    description?: string;
    isEmpty?: (state: StateDescriptorValueType<S>) => boolean;
    onKeyDown?: (e: KeyboardEvent) => boolean;
    getFocusableChildren?: (state: StateDescriptorReturnType<S>) => {
        id: string;
    }[];
}
export declare type StatefulPluginEditorProps<S extends StateDescriptor = StateDescriptor, Props extends Record<string, unknown> = {}> = StatelessPluginEditorProps<Props> & {
    state: StateDescriptorReturnType<S>;
};
export declare function isStatefulPlugin<S extends StateDescriptor>(plugin: Plugin<S>): plugin is StatefulPlugin<S, any>;
export declare function isStatelessPlugin(plugin: Plugin): plugin is StatelessPlugin<any>;
//# sourceMappingURL=plugin.d.ts.map