25 lines
1.9 KiB
TypeScript
25 lines
1.9 KiB
TypeScript
/**
|
|
* 内置画布类型到React组件的装配表。把bindings层的renderer描述绑定到实际节点/连线组件,生成默认React渲染注册表。
|
|
* 这张表保存可复用的显示定义,不保存每个元素的数据、选择或编辑状态。
|
|
*/
|
|
"use client";
|
|
import type { NodeProps } from '@xyflow/react';
|
|
import type { CanvasNode } from '@/lib/canvas-elements';
|
|
import { builtinRendererDefinitions } from '@/lib/canvas-bindings/renderers';
|
|
import { createReactRenderers, type ReactRendererDefinition } from '@/lib/canvas-bindings/react-flow';
|
|
import { MaterialNode } from './material-node';
|
|
import { PlainTextNode } from './plain-text-node';
|
|
import { PlainImageNode } from './plain-image-node';
|
|
import { FrameNode } from './frame-node';
|
|
import { IconNode } from './icon-node';
|
|
import { CanvasEdge } from './canvas-edge';
|
|
/** 新版分区复用FrameNode,但开启directAnchors,使它使用该模式的直接连接点。
|
|
* 其它NodeProps透传,包装层不再创建一份分区模型。 */
|
|
function HeadlessFrameNode(props:NodeProps<CanvasNode>){return <FrameNode {...props} directAnchors />;}
|
|
/** rendererId到节点组件的固定映射;这里的键与builtinRendererDefinitions中节点的rendererId配套。 */
|
|
const nodes={material:MaterialNode,plainText:PlainTextNode,plainImage:PlainImageNode,frame:HeadlessFrameNode,icon:IconNode};
|
|
/** 每项保留原始类型/结构描述,node按rendererId查表,connection绑定CanvasEdge。
|
|
* render与preview目前共用同一个组件;createReactRenderers负责生成供ReactFlow使用的注册结果。
|
|
* 本表没有自定义类型的通配组件,兼容占位由投影/渲染选择链路处理。 */
|
|
export const defaultCanvasRenderers=createReactRenderers(builtinRendererDefinitions.map(definition=>{const render=definition.structure==='node'?nodes[definition.rendererId as keyof typeof nodes]:CanvasEdge;return{...definition,render,preview:render} as ReactRendererDefinition;}));
|