From 5894c36ca2575018a061f03b8baf8409f09abeff Mon Sep 17 00:00:00 2001 From: David Hill Date: Tue, 17 Mar 2026 15:41:04 +0000 Subject: [PATCH 1/3] tweak(ui): add an empty state to the sidebar when no projects --- packages/app/e2e/app/home.spec.ts | 3 +++ packages/app/src/i18n/en.ts | 2 ++ packages/app/src/pages/layout.tsx | 27 +++++++++++++++++++-------- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/packages/app/e2e/app/home.spec.ts b/packages/app/e2e/app/home.spec.ts index a3cedf7cb6fc..5deba4300cb4 100644 --- a/packages/app/e2e/app/home.spec.ts +++ b/packages/app/e2e/app/home.spec.ts @@ -3,8 +3,11 @@ import { serverNamePattern } from "../utils" test("home renders and shows core entrypoints", async ({ page }) => { await page.goto("/") + const nav = page.locator('[data-component="sidebar-nav-desktop"]') await expect(page.getByRole("button", { name: "Open project" }).first()).toBeVisible() + await expect(nav.getByText("No projects open")).toBeVisible() + await expect(nav.getByText("Open a project to get started")).toBeVisible() await expect(page.getByRole("button", { name: serverNamePattern })).toBeVisible() }) diff --git a/packages/app/src/i18n/en.ts b/packages/app/src/i18n/en.ts index ad12e1e0de58..7f6816de9e34 100644 --- a/packages/app/src/i18n/en.ts +++ b/packages/app/src/i18n/en.ts @@ -674,6 +674,8 @@ export const dict = { "sidebar.project.recentSessions": "Recent sessions", "sidebar.project.viewAllSessions": "View all sessions", "sidebar.project.clearNotifications": "Clear notifications", + "sidebar.empty.title": "No projects open", + "sidebar.empty.description": "Open a project to get started", "debugBar.ariaLabel": "Development performance diagnostics", "debugBar.na": "n/a", diff --git a/packages/app/src/pages/layout.tsx b/packages/app/src/pages/layout.tsx index ab2687dcab93..c40c94f4ea5c 100644 --- a/packages/app/src/pages/layout.tsx +++ b/packages/app/src/pages/layout.tsx @@ -2011,7 +2011,24 @@ export default function Layout(props: ParentProps) { width: panelProps.mobile ? undefined : `${Math.max(Math.max(layout.sidebar.width(), 244) - 64, 0)}px`, }} > - + +
+
+
{language.t("sidebar.empty.title")}
+
+ {language.t("sidebar.empty.description")} +
+
+ +
+ + } + > <>
@@ -2260,13 +2277,7 @@ export default function Layout(props: ParentProps) { helpLabel={() => language.t("sidebar.help")} onOpenHelp={() => platform.openLink("https://opencode.ai/desktop-feedback")} renderPanel={() => - mobile ? ( - - ) : ( - - - - ) + mobile ? : } /> ) From 45d41a708729fab3dc17470574d766ecd4cd0559 Mon Sep 17 00:00:00 2001 From: David Hill Date: Tue, 17 Mar 2026 15:49:11 +0000 Subject: [PATCH 2/3] tweak(ui): hide back and forward when no projects --- packages/app/src/components/titlebar.tsx | 63 +++++++++++++----------- 1 file changed, 33 insertions(+), 30 deletions(-) diff --git a/packages/app/src/components/titlebar.tsx b/packages/app/src/components/titlebar.tsx index 345903420c03..77de1a73ce69 100644 --- a/packages/app/src/components/titlebar.tsx +++ b/packages/app/src/components/titlebar.tsx @@ -77,6 +77,7 @@ export function Titlebar() { const canBack = createMemo(() => history.index > 0) const canForward = createMemo(() => history.index < history.stack.length - 1) + const hasProjects = createMemo(() => layout.projects.list().length > 0) const back = () => { const next = backPath(history) @@ -251,36 +252,38 @@ export function Titlebar() {
-
- -
+ +
+ +
+
From c79c5bd4aa071b0985faec4d4221859fd3e94926 Mon Sep 17 00:00:00 2001 From: Shoubhit Dash Date: Wed, 18 Mar 2026 00:58:36 +0530 Subject: [PATCH 3/3] fix(app): avoid empty sidebar state on direct sessions --- packages/app/src/pages/layout.tsx | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/packages/app/src/pages/layout.tsx b/packages/app/src/pages/layout.tsx index c40c94f4ea5c..a694ce0941b2 100644 --- a/packages/app/src/pages/layout.tsx +++ b/packages/app/src/pages/layout.tsx @@ -1959,6 +1959,7 @@ export default function Layout(props: ParentProps) { const merged = createMemo(() => panelProps.mobile || (panelProps.merged ?? layout.sidebar.opened())) const hover = createMemo(() => !panelProps.mobile && panelProps.merged === false && !layout.sidebar.opened()) const popover = createMemo(() => !!panelProps.mobile || panelProps.merged === false || layout.sidebar.opened()) + const empty = createMemo(() => !params.dir && layout.projects.list().length === 0) const projectName = createMemo(() => { const item = project() if (!item) return "" @@ -2014,19 +2015,21 @@ export default function Layout(props: ParentProps) { -
-
-
{language.t("sidebar.empty.title")}
-
- {language.t("sidebar.empty.description")} + +
+
+
+
{language.t("sidebar.empty.title")}
+
+ {language.t("sidebar.empty.description")} +
+
-
-
+ } > <>