import React from 'react'; import { NodeData } from './GraphicsContext'; import { Input, Slider, Text } from '..'; // --- Custom Components for Node Bodies --- const NumberComponent: React.FC<{ data: NodeData; onUpdateData: (d: any) => void; }> = ({ data, onUpdateData }) => { const value = data.data?.value ?? 0; return (
onUpdateData({ value: parseFloat(e.target.value) || 0 })} />
); }; const SliderComponent: React.FC<{ data: NodeData; onUpdateData: (d: any) => void; }> = ({ data, onUpdateData }) => { const value = data.data?.value ?? 50; return (
onUpdateData({ value: v })} showValue />
); }; const DisplayComponent: React.FC<{ inputs: Record }> = ({ inputs }) => { const value = inputs.value; const displayValue = typeof value === 'object' ? JSON.stringify(value, null, 2) : value?.toString() ?? 'N/A'; return (
{displayValue}
); }; // --- Node Type Definitions --- export const numberNodeType: Omit = { label: 'Number Input', inputs: [], outputs: [{ id: 'value', label: 'Value', type: 'number', color: '#60a5fa' }], component: NumberComponent, process: (inputs, data) => ({ value: data?.value ?? 0 }), data: { value: 10 }, }; export const sliderNodeType: Omit = { label: 'Slider Input', inputs: [], outputs: [{ id: 'value', label: 'Value', type: 'number', color: '#f59e0b' }], component: SliderComponent, process: (inputs, data) => ({ value: data?.value ?? 50 }), data: { value: 50 }, }; export const addNodeType: Omit = { label: 'Add', inputs: [ { id: 'a', label: 'A', type: 'number', value: 0 }, { id: 'b', label: 'B', type: 'number', value: 0 }, ], outputs: [{ id: 'result', label: 'Result', type: 'number', color: '#10b981' }], process: (inputs) => ({ result: (inputs.a ?? 0) + (inputs.b ?? 0) }), }; export const subtractNodeType: Omit = { label: 'Subtract', inputs: [ { id: 'a', label: 'A', type: 'number', value: 0 }, { id: 'b', label: 'B', type: 'number', value: 0 }, ], outputs: [{ id: 'result', label: 'Result', type: 'number', color: '#ef4444' }], process: (inputs) => ({ result: (inputs.a ?? 0) - (inputs.b ?? 0) }), }; export const displayNodeType: Omit = { label: 'Display', inputs: [{ id: 'value', label: 'Value', type: 'any' }], outputs: [], component: DisplayComponent, }; export const openGLNodeType: Omit = { label: 'GPU Shader (Concept)', inputs: [ { id: 'color', label: 'Color', type: 'any' }, { id: 'position', label: 'Position', type: 'any' }, ], outputs: [{ id: 'fragColor', label: 'Frag Color', type: 'any' }], process: (inputs) => ({ fragColor: inputs.color ?? { r: 0, g: 0, b: 0, a: 1 } }), component: () => This node simulates a shader. }; export const creatableNodeTypes = { 'Number Input': numberNodeType, 'Slider Input': sliderNodeType, 'Add': addNodeType, 'Subtract': subtractNodeType, 'Display': displayNodeType, };