Skip to content

Commit ad78b79

Browse files
authored
use renderer theme mode to switch dark/light mode (#18851)
1 parent 9a006d8 commit ad78b79

1 file changed

Lines changed: 24 additions & 12 deletions

File tree

  • packages/opencode/src/cli/cmd/tui/context

packages/opencode/src/cli/cmd/tui/context/theme.tsx

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { SyntaxStyle, RGBA, type TerminalColors } from "@opentui/core"
1+
import { CliRenderEvents, SyntaxStyle, RGBA, type TerminalColors } from "@opentui/core"
22
import path from "path"
3-
import { createEffect, createMemo, onMount } from "solid-js"
3+
import { createEffect, createMemo, onCleanup, onMount } from "solid-js"
44
import { createSimpleContext } from "./helper"
55
import { Glob } from "../../../../util/glob"
66
import aura from "./theme/aura.json" with { type: "json" }
@@ -280,6 +280,7 @@ function ansiToRgba(code: number): RGBA {
280280
export const { use: useTheme, provider: ThemeProvider } = createSimpleContext({
281281
name: "Theme",
282282
init: (props: { mode: "dark" | "light" }) => {
283+
const renderer = useRenderer()
283284
const config = useTuiConfig()
284285
const kv = useKV()
285286
const [store, setStore] = createStore({
@@ -295,7 +296,7 @@ export const { use: useTheme, provider: ThemeProvider } = createSimpleContext({
295296
})
296297

297298
function init() {
298-
resolveSystemTheme()
299+
resolveSystemTheme(store.mode)
299300
getCustomThemes()
300301
.then((custom) => {
301302
setStore(
@@ -316,14 +317,12 @@ export const { use: useTheme, provider: ThemeProvider } = createSimpleContext({
316317

317318
onMount(init)
318319

319-
function resolveSystemTheme() {
320-
console.log("resolveSystemTheme")
320+
function resolveSystemTheme(mode: "dark" | "light" = store.mode) {
321321
renderer
322322
.getPalette({
323323
size: 16,
324324
})
325325
.then((colors) => {
326-
console.log(colors.palette)
327326
if (!colors.palette[0]) {
328327
if (store.active === "system") {
329328
setStore(
@@ -337,7 +336,7 @@ export const { use: useTheme, provider: ThemeProvider } = createSimpleContext({
337336
}
338337
setStore(
339338
produce((draft) => {
340-
draft.themes.system = generateSystem(colors, store.mode)
339+
draft.themes.system = generateSystem(colors, mode)
341340
if (store.active === "system") {
342341
draft.ready = true
343342
}
@@ -346,16 +345,30 @@ export const { use: useTheme, provider: ThemeProvider } = createSimpleContext({
346345
})
347346
}
348347

349-
const renderer = useRenderer()
350-
process.on("SIGUSR2", async () => {
348+
function update(mode: "dark" | "light") {
349+
if (store.mode === mode) return
350+
setStore("mode", mode)
351+
kv.set("theme_mode", mode)
351352
renderer.clearPaletteCache()
352-
init()
353+
resolveSystemTheme(mode)
354+
}
355+
356+
const handle = (mode: "dark" | "light") => {
357+
update(mode)
358+
}
359+
renderer.on(CliRenderEvents.THEME_MODE, handle)
360+
onCleanup(() => {
361+
renderer.off(CliRenderEvents.THEME_MODE, handle)
353362
})
354363

355364
const values = createMemo(() => {
356365
return resolveTheme(store.themes[store.active] ?? store.themes.opencode, store.mode)
357366
})
358367

368+
createEffect(() => {
369+
renderer.setBackgroundColor(values().background)
370+
})
371+
359372
const syntax = createMemo(() => generateSyntax(values()))
360373
const subtleSyntax = createMemo(() => generateSubtleSyntax(values()))
361374

@@ -378,8 +391,7 @@ export const { use: useTheme, provider: ThemeProvider } = createSimpleContext({
378391
return store.mode
379392
},
380393
setMode(mode: "dark" | "light") {
381-
setStore("mode", mode)
382-
kv.set("theme_mode", mode)
394+
update(mode)
383395
},
384396
set(theme: string) {
385397
setStore("active", theme)

0 commit comments

Comments
 (0)