/** * 兼容占位组件:显示可理解的公共几何与说明文字,不解析未知类型的业务payload。 * 原始数据由模型保留;这些组件只提供占位绘制,不执行数据迁移,也不自行决定外层是否允许移动或选择。 */ "use client"; import { BaseEdge, Handle, Position, getBezierPath, type EdgeProps, type NodeProps } from "@xyflow/react"; import type {ReactFlowProjectionNode as ProjectionNode} from "@/lib/canvas-bindings/react-flow"; import type { CanvasEdgeModel } from "@/lib/canvas-v2"; import styles from "./canvas.module.css"; /** 将投影提供的四边方位转换成ReactFlow Handle要求的枚举。 */ const positions={top:Position.Top,right:Position.Right,bottom:Position.Bottom,left:Position.Left}; /** Render only the known envelope and derived endpoints, never interpret opaque payload fields. */ /** 使用投影已提供的标题、旋转和fallback元数据绘制占位节点,尺寸填满外层节点容器。 * renderer-unavailable明确表示当前缺少显示实现,其它情形提示原内容保留。 * 仍绘制已知连接点供现有连线定位,但禁止从这些Handle发起或接收新连接;不推断未知内容字段。 */ export function UnsupportedNode({data,selected}:NodeProps){ // fallback来自bindings投影;缺失时仍显示通用提示,不尝试从data猜测组件结构。 const fallback=data.__headlessFallback; return
{data.title}此元素需要兼容的组件版本才能编辑 {fallback?.reason==='renderer-unavailable'?'当前视图暂无此类型的编辑器':'原始内容已保留'} {fallback?.handles.map(handle=>)}
; } /** 直接使用ReactFlow推导的端点生成贝塞尔路径,附可访问标题;不调用未知类型的编辑/样式逻辑。 * BaseEdge绘制统一颜色的可见线条,数据保留与版本兼容仍归模型层负责。 */ export function UnsupportedEdge(props:EdgeProps){ const [path]=getBezierPath(props); return 原始连线内容已保留; }