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>;