import { ColumnDataSchemaModel } from '@revolist/revogrid';
import { ColumnTemplateProp } from '@revolist/revogrid';
import { ComponentType } from 'react';
import { EditCell } from '@revolist/revogrid';
import { EditorBase } from '@revolist/revogrid';
import { EditorCtr } from '@revolist/revogrid';
import { ForwardRefExoticComponent } from 'react';
import { HTMLAttributes } from 'react';
import { HyperFunc } from '@revolist/revogrid';
import { JSX as JSX_2 } from '@revolist/revogrid';
import { RefAttributes } from 'react';
import { Root } from 'react-dom/client';
import { VNode } from '@revolist/revogrid';

/**
 * Create editor constructor.
 * This function creates editor constructor by wrapping it with EditorAdapter
 * which is responsible for connecting editor with grid.
 */
export declare const Editor: (EditorComponent: ComponentType<EditorType>) => EditorCtr;

export declare class EditorAdapter implements EditorBase {
    private EditorComponent;
    column: ColumnDataSchemaModel;
    private save;
    private close;
    element: ReactElement | null;
    editCell?: EditCell;
    private renderedComponent;
    constructor(EditorComponent: ComponentType<EditorType>, column: ColumnDataSchemaModel, save: (value: any, preventFocus?: boolean) => void, close: (focusNext?: boolean) => void);
    componentDidRender(): void;
    disconnectedCallback(): void;
    render(h: HyperFunc<VNode>): VNode;
}

/**
 * Data passed to editor
 */
export declare type EditorType = {
    column: ColumnDataSchemaModel;
    save: (value: any, preventFocus?: boolean) => void;
    close: (focusNext?: boolean) => void;
} & Partial<EditCell>;

export declare interface ReactElement extends HTMLElement {
    _root?: Root;
}

export declare interface RenderedComponent<T> {
    update: (newProps: T) => void;
    destroy: () => void;
}

export declare const RevoGrid: ForwardRefExoticComponent<JSX_2.RevoGrid & Omit<HTMLAttributes<HTMLRevoGridElement>, "style"> & StyleReactProps & RefAttributes<HTMLRevoGridElement>>;

declare interface StyleReactProps {
    class?: string;
    className?: string;
    style?: {
        [key: string]: any;
    };
}

/**
 * Render React component in Grid column template.
 */
export declare const Template: (ReactComponent: ComponentType<ColumnDataSchemaModel | ColumnTemplateProp>, customProps?: any) => (h: HyperFunc<VNode>, p: ColumnDataSchemaModel | ColumnTemplateProp, addition?: any) => VNode;


export * from "@revolist/revogrid";
export * from "@revolist/revogrid/loader";

export { }
