diff --git a/frontend/src/components/EditorLayout.tsx b/frontend/src/components/EditorLayout.tsx index 4a42c2e4..dbd41f94 100644 --- a/frontend/src/components/EditorLayout.tsx +++ b/frontend/src/components/EditorLayout.tsx @@ -463,7 +463,6 @@ export default function EditorLayout() { // `activeView`, so 'dashboard' still maps to HomeDashboard everywhere. const isMobile = useIsMobile(); const { sidebarMode, sidebarWidth, setSidebarWidth } = useSidebarLayout(); - const commitSidebarWidth = useCallback((width: number) => setSidebarWidth(width), [setSidebarWidth]); const [mobileView, setMobileView] = useState('list'); const [mobileSettingsSection, setMobileSettingsSection] = useState(null); // Optimistically flip to the detail surface the instant a row is tapped, @@ -1049,7 +1048,7 @@ export default function EditorLayout() { const sidebarSlotEl = !isMobile && sidebarMode === 'resizable' ? ( {sidebarEl} @@ -1397,7 +1396,7 @@ export default function EditorLayout() { {/* Left Sidebar (Stacks) */} {sidebarSlotEl} {/* Main Content Area */} -
+
{topBarEl} {/* Main Workspace */} {workspaceEl} diff --git a/frontend/src/components/sidebar/SidebarResizePane.tsx b/frontend/src/components/sidebar/SidebarResizePane.tsx index 9d492695..e66eb850 100644 --- a/frontend/src/components/sidebar/SidebarResizePane.tsx +++ b/frontend/src/components/sidebar/SidebarResizePane.tsx @@ -18,7 +18,7 @@ const MIN_WORKSPACE = 560; /** Separator hit area in px between sidebar and workspace. */ const HANDLE_FOOTPRINT = 12; /** Keyboard step per arrow press, in px. */ -const KEY_STEP = 16; +const KEY_STEP = 8; interface SidebarResizePaneProps { sidebarWidth: number; @@ -36,7 +36,6 @@ export function SidebarResizePane({ sidebarWidth, onCommitWidth, children }: Sid startX: number; startWidth: number; lastWidth: number; - committed: boolean; } | null>(null); // The pane's flex row (its parent: sidebar pane + separator + workspace) @@ -104,7 +103,6 @@ export function SidebarResizePane({ sidebarWidth, onCommitWidth, children }: Sid startX: event.clientX, startWidth: effectiveWidth, lastWidth: effectiveWidth, - committed: false, }; setDragging(true); event.currentTarget.setPointerCapture(event.pointerId); @@ -124,9 +122,8 @@ export function SidebarResizePane({ sidebarWidth, onCommitWidth, children }: Sid const onSeparatorPointerUp = useCallback((event: React.PointerEvent) => { const drag = dragRef.current; if (drag === null || drag.pointerId !== event.pointerId) return; - // Snapshot and mark committed BEFORE releasing capture so the trailing - // lostpointercapture finds no drag and cleans up without a second commit. - drag.committed = true; + // The trailing lostpointercapture is a no-op: endDrag clears dragRef + // before capture releases, so nothing can commit a second time. try { onCommitWidth(Math.round(drag.lastWidth)); } finally { diff --git a/frontend/src/components/sidebar/StackSidebar.tsx b/frontend/src/components/sidebar/StackSidebar.tsx index c566250e..aa83422b 100644 --- a/frontend/src/components/sidebar/StackSidebar.tsx +++ b/frontend/src/components/sidebar/StackSidebar.tsx @@ -46,7 +46,6 @@ export interface StackSidebarProps { export function StackSidebar(props: StackSidebarProps) { const { - isDarkMode, nodeSwitcherSlot, createStackSlot, onScan, isScanning, canCreate, searchQuery, onSearchChange, filterChip, filterCounts, onFilterChipChange, list, activitySummary, onActivityAction, diff --git a/frontend/src/components/sidebar/__tests__/SidebarResizePane.test.tsx b/frontend/src/components/sidebar/__tests__/SidebarResizePane.test.tsx index 34e2d1d6..5c180fcf 100644 --- a/frontend/src/components/sidebar/__tests__/SidebarResizePane.test.tsx +++ b/frontend/src/components/sidebar/__tests__/SidebarResizePane.test.tsx @@ -247,14 +247,14 @@ describe('SidebarResizePane', () => { setup((w) => commits.push(w)); separator().focus(); await user.keyboard('{ArrowRight}'); - expect(commits).toEqual([316]); - expect(separator()).toHaveAttribute('aria-valuenow', '316'); + expect(commits).toEqual([308]); + expect(separator()).toHaveAttribute('aria-valuenow', '308'); await user.keyboard('{Home}'); expect(pane().style.width).toBe(`${SIDEBAR_WIDTH.min}px`); await user.keyboard('{End}'); expect(pane().style.width).toBe(`${SIDEBAR_WIDTH.max}px`); expect(separator()).toHaveAttribute('aria-valuemax', String(SIDEBAR_WIDTH.max)); - expect(commits).toEqual([316, SIDEBAR_WIDTH.min, SIDEBAR_WIDTH.max]); + expect(commits).toEqual([308, SIDEBAR_WIDTH.min, SIDEBAR_WIDTH.max]); }); it('keyboard End clamps to the viewport-limited max in a narrow shell', async () => {