From 3f5022f33ad49b8c5f224aaa005837c144ebbfa8 Mon Sep 17 00:00:00 2001 From: luckeyfaraday Date: Mon, 15 Jun 2026 15:29:42 +0200 Subject: [PATCH] Replace legacy opencode themes with Athena Desktop themes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The TUI theme picker previously exposed ~30 upstream opencode themes (aura, catppuccin, dracula, gruvbox, nord, tokyonight, etc.). Replace that set with the four Athena Desktop palettes from context-workspace, keeping the existing classic-green `athena` theme as the default. DEFAULT_THEMES is now exactly: athena, mono-dark, mono-light, monolith, press. Each desktop CSS palette is translated into a full opencode ThemeJson (semantic roles, diff, markdown, and a syntax palette derived from each theme's accent set). Also fix a latent bug surfaced by removing the `opencode` theme: context/theme.tsx had three fallbacks selecting the now-deleted `opencode` theme (the two system-theme failure paths and the final resolver) — repointed to `athena`. Patch regenerated via the clone→git diff workflow; verified it applies cleanly to the pinned revision and that the built binary bundles all five themes and none of the legacy ones. Co-Authored-By: Claude Opus 4.8 --- .../tui/src/theme/assets/mono-dark.json | 80 ++++++++++++ .../tui/src/theme/assets/mono-light.json | 79 ++++++++++++ .../tui/src/theme/assets/monolith.json | 80 ++++++++++++ .../packages/tui/src/theme/assets/press.json | 80 ++++++++++++ patches/opencode-athena.patch | 114 ++++++++++++++++-- 5 files changed, 422 insertions(+), 11 deletions(-) create mode 100644 overlay/packages/tui/src/theme/assets/mono-dark.json create mode 100644 overlay/packages/tui/src/theme/assets/mono-light.json create mode 100644 overlay/packages/tui/src/theme/assets/monolith.json create mode 100644 overlay/packages/tui/src/theme/assets/press.json diff --git a/overlay/packages/tui/src/theme/assets/mono-dark.json b/overlay/packages/tui/src/theme/assets/mono-dark.json new file mode 100644 index 0000000..946ffd2 --- /dev/null +++ b/overlay/packages/tui/src/theme/assets/mono-dark.json @@ -0,0 +1,80 @@ +{ + "$schema": "https://opencode.ai/theme.json", + "defs": { + "bg": "#0a0a0a", + "sidebar": "#111111", + "panel": "#141414", + "panel2": "#1c1c1c", + "panel3": "#262626", + "line": "#2a2a2a", + "lineStrong": "#3a3a3a", + "text": "#f5f5f5", + "text2": "#c4c4c4", + "muted": "#8a8a8a", + "faint": "#5a5a5a", + "accent": "#fafafa", + "accentFg": "#0a0a0a", + "green": "#b8b8b8", + "blue": "#c4c4c4", + "violet": "#b0b0b0", + "orange": "#c8c8c8", + "red": "#e0a0a0", + "redBright": "#f0b8b8", + "gold": "#d4d4d4" + }, + "theme": { + "primary": "accent", + "secondary": "text2", + "accent": "accent", + "error": "red", + "warning": "orange", + "success": "green", + "info": "blue", + "text": "text", + "textMuted": "muted", + "selectedListItemText": "accentFg", + "background": "bg", + "backgroundPanel": "sidebar", + "backgroundElement": "panel2", + "backgroundMenu": "panel3", + "border": "lineStrong", + "borderActive": "accent", + "borderSubtle": "line", + "diffAdded": "green", + "diffRemoved": "red", + "diffContext": "muted", + "diffHunkHeader": "muted", + "diffHighlightAdded": "#d8d8d8", + "diffHighlightRemoved": "redBright", + "diffAddedBg": "#161a16", + "diffRemovedBg": "#1f1616", + "diffContextBg": "panel", + "diffLineNumber": "faint", + "diffAddedLineNumberBg": "#1c221c", + "diffRemovedLineNumberBg": "#2a1c1c", + "markdownText": "text", + "markdownHeading": "accent", + "markdownLink": "text2", + "markdownLinkText": "text", + "markdownCode": "gold", + "markdownBlockQuote": "muted", + "markdownEmph": "text2", + "markdownStrong": "accent", + "markdownHorizontalRule": "line", + "markdownListItem": "text2", + "markdownListEnumeration": "gold", + "markdownImage": "text2", + "markdownImageText": "text", + "markdownCodeBlock": "text", + "syntaxComment": "faint", + "syntaxKeyword": "text2", + "syntaxFunction": "text", + "syntaxVariable": "text2", + "syntaxString": "green", + "syntaxNumber": "gold", + "syntaxType": "blue", + "syntaxOperator": "muted", + "syntaxPunctuation": "muted", + "thinkingOpacity": 0.55 + } +} diff --git a/overlay/packages/tui/src/theme/assets/mono-light.json b/overlay/packages/tui/src/theme/assets/mono-light.json new file mode 100644 index 0000000..907abd3 --- /dev/null +++ b/overlay/packages/tui/src/theme/assets/mono-light.json @@ -0,0 +1,79 @@ +{ + "$schema": "https://opencode.ai/theme.json", + "defs": { + "bg": "#ffffff", + "sidebar": "#fafafa", + "panel2": "#f5f5f5", + "panel3": "#ebebeb", + "line": "#e0e0e0", + "lineStrong": "#cfcfcf", + "text": "#0a0a0a", + "text2": "#3f3f3f", + "muted": "#737373", + "faint": "#a3a3a3", + "accent": "#0a0a0a", + "accentFg": "#ffffff", + "green": "#525252", + "blue": "#404040", + "violet": "#525252", + "orange": "#404040", + "red": "#7f3030", + "redBright": "#5f2020", + "gold": "#525252" + }, + "theme": { + "primary": "accent", + "secondary": "text2", + "accent": "accent", + "error": "red", + "warning": "orange", + "success": "green", + "info": "blue", + "text": "text", + "textMuted": "muted", + "selectedListItemText": "accentFg", + "background": "bg", + "backgroundPanel": "sidebar", + "backgroundElement": "panel2", + "backgroundMenu": "panel3", + "border": "lineStrong", + "borderActive": "accent", + "borderSubtle": "line", + "diffAdded": "green", + "diffRemoved": "red", + "diffContext": "muted", + "diffHunkHeader": "muted", + "diffHighlightAdded": "#2f2f2f", + "diffHighlightRemoved": "redBright", + "diffAddedBg": "#f0f3f0", + "diffRemovedBg": "#fbf0f0", + "diffContextBg": "panel2", + "diffLineNumber": "faint", + "diffAddedLineNumberBg": "#e6ebe6", + "diffRemovedLineNumberBg": "#f2e2e2", + "markdownText": "text", + "markdownHeading": "accent", + "markdownLink": "text2", + "markdownLinkText": "text", + "markdownCode": "gold", + "markdownBlockQuote": "muted", + "markdownEmph": "text2", + "markdownStrong": "accent", + "markdownHorizontalRule": "line", + "markdownListItem": "text2", + "markdownListEnumeration": "gold", + "markdownImage": "text2", + "markdownImageText": "text", + "markdownCodeBlock": "text", + "syntaxComment": "faint", + "syntaxKeyword": "text", + "syntaxFunction": "text2", + "syntaxVariable": "text2", + "syntaxString": "green", + "syntaxNumber": "gold", + "syntaxType": "blue", + "syntaxOperator": "muted", + "syntaxPunctuation": "muted", + "thinkingOpacity": 0.5 + } +} diff --git a/overlay/packages/tui/src/theme/assets/monolith.json b/overlay/packages/tui/src/theme/assets/monolith.json new file mode 100644 index 0000000..f1a0298 --- /dev/null +++ b/overlay/packages/tui/src/theme/assets/monolith.json @@ -0,0 +1,80 @@ +{ + "$schema": "https://opencode.ai/theme.json", + "defs": { + "bg": "#07070b", + "sidebar": "#0a0a10", + "panel": "#0e0e15", + "panel2": "#14141c", + "panel3": "#1b1b25", + "line": "#1c1c26", + "lineStrong": "#2a2a38", + "text": "#ededf4", + "text2": "#9292a0", + "muted": "#46465a", + "lime": "#c6f135", + "limeFg": "#0d1b00", + "green": "#4ade80", + "greenBright": "#86efac", + "blue": "#7ea8f2", + "violet": "#b39efa", + "orange": "#fb923c", + "red": "#f87171", + "redBright": "#fca5a5", + "gold": "#fbbf24" + }, + "theme": { + "primary": "lime", + "secondary": "violet", + "accent": "lime", + "error": "red", + "warning": "orange", + "success": "green", + "info": "blue", + "text": "text", + "textMuted": "text2", + "selectedListItemText": "limeFg", + "background": "bg", + "backgroundPanel": "sidebar", + "backgroundElement": "panel2", + "backgroundMenu": "panel3", + "border": "lineStrong", + "borderActive": "lime", + "borderSubtle": "line", + "diffAdded": "green", + "diffRemoved": "red", + "diffContext": "text2", + "diffHunkHeader": "text2", + "diffHighlightAdded": "greenBright", + "diffHighlightRemoved": "redBright", + "diffAddedBg": "#0c1810", + "diffRemovedBg": "#1a0f12", + "diffContextBg": "panel", + "diffLineNumber": "muted", + "diffAddedLineNumberBg": "#103018", + "diffRemovedLineNumberBg": "#2a1418", + "markdownText": "text", + "markdownHeading": "lime", + "markdownLink": "blue", + "markdownLinkText": "violet", + "markdownCode": "green", + "markdownBlockQuote": "text2", + "markdownEmph": "gold", + "markdownStrong": "lime", + "markdownHorizontalRule": "lineStrong", + "markdownListItem": "lime", + "markdownListEnumeration": "violet", + "markdownImage": "blue", + "markdownImageText": "violet", + "markdownCodeBlock": "text", + "syntaxComment": "muted", + "syntaxKeyword": "violet", + "syntaxFunction": "blue", + "syntaxVariable": "text", + "syntaxString": "green", + "syntaxNumber": "orange", + "syntaxType": "gold", + "syntaxOperator": "text2", + "syntaxPunctuation": "text2", + "thinkingOpacity": 0.55 + } +} diff --git a/overlay/packages/tui/src/theme/assets/press.json b/overlay/packages/tui/src/theme/assets/press.json new file mode 100644 index 0000000..f721548 --- /dev/null +++ b/overlay/packages/tui/src/theme/assets/press.json @@ -0,0 +1,80 @@ +{ + "$schema": "https://opencode.ai/theme.json", + "defs": { + "bg": "#0c0a07", + "surface": "#16120c", + "surface2": "#1f1a13", + "surface3": "#2a241a", + "line": "#221d15", + "lineStrong": "#34291c", + "lineBold": "#4a3c28", + "text": "#f4ecdb", + "text2": "#b8aa92", + "muted": "#6e6552", + "faint": "#4a4337", + "vermillion": "#e54b25", + "vermillionFg": "#f9eee0", + "saffron": "#f0b429", + "inkBlue": "#6b8fc7", + "sage": "#9bb37a", + "sageBright": "#b9cd99", + "bruise": "#b585d0", + "red": "#d8523a", + "redBright": "#ec6a4f" + }, + "theme": { + "primary": "vermillion", + "secondary": "sage", + "accent": "saffron", + "error": "red", + "warning": "saffron", + "success": "sage", + "info": "inkBlue", + "text": "text", + "textMuted": "muted", + "selectedListItemText": "vermillionFg", + "background": "bg", + "backgroundPanel": "surface", + "backgroundElement": "surface2", + "backgroundMenu": "surface3", + "border": "lineStrong", + "borderActive": "vermillion", + "borderSubtle": "line", + "diffAdded": "sage", + "diffRemoved": "red", + "diffContext": "muted", + "diffHunkHeader": "muted", + "diffHighlightAdded": "sageBright", + "diffHighlightRemoved": "redBright", + "diffAddedBg": "#131811", + "diffRemovedBg": "#21130d", + "diffContextBg": "surface", + "diffLineNumber": "faint", + "diffAddedLineNumberBg": "#1c2417", + "diffRemovedLineNumberBg": "#2e1a10", + "markdownText": "text", + "markdownHeading": "vermillion", + "markdownLink": "inkBlue", + "markdownLinkText": "saffron", + "markdownCode": "sage", + "markdownBlockQuote": "muted", + "markdownEmph": "saffron", + "markdownStrong": "vermillion", + "markdownHorizontalRule": "lineBold", + "markdownListItem": "vermillion", + "markdownListEnumeration": "saffron", + "markdownImage": "inkBlue", + "markdownImageText": "saffron", + "markdownCodeBlock": "text", + "syntaxComment": "muted", + "syntaxKeyword": "vermillion", + "syntaxFunction": "saffron", + "syntaxVariable": "text2", + "syntaxString": "sage", + "syntaxNumber": "bruise", + "syntaxType": "inkBlue", + "syntaxOperator": "muted", + "syntaxPunctuation": "faint", + "thinkingOpacity": 0.55 + } +} diff --git a/patches/opencode-athena.patch b/patches/opencode-athena.patch index 94eb85b..7b70451 100644 --- a/patches/opencode-athena.patch +++ b/patches/opencode-athena.patch @@ -343,7 +343,7 @@ index 0a9f103..2d93003 100644 diff --git a/packages/tui/src/context/theme.tsx b/packages/tui/src/context/theme.tsx -index 909dd69..00474c3 100644 +index 909dd69..a7182ff 100644 --- a/packages/tui/src/context/theme.tsx +++ b/packages/tui/src/context/theme.tsx @@ -93,7 +93,7 @@ const [store, setStore] = createStore({ @@ -375,12 +375,30 @@ index 909dd69..00474c3 100644 } onMount(() => { +@@ -159,7 +159,7 @@ export const { use: useTheme, provider: ThemeProvider } = createSimpleContext({ + if (!colors.palette[0]) { + if (hasResolvedSystemTheme) return + setSystemTheme(undefined) +- if (store.active === "system") setStore("active", "opencode") ++ if (store.active === "system") setStore("active", "athena") + return + } + const next = store.lock ?? terminalMode(colors) ?? mode +@@ -174,7 +174,7 @@ export const { use: useTheme, provider: ThemeProvider } = createSimpleContext({ + .catch(() => { + if (hasResolvedSystemTheme) return + setSystemTheme(undefined) +- if (store.active === "system") setStore("active", "opencode") ++ if (store.active === "system") setStore("active", "athena") + }) + } + @@ -263,7 +263,7 @@ export const { use: useTheme, provider: ThemeProvider } = createSimpleContext({ if (theme) return resolveTheme(theme, store.mode) } - return resolveTheme(store.themes.opencode, store.mode) -+ return resolveTheme(store.themes.athena ?? store.themes.opencode, store.mode) ++ return resolveTheme(store.themes.athena, store.mode) }) createEffect(() => renderer.setBackgroundColor(values().background)) @@ -646,23 +664,97 @@ index c787a84..7962e78 100644 = { +- aura, +- ayu, +- catppuccin, +- ["catppuccin-frappe"]: catppuccinFrappe, +- ["catppuccin-macchiato"]: catppuccinMacchiato, +- cobalt2, +- cursor, +- dracula, +- everforest, +- flexoki, +- github, +- gruvbox, +- kanagawa, +- material, +- matrix, +- mercury, +- monokai, +- nightowl, +- nord, +- ["one-dark"]: onedark, +- ["osaka-jade"]: osakaJade, +- opencode, +- orng, +- ["lucent-orng"]: lucentOrng, +- palenight, +- rosepine, +- solarized, +- synthwave84, +- tokyonight, +- vesper, +- vercel, +- zenburn, +- carbonfox, + athena, - aura, - ayu, - catppuccin, ++ ["mono-dark"]: monoDark, ++ ["mono-light"]: monoLight, ++ monolith, ++ press, + } + + const pluginThemes: Record = {} diff --git a/packages/tui/src/ui/link.tsx b/packages/tui/src/ui/link.tsx index cfd78bc..7729823 100644 --- a/packages/tui/src/ui/link.tsx