import React from "react"; import type { ComponentData } from "../component-parser"; import { DesignerContext } from "../context"; import "./editor-panel.scss"; export interface IEditorPanel { selectComponent(componentId: string): void; } export interface EditorPanelProps { componentData: ComponentData; onChanged?: (componentData: ComponentData, componentId?: string, propName?: string, value?: any) => void; } /** * 面板:编辑器以「栈」的形式存在,默认只有一块(main),承载组件编辑器; * 调用 showNext 会向栈顶压入一块新的 child 面板,用于渲染子组件编辑器。 */ type Panel = { id: string; kind: "main"; title: string; } | { id: string; kind: "child"; title: string; content: React.ReactNode; }; interface EditorPanelState { /** 导航栈:从根组件到当前选中组件的 id 路径(用于面包屑/返回/子组件切换) */ navigationStack?: string[]; /** 本地缓存的组件数据副本:属性修改直接更新此副本并触发重渲染 */ componentData?: ComponentData; /** 属性面板搜索关键词:过滤属性行 */ search?: string; /** 面板栈:默认一块(main,承载组件编辑器),showNext 压入子面板 */ panels?: Panel[]; panelProps: ChildPanelProps[]; } export declare class EditorPanel extends React.Component implements IEditorPanel { static contextType: React.Context; context: React.ContextType; constructor(props: EditorPanelProps); /** * 父组件传入新的 componentData(撤销/重做、代码编辑等)时同步到 state。 * 选中状态随数据持久化:数据带 selected 标记时按标记回同步导航栈(撤销会一并恢复选中); * 无标记时保持当前选中(栈顶已不存在则回退根组件)。 */ static getDerivedStateFromProps(props: EditorPanelProps, state: EditorPanelState): Partial | null; /** 选中某组件:计算其在组件树中的路径作为导航栈,并把 selected 标记移动到该组件(经 onChanged 通知 designer) */ selectComponent: (componentId: string) => void; /** 面包屑点击:切换当前编辑的组件 */ private navigateTo; /** * 切换到指定下标的面板(导航栏点击):清除该面板上方的所有子面板。 * index 超出范围时忽略。 */ navigateToPanel: (index: number) => void; /** component-editor2 子类编辑器的回调:value 为整份组件数据,替换选中组件的 props; * 若子树带有新的 selected 标记(内嵌编辑器/子组件跳转发起),则导航到该组件 */ private handleComponentDataChange; /** 渲染当前选中组件的编辑器:注册表条目为 React 元素时克隆注入选中组件数据,旧类条目直接实例化 */ private renderEditor; render(): React.JSX.Element; } interface ChildPanelProps { editor: React.ReactElement; componentData: ComponentData; onChange?: (value: ComponentData) => void; } export {};