From df020676877da32fa164af63663154c691bd33ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hartmut=20N=C3=B6renberg?= Date: Fri, 6 Mar 2026 18:21:35 +0100 Subject: [PATCH] fix(ui): theme WorkflowEditor for dark mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace all hardcoded gray-*/white Tailwind classes with semantic CSS variable tokens (bg-surface, text-content, border-border-default, etc.) so the page respects dark/light mode correctly. - Sidebar, header bar, toolbar: bg-surface + border-border-default - Node cards: bg-surface + border-accent (selected) / border-border-default - ConfigSidepanel: bg-surface, text-content-secondary labels - NewWorkflowModal: bg-surface, border-border-default inputs, accent buttons - Workflow list items: bg-accent-light highlight for selected, hover:bg-surface-hover - Empty state icon: text-content-muted - ReactFlow: colorMode prop tied to useThemeStore (dark/light) - Background: removed hardcoded #e5e7eb dot color (uses ReactFlow colorMode) - All blue-600 buttons → bg-accent / hover:bg-accent-hover Co-Authored-By: Claude Sonnet 4.6 --- frontend/src/pages/WorkflowEditor.tsx | 133 +++++++++++++------------- 1 file changed, 69 insertions(+), 64 deletions(-) diff --git a/frontend/src/pages/WorkflowEditor.tsx b/frontend/src/pages/WorkflowEditor.tsx index 47d36f9..77d71a2 100644 --- a/frontend/src/pages/WorkflowEditor.tsx +++ b/frontend/src/pages/WorkflowEditor.tsx @@ -15,6 +15,7 @@ import { type NodeTypes, } from '@xyflow/react' import '@xyflow/react/dist/style.css' +import { useThemeStore, resolveTheme } from '../store/theme' import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query' import { getWorkflows, @@ -55,8 +56,8 @@ interface BaseNodeProps { function BaseNode({ label, icon, color, description, selected, hasSource = true, hasTarget = true }: BaseNodeProps) { return (
{hasTarget && ( @@ -236,12 +237,12 @@ function ConfigSidepanel({ onChange: (p: WorkflowParams) => void }) { return ( -
-

Node-Konfiguration

+
+

Node-Konfiguration

{/* Render Engine */}
- +
{(['cycles', 'eevee'] as const).map(eng => (
- + setName(e.target.value)} @@ -385,7 +386,7 @@ function NewWorkflowModal({ onClose, onCreate, isLoading }: NewWorkflowModalProp
- +
{([ { value: 'still', label: 'Still', desc: 'Einzelbild PNG' }, @@ -398,12 +399,12 @@ function NewWorkflowModal({ onClose, onCreate, isLoading }: NewWorkflowModalProp onClick={() => setType(opt.value)} className={`p-3 rounded-lg border-2 text-left transition-colors ${ type === opt.value - ? 'border-blue-500 bg-blue-50' - : 'border-gray-200 hover:border-gray-300' + ? 'border-accent bg-accent-light' + : 'border-border-default hover:border-border-light' }`} > -

{opt.label}

-

{opt.desc}

+

{opt.label}

+

{opt.desc}

))}
@@ -413,14 +414,14 @@ function NewWorkflowModal({ onClose, onCreate, isLoading }: NewWorkflowModalProp
@@ -520,11 +521,14 @@ function FlowCanvas({ workflow, onSave, isSaving }: FlowCanvasProps) { const selectedNode = nodes.find(n => n.id === selectedNodeId) + const { mode } = useThemeStore() + const isDark = resolveTheme(mode) === 'dark' + return (
{/* Canvas Toolbar */} -
- Nodes: +
+ Nodes: {NODE_PALETTE.map(item => (
{item.icon} {item.label} @@ -543,7 +547,7 @@ function FlowCanvas({ workflow, onSave, isSaving }: FlowCanvasProps) { @@ -695,12 +700,12 @@ export default function WorkflowEditor() { onClick={() => setSelectedId(wf.id)} className={`w-full text-left px-3 py-2.5 rounded-lg transition-colors group ${ selectedId === wf.id - ? 'bg-blue-50 border border-blue-200' - : 'hover:bg-gray-50 border border-transparent' + ? 'bg-accent-light border border-accent/30' + : 'hover:bg-surface-hover border border-transparent' }`} >
-

{wf.name}

+

{wf.name}

))} @@ -732,16 +737,16 @@ export default function WorkflowEditor() { {/* Main Canvas Area */}
{/* Header */} -
+
-

Workflow-Editor

+

Workflow-Editor

{selectedWorkflow && ( -

{selectedWorkflow.name}

+

{selectedWorkflow.name}

)}