From 96feb38aea7de977f035b80a7724f8b4de6b1641 Mon Sep 17 00:00:00 2001 From: Auto Date: Sun, 8 Feb 2026 15:41:17 +0200 Subject: [PATCH] ui: restructure header navbar into two-row responsive layout Redesign the header from a single overflowing row into a clean two-row layout that prevents content from overlapping the logo and bleeding outside the navbar on smaller screens. Row 1: Logo + project selector + spacer + mode badges + utility icons Row 2: Agent controls + dev server + spacer + settings + reset (only rendered when a project is selected, with a subtle border divider) Changes: - App.tsx: Split header into two logical rows with flex spacers for right-alignment; hide title text below md breakpoint; move mode badges (Ollama/GLM) to row 1 with sm:hidden for small screens - ProjectSelector: Responsive min-width (140px mobile, 200px desktop); truncate long project names instead of pushing icons off-screen - AgentControl: Responsive gap (gap-2 mobile, gap-4 desktop) Co-Authored-By: Claude Opus 4.6 --- ui/src/App.tsx | 149 +++++++++++++------------- ui/src/components/AgentControl.tsx | 2 +- ui/src/components/ProjectSelector.tsx | 8 +- 3 files changed, 81 insertions(+), 78 deletions(-) diff --git a/ui/src/App.tsx b/ui/src/App.tsx index 7e01de4..b6784fc 100644 --- a/ui/src/App.tsx +++ b/ui/src/App.tsx @@ -261,19 +261,19 @@ function App() {
{/* Header */}
-
+
-
+ {/* Row 1: Branding + Project + Utility icons */} +
{/* Logo and Title */} -
+
AutoForge -

+

AutoForge

- {/* Controls */} -
+ {/* Project selector */} - {selectedProject && ( - <> - + {/* Spacer */} +
- - - - - - - Settings (,) - - - - - - - Reset (R) - - - {/* Ollama Mode Indicator */} - {settings?.ollama_mode && ( -
- Ollama - Ollama -
- )} - - {/* GLM Mode Badge */} - {settings?.glm_mode && ( - - GLM - - )} - + {/* Ollama Mode Indicator */} + {selectedProject && settings?.ollama_mode && ( +
+ Ollama + Ollama +
)} - {/* Docs link */} + {/* GLM Mode Badge */} + {selectedProject && settings?.glm_mode && ( + + GLM + + )} + + {/* Utility icons - always visible */}
+ + {/* Row 2: Project controls - only when a project is selected */} + {selectedProject && ( +
+ + + + +
+ + + + + + Settings (,) + + + + + + + Reset (R) + +
+ )}
diff --git a/ui/src/components/AgentControl.tsx b/ui/src/components/AgentControl.tsx index cc6e3ba..3529c03 100644 --- a/ui/src/components/AgentControl.tsx +++ b/ui/src/components/AgentControl.tsx @@ -81,7 +81,7 @@ export function AgentControl({ projectName, status, defaultConcurrency = 3 }: Ag return ( <> -
+
{/* Concurrency slider - visible when stopped */} {isStopped && (
diff --git a/ui/src/components/ProjectSelector.tsx b/ui/src/components/ProjectSelector.tsx index 5973895..10b4839 100644 --- a/ui/src/components/ProjectSelector.tsx +++ b/ui/src/components/ProjectSelector.tsx @@ -73,16 +73,16 @@ export function ProjectSelector({