import { default as React } from 'react';
import { BaseEditor } from 'slate';
import { ReactEditor } from 'slate-react';
export interface RichTextEditorProps {
/** 初始值 */
initialValue?: CustomElement[];
/** 主题样式 */
styles?: RichTextStyles;
/** 是否只读 */
readOnly?: boolean;
/** 占位符文本 */
placeholder?: string;
/** 最小高度 */
minHeight?: string;
/** 最大高度 */
maxHeight?: string;
/** 是否显示工具栏 */
showToolbar?: boolean;
/** 自定义工具栏 */
customToolbar?: React.ReactNode;
/** 编辑器变化回调 */
onChange?: (value: CustomElement[]) => void;
/** 编辑器焦点回调 */
onFocus?: () => void;
/** 编辑器失焦回调 */
onBlur?: () => void;
/** 自定义渲染元素 */
renderElement?: (props: any) => JSX.Element;
/** 自定义渲染叶子节点 */
renderLeaf?: (props: any) => JSX.Element;
/** 自定义样式 */
className?: string;
/** 自定义样式对象 */
style?: React.CSSProperties;
}
export interface RichTextRendererProps {
/** 要渲染的内容 */
content: CustomElement[] | string;
/** 主题样式 */
styles?: RichTextStyles;
/** 是否显示工具栏 */
showToolbar?: boolean;
/** 自定义工具栏 */
customToolbar?: React.ReactNode;
/** 自定义渲染元素 */
renderElement?: (props: any) => JSX.Element;
/** 自定义渲染叶子节点 */
renderLeaf?: (props: any) => JSX.Element;
/** 自定义样式 */
className?: string;
/** 自定义样式对象 */
style?: React.CSSProperties;
}
export interface MarkdownRendererProps {
/** Markdown文本内容 */
content: string;
/** 主题样式 */
styles?: RichTextStyles;
/** 是否转换为富文本后渲染 */
convertToRichText?: boolean;
/** 自定义样式 */
className?: string;
/** 自定义样式对象 */
style?: React.CSSProperties;
}
export interface RichTextStyles {
theme?: any;
mode?: 'light' | 'dark';
[key: string]: any;
}
export interface RichTextEvents {
onChange?: (value: CustomElement[]) => void;
onFocus?: () => void;
onBlur?: () => void;
onSelectionChange?: (selection: any) => void;
onKeyDown?: (event: React.KeyboardEvent) => void;
onPaste?: (event: React.ClipboardEvent) => void;
onDrop?: (event: React.DragEvent) => void;
}
export interface ToolbarButton {
/** 按钮类型 */
type: string;
/** 按钮图标 */
icon: React.ReactNode;
/** 按钮标题 */
title: string;
/** 是否激活 */
isActive?: boolean;
/** 点击回调 */
onClick: () => void;
/** 是否禁用 */
disabled?: boolean;
}
export type CustomText = {
text: string;
bold?: boolean;
italic?: boolean;
underline?: boolean;
code?: boolean;
strikethrough?: boolean;
link?: string;
color?: string;
backgroundColor?: string;
/** 检索高亮标签(retrive-tag)行内标记 */
retrive?: boolean;
};
export interface BaseElement {
type: string;
children: (CustomElement | CustomText)[];
align?: 'left' | 'center' | 'right';
}
export interface ParagraphElement extends BaseElement {
type: 'paragraph';
}
export interface HeadingOneElement extends BaseElement {
type: 'heading-one';
}
export interface HeadingTwoElement extends BaseElement {
type: 'heading-two';
}
export interface HeadingThreeElement extends BaseElement {
type: 'heading-three';
}
export interface ListElement extends BaseElement {
type: 'bulleted-list' | 'numbered-list';
}
export interface ListItemElement extends BaseElement {
type: 'list-item';
}
export interface TableElement extends BaseElement {
type: 'table';
}
export interface TableRowElement extends BaseElement {
type: 'table-row';
}
export interface TableCellElement extends BaseElement {
type: 'table-cell';
header?: boolean;
}
export interface ImageElement extends BaseElement {
type: 'image';
url: string;
alt?: string;
width?: number;
height?: number;
}
export interface IframeElement extends BaseElement {
type: 'iframe';
src: string;
width?: string;
height?: string;
frameborder?: string;
title?: string;
}
export interface CodeBlockElement extends BaseElement {
type: 'code-block';
language?: string;
}
export interface BlockQuoteElement extends BaseElement {
type: 'block-quote';
}
export interface LinkElement extends BaseElement {
type: 'link';
url: string;
}
/**
* 思考块元素类型,用于解析 ...
*/
export interface ThinkElement extends BaseElement {
type: 'think';
}
/**
* 数据库表格元素类型,用于解析
*/
export interface RetrieveSqlDataElement extends BaseElement {
type: 'retrieve-sql-data';
id: string;
}
/**
* 模版输入字段元素类型
* 用于在富文本中插入可编辑的模版输入框
*/
export interface TemplateInputElement extends BaseElement {
type: 'template-input';
/** 输入框的占位符文本 */
placeholder?: string;
/** 输入框的默认值 */
defaultValue?: string;
/** 输入框的当前值 */
value?: string;
/** 是否处于编辑状态 */
isEditing?: boolean;
/** 输入框的样式类型 */
style?: 'blue' | 'green' | 'purple' | 'custom';
/** 自定义样式 */
customStyle?: {
backgroundColor?: string;
borderColor?: string;
textColor?: string;
};
}
/**
* 模版元素类型
* 用于在富文本中插入可编辑的模版输入块
*/
export interface TemplateElement extends BaseElement {
type: 'template';
/** 占位符文本 */
placeholder: string;
/** 当前值 */
value: string;
/** 样式类型 */
style: 'blue' | 'green' | 'purple';
/** 字段标识 */
fieldId: string;
/** 是否处于编辑状态 */
isEditing?: boolean;
}
/**
* 行内 LaTeX 公式节点
* 2025-11-25 新增: 支持 KaTeX 行内渲染
*/
export interface LatexInlineElement extends BaseElement {
type: 'latex-inline';
/** LaTeX 公式原文 */
formula: string;
}
/**
* 块级 LaTeX 公式节点
* 2025-11-25 新增: 支持 KaTeX 块级渲染
*/
export interface LatexBlockElement extends BaseElement {
type: 'latex-block';
/** LaTeX 公式原文 */
formula: string;
}
export type CustomElement = ParagraphElement | HeadingOneElement | HeadingTwoElement | HeadingThreeElement | ListElement | ListItemElement | TableElement | TableRowElement | TableCellElement | ImageElement | IframeElement | CodeBlockElement | BlockQuoteElement | LinkElement | TemplateInputElement | TemplateElement | LatexInlineElement | LatexBlockElement | ThinkElement;
declare module 'slate' {
interface CustomTypes {
Editor: BaseEditor & ReactEditor;
Element: CustomElement;
Text: CustomText;
}
}
export interface AdapterProps {
/** 主题样式 */
styles?: RichTextStyles;
/** 事件回调 */
events?: RichTextEvents;
/** 自定义组件 */
customComponents?: Record>;
/** 其他属性 */
[key: string]: any;
}
export type MergedEventsEmit = (eventName: string, ...args: any[]) => void;
export type MergedCustomizeComponents = Record>;