Terminal Settings
diff --git a/apps/desktop/src/renderer/components/lanes/LanesPage.tsx b/apps/desktop/src/renderer/components/lanes/LanesPage.tsx
index 782e496e2..3e00f31b2 100644
--- a/apps/desktop/src/renderer/components/lanes/LanesPage.tsx
+++ b/apps/desktop/src/renderer/components/lanes/LanesPage.tsx
@@ -2,7 +2,7 @@ import React, { useCallback, useEffect, useMemo, useRef, useState } from "react"
import { useNavigate, useSearchParams } from "react-router-dom";
import * as Dialog from "@radix-ui/react-dialog";
import { Group, Panel } from "react-resizable-panels";
-import { Check, ChevronDown, FileCode2, GitBranch, Home, Layers3, Link2, Maximize2, Pin, Play, Plus, Search, Terminal, X } from "lucide-react";
+import { Check, ChevronDown, FileCode2, GitBranch, Home, Layers3, Link2, Maximize2, Pin, Plus, Search, Terminal, X } from "lucide-react";
import { useAppStore } from "../../state/appStore";
import { EmptyState } from "../ui/EmptyState";
import { cn } from "../ui/cn";
@@ -271,6 +271,9 @@ export function LanesPage() {
const [branchCheckoutError, setBranchCheckoutError] = useState(null);
const branchDropdownRef = useRef(null);
+ const [addLaneDropdownOpen, setAddLaneDropdownOpen] = useState(false);
+ const addLaneDropdownRef = useRef(null);
+
const [lanePaneDetails, setLanePaneDetails] = useState>({});
const [laneContextMenu, setLaneContextMenu] = useState<{ laneId: string; x: number; y: number } | null>(null);
const [expandedLaneId, setExpandedLaneId] = useState(null);
@@ -334,6 +337,17 @@ export function LanesPage() {
return () => document.removeEventListener("mousedown", handler);
}, [branchDropdownOpen]);
+ useEffect(() => {
+ if (!addLaneDropdownOpen) return;
+ const handler = (e: MouseEvent) => {
+ if (addLaneDropdownRef.current && !addLaneDropdownRef.current.contains(e.target as Node)) {
+ setAddLaneDropdownOpen(false);
+ }
+ };
+ document.addEventListener("mousedown", handler);
+ return () => document.removeEventListener("mousedown", handler);
+ }, [addLaneDropdownOpen]);
+
/* ---- Conflict loading ---- */
const loadConflictStatuses = useCallback(async () => {
@@ -913,49 +927,57 @@ export function LanesPage() {
) : null}
-
-
-
+ {/* Add Lane dropdown */}
+
+
+ {addLaneDropdownOpen ? (
+
+
+
+
+ ) : null}
+
- {filteredLanes.length}/{sortedLanes.length} · shift-click split · j/k move · [ ] cycle · / filter
+ {filteredLanes.length}/{sortedLanes.length} · shift-click split
@@ -977,7 +999,7 @@ export function LanesPage() {
key={lane.id}
type="button"
className={cn(
- "inline-flex max-w-[320px] shrink-0 items-center gap-1 rounded-xl px-2 py-1 text-xs transition-colors",
+ "group inline-flex max-w-[320px] shrink-0 items-center gap-1 rounded-xl px-2 py-1 text-xs transition-colors",
isSelected
? "bg-accent/20 text-fg shadow-card ring-1 ring-accent/40 font-semibold"
: isVisible
@@ -997,9 +1019,7 @@ export function LanesPage() {
>
{isPrimary ? (
- ) : (
-
- )}
+ ) : null}
{lane.name}
{isPrimary ? {lane.branchRef} : null}
@@ -1020,8 +1040,10 @@ export function LanesPage() {
{!isPrimary ? (
{
event.stopPropagation();
@@ -1150,18 +1172,20 @@ export function LanesPage() {
{/* Fullscreen lane overlay */}
{expandedLaneId && lanesById.has(expandedLaneId) ? (
-
-
-
- {lanesById.get(expandedLaneId)?.name}
- Fullscreen
-
-