summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorSebastian <[email protected]>2026-03-24 00:32:48 +0100
committerGitHub <[email protected]>2026-03-24 00:32:48 +0100
commitad78b79b8aafa25e307c9597dc7a64ab3fcd1792 (patch)
tree6194a82939c8a77622a8885b2f9ef3af71dd04e8
parent9a006d87004835d1867207def09c9aa4cf7394db (diff)
downloadopencode-ad78b79b8aafa25e307c9597dc7a64ab3fcd1792.tar.gz
opencode-ad78b79b8aafa25e307c9597dc7a64ab3fcd1792.zip
use renderer theme mode to switch dark/light mode (#18851)
-rw-r--r--packages/opencode/src/cli/cmd/tui/context/theme.tsx36
1 files changed, 24 insertions, 12 deletions
diff --git a/packages/opencode/src/cli/cmd/tui/context/theme.tsx b/packages/opencode/src/cli/cmd/tui/context/theme.tsx
index d65fbf40a..d786e0b49 100644
--- a/packages/opencode/src/cli/cmd/tui/context/theme.tsx
+++ b/packages/opencode/src/cli/cmd/tui/context/theme.tsx
@@ -1,6 +1,6 @@
-import { SyntaxStyle, RGBA, type TerminalColors } from "@opentui/core"
+import { CliRenderEvents, SyntaxStyle, RGBA, type TerminalColors } from "@opentui/core"
import path from "path"
-import { createEffect, createMemo, onMount } from "solid-js"
+import { createEffect, createMemo, onCleanup, onMount } from "solid-js"
import { createSimpleContext } from "./helper"
import { Glob } from "../../../../util/glob"
import aura from "./theme/aura.json" with { type: "json" }
@@ -280,6 +280,7 @@ function ansiToRgba(code: number): RGBA {
export const { use: useTheme, provider: ThemeProvider } = createSimpleContext({
name: "Theme",
init: (props: { mode: "dark" | "light" }) => {
+ const renderer = useRenderer()
const config = useTuiConfig()
const kv = useKV()
const [store, setStore] = createStore({
@@ -295,7 +296,7 @@ export const { use: useTheme, provider: ThemeProvider } = createSimpleContext({
})
function init() {
- resolveSystemTheme()
+ resolveSystemTheme(store.mode)
getCustomThemes()
.then((custom) => {
setStore(
@@ -316,14 +317,12 @@ export const { use: useTheme, provider: ThemeProvider } = createSimpleContext({
onMount(init)
- function resolveSystemTheme() {
- console.log("resolveSystemTheme")
+ function resolveSystemTheme(mode: "dark" | "light" = store.mode) {
renderer
.getPalette({
size: 16,
})
.then((colors) => {
- console.log(colors.palette)
if (!colors.palette[0]) {
if (store.active === "system") {
setStore(
@@ -337,7 +336,7 @@ export const { use: useTheme, provider: ThemeProvider } = createSimpleContext({
}
setStore(
produce((draft) => {
- draft.themes.system = generateSystem(colors, store.mode)
+ draft.themes.system = generateSystem(colors, mode)
if (store.active === "system") {
draft.ready = true
}
@@ -346,16 +345,30 @@ export const { use: useTheme, provider: ThemeProvider } = createSimpleContext({
})
}
- const renderer = useRenderer()
- process.on("SIGUSR2", async () => {
+ function update(mode: "dark" | "light") {
+ if (store.mode === mode) return
+ setStore("mode", mode)
+ kv.set("theme_mode", mode)
renderer.clearPaletteCache()
- init()
+ resolveSystemTheme(mode)
+ }
+
+ const handle = (mode: "dark" | "light") => {
+ update(mode)
+ }
+ renderer.on(CliRenderEvents.THEME_MODE, handle)
+ onCleanup(() => {
+ renderer.off(CliRenderEvents.THEME_MODE, handle)
})
const values = createMemo(() => {
return resolveTheme(store.themes[store.active] ?? store.themes.opencode, store.mode)
})
+ createEffect(() => {
+ renderer.setBackgroundColor(values().background)
+ })
+
const syntax = createMemo(() => generateSyntax(values()))
const subtleSyntax = createMemo(() => generateSubtleSyntax(values()))
@@ -378,8 +391,7 @@ export const { use: useTheme, provider: ThemeProvider } = createSimpleContext({
return store.mode
},
setMode(mode: "dark" | "light") {
- setStore("mode", mode)
- kv.set("theme_mode", mode)
+ update(mode)
},
set(theme: string) {
setStore("active", theme)