diff --git a/atomizer-dashboard/frontend/src/components/canvas/AtomizerCanvas.tsx b/atomizer-dashboard/frontend/src/components/canvas/AtomizerCanvas.tsx index 310c3d0f..8c280a5c 100644 --- a/atomizer-dashboard/frontend/src/components/canvas/AtomizerCanvas.tsx +++ b/atomizer-dashboard/frontend/src/components/canvas/AtomizerCanvas.tsx @@ -118,7 +118,7 @@ function CanvasFlow() { }; return ( -
+
{/* Left: Node Palette */} @@ -137,10 +137,15 @@ function CanvasFlow() { onPaneClick={onPaneClick} nodeTypes={nodeTypes} fitView + className="bg-dark-900" > - - - + + + {/* Action Buttons */} @@ -149,8 +154,8 @@ function CanvasFlow() { onClick={() => setShowChat(!showChat)} className={`px-3 py-2 rounded-lg transition-colors ${ showChat - ? 'bg-blue-100 text-blue-700' - : 'bg-gray-100 text-gray-600 hover:bg-gray-200' + ? 'bg-primary-600/20 text-primary-400 border border-primary-500/50' + : 'bg-dark-800 text-dark-300 hover:bg-dark-700 border border-dark-600' }`} title="Toggle Chat" > @@ -158,17 +163,17 @@ function CanvasFlow() { diff --git a/atomizer-dashboard/frontend/src/components/canvas/nodes/BaseNode.tsx b/atomizer-dashboard/frontend/src/components/canvas/nodes/BaseNode.tsx index 94348b78..a027c70c 100644 --- a/atomizer-dashboard/frontend/src/components/canvas/nodes/BaseNode.tsx +++ b/atomizer-dashboard/frontend/src/components/canvas/nodes/BaseNode.tsx @@ -16,7 +16,7 @@ function BaseNodeComponent({ selected, icon, color, - colorBg = 'bg-gray-50', + colorBg = 'bg-dark-700', children, inputs = 1, outputs = 1, @@ -27,13 +27,13 @@ function BaseNodeComponent({ return (
@@ -56,9 +56,9 @@ function BaseNodeComponent({ type="target" position={Position.Left} className={` - !w-4 !h-4 !border-2 !border-white !shadow-md + !w-4 !h-4 !border-2 !border-dark-800 !shadow-md transition-all duration-200 - ${selected ? '!bg-blue-500' : '!bg-gray-400 group-hover:!bg-gray-500'} + ${selected ? '!bg-primary-500' : '!bg-dark-400 group-hover:!bg-dark-300'} `} style={{ left: -8 }} /> @@ -74,16 +74,16 @@ function BaseNodeComponent({ {icon}
- {data.label} + {data.label} {!isConfigured && ( - Needs config + Needs config )}
{/* Content */} {children && ( -
+
{children}
)} @@ -95,14 +95,14 @@ function BaseNodeComponent({ ) : isConfigured ? ( ) : ( - + )}
{/* Errors */} {hasError && ( -
-

+

+

{data.errors?.[0]}

@@ -115,9 +115,9 @@ function BaseNodeComponent({ type="source" position={Position.Right} className={` - !w-4 !h-4 !border-2 !border-white !shadow-md + !w-4 !h-4 !border-2 !border-dark-800 !shadow-md transition-all duration-200 - ${selected ? '!bg-blue-500' : '!bg-gray-400 group-hover:!bg-gray-500'} + ${selected ? '!bg-primary-500' : '!bg-dark-400 group-hover:!bg-dark-300'} `} style={{ right: -8 }} /> diff --git a/atomizer-dashboard/frontend/src/components/canvas/palette/NodePalette.tsx b/atomizer-dashboard/frontend/src/components/canvas/palette/NodePalette.tsx index 14236761..d41ffe43 100644 --- a/atomizer-dashboard/frontend/src/components/canvas/palette/NodePalette.tsx +++ b/atomizer-dashboard/frontend/src/components/canvas/palette/NodePalette.tsx @@ -26,8 +26,8 @@ export function NodePalette() { }; return ( -
-

+
+

Components

@@ -36,13 +36,14 @@ export function NodePalette() { key={item.type} draggable onDragStart={(e) => onDragStart(e, item.type)} - className="flex items-center gap-3 p-3 bg-white rounded-lg border border-gray-200 - cursor-grab hover:border-blue-300 hover:shadow-sm transition-all" + className="flex items-center gap-3 p-3 bg-dark-800 rounded-lg border border-dark-600 + cursor-grab hover:border-primary-500/50 hover:bg-dark-750 transition-all + active:cursor-grabbing" > {item.icon}
-
{item.label}
-
{item.description}
+
{item.label}
+
{item.description}
))} diff --git a/atomizer-dashboard/frontend/src/components/canvas/panels/ChatPanel.tsx b/atomizer-dashboard/frontend/src/components/canvas/panels/ChatPanel.tsx index 1afcff85..3a9f3ccb 100644 --- a/atomizer-dashboard/frontend/src/components/canvas/panels/ChatPanel.tsx +++ b/atomizer-dashboard/frontend/src/components/canvas/panels/ChatPanel.tsx @@ -20,15 +20,15 @@ export function ChatPanel({ messages, isThinking }: ChatPanelProps) { }, [messages, isThinking]); return ( -
+
{/* Welcome message if no messages */} {messages.length === 0 && !isThinking && (
-
+
🧠
-

- Use Validate, Analyze, or Execute to interact with Claude about your optimization workflow. +

+ Use Validate, Analyze, or Execute to interact with Claude about your optimization workflow.

)} diff --git a/atomizer-dashboard/frontend/src/components/canvas/panels/ConfigImporter.tsx b/atomizer-dashboard/frontend/src/components/canvas/panels/ConfigImporter.tsx index eb8d44af..f87a1d05 100644 --- a/atomizer-dashboard/frontend/src/components/canvas/panels/ConfigImporter.tsx +++ b/atomizer-dashboard/frontend/src/components/canvas/panels/ConfigImporter.tsx @@ -110,21 +110,21 @@ export function ConfigImporter({ isOpen, onClose, onImport }: ConfigImporterProp }; return ( -
-
+
+
{/* Header */} -
-

Import Configuration

+
+

Import Configuration

{/* Tabs */} -
+
{[ { id: 'file', label: 'Upload File' }, { id: 'paste', label: 'Paste JSON' }, @@ -135,8 +135,8 @@ export function ConfigImporter({ isOpen, onClose, onImport }: ConfigImporterProp onClick={() => setTab(t.id as 'file' | 'paste' | 'study')} className={`flex-1 px-4 py-3 text-sm font-medium transition-colors ${ tab === t.id - ? 'text-blue-600 border-b-2 border-blue-600 bg-blue-50' - : 'text-gray-500 hover:text-gray-700 hover:bg-gray-50' + ? 'text-primary-400 border-b-2 border-primary-500 bg-dark-800' + : 'text-dark-400 hover:text-white hover:bg-dark-800' }`} > {t.label} @@ -149,8 +149,8 @@ export function ConfigImporter({ isOpen, onClose, onImport }: ConfigImporterProp {/* File Upload Tab */} {tab === 'file' && (
-

- Upload an optimization_config.json file +

+ Upload an optimization_config.json file from an existing study.

fileInputRef.current?.click()} disabled={isLoading} - className="w-full py-8 border-2 border-dashed border-gray-300 rounded-lg hover:border-blue-400 hover:bg-blue-50 transition-colors flex flex-col items-center gap-2" + className="w-full py-8 border-2 border-dashed border-dark-600 rounded-lg hover:border-primary-500/50 hover:bg-dark-800 transition-colors flex flex-col items-center gap-2" > 📁 - + {isLoading ? 'Loading...' : 'Click to select file'} @@ -176,7 +176,7 @@ export function ConfigImporter({ isOpen, onClose, onImport }: ConfigImporterProp {/* Paste JSON Tab */} {tab === 'paste' && (
-

+

Paste your optimization configuration JSON below.