import React from 'react'; import { Node } from 'reactflow'; import { NodeData, LayerDefinition, LogEntry } from '../types'; import { LAYER_DEFINITIONS } from '../constants'; import { X, Trash2, Activity, Info, CheckCircle, AlertTriangle, AlertOctagon, ChevronDown } from 'lucide-react'; import GoogleAd from './GoogleAd'; interface PropertiesPanelProps { selectedNode: Node | null; onChange: (id: string, newData: Partial) => void; onDelete: (id: string) => void; onClose: () => void; logs?: LogEntry[]; isOpen: boolean; // Mobile visibility state } const PropertiesPanel: React.FC = ({ selectedNode, onChange, onDelete, onClose, logs = [], isOpen }) => { const containerClasses = ` bg-slate-900 flex flex-col transition-all duration-300 z-30 shadow-2xl fixed inset-x-0 bottom-0 h-[60vh] w-full border-t border-slate-700 rounded-t-xl ${isOpen ? 'translate-y-0' : 'translate-y-full'} md:relative md:inset-auto md:h-full md:w-80 md:border-l md:border-t-0 md:rounded-none md:translate-y-0 md:shadow-none `; if (!selectedNode) { return (

System Activity

{/* Mobile Close Handle */}
{logs.length === 0 ? (

No activity recorded yet.

) : ( logs.map(log => (
{log.type === 'info' && } {log.type === 'success' && } {log.type === 'warning' && } {log.type === 'error' && } {log.type}
{log.timestamp.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit' })}

{log.message}

)) )}

Select a node on the canvas to configure parameters.

); } const definition: LayerDefinition | undefined = LAYER_DEFINITIONS[selectedNode.data.type]; if (!definition) { return (

Unknown Layer

Error: Layer definition not found for type "{selectedNode.data.type}". This may happen if an imported template uses deprecated types.
); } const handleParamChange = (name: string, value: any, type: string) => { let parsedValue = value; if (type === 'number') parsedValue = Number(value); if (type === 'boolean') parsedValue = value === 'true'; // Update only the params object within data onChange(selectedNode.id, { params: { ...selectedNode.data.params, [name]: parsedValue } }); }; const handleLabelChange = (newLabel: string) => { onChange(selectedNode.id, { label: newLabel }); }; return (

{definition.label}

{selectedNode.id}

{definition.description}
{/* Node Label Renaming */}
handleLabelChange(e.target.value)} />
{definition.parameters.map((param) => (
{param.type === 'select' ? ( ) : param.type === 'boolean' ? ( ) : param.type === 'text' ? (