diff --git a/apps/desktop/src/renderer/components/chat/AgentChatPane.tsx b/apps/desktop/src/renderer/components/chat/AgentChatPane.tsx index 8c5897113..9d209d4ca 100644 --- a/apps/desktop/src/renderer/components/chat/AgentChatPane.tsx +++ b/apps/desktop/src/renderer/components/chat/AgentChatPane.tsx @@ -13842,10 +13842,16 @@ export function AgentChatPane({ style={{ aspectRatio: "560 / 300" }} exit={{ opacity: 0, scale: 0.8, transition: { duration: 0.3, ease: "easeOut" } }} > + {/* `h-auto` + `max-h-full` left the image at its + natural height once the box shrank, so a short + window cropped the wordmark against the column's + `overflow-hidden` instead of scaling it. Filling + the box and letterboxing inside it with + `object-contain` keeps the shrink proportional. */} ADE @@ -13867,14 +13873,6 @@ export function AgentChatPane({ ) : null} - {onImportedSession && !appPanelOpen ? ( - setImportBrowserOpen(true)} - /> - ) : null} - {/* Launch shelf — everything that answers "where does this run". It is drawn as a recessed drawer tucked under the composer rather than as another centered band: the lane @@ -14016,6 +14014,19 @@ export function AgentChatPane({ ) : null} + + {/* Last row in the column. Sat between the composer and + the launch shelf before, where it wedged itself into + the shelf's row and overlapped it in a narrow window; + at the bottom it is a hint below everything it can + act on rather than a band cutting the stack in two. */} + {onImportedSession && !appPanelOpen ? ( + setImportBrowserOpen(true)} + /> + ) : null} {appPanelOpen ? ( diff --git a/apps/desktop/src/renderer/components/terminals/importSessions/ImportFloatingBadge.test.tsx b/apps/desktop/src/renderer/components/terminals/importSessions/ImportFloatingBadge.test.tsx index f5f42d30d..c7338e10f 100644 --- a/apps/desktop/src/renderer/components/terminals/importSessions/ImportFloatingBadge.test.tsx +++ b/apps/desktop/src/renderer/components/terminals/importSessions/ImportFloatingBadge.test.tsx @@ -31,11 +31,22 @@ describe("ImportFloatingBadge", () => { it("dismisses machine-locally per project without opening", () => { const onOpen = vi.fn(); - render(); + const { container } = render(); fireEvent.click(screen.getByLabelText("Hide import hint")); expect(onOpen).not.toHaveBeenCalled(); expect(readImportBadgeDismissed("/Users/dev/ade")).toBe(true); expect(screen.queryByText("Import your chats from outside ADE")).toBeNull(); + // Not merely invisible — zero nodes. The badge is a row in a `gap-3` + // flex column, so anything it leaves behind once retired (an empty + // wrapper included) spends gap the retired hint no longer earns. + expect(container.firstChild).toBeNull(); + }); + + it("occupies no layout row for a project that never opts in", () => { + const { container } = render(); + expect(container.firstChild).toBeNull(); + expect(screen.queryByText("Import your chats from outside ADE")).toBeNull(); + expect(screen.queryByLabelText("Hide import hint")).toBeNull(); }); it("stays visible for a different project on this machine", () => { diff --git a/apps/desktop/src/renderer/components/terminals/importSessions/ImportFloatingBadge.tsx b/apps/desktop/src/renderer/components/terminals/importSessions/ImportFloatingBadge.tsx index 9e361349c..836e513ff 100644 --- a/apps/desktop/src/renderer/components/terminals/importSessions/ImportFloatingBadge.tsx +++ b/apps/desktop/src/renderer/components/terminals/importSessions/ImportFloatingBadge.tsx @@ -58,7 +58,9 @@ export function ImportFloatingBadge({ if (!projectRoot || dismissed) return null; return ( -
+ // `shrink-0` because the draft column this sits in is a height-capped + // flex-col where the logo is the only row meant to absorb overflow. +