import { CanvasNodeType } from "@/types/canvas"; import type { CanvasNodeMetadata } from "@/types/canvas"; type CanvasNodeSpec = { width: number; height: number; title: string; metadata?: CanvasNodeMetadata; }; export const NODE_DEFAULT_SIZE = { [CanvasNodeType.Image]: { width: 720, height: 405, title: "图片" }, [CanvasNodeType.Text]: { width: 340, height: 240, title: "Note" }, [CanvasNodeType.Drawing]: { width: 440, height: 300, title: "绘图" }, [CanvasNodeType.Script]: { width: 920, height: 360, title: "分镜脚本" }, [CanvasNodeType.Skill]: { width: 360, height: 220, title: "技能" }, // 配置节点同时承载模式、渠道、工作流和参数;预留稳定空间,避免控件和错误状态互相挤压。 [CanvasNodeType.Config]: { width: 480, height: 390, title: "生成配置" }, [CanvasNodeType.Video]: { width: 720, height: 405, title: "视频" }, [CanvasNodeType.Audio]: { width: 340, height: 120, title: "Audio" }, [CanvasNodeType.Frame]: { width: 760, height: 520, title: "未命名背板" }, [CanvasNodeType.Markdown]: { width: 420, height: 320, title: "Markdown" }, [CanvasNodeType.Svg]: { width: 420, height: 320, title: "SVG" }, [CanvasNodeType.Html]: { width: 520, height: 380, title: "HTML" }, [CanvasNodeType.Panorama]: { width: 520, height: 300, title: "全景" }, [CanvasNodeType.Compare]: { width: 520, height: 320, title: "对比" }, [CanvasNodeType.Chart]: { width: 480, height: 320, title: "图表" }, [CanvasNodeType.ColorGrade]: { width: 420, height: 360, title: "调色" }, } satisfies Record; export const NODE_SPECS = { [CanvasNodeType.Image]: { ...NODE_DEFAULT_SIZE[CanvasNodeType.Image], metadata: { content: "", status: "idle" }, }, [CanvasNodeType.Text]: { ...NODE_DEFAULT_SIZE[CanvasNodeType.Text], metadata: { content: "", status: "idle", fontSize: 14 }, }, [CanvasNodeType.Drawing]: { ...NODE_DEFAULT_SIZE[CanvasNodeType.Drawing], metadata: { status: "success" }, }, [CanvasNodeType.Script]: { ...NODE_DEFAULT_SIZE[CanvasNodeType.Script], metadata: { status: "idle", workflowKind: "script", storyboard: { rows: [], visibleColumns: ["shotNumber", "durationSeconds", "videoMotionPrompt", "dialogue", "assets"], referenceNodeIds: [], }, }, }, [CanvasNodeType.Skill]: { ...NODE_DEFAULT_SIZE[CanvasNodeType.Skill], metadata: { status: "success" }, }, [CanvasNodeType.Config]: { ...NODE_DEFAULT_SIZE[CanvasNodeType.Config], metadata: { content: "", status: "idle", generationMode: "image" }, }, [CanvasNodeType.Video]: { ...NODE_DEFAULT_SIZE[CanvasNodeType.Video], metadata: { content: "", status: "idle" }, }, [CanvasNodeType.Audio]: { ...NODE_DEFAULT_SIZE[CanvasNodeType.Audio], metadata: { content: "", status: "idle" }, }, [CanvasNodeType.Frame]: { ...NODE_DEFAULT_SIZE[CanvasNodeType.Frame], metadata: { frame: { collapsed: false, expandedWidth: NODE_DEFAULT_SIZE[CanvasNodeType.Frame].width, expandedHeight: NODE_DEFAULT_SIZE[CanvasNodeType.Frame].height } }, }, [CanvasNodeType.Markdown]: { ...NODE_DEFAULT_SIZE[CanvasNodeType.Markdown], metadata: { content: "", status: "idle" }, }, [CanvasNodeType.Svg]: { ...NODE_DEFAULT_SIZE[CanvasNodeType.Svg], metadata: { content: "", status: "idle" }, }, [CanvasNodeType.Html]: { ...NODE_DEFAULT_SIZE[CanvasNodeType.Html], metadata: { content: "", status: "idle" }, }, [CanvasNodeType.Panorama]: { ...NODE_DEFAULT_SIZE[CanvasNodeType.Panorama], metadata: { content: "", status: "idle" }, }, [CanvasNodeType.Compare]: { ...NODE_DEFAULT_SIZE[CanvasNodeType.Compare], metadata: { status: "idle" }, }, [CanvasNodeType.Chart]: { ...NODE_DEFAULT_SIZE[CanvasNodeType.Chart], metadata: { content: "", status: "idle" }, }, [CanvasNodeType.ColorGrade]: { ...NODE_DEFAULT_SIZE[CanvasNodeType.ColorGrade], metadata: { status: "idle" }, }, } satisfies Record; export function getNodeSpec(type: CanvasNodeType) { return NODE_SPECS[type]; }