From f6befeae88abdd27403064bdb6bfea022791481b Mon Sep 17 00:00:00 2001 From: rxchitrx Date: Tue, 6 Oct 2026 23:21:12 +0530 Subject: [PATCH 1/5] Fix footer Terminal button toggle and pressed state The footer Terminal button called onShowProjectTerminal when the dock already had terminals, so it could open/focus but never collapse, and aria-pressed/accent tracked has-terminals instead of dock.open. Wire it to onToggleProjectTerminal and base pressed state on projectTerminalOpen, keeping the Terminal label on has-terminals. Fixes #755 --- src/app/App.tsx | 8 ++++ src/app/shell/UsageFooter.test.ts | 75 ++++++++++++++++++++++++++++++- src/app/shell/UsageFooter.tsx | 14 ++++-- 3 files changed, 91 insertions(+), 6 deletions(-) diff --git a/src/app/App.tsx b/src/app/App.tsx index d8c1c50de2..912fcfd841 100644 --- a/src/app/App.tsx +++ b/src/app/App.tsx @@ -12522,11 +12522,19 @@ function Workspace({ ? onShowProjectTerminal : undefined } + onToggleProjectTerminal={ + !monoCovers && isLocalProject(projectCwd) + ? onToggleProjectTerminal + : undefined + } projectTerminalActive={ !monoCovers && !!currentProjectDock && currentProjectDock.pane.files.length > 0 } + projectTerminalOpen={ + !monoCovers && !!currentProjectDock?.open + } /> )} diff --git a/src/app/shell/UsageFooter.test.ts b/src/app/shell/UsageFooter.test.ts index 2969d1740b..f459d31e03 100644 --- a/src/app/shell/UsageFooter.test.ts +++ b/src/app/shell/UsageFooter.test.ts @@ -1,8 +1,28 @@ -import { createElement } from "react"; +// @vitest-environment happy-dom +import { act, createElement } from "react"; import { renderToStaticMarkup } from "react-dom/server"; -import { describe, expect, it, vi } from "vitest"; +import { createRoot, type Root } from "react-dom/client"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { UsageFooter } from "./UsageFooter"; +let container: HTMLDivElement; +let root: Root | null = null; + +beforeEach(() => { + vi.stubGlobal("IS_REACT_ACT_ENVIRONMENT", true); + container = document.createElement("div"); + document.body.append(container); +}); + +afterEach(() => { + if (root) { + act(() => root!.unmount()); + root = null; + } + container.remove(); + vi.unstubAllGlobals(); +}); + describe("UsageFooter terminal control", () => { it("replaces the generic terminal button with the live process control", () => { const markup = renderToStaticMarkup( @@ -40,4 +60,55 @@ describe("UsageFooter terminal control", () => { expect(markup).toContain(">Terminal"); expect(markup.match(/