+
+
+ {language.t("settings.appearance.row.projectName.title")}
+
+
+
diff --git a/packages/app/src/settings/general/controllers.ts b/packages/app/src/settings/general/controllers.ts
index 2c314ebf0d0..a1973ed4cde 100644
--- a/packages/app/src/settings/general/controllers.ts
+++ b/packages/app/src/settings/general/controllers.ts
@@ -85,6 +85,10 @@ export function createAppearanceSettingsController() {
current: settings.appearance.tabLayout,
select: settings.appearance.setTabLayout,
},
+ projectName: {
+ current: settings.appearance.showProjectName,
+ set: settings.appearance.setShowProjectName,
+ },
}
}
diff --git a/packages/app/src/settings/model.test.ts b/packages/app/src/settings/model.test.ts
index e62cf864b40..a3244a4e94a 100644
--- a/packages/app/src/settings/model.test.ts
+++ b/packages/app/src/settings/model.test.ts
@@ -101,7 +101,14 @@ describe("settings schema", () => {
terminalPlacement: "side",
followUpBehavior: "steer",
},
- appearance: { fontSize: 14, mono: "", sans: "", terminal: "", tabLayout: "horizontal" },
+ appearance: {
+ fontSize: 14,
+ mono: "",
+ sans: "",
+ terminal: "",
+ tabLayout: "horizontal",
+ showProjectName: false,
+ },
keybinds: {},
permissions: { autoApprove: false },
workspaces: { defaultDestination: "last-used", lastUsed: {} },
@@ -126,7 +133,7 @@ describe("settings schema", () => {
reasoningMode: 3,
followUpBehavior: "invalid",
},
- appearance: { fontSize: "large", mono: "Custom Mono", tabLayout: "vertical" },
+ appearance: { fontSize: "large", mono: "Custom Mono", tabLayout: "vertical", showProjectName: true },
permissions: { autoApprove: true },
workspaces: { defaultDestination: "new", lastUsed: { good: "workspace", bad: true } },
keybinds: { good: "ctrl+k", bad: 3 },
@@ -146,6 +153,7 @@ describe("settings schema", () => {
sans: "",
terminal: "",
tabLayout: "vertical",
+ showProjectName: true,
})
expect(settings.permissions.autoApprove).toBe(true)
expect(settings.workspaces).toEqual({ defaultDestination: "new", lastUsed: { good: "workspace" } })
diff --git a/packages/app/src/settings/model.tsx b/packages/app/src/settings/model.tsx
index 6212b692fc3..0a0d1d2697b 100644
--- a/packages/app/src/settings/model.tsx
+++ b/packages/app/src/settings/model.tsx
@@ -95,6 +95,7 @@ const appearanceSchema = Persistence.struct({
sans: Schema.String,
terminal: Schema.String,
tabLayout: Schema.Literals(["horizontal", "vertical"]),
+ showProjectName: Schema.Boolean,
})
const permissionsSchema = Persistence.struct({
@@ -179,7 +180,7 @@ export const defaultSettings: Settings = {
terminalPlacement: "side",
followUpBehavior: "steer",
},
- appearance: { fontSize: 14, mono: "", sans: "", terminal: "", tabLayout: "horizontal" },
+ appearance: { fontSize: 14, mono: "", sans: "", terminal: "", tabLayout: "horizontal", showProjectName: false },
keybinds: {},
permissions: { autoApprove: false },
workspaces: { defaultDestination: "last-used", lastUsed: {} },
@@ -327,6 +328,13 @@ export const { use: useSettings, provider: SettingsProvider } = createSimpleCont
setTabLayout(value: TabLayout) {
setStore("appearance", "tabLayout", value)
},
+ showProjectName: withFallback(
+ () => store.appearance?.showProjectName,
+ defaultSettings.appearance.showProjectName,
+ ),
+ setShowProjectName(value: boolean) {
+ setStore("appearance", "showProjectName", value)
+ },
},
keybinds: {
get: (action: string) => store.keybinds?.[action],
diff --git a/packages/app/src/shell/titlebar/tab-nav.css b/packages/app/src/shell/titlebar/tab-nav.css
index 0a9265a9888..1cea5e4e871 100644
--- a/packages/app/src/shell/titlebar/tab-nav.css
+++ b/packages/app/src/shell/titlebar/tab-nav.css
@@ -15,11 +15,11 @@
background: linear-gradient(var(--tab-overlay), var(--tab-overlay)), var(--tab-base);
}
-[data-titlebar-tab][data-orientation="vertical"]:has([data-slot="project-avatar-slot"]) {
+[data-titlebar-tab][data-orientation="vertical"]:has([data-slot="tab-project"]) {
height: 45px;
}
-[data-titlebar-tab][data-orientation="vertical"]:has([data-slot="project-avatar-slot"]) [data-slot="tab-link"] {
+[data-titlebar-tab][data-orientation="vertical"]:has([data-slot="tab-project"]) [data-slot="tab-link"] {
display: grid;
grid-template-columns: 16px minmax(0, 1fr);
grid-template-rows: repeat(2, var(--line-height-compact));
diff --git a/packages/app/src/shell/titlebar/tab-nav.tsx b/packages/app/src/shell/titlebar/tab-nav.tsx
index 1859b7bada2..2fe162ac206 100644
--- a/packages/app/src/shell/titlebar/tab-nav.tsx
+++ b/packages/app/src/shell/titlebar/tab-nav.tsx
@@ -14,6 +14,7 @@ import { SessionTabAvatar } from "@/shell/layout/session-tab-avatar"
import { SessionProgressIndicatorV2 } from "@opencode-ai/session-ui/v2/session-progress-indicator-v2"
import type { SessionInfo } from "@opencode-ai/client/promise"
import { sessionLabel } from "@/session/title"
+import { useSettings } from "@/settings/model"
import { canOpenTabRename, forwardTabRef } from "./tab-gesture"
import { TabPreviewPopover } from "./tab-popover"
import "./tab-nav.css"
@@ -39,6 +40,7 @@ export function TabNavItem(props: {
orientation?: "horizontal" | "vertical"
}) {
const language = useLanguage()
+ const settings = useSettings()
const [menu, setMenu] = createStore({ open: false, rename: false })
const [editing, setEditing] = createSignal(false)
const [titleOverflowing, setTitleOverflowing] = createSignal(false)
@@ -298,7 +300,7 @@ export function TabNavItem(props: {
event.preventDefault()
}}
/>
-