import * as _udecode_plate_core from '@udecode/plate-core';
import * as _udecode_slate from '@udecode/slate';
import React from 'react';
import { PlatePlugin, PlatePluginComponent, PlateContentProps, PlateProps, TElement, Value, PlateEditor, HotkeyPlugin } from '@udecode/plate-common';
import { TComboboxItem } from '@udecode/plate-combobox';
import { CommentUser } from '@udecode/plate-comments';
import * as class_variance_authority_dist_types from 'class-variance-authority/dist/types';
import { VariantProps } from 'class-variance-authority';
import * as slate_react from 'slate-react';

interface PluginOptions {
    plugins?: PlatePlugin[];
    draggable?: boolean;
    placeholder?: boolean;
    excludePluginKeys?: string[];
    overrideByKey?: Partial<Record<string, PlatePluginComponent>>;
}

declare const editorVariants: (props?: ({
    variant?: "outline" | "ghost" | null | undefined;
    focused?: boolean | null | undefined;
    disabled?: boolean | null | undefined;
    focusRing?: boolean | null | undefined;
    size?: "sm" | "md" | null | undefined;
} & class_variance_authority_dist_types.ClassProp) | undefined) => string;
type EditorProps = PlateContentProps & VariantProps<typeof editorVariants>;

interface CommentsOptions {
    users: Record<number, CommentUser>;
    myUserId: string;
}
interface FlowesEditorProps extends Pick<PlateProps, 'value' | 'readOnly' | 'onChange' | 'maxLength' | 'initialValue' | 'disableCorePlugins'>, Pick<EditorProps, 'className' | 'style' | 'autoFocus'> {
    mentions?: TComboboxItem[];
    commentsOptions?: CommentsOptions;
    pluginOptions?: PluginOptions;
}
declare const FlowesEditor: React.MemoExoticComponent<React.ForwardRefExoticComponent<FlowesEditorProps & React.RefAttributes<_udecode_plate_core.PlateEditor<_udecode_slate.Value>>>>;

declare const ELEMENT_ATTACHMENT = "attachment";
interface TAttachmentElement extends TElement {
    type: 'attachment' | 'attachment_audio' | 'attachment_document' | 'attachment_image' | 'attachment_video' | string;
    url: string;
    name: string;
    size: number;
    fileUrl: string;
    fileType: string;
    width?: string | number;
    height?: string | number;
    align?: 'left' | 'center' | 'right';
    status?: 'link' | 'thumbnail';
    bordered?: boolean;
    uploadStatus: 'uploading' | 'success' | 'fail';
}
interface AttachmentPlugin {
    uploadAttachment?: (file: File) => Promise<Partial<TAttachmentElement>>;
}

interface ImagePlugin extends AttachmentPlugin {
}

declare const ELEMENT_ATTACHMENT_IMAGE = "attachment_image";
declare const createAttachmentImagePlugin: <OP = ImagePlugin, OV extends _udecode_slate.Value = _udecode_slate.Value, OE extends _udecode_plate_core.PlateEditor<OV> = _udecode_plate_core.PlateEditor<OV>>(override?: Partial<_udecode_plate_core.PlatePlugin<_udecode_plate_core.NoInfer<OP>, OV, OE>> | undefined, overrideByKey?: _udecode_plate_core.OverrideByKey<OV, OE> | undefined) => _udecode_plate_core.PlatePlugin<_udecode_plate_core.NoInfer<OP>, OV, OE>;

interface AudioPlugin extends AttachmentPlugin {
}

declare const ELEMENT_ATTACHMENT_AUDIO = "attachment_audio";
declare const createAttachmentAudioPlugin: <OP = AudioPlugin, OV extends _udecode_slate.Value = _udecode_slate.Value, OE extends _udecode_plate_core.PlateEditor<OV> = _udecode_plate_core.PlateEditor<OV>>(override?: Partial<_udecode_plate_core.PlatePlugin<_udecode_plate_core.NoInfer<OP>, OV, OE>> | undefined, overrideByKey?: _udecode_plate_core.OverrideByKey<OV, OE> | undefined) => _udecode_plate_core.PlatePlugin<_udecode_plate_core.NoInfer<OP>, OV, OE>;

interface VideoPlugin extends AttachmentPlugin {
}

declare const ELEMENT_ATTACHMENT_VIDEO = "attachment_video";
declare const createAttachmentVideoPlugin: <OP = VideoPlugin, OV extends _udecode_slate.Value = _udecode_slate.Value, OE extends _udecode_plate_core.PlateEditor<OV> = _udecode_plate_core.PlateEditor<OV>>(override?: Partial<_udecode_plate_core.PlatePlugin<_udecode_plate_core.NoInfer<OP>, OV, OE>> | undefined, overrideByKey?: _udecode_plate_core.OverrideByKey<OV, OE> | undefined) => _udecode_plate_core.PlatePlugin<_udecode_plate_core.NoInfer<OP>, OV, OE>;

interface DocumentPlugin extends AttachmentPlugin {
}

declare const ELEMENT_ATTACHMENT_DOCUMENT = "attachment_document";
declare const createAttachmentDocumentPlugin: <OP = DocumentPlugin, OV extends _udecode_slate.Value = _udecode_slate.Value, OE extends _udecode_plate_core.PlateEditor<OV> = _udecode_plate_core.PlateEditor<OV>>(override?: Partial<_udecode_plate_core.PlatePlugin<_udecode_plate_core.NoInfer<OP>, OV, OE>> | undefined, overrideByKey?: _udecode_plate_core.OverrideByKey<OV, OE> | undefined) => _udecode_plate_core.PlatePlugin<_udecode_plate_core.NoInfer<OP>, OV, OE>;

declare const AttachmentAudioElement: React.ForwardRefExoticComponent<Omit<Omit<_udecode_plate_core.PlateRenderNodeProps<_udecode_slate.Value, _udecode_plate_core.PlateEditor<_udecode_slate.Value>> & Omit<slate_react.RenderElementProps, "element"> & {
    element: _udecode_slate.TElement;
} & Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
    as?: React.ElementType<any> | undefined;
    asChild?: boolean | undefined;
} & React.RefAttributes<any> & {
    elementToAttributes?: ((element: _udecode_slate.TElement) => any) | undefined;
} & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<any>, "ref"> & React.RefAttributes<unknown>>;

declare const AttachmentDocumentElement: React.ForwardRefExoticComponent<Omit<Omit<_udecode_plate_core.PlateRenderNodeProps<_udecode_slate.Value, _udecode_plate_core.PlateEditor<_udecode_slate.Value>> & Omit<slate_react.RenderElementProps, "element"> & {
    element: _udecode_slate.TElement;
} & Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
    as?: React.ElementType<any> | undefined;
    asChild?: boolean | undefined;
} & React.RefAttributes<any> & {
    elementToAttributes?: ((element: _udecode_slate.TElement) => any) | undefined;
} & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<any>, "ref"> & React.RefAttributes<unknown>>;

declare const AttachmentElement: React.ForwardRefExoticComponent<Omit<Omit<_udecode_plate_core.PlateRenderNodeProps<_udecode_slate.Value, _udecode_plate_core.PlateEditor<_udecode_slate.Value>> & Omit<slate_react.RenderElementProps, "element"> & {
    element: _udecode_slate.TElement;
} & Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
    as?: React.ElementType<any> | undefined;
    asChild?: boolean | undefined;
} & React.RefAttributes<any> & {
    elementToAttributes?: ((element: _udecode_slate.TElement) => any) | undefined;
} & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<any>, "ref"> & React.RefAttributes<unknown>>;

declare const AttachmentImageElement: React.ForwardRefExoticComponent<Omit<Omit<_udecode_plate_core.PlateRenderNodeProps<_udecode_slate.Value, _udecode_plate_core.PlateEditor<_udecode_slate.Value>> & Omit<slate_react.RenderElementProps, "element"> & {
    element: _udecode_slate.TElement;
} & Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
    as?: React.ElementType<any> | undefined;
    asChild?: boolean | undefined;
} & React.RefAttributes<any> & {
    elementToAttributes?: ((element: _udecode_slate.TElement) => any) | undefined;
} & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<any>, "ref"> & React.RefAttributes<unknown>>;

declare const AttachmentVideoElement: React.ForwardRefExoticComponent<Omit<Omit<_udecode_plate_core.PlateRenderNodeProps<_udecode_slate.Value, _udecode_plate_core.PlateEditor<_udecode_slate.Value>> & Omit<slate_react.RenderElementProps, "element"> & {
    element: _udecode_slate.TElement;
} & Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
    as?: React.ElementType<any> | undefined;
    asChild?: boolean | undefined;
} & React.RefAttributes<any> & {
    elementToAttributes?: ((element: _udecode_slate.TElement) => any) | undefined;
} & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<any>, "ref"> & React.RefAttributes<unknown>>;

declare const HighlightComponent: React.ForwardRefExoticComponent<Omit<_udecode_plate_core.PlateRenderNodeProps<_udecode_slate.Value, _udecode_plate_core.PlateEditor<_udecode_slate.Value>> & Omit<slate_react.RenderElementProps, "element"> & {
    element: _udecode_slate.TElement;
} & Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
    as?: React.ElementType<any> | undefined;
    asChild?: boolean | undefined;
} & React.RefAttributes<any> & {
    elementToAttributes?: ((element: _udecode_slate.TElement) => any) | undefined;
} & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<any>>;

declare const insertHighlight: <V extends Value>(editor: PlateEditor<V>) => void;

declare const ELEMENT_HIGHLIGH_BLOCK = "highlight_block";
declare const createHighlightBlockPlugin: <OP = HotkeyPlugin, OV extends _udecode_slate.Value = _udecode_slate.Value, OE extends _udecode_plate_core.PlateEditor<OV> = _udecode_plate_core.PlateEditor<OV>>(override?: Partial<_udecode_plate_core.PlatePlugin<_udecode_plate_core.NoInfer<OP>, OV, OE>> | undefined, overrideByKey?: _udecode_plate_core.OverrideByKey<OV, OE> | undefined) => _udecode_plate_core.PlatePlugin<_udecode_plate_core.NoInfer<OP>, OV, OE>;

declare const StatusComponent: React.ForwardRefExoticComponent<Omit<_udecode_plate_core.PlateRenderNodeProps<_udecode_slate.Value, _udecode_plate_core.PlateEditor<_udecode_slate.Value>> & Omit<slate_react.RenderElementProps, "element"> & {
    element: _udecode_slate.TElement;
} & Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
    as?: React.ElementType<any> | undefined;
    asChild?: boolean | undefined;
} & React.RefAttributes<any> & {
    elementToAttributes?: ((element: _udecode_slate.TElement) => any) | undefined;
} & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<any>>;

interface TStatusElement extends TElement {
    category?: 'gray' | 'red' | 'yellow' | 'green' | 'blue' | 'time';
    value?: string;
}

declare const insertStatus: <V extends Value>(editor: PlateEditor<V>, category?: TStatusElement['category']) => void;

declare const ELEMENT_STATUS = "status";
declare const ELEMENT_STATUS_TIME = "status_time";
declare const createStatusPlugin: <OP = HotkeyPlugin, OV extends _udecode_slate.Value = _udecode_slate.Value, OE extends _udecode_plate_core.PlateEditor<OV> = _udecode_plate_core.PlateEditor<OV>>(override?: Partial<_udecode_plate_core.PlatePlugin<_udecode_plate_core.NoInfer<OP>, OV, OE>> | undefined, overrideByKey?: _udecode_plate_core.OverrideByKey<OV, OE> | undefined) => _udecode_plate_core.PlatePlugin<_udecode_plate_core.NoInfer<OP>, OV, OE>;

declare const LayoutChildComponent: React.ForwardRefExoticComponent<Omit<Omit<_udecode_plate_core.PlateRenderNodeProps<_udecode_slate.Value, _udecode_plate_core.PlateEditor<_udecode_slate.Value>> & Omit<slate_react.RenderElementProps, "element"> & {
    element: _udecode_slate.TElement;
} & Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
    as?: React.ElementType<any> | undefined;
    asChild?: boolean | undefined;
} & React.RefAttributes<any> & {
    elementToAttributes?: ((element: _udecode_slate.TElement) => any) | undefined;
} & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<any>, "ref"> & React.RefAttributes<unknown>>;

declare const LayoutComponent: React.ForwardRefExoticComponent<Omit<_udecode_plate_core.PlateRenderNodeProps<_udecode_slate.Value, _udecode_plate_core.PlateEditor<_udecode_slate.Value>> & Omit<slate_react.RenderElementProps, "element"> & {
    element: _udecode_slate.TElement;
} & Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
    as?: React.ElementType<any> | undefined;
    asChild?: boolean | undefined;
} & React.RefAttributes<any> & {
    elementToAttributes?: ((element: _udecode_slate.TElement) => any) | undefined;
} & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<any>>;

declare const insertLayout: <V extends Value>(editor: PlateEditor<V>) => void;

declare const ELEMENT_LAYOUT = "layout";
declare const ELEMENT_LAYOUT_CHILD = "layout_child";
declare const createLayoutPlugin: <OP = HotkeyPlugin, OV extends _udecode_slate.Value = _udecode_slate.Value, OE extends _udecode_plate_core.PlateEditor<OV> = _udecode_plate_core.PlateEditor<OV>>(override?: Partial<_udecode_plate_core.PlatePlugin<_udecode_plate_core.NoInfer<OP>, OV, OE>> | undefined, overrideByKey?: _udecode_plate_core.OverrideByKey<OV, OE> | undefined) => _udecode_plate_core.PlatePlugin<_udecode_plate_core.NoInfer<OP>, OV, OE>;

export { AttachmentAudioElement, AttachmentDocumentElement, AttachmentElement, AttachmentImageElement, AttachmentVideoElement, ELEMENT_ATTACHMENT, ELEMENT_ATTACHMENT_AUDIO, ELEMENT_ATTACHMENT_DOCUMENT, ELEMENT_ATTACHMENT_IMAGE, ELEMENT_ATTACHMENT_VIDEO, ELEMENT_HIGHLIGH_BLOCK, ELEMENT_LAYOUT, ELEMENT_LAYOUT_CHILD, ELEMENT_STATUS, ELEMENT_STATUS_TIME, FlowesEditor, FlowesEditorProps, HighlightComponent, LayoutChildComponent, LayoutComponent, StatusComponent, createAttachmentAudioPlugin, createAttachmentDocumentPlugin, createAttachmentImagePlugin, createAttachmentVideoPlugin, createHighlightBlockPlugin, createLayoutPlugin, createStatusPlugin, insertHighlight, insertLayout, insertStatus };
