From 1f38f958bff864947e6116c5c660d29fe0538342 Mon Sep 17 00:00:00 2001 From: Ariane Emory Date: Wed, 4 Mar 2026 15:44:15 -0500 Subject: [PATCH] feat: add optional sessionTitle theme property for distinct session title color --- packages/opencode/src/cli/cmd/tui/context/theme.tsx | 13 +++++++++++-- .../src/cli/cmd/tui/routes/session/header.tsx | 2 +- .../src/cli/cmd/tui/routes/session/sidebar.tsx | 2 +- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/packages/opencode/src/cli/cmd/tui/context/theme.tsx b/packages/opencode/src/cli/cmd/tui/context/theme.tsx index 2320c08ccc6..59e0eec252e 100644 --- a/packages/opencode/src/cli/cmd/tui/context/theme.tsx +++ b/packages/opencode/src/cli/cmd/tui/context/theme.tsx @@ -52,6 +52,7 @@ type ThemeColors = { success: RGBA info: RGBA text: RGBA + sessionTitle: RGBA textMuted: RGBA selectedListItemText: RGBA background: RGBA @@ -131,9 +132,10 @@ type ColorValue = HexColor | RefName | Variant | RGBA type ThemeJson = { $schema?: string defs?: Record - theme: Omit, "selectedListItemText" | "backgroundMenu"> & { + theme: Omit, "selectedListItemText" | "backgroundMenu" | "sessionTitle"> & { selectedListItemText?: ColorValue backgroundMenu?: ColorValue + sessionTitle?: ColorValue thinkingOpacity?: number } } @@ -199,7 +201,7 @@ function resolveTheme(theme: ThemeJson, mode: "dark" | "light") { const resolved = Object.fromEntries( Object.entries(theme.theme) - .filter(([key]) => key !== "selectedListItemText" && key !== "backgroundMenu" && key !== "thinkingOpacity") + .filter(([key]) => key !== "selectedListItemText" && key !== "backgroundMenu" && key !== "thinkingOpacity" && key !== "sessionTitle") .map(([key, value]) => { return [key, resolveColor(value as ColorValue)] }), @@ -222,6 +224,13 @@ function resolveTheme(theme: ThemeJson, mode: "dark" | "light") { resolved.backgroundMenu = resolved.backgroundElement } + // Handle sessionTitle - optional with fallback to text + if (theme.theme.sessionTitle !== undefined) { + resolved.sessionTitle = resolveColor(theme.theme.sessionTitle) + } else { + resolved.sessionTitle = resolved.text + } + // Handle thinkingOpacity - optional with default of 0.6 const thinkingOpacity = theme.theme.thinkingOpacity ?? 0.6 diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/header.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/header.tsx index 0c5ea9a8572..ad5b295a294 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/header.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/header.tsx @@ -12,7 +12,7 @@ import { useTerminalDimensions } from "@opentui/solid" const Title = (props: { session: Accessor }) => { const { theme } = useTheme() return ( - + # {props.session().title} ) diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/sidebar.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/sidebar.tsx index 42ac5fbe080..02c11b5619e 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/sidebar.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/sidebar.tsx @@ -91,7 +91,7 @@ export function Sidebar(props: { sessionID: string; overlay?: boolean }) { > - + {session().title}