From dc25e585c512ae6af31c564be151d89b7576ed46 Mon Sep 17 00:00:00 2001 From: shrimbly Date: Tue, 10 Mar 2026 21:40:02 +1300 Subject: [PATCH] ui: redesign ProjectSetupModal with pill tabs, segmented controls, and polish Replace underline tab bar with pill-style segmented tabs. Replace radio button lists in Canvas tab with compact segmented button groups. Add backdrop blur, click-outside-to-close, rounded-lg inputs, and improved text contrast (neutral-400 instead of neutral-500 for descriptions). Co-Authored-By: Claude Opus 4.6 --- src/components/ProjectSetupModal.tsx | 267 ++++++++++++++------------- 1 file changed, 135 insertions(+), 132 deletions(-) diff --git a/src/components/ProjectSetupModal.tsx b/src/components/ProjectSetupModal.tsx index 60ca0497..a8f6ba4d 100644 --- a/src/components/ProjectSetupModal.tsx +++ b/src/components/ProjectSetupModal.tsx @@ -381,39 +381,47 @@ export function ProjectSetupModal({ if (!isOpen) return null; return ( -
+
e.stopPropagation()} + >
e.stopPropagation()} onKeyDown={handleKeyDown} > -
-

- {mode === "new" ? "New Project" : "Project Settings"} -

+
+
+ +

+ {mode === "new" ? "New Project" : "Project Settings"} +

+
{/* Tab Bar */} -
+
@@ -421,7 +429,7 @@ export function ProjectSetupModal({
{/* Scrollable tab content area */} -
+
{/* Project Tab Content */} {activeTab === "project" && ( @@ -436,7 +444,7 @@ export function ProjectSetupModal({ onChange={(e) => setName(e.target.value)} placeholder="my-project" autoFocus - className="w-full px-3 py-2 bg-neutral-900 border border-neutral-600 rounded text-neutral-100 text-sm focus:outline-none focus:border-neutral-500" + className="w-full px-3 py-2 bg-neutral-900 border border-neutral-600 rounded-lg text-neutral-100 text-sm focus:outline-none focus:border-neutral-500" />
@@ -450,18 +458,18 @@ export function ProjectSetupModal({ value={directoryPath} onChange={(e) => setDirectoryPath(e.target.value)} placeholder="/Users/username/projects/my-project" - className="flex-1 px-3 py-2 bg-neutral-900 border border-neutral-600 rounded text-neutral-100 text-sm focus:outline-none focus:border-neutral-500" + className="flex-1 px-3 py-2 bg-neutral-900 border border-neutral-600 rounded-lg text-neutral-100 text-sm focus:outline-none focus:border-neutral-500" />
-

+

Workflow files and images will be saved here. Subfolders for inputs and generations will be auto-created.

@@ -470,7 +478,7 @@ export function ProjectSetupModal({
-

+

Add API keys via .env.local for better security. Keys added here override .env and are stored in your browser.

@@ -897,7 +899,7 @@ export function ProjectSetupModal({ ) : ( <> - System default (Gemini nano-banana-pro) + System default (Gemini nano-banana-pro)
{!localNodeDefaults.llm ? ( -

Using system defaults (Google Gemini 3 Flash)

+

Using system defaults (Google Gemini 3 Flash)

) : null} {/* Provider dropdown */} @@ -1092,14 +1094,14 @@ export function ProjectSetupModal({ className="flex-1 h-1 bg-neutral-700 rounded-lg appearance-none cursor-pointer accent-neutral-400" />
-

+

Maximum number of nodes to execute in parallel during workflow execution. Higher values may improve speed but increase API rate limit risk.

-

+

These defaults are applied when creating nodes via keyboard shortcuts (Shift+G, Shift+L, etc).

@@ -1107,106 +1109,107 @@ export function ProjectSetupModal({ {/* Canvas Tab Content */} {activeTab === "canvas" && ( -
+
+

Configure how you navigate and interact with the canvas.

{/* Pan Mode */} -
-

Pan Mode

-
- {([ - { value: "space" as PanMode, label: "Space + Drag", description: "Hold Space and drag to pan (default)" }, - { value: "middleMouse" as PanMode, label: "Middle Mouse", description: "Click and drag with middle mouse button" }, - { value: "always" as PanMode, label: "Always On", description: "Pan without holding any keys" }, - ] as const).map((option) => ( - - ))} +
+
+
+ Pan Mode +

+ {localCanvasSettings.panMode === "space" && "Hold Space and drag to pan"} + {localCanvasSettings.panMode === "middleMouse" && "Click and drag with middle mouse button"} + {localCanvasSettings.panMode === "always" && "Pan without holding any keys"} +

+
+
+ {([ + { value: "space" as PanMode, label: "Space + Drag" }, + { value: "middleMouse" as PanMode, label: "Middle Mouse" }, + { value: "always" as PanMode, label: "Always On" }, + ] as const).map((option) => ( + + ))} +
{/* Zoom Mode */} -
-

Zoom Mode

-
- {([ - { value: "altScroll" as ZoomMode, label: "Alt + Scroll", description: "Hold Alt and scroll to zoom (default)" }, - { value: "ctrlScroll" as ZoomMode, label: "Ctrl + Scroll", description: "Hold Ctrl/Cmd and scroll to zoom" }, - { value: "scroll" as ZoomMode, label: "Scroll", description: "Scroll to zoom without holding any keys" }, - ] as const).map((option) => ( - - ))} +
+
+
+ Zoom Mode +

+ {localCanvasSettings.zoomMode === "altScroll" && "Hold Alt and scroll to zoom"} + {localCanvasSettings.zoomMode === "ctrlScroll" && "Hold Ctrl/Cmd and scroll to zoom"} + {localCanvasSettings.zoomMode === "scroll" && "Scroll to zoom without modifier keys"} +

+
+
+ {([ + { value: "altScroll" as ZoomMode, label: "Alt + Scroll" }, + { value: "ctrlScroll" as ZoomMode, label: "Ctrl + Scroll" }, + { value: "scroll" as ZoomMode, label: "Scroll" }, + ] as const).map((option) => ( + + ))} +
{/* Selection Mode */} -
-

Selection Mode

-
- {([ - { value: "click" as SelectionMode, label: "Click", description: "Click to select nodes (default)" }, - { value: "altDrag" as SelectionMode, label: "Alt + Drag", description: "Hold Alt and drag to select multiple nodes" }, - { value: "shiftDrag" as SelectionMode, label: "Shift + Drag", description: "Hold Shift and drag to select multiple nodes" }, - ] as const).map((option) => ( - - ))} +
+
+
+ Selection Mode +

+ {localCanvasSettings.selectionMode === "click" && "Click to select nodes"} + {localCanvasSettings.selectionMode === "altDrag" && "Hold Alt and drag to select"} + {localCanvasSettings.selectionMode === "shiftDrag" && "Hold Shift and drag to select"} +

+
+
+ {([ + { value: "click" as SelectionMode, label: "Click" }, + { value: "altDrag" as SelectionMode, label: "Alt + Drag" }, + { value: "shiftDrag" as SelectionMode, label: "Shift + Drag" }, + ] as const).map((option) => ( + + ))} +
@@ -1215,7 +1218,7 @@ export function ProjectSetupModal({
{/* Fixed footer */} -
+