From db5fcf5a843101cb15a1865337c04a112af129e2 Mon Sep 17 00:00:00 2001 From: Br1an67 <932039080@qq.com> Date: Mon, 2 Mar 2026 02:11:14 +0800 Subject: [PATCH] feat(tui): add theme_mode config to override terminal color detection Terminals like Zellij misreport system theme, making the TUI render in dark mode even when the terminal is light. Add a theme_mode option ('light' | 'dark' | 'system') to tui.json that overrides terminal background color detection when set to light or dark. --- .../opencode/src/cli/cmd/tui/context/theme.tsx | 14 +++++++++++++- packages/opencode/src/config/tui-schema.ts | 6 ++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/packages/opencode/src/cli/cmd/tui/context/theme.tsx b/packages/opencode/src/cli/cmd/tui/context/theme.tsx index 2320c08ccc6e..9288efc720f0 100644 --- a/packages/opencode/src/cli/cmd/tui/context/theme.tsx +++ b/packages/opencode/src/cli/cmd/tui/context/theme.tsx @@ -282,9 +282,16 @@ export const { use: useTheme, provider: ThemeProvider } = createSimpleContext({ init: (props: { mode: "dark" | "light" }) => { const config = useTuiConfig() const kv = useKV() + + function configMode(): "dark" | "light" | undefined { + const override = config.theme_mode + if (override === "light" || override === "dark") return override + return undefined + } + const [store, setStore] = createStore({ themes: DEFAULT_THEMES, - mode: kv.get("theme_mode", props.mode), + mode: configMode() ?? kv.get("theme_mode", props.mode), active: (config.theme ?? kv.get("theme", "opencode")) as string, ready: false, }) @@ -294,6 +301,11 @@ export const { use: useTheme, provider: ThemeProvider } = createSimpleContext({ if (theme) setStore("active", theme) }) + createEffect(() => { + const override = configMode() + if (override) setStore("mode", override) + }) + function init() { resolveSystemTheme() getCustomThemes() diff --git a/packages/opencode/src/config/tui-schema.ts b/packages/opencode/src/config/tui-schema.ts index f9068e3f01d3..cf9b4fa4cc7d 100644 --- a/packages/opencode/src/config/tui-schema.ts +++ b/packages/opencode/src/config/tui-schema.ts @@ -28,6 +28,12 @@ export const TuiInfo = z .object({ $schema: z.string().optional(), theme: z.string().optional(), + theme_mode: z + .enum(["light", "dark", "system"]) + .optional() + .describe( + "Override the detected terminal color scheme. Set to 'light' or 'dark' to force a mode, or 'system' to auto-detect from terminal.", + ), keybinds: KeybindOverride.optional(), }) .extend(TuiOptions.shape)