// 插件模板:复制本目录 → 改 id/name/type → 写你的节点。 // 这是一个演示节点:编辑文本、跟随主题、读取上游节点、用画布指令衍生新节点。 import { definePlugin, useState } from "@infinite-canvas/plugin-sdk"; import type { CanvasNodeContentProps } from "@infinite-canvas/plugin-sdk"; function TemplateContent({ ctx }: CanvasNodeContentProps) { const [editing, setEditing] = useState(false); const content = ctx.node.metadata?.content || ""; // 读取上游相连节点的文本内容(演示 ctx.getUpstream) const upstreamText = ctx .getUpstream() .map((node) => node.metadata?.content) .filter(Boolean) .join("\n"); // 用画布指令集衍生一个文本节点并连线(演示 ctx.applyOps) const spawnBelow = () => { const id = `template-${ctx.node.id}-${ctx.getNodes().length}`; ctx.applyOps([ { type: "add_node", id, nodeType: "text", title: "衍生节点", x: ctx.node.position.x, y: ctx.node.position.y + ctx.node.height + 40, metadata: { content, status: "success" } }, { type: "connect_nodes", fromNodeId: ctx.node.id, toNodeId: id }, ]); }; const btn = { padding: "4px 10px", borderRadius: 8, border: `1px solid ${ctx.theme.node.stroke}`, background: ctx.theme.toolbar.panel, color: ctx.theme.node.text, cursor: "pointer", fontSize: 12 } as const; return ( // data-canvas-no-zoom + stopPropagation:交互控件避免触发画布拖拽/缩放
e.stopPropagation()} style={{ height: "100%", width: "100%", display: "flex", flexDirection: "column", gap: 8, padding: 12, boxSizing: "border-box", color: ctx.theme.node.text }}>
{editing ? (