diff --git a/packages/opencode/src/cli/cmd/tui/context/theme.tsx b/packages/opencode/src/cli/cmd/tui/context/theme.tsx index 2320c08ccc6..9288efc720f 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 f9068e3f01d..cf9b4fa4cc7 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)