summaryrefslogtreecommitdiffhomepage
path: root/packages
diff options
context:
space:
mode:
authorDax <[email protected]>2025-11-11 21:30:38 -0500
committerGitHub <[email protected]>2025-11-11 21:30:38 -0500
commitd81dce6a82d670d69e813a1bba67b9f06698d30b (patch)
tree43cac7183e558031e6e75c32d0cddf189ef7d3e8 /packages
parent0bd11e970b723b8cd59c14dd55e00829d9dcb862 (diff)
downloadopencode-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.tsx47
-rw-r--r--packages/opencode/src/server/server.ts1
-rw-r--r--packages/plugin/package.json2
-rw-r--r--packages/sdk/js/package.json2
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
+}