diff options
| author | Dax <[email protected]> | 2025-11-11 21:30:38 -0500 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-11-11 21:30:38 -0500 |
| commit | d81dce6a82d670d69e813a1bba67b9f06698d30b (patch) | |
| tree | 43cac7183e558031e6e75c32d0cddf189ef7d3e8 /packages | |
| parent | 0bd11e970b723b8cd59c14dd55e00829d9dcb862 (diff) | |
| download | opencode-d81dce6a82d670d69e813a1bba67b9f06698d30b.tar.gz opencode-d81dce6a82d670d69e813a1bba67b9f06698d30b.zip | |
fix: add support for loading custom themes from .opencode/themes directory (#4229)
Co-authored-by: GitHub Action <[email protected]>
Diffstat (limited to 'packages')
| -rw-r--r-- | packages/opencode/src/cli/cmd/tui/context/theme.tsx | 47 | ||||
| -rw-r--r-- | packages/opencode/src/server/server.ts | 1 | ||||
| -rw-r--r-- | packages/plugin/package.json | 2 | ||||
| -rw-r--r-- | packages/sdk/js/package.json | 2 |
4 files changed, 47 insertions, 5 deletions
diff --git a/packages/opencode/src/cli/cmd/tui/context/theme.tsx b/packages/opencode/src/cli/cmd/tui/context/theme.tsx index 74c2ff7f0..2a79620e6 100644 --- a/packages/opencode/src/cli/cmd/tui/context/theme.tsx +++ b/packages/opencode/src/cli/cmd/tui/context/theme.tsx @@ -1,5 +1,6 @@ import { SyntaxStyle, RGBA, type TerminalColors } from "@opentui/core" -import { createMemo } from "solid-js" +import path from "path" +import { createEffect, createMemo, onMount } from "solid-js" import { useSync } from "@tui/context/sync" import { createSimpleContext } from "./helper" import aura from "./theme/aura.json" with { type: "json" } @@ -27,7 +28,9 @@ import vesper from "./theme/vesper.json" with { type: "json" } import zenburn from "./theme/zenburn.json" with { type: "json" } import { useKV } from "./kv" import { useRenderer } from "@opentui/solid" -import { createStore } from "solid-js/store" +import { createStore, produce } from "solid-js/store" +import { Global } from "@/global" +import { Filesystem } from "@/util/filesystem" type Theme = { primary: RGBA @@ -144,6 +147,17 @@ export const { use: useTheme, provider: ThemeProvider } = createSimpleContext({ themes: DEFAULT_THEMES, mode: props.mode, active: (sync.data.config.theme ?? kv.get("theme", "opencode")) as string, + ready: false, + }) + + createEffect(async () => { + const custom = await getCustomThemes() + setStore( + produce((draft) => { + Object.assign(draft.themes, custom) + draft.ready = true + }), + ) }) const renderer = useRenderer() @@ -187,12 +201,39 @@ export const { use: useTheme, provider: ThemeProvider } = createSimpleContext({ kv.set("theme", theme) }, get ready() { - return sync.ready + return store.ready }, } }, }) +const CUSTOM_THEME_GLOB = new Bun.Glob("themes/*.json") +async function getCustomThemes() { + const directories = [ + Global.Path.config, + ...(await Array.fromAsync( + Filesystem.up({ + targets: [".opencode"], + start: process.cwd(), + }), + )), + ] + + const result: Record<string, ThemeJson> = {} + for (const dir of directories) { + for await (const item of CUSTOM_THEME_GLOB.scan({ + absolute: true, + followSymlinks: true, + dot: true, + cwd: dir, + })) { + const name = path.basename(item, ".json") + result[name] = await Bun.file(item).json() + } + } + return result +} + function generateSystem(colors: TerminalColors, mode: "dark" | "light"): ThemeJson { const bg = RGBA.fromHex(colors.defaultBackground ?? colors.palette[0]!) const fg = RGBA.fromHex(colors.defaultForeground ?? colors.palette[7]!) diff --git a/packages/opencode/src/server/server.ts b/packages/opencode/src/server/server.ts index 106693b22..2dee6c915 100644 --- a/packages/opencode/src/server/server.ts +++ b/packages/opencode/src/server/server.ts @@ -163,6 +163,7 @@ export namespace Server { return c.json(await Config.get()) }, ) + .patch( "/config", describeRoute({ diff --git a/packages/plugin/package.json b/packages/plugin/package.json index 675971e2b..427ea3e40 100644 --- a/packages/plugin/package.json +++ b/packages/plugin/package.json @@ -24,4 +24,4 @@ "typescript": "catalog:", "@typescript/native-preview": "catalog:" } -}
\ No newline at end of file +} diff --git a/packages/sdk/js/package.json b/packages/sdk/js/package.json index 4e1b0df72..c4530dc65 100644 --- a/packages/sdk/js/package.json +++ b/packages/sdk/js/package.json @@ -26,4 +26,4 @@ "publishConfig": { "directory": "dist" } -}
\ No newline at end of file +} |
