From b3a213a43f177215e13b6bb430a46696544236e7 Mon Sep 17 00:00:00 2001 From: Raban von Spiegel Date: Wed, 14 Jan 2026 22:55:50 -0800 Subject: [PATCH 1/8] Refine titlebar context controls --- src/renderer/App.tsx | 5 + .../components/titlebar/OpenInMenu.tsx | 9 +- src/renderer/components/titlebar/Titlebar.tsx | 26 +++- .../components/titlebar/TitlebarContext.tsx | 116 ++++++++++++++++++ 4 files changed, 152 insertions(+), 4 deletions(-) create mode 100644 src/renderer/components/titlebar/TitlebarContext.tsx diff --git a/src/renderer/App.tsx b/src/renderer/App.tsx index ef699063..071a7d41 100644 --- a/src/renderer/App.tsx +++ b/src/renderer/App.tsx @@ -2129,6 +2129,11 @@ const AppContent: React.FC = () => { onToggleEditor={() => setShowEditorMode(!showEditorMode)} showEditorButton={Boolean(activeTask)} isEditorOpen={showEditorMode} + projects={projects} + selectedProject={selectedProject} + activeTask={activeTask} + onSelectProject={handleSelectProject} + onSelectTask={handleSelectTask} />
= ({ path, align = 'right' }) => { type="button" variant="ghost" size="sm" - className="h-8 gap-1 px-2 text-muted-foreground hover:bg-background/80" + className={[ + 'h-7 gap-1.5 px-2 text-[13px] font-medium leading-none text-muted-foreground hover:bg-background/70 hover:text-foreground', + open ? 'bg-background/80 text-foreground' : '', + ].join(' ')} onClick={async () => { const newState = !open; void import('../../lib/telemetryClient').then(({ captureTelemetry }) => { @@ -141,7 +144,9 @@ const OpenInMenu: React.FC = ({ path, align = 'right' }) => { > Open in diff --git a/src/renderer/components/titlebar/Titlebar.tsx b/src/renderer/components/titlebar/Titlebar.tsx index 98b693f0..210684f4 100644 --- a/src/renderer/components/titlebar/Titlebar.tsx +++ b/src/renderer/components/titlebar/Titlebar.tsx @@ -14,6 +14,8 @@ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../ui/ import OpenInMenu from './OpenInMenu'; import FeedbackModal from '../FeedbackModal'; import BrowserToggleButton from './BrowserToggleButton'; +import TitlebarContext from './TitlebarContext'; +import type { Project, Task } from '../../types/app'; interface GithubUser { login?: string; @@ -38,6 +40,11 @@ interface TitlebarProps { onToggleEditor?: () => void; showEditorButton?: boolean; isEditorOpen?: boolean; + projects: Project[]; + selectedProject: Project | null; + activeTask: Task | null; + onSelectProject: (project: Project) => void; + onSelectTask: (task: Task) => void; } const Titlebar: React.FC = ({ @@ -56,6 +63,11 @@ const Titlebar: React.FC = ({ onToggleEditor, showEditorButton = false, isEditorOpen = false, + projects, + selectedProject, + activeTask, + onSelectProject, + onSelectTask, }) => { const [isFeedbackOpen, setIsFeedbackOpen] = useState(false); const feedbackButtonRef = useRef(null); @@ -114,8 +126,18 @@ const Titlebar: React.FC = ({ return ( <> -
-
+
+
+
+ +
+
{currentPath ? : null} {showEditorButton ? ( diff --git a/src/renderer/components/titlebar/TitlebarContext.tsx b/src/renderer/components/titlebar/TitlebarContext.tsx new file mode 100644 index 00000000..e2b25631 --- /dev/null +++ b/src/renderer/components/titlebar/TitlebarContext.tsx @@ -0,0 +1,116 @@ +import React from 'react'; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '../ui/select'; +import type { Project, Task } from '../../types/app'; + +interface TitlebarContextProps { + projects: Project[]; + selectedProject: Project | null; + activeTask: Task | null; + onSelectProject: (project: Project) => void; + onSelectTask: (task: Task) => void; +} + +const TitlebarContext: React.FC = ({ + projects, + selectedProject, + activeTask, + onSelectProject, + onSelectTask, +}) => { + if (!selectedProject) { + return
; + } + + const tasks = selectedProject?.tasks ?? []; + const projectValue = selectedProject.id; + const taskValue = activeTask?.id; + const projectLabel = selectedProject.name; + const taskLabel = activeTask?.name ?? ''; + + const handleProjectChange = (value: string) => { + const nextProject = projects.find((project) => project.id === value); + if (nextProject) { + onSelectProject(nextProject); + } + }; + + const handleTaskChange = (value: string) => { + const nextTask = tasks.find((task) => task.id === value); + if (nextTask) { + onSelectTask(nextTask); + } + }; + + return ( +
+
+ +
+ / +
+ +
+
+ ); +}; + +export default TitlebarContext; From 20dda9cdd6a86145bbd72e9eefaeee073365732a Mon Sep 17 00:00:00 2001 From: Raban von Spiegel Date: Wed, 14 Jan 2026 22:59:22 -0800 Subject: [PATCH 2/8] Adjust titlebar context styling --- src/renderer/components/titlebar/TitlebarContext.tsx | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/renderer/components/titlebar/TitlebarContext.tsx b/src/renderer/components/titlebar/TitlebarContext.tsx index e2b25631..0ca0bb5a 100644 --- a/src/renderer/components/titlebar/TitlebarContext.tsx +++ b/src/renderer/components/titlebar/TitlebarContext.tsx @@ -52,7 +52,7 @@ const TitlebarContext: React.FC = ({
span]:min-w-0 [&>svg]:hidden', - activeTask ? '' : 'min-w-[84px]', - ].join(' ')} + className="h-7 w-auto max-w-[320px] justify-start gap-1 border-none bg-transparent px-1 py-0.5 text-[13px] font-medium leading-none text-muted-foreground shadow-none hover:bg-background/70 hover:text-foreground data-[state=open]:bg-background/80 data-[state=open]:text-foreground data-[placeholder]:text-muted-foreground/70 [&>span]:min-w-0 [&>svg]:hidden" aria-label="Select task" title={taskLabel} > From 4c3c9d417651091dc96a49ef9d2bce802d52caae Mon Sep 17 00:00:00 2001 From: Raban von Spiegel Date: Wed, 14 Jan 2026 23:09:36 -0800 Subject: [PATCH 3/8] Fix titlebar dropdown truncation --- .../components/titlebar/TitlebarContext.tsx | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/renderer/components/titlebar/TitlebarContext.tsx b/src/renderer/components/titlebar/TitlebarContext.tsx index 0ca0bb5a..c5f1e5cc 100644 --- a/src/renderer/components/titlebar/TitlebarContext.tsx +++ b/src/renderer/components/titlebar/TitlebarContext.tsx @@ -32,6 +32,7 @@ const TitlebarContext: React.FC = ({ const taskValue = activeTask?.id; const projectLabel = selectedProject.name; const taskLabel = activeTask?.name ?? ''; + const selectContentClassName = 'w-[min(280px,90vw)]'; const handleProjectChange = (value: string) => { const nextProject = projects.find((project) => project.id === value); @@ -58,11 +59,15 @@ const TitlebarContext: React.FC = ({ > - + {projects.length > 0 ? ( projects.map((project) => ( - - {project.name} + + {project.name} )) ) : ( @@ -83,23 +88,19 @@ const TitlebarContext: React.FC = ({ > - + {tasks.length > 0 ? ( tasks.map((task) => ( - {task.name} + {task.name} )) ) : ( - + No tasks yet )} From 65003a47813afb3c83b533929052b60750e63007 Mon Sep 17 00:00:00 2001 From: Raban von Spiegel Date: Wed, 14 Jan 2026 23:26:19 -0800 Subject: [PATCH 4/8] Fix titlebar select truncation with ellipsis - Add block display to span for max-width to take effect - Apply truncate class for proper text-overflow: ellipsis - Set consistent max-width (236px) for both project and task selectors Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com> --- src/renderer/components/titlebar/TitlebarContext.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/renderer/components/titlebar/TitlebarContext.tsx b/src/renderer/components/titlebar/TitlebarContext.tsx index c5f1e5cc..ed9eb33e 100644 --- a/src/renderer/components/titlebar/TitlebarContext.tsx +++ b/src/renderer/components/titlebar/TitlebarContext.tsx @@ -53,7 +53,7 @@ const TitlebarContext: React.FC = ({
From 69b13e579e25c3acde9e048ef56076d757f8f74e Mon Sep 17 00:00:00 2001 From: Raban von Spiegel Date: Wed, 14 Jan 2026 23:29:24 -0800 Subject: [PATCH 5/8] Align titlebar and dropdown truncation width Set trigger span max-width to 218px to match dropdown text area width --- src/renderer/components/titlebar/TitlebarContext.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/renderer/components/titlebar/TitlebarContext.tsx b/src/renderer/components/titlebar/TitlebarContext.tsx index ed9eb33e..af064ff9 100644 --- a/src/renderer/components/titlebar/TitlebarContext.tsx +++ b/src/renderer/components/titlebar/TitlebarContext.tsx @@ -53,7 +53,7 @@ const TitlebarContext: React.FC = ({
From 3ceb7c5decb3b5aabbf05843c1c5b6657848f65d Mon Sep 17 00:00:00 2001 From: Raban von Spiegel Date: Wed, 14 Jan 2026 23:30:37 -0800 Subject: [PATCH 6/8] Format titlebar components --- src/renderer/components/titlebar/Titlebar.tsx | 2 +- src/renderer/components/titlebar/TitlebarContext.tsx | 10 ++-------- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/renderer/components/titlebar/Titlebar.tsx b/src/renderer/components/titlebar/Titlebar.tsx index 210684f4..92b5721a 100644 --- a/src/renderer/components/titlebar/Titlebar.tsx +++ b/src/renderer/components/titlebar/Titlebar.tsx @@ -128,7 +128,7 @@ const Titlebar: React.FC = ({ <>
-
+
= ({
From c19b51d2505d0f2c8d2eb8ed4aa943c8cca08087 Mon Sep 17 00:00:00 2001 From: Raban von Spiegel Date: Mon, 19 Jan 2026 16:04:33 -0800 Subject: [PATCH 8/8] fix: constrain titlebar drag region to actual select elements - Use absolute positioning for center content to keep it truly centered - Move no-drag from wrapper divs to SelectTrigger elements - Add pointer-events-auto to SelectTriggers for clickability --- src/renderer/components/titlebar/Titlebar.tsx | 23 ++++++++++--------- .../components/titlebar/TitlebarContext.tsx | 10 ++++---- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/renderer/components/titlebar/Titlebar.tsx b/src/renderer/components/titlebar/Titlebar.tsx index 352501e2..f7fb33ff 100644 --- a/src/renderer/components/titlebar/Titlebar.tsx +++ b/src/renderer/components/titlebar/Titlebar.tsx @@ -126,18 +126,19 @@ const Titlebar: React.FC = ({ return ( <> -
-
-
- +
+
+
+ +
-
+
{currentPath ? : null} {showEditorButton ? ( diff --git a/src/renderer/components/titlebar/TitlebarContext.tsx b/src/renderer/components/titlebar/TitlebarContext.tsx index 2026a012..8da7374e 100644 --- a/src/renderer/components/titlebar/TitlebarContext.tsx +++ b/src/renderer/components/titlebar/TitlebarContext.tsx @@ -18,7 +18,7 @@ const TitlebarContext: React.FC = ({ onSelectTask, }) => { if (!selectedProject) { - return
; + return
; } const tasks = selectedProject?.tasks ?? []; @@ -44,10 +44,10 @@ const TitlebarContext: React.FC = ({ return (
-
+
/ -
+